WebBrowser/WebBrowserWindow.py

changeset 5745
4f4316e83318
parent 5740
292538236234
child 5746
6ccc43d9faf0
--- a/WebBrowser/WebBrowserWindow.py	Sat May 27 18:51:22 2017 +0200
+++ b/WebBrowser/WebBrowserWindow.py	Sun May 28 16:59:18 2017 +0200
@@ -22,7 +22,7 @@
 from PyQt5.QtGui import QDesktopServices, QKeySequence, QFont, QFontMetrics
 from PyQt5.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QDockWidget, \
     QComboBox, QLabel, QMenu, QToolButton, QLineEdit, QApplication, \
-    QWhatsThis, QDialog, QHBoxLayout, QProgressBar, QInputDialog
+    QWhatsThis, QDialog, QHBoxLayout, QProgressBar, QInputDialog, QAction
 from PyQt5.QtWebEngineWidgets import QWebEngineSettings, QWebEnginePage, \
     QWebEngineProfile, QWebEngineScript
 try:
@@ -313,9 +313,25 @@
             self.historyManager()
             self.greaseMonkeyManager()
             
+            # initialize the actions
             self.__initActions()
+            
+            # initialize the menus
             self.__initMenus()
-            self.__initToolbars()
+            self.__initSuperMenu()
+            if Preferences.getWebBrowser("MenuBarVisible"):
+                self.__navigationBar.superMenuButton().hide()
+            else:
+                self.menuBar().hide()
+            
+            # save references to toolbars in order to hide them
+            # when going full screen
+            self.__toolbars = {}
+            # initialize toolbars
+            if Preferences.getWebBrowser("ShowToolbars"):
+                self.__initToolbars()
+            self.__bookmarksToolBar.setVisible(
+                Preferences.getWebBrowser("BookmarksToolBarVisible"))
             
             syncMgr = self.syncManager()
             syncMgr.syncMessage.connect(self.statusBar().showMessage)
@@ -344,6 +360,9 @@
             self.networkIcon = E5NetworkIcon(self)
             self.statusBar().addPermanentWidget(self.networkIcon)
             
+            if not Preferences.getWebBrowser("StatusBarVisible"):
+                self.statusBar().hide()
+            
             QDesktopServices.setUrlHandler("http", self.__linkActivated)
             QDesktopServices.setUrlHandler("https", self.__linkActivated)
             
@@ -1798,6 +1817,45 @@
             self.showTabManagerAct.triggered.connect(self.__showTabManager)
         self.__actions.append(self.showTabManagerAct)
         
+        self.virustotalScanCurrentAct = E5Action(
+            self.tr("Scan current site"),
+            UI.PixmapCache.getIcon("virustotal.png"),
+            self.tr("Scan current site"),
+            0, 0,
+            self, 'webbrowser_virustotal_scan_site')
+        if not self.__initShortcutsOnly:
+            self.virustotalScanCurrentAct.triggered.connect(
+                self.__virusTotalScanCurrentSite)
+        self.__actions.append(self.virustotalScanCurrentAct)
+        
+        self.virustotalIpReportAct = E5Action(
+            self.tr("IP Address Report"),
+            UI.PixmapCache.getIcon("virustotal.png"),
+            self.tr("IP Address Report"),
+            0, 0,
+            self, 'webbrowser_virustotal_ip_report')
+        if not self.__initShortcutsOnly:
+            self.virustotalIpReportAct.triggered.connect(
+                self.__virusTotalIpAddressReport)
+        self.__actions.append(self.virustotalIpReportAct)
+        
+        self.virustotalDomainReportAct = E5Action(
+            self.tr("Domain Report"),
+            UI.PixmapCache.getIcon("virustotal.png"),
+            self.tr("Domain Report"),
+            0, 0,
+            self, 'webbrowser_virustotal_domain_report')
+        if not self.__initShortcutsOnly:
+            self.virustotalDomainReportAct.triggered.connect(
+                self.__virusTotalDomainReport)
+        self.__actions.append(self.virustotalDomainReportAct)
+        
+        if not Preferences.getWebBrowser("VirusTotalEnabled") or \
+           Preferences.getWebBrowser("VirusTotalServiceKey") == "":
+            self.virustotalScanCurrentAct.setEnabled(False)
+            self.virustotalIpReportAct.setEnabled(False)
+            self.virustotalDomainReportAct.setEnabled(False)
+        
         self.backAct.setEnabled(False)
         self.forwardAct.setEnabled(False)
         
@@ -1820,7 +1878,6 @@
         mb = self.menuBar()
         
         menu = mb.addMenu(self.tr('&File'))
-        menu.setTearOffEnabled(True)
         menu.addAction(self.newTabAct)
         menu.addAction(self.newAct)
         menu.addAction(self.newPrivateAct)
@@ -1845,7 +1902,6 @@
         menu.addAction(self.exitAct)
         
         menu = mb.addMenu(self.tr('&Edit'))
-        menu.setTearOffEnabled(True)
         menu.addAction(self.undoAct)
         menu.addAction(self.redoAct)
         menu.addSeparator()
@@ -1861,34 +1917,27 @@
         menu.addAction(self.findPrevAct)
         
         menu = mb.addMenu(self.tr('&View'))
-        menu.setTearOffEnabled(True)
+        menu.addAction(self.stopAct)
+        menu.addAction(self.reloadAct)
+        if WebBrowserWindow._useQtHelp:
+            menu.addSeparator()
+            menu.addAction(self.syncTocAct)
+        menu.addSeparator()
         menu.addAction(self.zoomInAct)
         menu.addAction(self.zoomResetAct)
         menu.addAction(self.zoomOutAct)
         menu.addSeparator()
-        menu.addAction(self.pageSourceAct)
-        menu.addAction(self.fullScreenAct)
         self.__textEncodingMenu = menu.addMenu(
             self.tr("Text Encoding"))
         self.__textEncodingMenu.aboutToShow.connect(
             self.__aboutToShowTextEncodingMenu)
         self.__textEncodingMenu.triggered.connect(self.__setTextEncoding)
-        
-        menu = mb.addMenu(self.tr('&Go'))
-        menu.setTearOffEnabled(True)
-        menu.addAction(self.backAct)
-        menu.addAction(self.forwardAct)
-        menu.addAction(self.homeAct)
         menu.addSeparator()
-        menu.addAction(self.stopAct)
-        menu.addAction(self.reloadAct)
-        if WebBrowserWindow._useQtHelp:
-            menu.addSeparator()
-            menu.addAction(self.syncTocAct)
+        menu.addAction(self.pageSourceAct)
+        menu.addAction(self.fullScreenAct)
         
         from .History.HistoryMenu import HistoryMenu
         self.historyMenu = HistoryMenu(self, self.__tabWidget)
-        self.historyMenu.setTearOffEnabled(True)
         self.historyMenu.setTitle(self.tr('H&istory'))
         self.historyMenu.openUrl.connect(self.openUrl)
         self.historyMenu.newTab.connect(self.openUrlNewTab)
@@ -1897,9 +1946,14 @@
         self.historyMenu.newPrivateWindow.connect(self.openUrlNewPrivateWindow)
         mb.addMenu(self.historyMenu)
         
+        historyActions = []
+        historyActions.append(self.backAct)
+        historyActions.append(self.forwardAct)
+        historyActions.append(self.homeAct)
+        self.historyMenu.setInitialActions(historyActions)
+        
         from .Bookmarks.BookmarksMenu import BookmarksMenuBarMenu
         self.bookmarksMenu = BookmarksMenuBarMenu(self)
-        self.bookmarksMenu.setTearOffEnabled(True)
         self.bookmarksMenu.setTitle(self.tr('&Bookmarks'))
         self.bookmarksMenu.openUrl.connect(self.openUrl)
         self.bookmarksMenu.newTab.connect(self.openUrlNewTab)
@@ -1917,7 +1971,6 @@
         self.bookmarksMenu.setInitialActions(bookmarksActions)
         
         menu = mb.addMenu(self.tr('&Settings'))
-        menu.setTearOffEnabled(True)
         menu.addAction(self.prefAct)
         menu.addAction(self.acceptedLanguagesAct)
         menu.addAction(self.cookiesAct)
@@ -1957,14 +2010,18 @@
         menu.addAction(self.clearIconsAct)
         
         menu = mb.addMenu(self.tr("&Tools"))
-        menu.setTearOffEnabled(True)
         menu.addAction(self.feedsManagerAct)
         menu.addAction(self.siteInfoAct)
         menu.addSeparator()
         menu.addAction(self.synchronizationAct)
-        
-        menu = mb.addMenu(self.tr("&Window"))
-        menu.setTearOffEnabled(True)
+        menu.addSeparator()
+        vtMenu = menu.addMenu(UI.PixmapCache.getIcon("virustotal.png"),
+                              self.tr("&VirusTotal"))
+        vtMenu.addAction(self.virustotalScanCurrentAct)
+        vtMenu.addAction(self.virustotalIpReportAct)
+        vtMenu.addAction(self.virustotalDomainReportAct)
+        
+        menu = mb.addMenu(self.tr("&Windows"))
         menu.addAction(self.showDownloadManagerAct)
         menu.addAction(self.showJavaScriptConsoleAct)
         menu.addAction(self.showTabManagerAct)
@@ -1973,24 +2030,149 @@
             menu.addAction(self.showTocAct)
             menu.addAction(self.showIndexAct)
             menu.addAction(self.showSearchAct)
+        menu.addSeparator()
+        self.__toolbarsMenu = menu.addMenu(self.tr("&Toolbars"))
+        self.__toolbarsMenu.aboutToShow.connect(self.__showToolbarsMenu)
+        self.__toolbarsMenu.triggered.connect(self.__TBMenuTriggered)
         
         mb.addSeparator()
         
         menu = mb.addMenu(self.tr('&Help'))
-        menu.setTearOffEnabled(True)
         menu.addAction(self.aboutAct)
         menu.addAction(self.aboutQtAct)
         menu.addSeparator()
         menu.addAction(self.whatsThisAct)
     
+    def __initSuperMenu(self):
+        """
+        Private method to create the super menu and attach it to the super
+        menu button.
+        """
+        self.__superMenu = QMenu(self)
+        
+        self.__superMenu.addAction(self.newTabAct)
+        self.__superMenu.addAction(self.newAct)
+        self.__superMenu.addAction(self.newPrivateAct)
+        self.__superMenu.addAction(self.openAct)
+        self.__superMenu.addAction(self.openTabAct)
+        self.__superMenu.addSeparator()
+        
+        menu = self.__superMenu.addMenu(self.tr("Save"))
+        if self.saveAsAct:
+            menu.addAction(self.saveAsAct)
+        menu.addAction(self.savePageScreenAct)
+        menu.addAction(self.saveVisiblePageScreenAct)
+        
+        if self.printPreviewAct or self.printAct or self.printPdfAct:
+            menu = self.__superMenu.addMenu(self.tr("Print"))
+            if self.printPreviewAct:
+                menu.addAction(self.printPreviewAct)
+            if self.printAct:
+                menu.addAction(self.printAct)
+            if self.printPdfAct:
+                menu.addAction(self.printPdfAct)
+        
+        # TODO: add "Send Page Link" action
+        self.__superMenu.addSeparator()
+        self.__superMenu.addAction(self.selectAllAct)
+        self.__superMenu.addAction(self.findAct)
+        self.__superMenu.addSeparator()
+        act = self.__superMenu.addAction(UI.PixmapCache.getIcon("history.png"),
+                                         self.tr("Show All History..."))
+        act.triggered.connect(self.historyMenu.showHistoryDialog)
+        self.__superMenu.addAction(self.bookmarksManageAct)
+        self.__superMenu.addSeparator()
+        self.__superMenu.addAction(self.prefAct)
+        
+        menu = self.__superMenu.addMenu(self.tr('Settings'))
+        menu.addAction(self.acceptedLanguagesAct)
+        menu.addAction(self.cookiesAct)
+        menu.addAction(self.flashCookiesAct)
+        menu.addAction(self.personalDataAct)
+        menu.addAction(self.greaseMonkeyAct)
+        menu.addAction(self.featurePermissionAct)
+        menu.addSeparator()
+        menu.addAction(self.editMessageFilterAct)
+        menu.addSeparator()
+        menu.addAction(self.searchEnginesAct)
+        menu.addSeparator()
+        menu.addAction(self.passwordsAct)
+        menu.addAction(self.certificateErrorsAct)
+        menu.addSeparator()
+        menu.addAction(self.zoomValuesAct)
+        menu.addAction(self.manageIconsAct)
+        menu.addSeparator()
+        menu.addAction(self.adblockAct)
+        menu.addSeparator()
+        menu.addMenu(self.__userAgentMenu)
+        menu.addAction(self.userAgentManagerAct)
+        menu.addSeparator()
+        if WebBrowserWindow._useQtHelp:
+            menu.addAction(self.manageQtHelpDocsAct)
+            menu.addAction(self.manageQtHelpFiltersAct)
+            menu.addAction(self.reindexDocumentationAct)
+            menu.addSeparator()
+        menu.addAction(self.clearPrivateDataAct)
+        menu.addAction(self.clearIconsAct)
+        menu.aboutToShow.connect(
+            self.__aboutToShowSettingsMenu)
+
+        self.__superMenu.addSeparator()
+        
+        menu = self.__superMenu.addMenu(self.tr('&View'))
+        menu.addMenu(self.__toolbarsMenu)
+        windowsMenu = menu.addMenu(self.tr("&Windows"))
+        windowsMenu.addAction(self.showDownloadManagerAct)
+        windowsMenu.addAction(self.showJavaScriptConsoleAct)
+        windowsMenu.addAction(self.showTabManagerAct)
+        if WebBrowserWindow._useQtHelp:
+            windowsMenu.addSeparator()
+            windowsMenu.addAction(self.showTocAct)
+            windowsMenu.addAction(self.showIndexAct)
+            windowsMenu.addAction(self.showSearchAct)
+        menu.addSeparator()
+        menu.addAction(self.stopAct)
+        menu.addAction(self.reloadAct)
+        if WebBrowserWindow._useQtHelp:
+            menu.addSeparator()
+            menu.addAction(self.syncTocAct)
+        menu.addSeparator()
+        menu.addAction(self.zoomInAct)
+        menu.addAction(self.zoomResetAct)
+        menu.addAction(self.zoomOutAct)
+        menu.addSeparator()
+        menu.addMenu(self.__textEncodingMenu)
+        menu.addSeparator()
+        menu.addAction(self.pageSourceAct)
+        menu.addAction(self.fullScreenAct)
+        
+        self.__superMenu.addMenu(self.historyMenu)
+        self.__superMenu.addMenu(self.bookmarksMenu)
+        
+        menu = self.__superMenu.addMenu(self.tr("&Tools"))
+        menu.addAction(self.feedsManagerAct)
+        menu.addAction(self.siteInfoAct)
+        menu.addSeparator()
+        menu.addAction(self.synchronizationAct)
+        menu.addSeparator()
+        vtMenu = menu.addMenu(UI.PixmapCache.getIcon("virustotal.png"),
+                              self.tr("&VirusTotal"))
+        vtMenu.addAction(self.virustotalScanCurrentAct)
+        vtMenu.addAction(self.virustotalIpReportAct)
+        vtMenu.addAction(self.virustotalDomainReportAct)
+        
+        self.__superMenu.addSeparator()
+        self.__superMenu.addAction(self.aboutAct)
+        self.__superMenu.addAction(self.aboutQtAct)
+        self.__superMenu.addSeparator()
+        self.__superMenu.addAction(self.exitAct)
+        
+        self.__navigationBar.superMenuButton().setMenu(self.__superMenu)
+    
     def __initToolbars(self):
         """
         Private method to create the toolbars.
         """
-        # save references to toolbars in order to hide them
-        # when going full screen
-        self.__toolbars = []
-        
         filetb = self.addToolBar(self.tr("File"))
         filetb.setObjectName("FileToolBar")
         filetb.setIconSize(UI.Config.ToolBarIconSize)
@@ -2014,7 +2196,7 @@
             filetb.addSeparator()
         filetb.addAction(self.closeAct)
         filetb.addAction(self.exitAct)
-        self.__toolbars.append(filetb)
+        self.__toolbars["file"] = (filetb.windowTitle(), filetb)
         
         self.savePageScreenMenu = QMenu(self)
         self.savePageScreenMenu.addAction(self.savePageScreenAct)
@@ -2034,7 +2216,7 @@
         edittb.addAction(self.pasteAct)
         edittb.addSeparator()
         edittb.addAction(self.selectAllAct)
-        self.__toolbars.append(edittb)
+        self.__toolbars["edit"] = (edittb.windowTitle(), edittb)
         
         viewtb = self.addToolBar(self.tr("View"))
         viewtb.setObjectName("ViewToolBar")
@@ -2044,7 +2226,7 @@
         viewtb.addAction(self.zoomOutAct)
         viewtb.addSeparator()
         viewtb.addAction(self.fullScreenAct)
-        self.__toolbars.append(viewtb)
+        self.__toolbars["view"] = (viewtb.windowTitle(), viewtb)
         
         findtb = self.addToolBar(self.tr("Find"))
         findtb.setObjectName("FindToolBar")
@@ -2052,7 +2234,7 @@
         findtb.addAction(self.findAct)
         findtb.addAction(self.findNextAct)
         findtb.addAction(self.findPrevAct)
-        self.__toolbars.append(findtb)
+        self.__toolbars["find"] = (findtb.windowTitle(), findtb)
         
         if WebBrowserWindow._useQtHelp:
             filtertb = self.addToolBar(self.tr("Filter"))
@@ -2066,7 +2248,7 @@
             self.filterCombo.activated[str].connect(
                 self.__filterQtHelpDocumentation)
             self.__setupFilterCombo()
-            self.__toolbars.append(filtertb)
+            self.__toolbars["filter"] = (filtertb.windowTitle(), filtertb)
         
         settingstb = self.addToolBar(self.tr("Settings"))
         settingstb.setObjectName("SettingsToolBar")
@@ -2078,7 +2260,7 @@
         settingstb.addAction(self.personalDataAct)
         settingstb.addAction(self.greaseMonkeyAct)
         settingstb.addAction(self.featurePermissionAct)
-        self.__toolbars.append(settingstb)
+        self.__toolbars["settings"] = (settingstb.windowTitle(), settingstb)
         
         toolstb = self.addToolBar(self.tr("Tools"))
         toolstb.setObjectName("ToolsToolBar")
@@ -2087,37 +2269,23 @@
         toolstb.addAction(self.siteInfoAct)
         toolstb.addSeparator()
         toolstb.addAction(self.synchronizationAct)
-        self.__toolbars.append(toolstb)
+        self.__toolbars["tools"] = (toolstb.windowTitle(), toolstb)
         
         helptb = self.addToolBar(self.tr("Help"))
         helptb.setObjectName("HelpToolBar")
         helptb.setIconSize(UI.Config.ToolBarIconSize)
         helptb.addAction(self.whatsThisAct)
-        self.__toolbars.append(helptb)
+        self.__toolbars["help"] = (helptb.windowTitle(), helptb)
         
         self.addToolBarBreak()
         vttb = self.addToolBar(self.tr("VirusTotal"))
         vttb.setObjectName("VirusTotalToolBar")
         vttb.setIconSize(UI.Config.ToolBarIconSize)
         vttb.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
-        self.virustotalScanCurrentAct = vttb.addAction(
-            UI.PixmapCache.getIcon("virustotal.png"),
-            self.tr("Scan current site"),
-            self.__virusTotalScanCurrentSite)
-        self.virustotalIpReportAct = vttb.addAction(
-            UI.PixmapCache.getIcon("virustotal.png"),
-            self.tr("IP Address Report"),
-            self.__virusTotalIpAddressReport)
-        self.virustotalDomainReportAct = vttb.addAction(
-            UI.PixmapCache.getIcon("virustotal.png"),
-            self.tr("Domain Report"),
-            self.__virusTotalDomainReport)
-        if not Preferences.getWebBrowser("VirusTotalEnabled") or \
-           Preferences.getWebBrowser("VirusTotalServiceKey") == "":
-            self.virustotalScanCurrentAct.setEnabled(False)
-            self.virustotalIpReportAct.setEnabled(False)
-            self.virustotalDomainReportAct.setEnabled(False)
-        self.__toolbars.append(vttb)
+        vttb.addAction(self.virustotalScanCurrentAct)
+        vttb.addAction(self.virustotalIpReportAct)
+        vttb.addAction(self.virustotalDomainReportAct)
+        self.__toolbars["virustotal"] = (vttb.windowTitle(), vttb)
         
     def __nextTab(self):
         """
@@ -2173,7 +2341,7 @@
         
         @param link file to be displayed in the new window (string or QUrl)
         @param addNextTo reference to the browser to open the tab after
-            (HelpBrowser)
+            (WebBrowserView)
         @keyparam background flag indicating to open the tab in the
             background (bool)
         @return reference to the new browser
@@ -3725,6 +3893,47 @@
         """
         return self.__navigationBar.searchEdit().openSearchManager()
     
+    def __createTextEncodingAction(self, codec, defaultCodec, parentMenu):
+        """
+        Private method to create an action for the text encoding menu.
+        
+        @param codec name of the codec to create an action for
+        @type str
+        @param defaultCodec name of the default codec
+        @type str
+        @param parentMenu reference to the parent menu
+        @type QMenu
+        """
+        act = QAction(codec, parentMenu)
+        act.setData(codec)
+        act.setCheckable(True)
+        if defaultCodec == codec:
+            act.setChecked(True)
+        
+        parentMenu.addAction(act)
+    
+    def __createTextEncodingSubmenu(self, title, codecNames, parentMenu):
+        """
+        Private method to create a text encoding sub menu.
+        
+        @param title title of the menu
+        @type str
+        @param codecNames list of codec names for the menu
+        @type list of str
+        @param parentMenu reference to the parent menu
+        @type QMenu
+        """
+        if codecNames:
+            defaultCodec = \
+                QWebEngineSettings.defaultSettings().defaultTextEncoding()\
+                .lower()
+            
+            menu = QMenu(title, parentMenu)
+            for codec in codecNames:
+                self.__createTextEncodingAction(codec, defaultCodec, menu)
+            
+            parentMenu.addMenu(menu)
+    
     def __aboutToShowTextEncodingMenu(self):
         """
         Private slot to populate the text encoding menu.
@@ -3732,8 +3941,11 @@
         self.__textEncodingMenu.clear()
         
         codecs = []
-        for codec in QTextCodec.availableCodecs():
-            codecs.append(str(codec, encoding="utf-8").lower())
+        for mib in QTextCodec.availableMibs():
+            codec = str(QTextCodec.codecForMib(mib).name(),
+                        encoding="utf-8").lower()
+            if codec not in codecs:
+                codecs.append(codec)
         codecs.sort()
         
         defaultTextEncoding = \
@@ -3741,47 +3953,46 @@
         if defaultTextEncoding in codecs:
             currentCodec = defaultTextEncoding
         else:
-            currentCodec = ""
-        
-        isDefaultEncodingUsed = True
-        isoMenu = QMenu(self.tr("ISO"), self.__textEncodingMenu)
-        winMenu = QMenu(self.tr("Windows"), self.__textEncodingMenu)
-        isciiMenu = QMenu(self.tr("ISCII"), self.__textEncodingMenu)
-        uniMenu = QMenu(self.tr("Unicode"), self.__textEncodingMenu)
-        otherMenu = QMenu(self.tr("Other"), self.__textEncodingMenu)
-        ibmMenu = QMenu(self.tr("IBM"), self.__textEncodingMenu)
+            currentCodec = "system"
+        
+        isoCodecs = []
+        winCodecs = []
+        isciiCodecs = []
+        uniCodecs = []
+        ibmCodecs = []
+        otherCodecs = []
         
         for codec in codecs:
-            if codec.startswith(("iso", "latin", "csisolatin")):
-                act = isoMenu.addAction(codec)
-            elif codec.startswith(("windows", "cp1")):
-                act = winMenu.addAction(codec)
+            if codec.startswith(("iso", "latin")):
+                isoCodecs.append(codec)
+            elif codec.startswith(("windows")):
+                winCodecs.append(codec)
             elif codec.startswith("iscii"):
-                act = isciiMenu.addAction(codec)
+                isciiCodecs.append(codec)
             elif codec.startswith("utf"):
-                act = uniMenu.addAction(codec)
-            elif codec.startswith(("ibm", "csibm", "cp")):
-                act = ibmMenu.addAction(codec)
+                uniCodecs.append(codec)
+            elif codec.startswith(("ibm")):
+                ibmCodecs.append(codec)
+            elif codec == "system":
+                self.__createTextEncodingAction(codec, currentCodec,
+                                                self.__textEncodingMenu)
             else:
-                act = otherMenu.addAction(codec)
-            
-            act.setData(codec)
-            act.setCheckable(True)
-            if currentCodec == codec:
-                act.setChecked(True)
-                isDefaultEncodingUsed = False
-        
-        act = self.__textEncodingMenu.addAction(
-            self.tr("Default Encoding"))
-        act.setData("")
-        act.setCheckable(True)
-        act.setChecked(isDefaultEncodingUsed)
-        self.__textEncodingMenu.addMenu(uniMenu)
-        self.__textEncodingMenu.addMenu(isoMenu)
-        self.__textEncodingMenu.addMenu(winMenu)
-        self.__textEncodingMenu.addMenu(ibmMenu)
-        self.__textEncodingMenu.addMenu(isciiMenu)
-        self.__textEncodingMenu.addMenu(otherMenu)
+                otherCodecs.append(codec)
+        
+        if not self.__textEncodingMenu.isEmpty():
+            self.__textEncodingMenu.addSeparator()
+        self.__createTextEncodingSubmenu(self.tr("ISO"), isoCodecs,
+                                         self.__textEncodingMenu)
+        self.__createTextEncodingSubmenu(self.tr("Unicode"), uniCodecs,
+                                         self.__textEncodingMenu)
+        self.__createTextEncodingSubmenu(self.tr("Windows"), winCodecs,
+                                         self.__textEncodingMenu)
+        self.__createTextEncodingSubmenu(self.tr("ISCII"), isciiCodecs,
+                                         self.__textEncodingMenu)
+        self.__createTextEncodingSubmenu(self.tr("IBM"), ibmCodecs,
+                                         self.__textEncodingMenu)
+        self.__createTextEncodingSubmenu(self.tr("Other"), otherCodecs,
+                                         self.__textEncodingMenu)
     
     def __setTextEncoding(self, act):
         """
@@ -3796,6 +4007,143 @@
         else:
             QWebEngineSettings.defaultSettings().setDefaultTextEncoding(codec)
     
+    def __populateToolbarsMenu(self, menu):
+        """
+        Private method to populate the toolbars menu.
+        
+        @param menu reference to the menu to be populated
+        @type QMenu
+        """
+        menu.clear()
+        
+        act = menu.addAction(self.tr("Menu Bar"))
+        act.setCheckable(True)
+        act.setChecked(not self.menuBar().isHidden())
+        act.setData("menubar")
+        
+        act = menu.addAction(self.tr("Bookmarks"))
+        act.setCheckable(True)
+        act.setChecked(not self.__bookmarksToolBar.isHidden())
+        act.setData("bookmarks")
+        
+        act = menu.addAction(self.tr("Status Bar"))
+        act.setCheckable(True)
+        act.setChecked(not self.statusBar().isHidden())
+        act.setData("statusbar")
+        
+        if Preferences.getWebBrowser("ShowToolbars"):
+            menu.addSeparator()
+            for name, (text, tb) in sorted(self.__toolbars.items(),
+                                           key=lambda t: t[1][0]):
+                act = menu.addAction(text)
+                act.setCheckable(True)
+                act.setChecked(not tb.isHidden())
+                act.setData(name)
+            menu.addSeparator()
+            act = menu.addAction(self.tr("&Show all"))
+            act.setData("__SHOW__")
+            act = menu.addAction(self.tr("&Hide all"))
+            act.setData("__HIDE__")
+    
+    def createPopupMenu(self):
+        """
+        Public method to create the toolbars menu for Qt.
+        
+        @return toolbars menu
+        @rtype QMenu
+        """
+        menu = QMenu(self)
+        menu.triggered.connect(self.__TBMenuTriggered)
+        
+        self.__populateToolbarsMenu(menu)
+        
+        return menu
+
+    def __showToolbarsMenu(self):
+        """
+        Private slot to display the Toolbars menu.
+        """
+        self.__populateToolbarsMenu(self.__toolbarsMenu)
+
+    def __TBMenuTriggered(self, act):
+        """
+        Private method to handle the toggle of a toolbar via the Window->
+        Toolbars submenu or the toolbars popup menu.
+        
+        @param act reference to the action that was triggered
+        @type QAction
+        """
+        name = act.data()
+        if name:
+            if name == "bookmarks":
+                # special handling of bookmarks toolbar
+                self.__setBookmarksToolbarVisibility(act.isChecked())
+            
+            elif name == "menubar":
+                # special treatment of the menu bar
+                self.__setMenuBarVisibility(act.isChecked())
+            
+            elif name == "statusbar":
+                # special treatment of the status bar
+                self.__setStatusBarVisible(act.isChecked())
+            
+            elif name == "__SHOW__":
+                for text, tb in list(self.__toolbars.values()):
+                    tb.show()
+            
+            elif name == "__HIDE__":
+                for text, tb in list(self.__toolbars.values()):
+                    tb.hide()
+            
+            else:
+                tb = self.__toolbars[name][1]
+                if act.isChecked():
+                    tb.show()
+                else:
+                    tb.hide()
+    
+    def __setBookmarksToolbarVisibility(self, visible):
+        """
+        Private method to set the visibility of the bookmarks toolbar.
+        
+        @param visible flag indicating the toolbar visibility
+        @type bool
+        """
+        if visible:
+            self.__bookmarksToolBar.show()
+        else:
+            self.__bookmarksToolBar.hide()
+        
+        # save state for next invokation
+        Preferences.setWebBrowser("BookmarksToolBarVisible", visible)
+    
+    def __setMenuBarVisibility(self, visible):
+        """
+        Private method to set the visibility of the menu bar.
+        
+        @param visible flag indicating the menu bar visibility
+        @type bool
+        """
+        if visible:
+            self.menuBar().show()
+            self.__navigationBar.superMenuButton().hide()
+        else:
+            self.menuBar().hide()
+            self.__navigationBar.superMenuButton().show()
+        
+        Preferences.setWebBrowser("MenuBarVisible", visible)
+    
+    def __setStatusBarVisible(self, visible):
+        """
+        Private method to set the visibility of the status bar.
+        
+        @param visible flag indicating the status bar visibility
+        @type bool
+        """
+        self.statusBar().setVisible(visible)
+        
+        Preferences.setWebBrowser("StatusBarVisible", visible)
+    
     def eventMouseButtons(self):
         """
         Public method to get the last recorded mouse buttons.
@@ -4005,8 +4353,10 @@
                 self.statusBar().hide()
                 self.__searchWidget.hide()
                 self.__tabWidget.tabBar().hide()
-                for toolbar in self.__toolbars:
-                    toolbar.hide()
+                if Preferences.getWebBrowser("ShowToolbars"):
+                    for title, toolbar in self.__toolbars.values():
+                        if toolbar is not self.__bookmarksToolBar:
+                            toolbar.hide()
                 self.__navigationBar.exitFullScreenButton().setVisible(True)
                 self.__navigationContainer.hide()
             
@@ -4015,8 +4365,10 @@
                 # leave full screen mode
                 self.setWindowState(self.__windowStates)
                 self.__htmlFullScreen = False
-                self.menuBar().show()
-                self.statusBar().show()
+                if Preferences.getWebBrowser("MenuBarVisible"):
+                    self.menuBar().show()
+                if Preferences.getWebBrowser("StatusBarVisible"):
+                    self.statusBar().show()
                 self.restoreState(self.__toolbarStates)
                 self.__tabWidget.tabBar().show()
                 self.__navigationBar.exitFullScreenButton().setVisible(False)

eric ide

mercurial