eric7/WebBrowser/QtHelp/HelpTocWidget.py

branch
eric7
changeset 8312
800c432b34c8
parent 8218
7c09585bd960
child 8318
962bce857696
diff -r 4e8b98454baa -r 800c432b34c8 eric7/WebBrowser/QtHelp/HelpTocWidget.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/WebBrowser/QtHelp/HelpTocWidget.py	Sat May 15 18:45:04 2021 +0200
@@ -0,0 +1,179 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2009 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a window for showing the QtHelp TOC.
+"""
+
+from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QUrl
+from PyQt5.QtWidgets import QWidget, QVBoxLayout, QMenu, QApplication
+
+
+class HelpTocWidget(QWidget):
+    """
+    Class implementing a window for showing the QtHelp TOC.
+    
+    @signal escapePressed() emitted when the ESC key was pressed
+    @signal openUrl(QUrl, str) emitted to open an entry in the current tab
+    @signal newTab(QUrl, str) emitted to open an entry in a new tab
+    @signal newBackgroundTab(QUrl, str) emitted to open an entry in a
+        new background tab
+    @signal newWindow(QUrl, str) emitted to open an entry in a new window
+    """
+    escapePressed = pyqtSignal()
+    openUrl = pyqtSignal(QUrl)
+    newTab = pyqtSignal(QUrl)
+    newBackgroundTab = pyqtSignal(QUrl)
+    newWindow = pyqtSignal(QUrl)
+    
+    def __init__(self, engine, parent=None):
+        """
+        Constructor
+        
+        @param engine reference to the help engine (QHelpEngine)
+        @param parent reference to the parent widget (QWidget)
+        """
+        super().__init__(parent)
+        
+        self.__engine = engine
+        self.__expandDepth = -2
+        
+        self.__tocWidget = self.__engine.contentWidget()
+        self.__tocWidget.setContextMenuPolicy(
+            Qt.ContextMenuPolicy.CustomContextMenu)
+        self.__tocWidget.setSortingEnabled(True)
+        
+        self.__layout = QVBoxLayout(self)
+        self.__layout.addWidget(self.__tocWidget)
+        
+        self.__tocWidget.customContextMenuRequested.connect(
+            self.__showContextMenu)
+        self.__tocWidget.linkActivated.connect(self.__linkActivated)
+        
+        model = self.__tocWidget.model()
+        model.contentsCreated.connect(self.__contentsCreated)
+    
+    @pyqtSlot(QUrl)
+    def __linkActivated(self, url):
+        """
+        Private slot handling the activation of an entry.
+        
+        @param url URL of the activated entry
+        @type QUrl
+        """
+        if not url.isEmpty() and url.isValid():
+            buttons = QApplication.mouseButtons()
+            modifiers = QApplication.keyboardModifiers()
+            
+            if buttons & Qt.MouseButton.MidButton:
+                self.newTab.emit(url)
+            else:
+                if (
+                    modifiers & (
+                        Qt.KeyboardModifier.ControlModifier |
+                        Qt.KeyboardModifier.ShiftModifier
+                    ) == (
+                        Qt.KeyboardModifier.ControlModifier |
+                        Qt.KeyboardModifier.ShiftModifier
+                    )
+                ):
+                    self.newBackgroundTab.emit(url)
+                elif modifiers & Qt.KeyboardModifier.ControlModifier:
+                    self.newTab.emit(url)
+                elif modifiers & Qt.KeyboardModifier.ShiftModifier:
+                    self.newWindow.emit(url)
+                else:
+                    self.openUrl.emit(url)
+    
+    def __contentsCreated(self):
+        """
+        Private slot to be run after the contents was generated.
+        """
+        self.__tocWidget.sortByColumn(0, Qt.SortOrder.AscendingOrder)
+        self.__expandTOC()
+    
+    def __expandTOC(self):
+        """
+        Private slot to expand the table of contents.
+        """
+        if self.__expandDepth > -2:
+            self.expandToDepth(self.__expandDepth)
+            self.__expandDepth = -2
+    
+    def expandToDepth(self, depth):
+        """
+        Public slot to expand the table of contents to a specific depth.
+        
+        @param depth depth to expand to (integer)
+        """
+        self.__expandDepth = depth
+        if depth == -1:
+            self.__tocWidget.expandAll()
+        else:
+            self.__tocWidget.expandToDepth(depth)
+    
+    def focusInEvent(self, evt):
+        """
+        Protected method handling focus in events.
+        
+        @param evt reference to the focus event object (QFocusEvent)
+        """
+        if evt.reason() != Qt.FocusReason.MouseFocusReason:
+            self.__tocWidget.setFocus()
+    
+    def keyPressEvent(self, evt):
+        """
+        Protected method handling key press events.
+        
+        @param evt reference to the key press event (QKeyEvent)
+        """
+        if evt.key() == Qt.Key.Key_Escape:
+            self.escapePressed.emit()
+    
+    def syncToContent(self, url):
+        """
+        Public method to sync the TOC to the displayed page.
+        
+        @param url URL of the displayed page (QUrl)
+        @return flag indicating a successful synchronization (boolean)
+        """
+        idx = self.__tocWidget.indexOf(url)
+        if not idx.isValid():
+            return False
+        self.__tocWidget.setCurrentIndex(idx)
+        return True
+    
+    def __showContextMenu(self, pos):
+        """
+        Private slot showing the context menu.
+        
+        @param pos position to show the menu at (QPoint)
+        """
+        if not self.__tocWidget.indexAt(pos).isValid():
+            return
+        
+        model = self.__tocWidget.model()
+        itm = model.contentItemAt(self.__tocWidget.currentIndex())
+        link = itm.url()
+        if link.isEmpty() or not link.isValid():
+            return
+        
+        menu = QMenu()
+        curTab = menu.addAction(self.tr("Open Link"))
+        newTab = menu.addAction(self.tr("Open Link in New Tab"))
+        newBackgroundTab = menu.addAction(
+            self.tr("Open Link in Background Tab"))
+        newWindow = menu.addAction(self.tr("Open Link in New Window"))
+        menu.move(self.__tocWidget.mapToGlobal(pos))
+        
+        act = menu.exec()
+        if act == curTab:
+            self.openUrl.emit(link)
+        elif act == newTab:
+            self.newTab.emit(link)
+        elif act == newBackgroundTab:
+            self.newBackgroundTab.emit(link)
+        elif act == newWindow:
+            self.newWindow.emit(link)

eric ide

mercurial