eric7/WebBrowser/Navigation/NavigationBar.py

branch
eric7
changeset 8312
800c432b34c8
parent 8220
006ee31b4835
child 8318
962bce857696
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/WebBrowser/Navigation/NavigationBar.py	Sat May 15 18:45:04 2021 +0200
@@ -0,0 +1,366 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2017 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the navigation bar widget.
+"""
+
+from PyQt5.QtCore import Qt, QUrl
+from PyQt5.QtWidgets import (
+    QWidget, QHBoxLayout, QStyle, QToolButton, QSplitter, QSizePolicy, QMenu,
+    QAction
+)
+
+from E5Gui.E5ToolButton import E5ToolButton
+
+from WebBrowser.WebBrowserWindow import WebBrowserWindow
+from WebBrowser.Download.DownloadManagerButton import DownloadManagerButton
+
+import UI.PixmapCache
+import Preferences
+
+from .ReloadStopButton import ReloadStopButton
+
+
+class NavigationBar(QWidget):
+    """
+    Class implementing the navigation bar.
+    """
+    def __init__(self, mainWindow, parent=None):
+        """
+        Constructor
+        
+        @param mainWindow reference to the browser main window
+        @type WebBrowserWindow
+        @param parent reference to the parent widget
+        @type QWidget
+        """
+        super().__init__(parent)
+        self.setObjectName("navigationbar")
+        
+        self.__mw = mainWindow
+        
+        self.__layout = QHBoxLayout(self)
+        margin = self.style().pixelMetric(
+            QStyle.PixelMetric.PM_ToolBarItemMargin, None, self)
+        self.__layout.setContentsMargins(margin, margin, margin, margin)
+        self.__layout.setSpacing(
+            self.style().pixelMetric(
+                QStyle.PixelMetric.PM_ToolBarItemSpacing, None, self))
+        self.setLayout(self.__layout)
+        
+        self.__backButton = E5ToolButton(self)
+        self.__backButton.setObjectName("navigation_back_button")
+        self.__backButton.setToolTip(self.tr("Move one screen backward"))
+        self.__backButton.setToolButtonStyle(
+            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.__backButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
+        self.__backButton.setAutoRaise(True)
+        self.__backButton.setIcon(
+            UI.PixmapCache.getIcon("back"))
+        self.__backButton.setEnabled(False)
+        
+        self.__forwardButton = E5ToolButton(self)
+        self.__forwardButton.setObjectName("navigation_forward_button")
+        self.__forwardButton.setToolTip(self.tr("Move one screen forward"))
+        self.__forwardButton.setToolButtonStyle(
+            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.__forwardButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
+        self.__forwardButton.setAutoRaise(True)
+        self.__forwardButton.setIcon(
+            UI.PixmapCache.getIcon("forward"))
+        self.__forwardButton.setEnabled(False)
+        
+        self.__backNextLayout = QHBoxLayout()
+        self.__backNextLayout.setContentsMargins(0, 0, 0, 0)
+        self.__backNextLayout.setSpacing(0)
+        self.__backNextLayout.addWidget(self.__backButton)
+        self.__backNextLayout.addWidget(self.__forwardButton)
+        
+        self.__reloadStopButton = ReloadStopButton(self)
+        
+        self.__homeButton = E5ToolButton(self)
+        self.__homeButton.setObjectName("navigation_home_button")
+        self.__homeButton.setToolTip(self.tr("Move to the initial screen"))
+        self.__homeButton.setToolButtonStyle(
+            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.__homeButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
+        self.__homeButton.setAutoRaise(True)
+        self.__homeButton.setIcon(
+            UI.PixmapCache.getIcon("home"))
+        
+        self.__exitFullScreenButton = E5ToolButton(self)
+        self.__exitFullScreenButton.setObjectName(
+            "navigation_exitfullscreen_button")
+        self.__exitFullScreenButton.setIcon(
+            UI.PixmapCache.getIcon("windowRestore"))
+        self.__exitFullScreenButton.setToolTip(self.tr("Exit Fullscreen"))
+        self.__exitFullScreenButton.setToolButtonStyle(
+            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.__exitFullScreenButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
+        self.__exitFullScreenButton.setAutoRaise(True)
+        self.__exitFullScreenButton.clicked.connect(self.__mw.toggleFullScreen)
+        self.__exitFullScreenButton.setVisible(False)
+        
+        self.__downloadManagerButton = DownloadManagerButton(self)
+        
+        self.__superMenuButton = E5ToolButton(self)
+        self.__superMenuButton.setObjectName(
+            "navigation_supermenu_button")
+        self.__superMenuButton.setIcon(UI.PixmapCache.getIcon("superMenu"))
+        self.__superMenuButton.setToolTip(self.tr("Main Menu"))
+        self.__superMenuButton.setPopupMode(
+            QToolButton.ToolButtonPopupMode.InstantPopup)
+        self.__superMenuButton.setToolButtonStyle(
+            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.__superMenuButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
+        self.__superMenuButton.setAutoRaise(True)
+        self.__superMenuButton.setShowMenuInside(True)
+        
+        self.__navigationSplitter = QSplitter(self)
+        urlBar = self.__mw.tabWidget().stackedUrlBar()
+        self.__navigationSplitter.addWidget(urlBar)
+        
+        from WebBrowser.WebBrowserWebSearchWidget import (
+            WebBrowserWebSearchWidget
+        )
+        self.__searchEdit = WebBrowserWebSearchWidget(self.__mw, self)
+        sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding,
+                                 QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(2)
+        sizePolicy.setVerticalStretch(0)
+        self.__searchEdit.setSizePolicy(sizePolicy)
+        self.__searchEdit.search.connect(self.__mw.openUrl)
+        self.__navigationSplitter.addWidget(self.__searchEdit)
+        
+        self.__navigationSplitter.setSizePolicy(
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Maximum)
+        self.__navigationSplitter.setCollapsible(0, False)
+        
+        self.__layout.addLayout(self.__backNextLayout)
+        self.__layout.addWidget(self.__reloadStopButton)
+        self.__layout.addWidget(self.__homeButton)
+        self.__layout.addWidget(self.__navigationSplitter)
+        self.__layout.addWidget(self.__downloadManagerButton)
+        self.__layout.addWidget(self.__exitFullScreenButton)
+        self.__layout.addWidget(self.__superMenuButton)
+        
+        self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.customContextMenuRequested.connect(self.__contextMenuRequested)
+        
+        self.__backMenu = QMenu(self)
+        self.__backMenu.triggered.connect(self.__navigationMenuActionTriggered)
+        self.__backButton.setMenu(self.__backMenu)
+        self.__backButton.aboutToShowMenu.connect(self.__showBackMenu)
+        
+        self.__forwardMenu = QMenu(self)
+        self.__forwardMenu.triggered.connect(
+            self.__navigationMenuActionTriggered)
+        self.__forwardButton.setMenu(self.__forwardMenu)
+        self.__forwardButton.aboutToShowMenu.connect(self.__showForwardMenu)
+        
+        self.__backButton.clicked.connect(self.__goBack)
+        self.__backButton.middleClicked.connect(self.__goBackInNewTab)
+        self.__backButton.controlClicked.connect(self.__goBackInNewTab)
+        self.__forwardButton.clicked.connect(self.__goForward)
+        self.__forwardButton.middleClicked.connect(self.__goForwardInNewTab)
+        self.__forwardButton.controlClicked.connect(self.__goForwardInNewTab)
+        self.__reloadStopButton.reloadClicked.connect(self.__reload)
+        self.__reloadStopButton.stopClicked.connect(self.__stopLoad)
+        self.__homeButton.clicked.connect(self.__goHome)
+        self.__homeButton.middleClicked.connect(self.__goHomeInNewTab)
+        self.__homeButton.controlClicked.connect(self.__goHomeInNewTab)
+    
+    def superMenuButton(self):
+        """
+        Public method to get a reference to the super menu button.
+        
+        @return reference to the super menu button
+        @rtype QToolButton
+        """
+        return self.__superMenuButton
+    
+    def backButton(self):
+        """
+        Public method to get a reference to the back button.
+        
+        @return reference to the back button
+        @rtype QToolButton
+        """
+        return self.__backButton
+    
+    def forwardButton(self):
+        """
+        Public method to get a reference to the forward button.
+        
+        @return reference to the forward button
+        @rtype QToolButton
+        """
+        return self.__forwardButton
+    
+    def reloadStopButton(self):
+        """
+        Public method to get a reference to the reload/stop button.
+        
+        @return reference to the reload/stop button
+        @rtype QToolButton
+        """
+        return self.__reloadStopButton
+    
+    def exitFullScreenButton(self):
+        """
+        Public method to get a reference to the exit full screen button.
+        
+        @return reference to the exit full screen button
+        @rtype QToolButton
+        """
+        return self.__exitFullScreenButton
+    
+    def searchEdit(self):
+        """
+        Public method to get a reference to the web search edit.
+        
+        @return reference to the web search edit
+        @rtype WebBrowserWebSearchWidget
+        """
+        return self.__searchEdit
+    
+    def __showBackMenu(self):
+        """
+        Private slot showing the backwards navigation menu.
+        """
+        self.__backMenu.clear()
+        history = self.__mw.currentBrowser().history()
+        backItems = history.backItems(20)
+        # show max. 20 items
+        
+        for item in reversed(backItems):
+            act = QAction(self)
+            act.setData(item)
+            icon = WebBrowserWindow.icon(item.url())
+            act.setIcon(icon)
+            act.setText(item.title())
+            self.__backMenu.addAction(act)
+        
+        self.__backMenu.addSeparator()
+        self.__backMenu.addAction(self.tr("Clear History"),
+                                  self.__clearHistory)
+    
+    def __showForwardMenu(self):
+        """
+        Private slot showing the forwards navigation menu.
+        """
+        self.__forwardMenu.clear()
+        history = self.__mw.currentBrowser().history()
+        forwardItems = history.forwardItems(20)
+        # show max. 20 items
+        
+        for item in forwardItems:
+            act = QAction(self)
+            act.setData(item)
+            icon = WebBrowserWindow.icon(item.url())
+            act.setIcon(icon)
+            act.setText(item.title())
+            self.__forwardMenu.addAction(act)
+        
+        self.__forwardMenu.addSeparator()
+        self.__forwardMenu.addAction(self.tr("Clear History"),
+                                     self.__clearHistory)
+    
+    def __navigationMenuActionTriggered(self, act):
+        """
+        Private slot to go to the selected page.
+        
+        @param act reference to the action selected in the navigation menu
+            (QAction)
+        """
+        historyItem = act.data()
+        if historyItem is not None:
+            history = self.__mw.currentBrowser().history()
+            history.goToItem(historyItem)
+    
+    def __goBack(self):
+        """
+        Private slot called to handle the backward button.
+        """
+        self.__mw.currentBrowser().backward()
+    
+    def __goBackInNewTab(self):
+        """
+        Private slot handling a middle click or Ctrl left click of the
+        backward button.
+        """
+        history = self.__mw.currentBrowser().history()
+        if history.canGoBack():
+            backItem = history.backItem()
+            self.__mw.newTab(link=backItem.url(),
+                             addNextTo=self.__mw.currentBrowser(),
+                             background=True)
+    
+    def __goForward(self):
+        """
+        Private slot called to handle the forward button.
+        """
+        self.__mw.currentBrowser().forward()
+    
+    def __goForwardInNewTab(self):
+        """
+        Private slot handling a middle click or Ctrl left click of the
+        forward button.
+        """
+        history = self.__mw.currentBrowser().history()
+        if history.canGoForward():
+            forwardItem = history.forwardItem()
+            self.__mw.newTab(link=forwardItem.url(),
+                             addNextTo=self.__mw.currentBrowser(),
+                             background=True)
+    
+    def __goHome(self):
+        """
+        Private slot called to handle the home button.
+        """
+        self.__mw.currentBrowser().home()
+    
+    def __goHomeInNewTab(self):
+        """
+        Private slot handling a middle click or Ctrl left click of the
+        home button.
+        """
+        homeUrl = QUrl(Preferences.getWebBrowser("HomePage"))
+        self.__mw.newTab(link=homeUrl,
+                         addNextTo=self.__mw.currentBrowser(),
+                         background=True)
+    
+    def __reload(self):
+        """
+        Private slot called to handle the reload button.
+        """
+        self.__mw.currentBrowser().reloadBypassingCache()
+    
+    def __stopLoad(self):
+        """
+        Private slot called to handle loading of the current page.
+        """
+        self.__mw.currentBrowser().stop()
+    
+    def __clearHistory(self):
+        """
+        Private slot to clear the history of the current web browser tab.
+        """
+        cb = self.__mw.currentBrowser()
+        if cb is not None:
+            cb.history().clear()
+            self.__mw.setForwardAvailable(cb.isForwardAvailable())
+            self.__mw.setBackwardAvailable(cb.isBackwardAvailable())
+    
+    def __contextMenuRequested(self, pos):
+        """
+        Private method to handle a context menu request.
+        
+        @param pos position of the request
+        @type QPoint
+        """
+        menu = self.__mw.createPopupMenu()
+        menu.exec(self.mapToGlobal(pos))

eric ide

mercurial