Helpviewer/HelpIndexWidget.py

changeset 0
de9c2efb9d02
child 7
c679fb30c8f3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Helpviewer/HelpIndexWidget.py	Mon Dec 28 16:03:33 2009 +0000
@@ -0,0 +1,162 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2009 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a window for showing the QtHelp index.
+"""
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from HelpTopicDialog import HelpTopicDialog
+
+class HelpIndexWidget(QWidget):
+    """
+    Class implementing a window for showing the QtHelp index.
+    
+    @signal linkActivated(const QUrl&) emitted when an index  entry is activated
+    @signal escapePressed() emitted when the ESC key was pressed
+    """
+    def __init__(self, engine, mainWindow, parent = None):
+        """
+        Constructor
+        
+        @param engine reference to the help engine (QHelpEngine)
+        @param mainWindow reference to the main window object (QMainWindow)
+        @param parent reference to the parent widget (QWidget)
+        """
+        QWidget.__init__(self, parent)
+        
+        self.__engine = engine
+        self.__mw = mainWindow
+        
+        self.__searchEdit = None
+        self.__index = None
+        
+        self.__layout = QVBoxLayout(self)
+        l = QLabel(self.trUtf8("&Look for:"))
+        self.__layout.addWidget(l)
+        
+        self.__searchEdit = QLineEdit()
+        l.setBuddy(self.__searchEdit)
+        self.connect(self.__searchEdit, SIGNAL("textChanged(QString)"), 
+                     self.__filterIndices)
+        self.__searchEdit.installEventFilter(self)
+        self.__layout.addWidget(self.__searchEdit)
+        
+        self.__index = self.__engine.indexWidget()
+        self.__index.installEventFilter(self)
+        self.connect(self.__engine.indexModel(), SIGNAL("indexCreationStarted()"), 
+                     self.__disableSearchEdit)
+        self.connect(self.__engine.indexModel(), SIGNAL("indexCreated()"), 
+                     self.__enableSearchEdit)
+        self.connect(self.__index, SIGNAL("linkActivated(const QUrl&, const QString&)"), 
+                     self, SIGNAL("linkActivated(const QUrl&)"))
+        self.connect(self.__index, 
+                     SIGNAL("linksActivated(const QMap<QString, QUrl>&, const QString&)"),
+                     self, 
+                     SIGNAL("linksActivated(const QMap<QString, QUrl>&, const QString&)"))
+        self.connect(self.__searchEdit, SIGNAL("returnPressed()"), 
+                     self.__index, SLOT("activateCurrentItem()"))
+        self.__layout.addWidget(self.__index)
+        
+        self.__index.viewport().installEventFilter(self)
+    
+    def __filterIndices(self, filter):
+        """
+        Private slot to filter the indices according to the given filter.
+        
+        @param filter filter to be used (string)
+        """
+        if '*' in filter:
+            self.__index.filterIndices(filter, filter)
+        else:
+            self.__index.filterIndices(filter)
+    
+    def __enableSearchEdit(self):
+        """
+        Private slot to enable the search edit.
+        """
+        self.__searchEdit.setEnabled(True)
+        self.__filterIndices(self.__searchEdit.text())
+    
+    def __disableSearchEdit(self):
+        """
+        Private slot to enable the search edit.
+        """
+        self.__searchEdit.setEnabled(False)
+    
+    def focusInEvent(self, evt):
+        """
+        Protected method handling focus in events.
+        
+        @param evt reference to the focus event object (QFocusEvent)
+        """
+        if evt.reason() != Qt.MouseFocusReason:
+            self.__searchEdit.selectAll()
+            self.__searchEdit.setFocus()
+    
+    def eventFilter(self, watched, event):
+        """
+        Public method called to filter the event queue.
+        
+        @param watched the QObject being watched (QObject)
+        @param event the event that occurred (QEvent)
+        @return flag indicating whether the event was handled (boolean)
+        """
+        if self.__searchEdit and watched == self.__searchEdit and \
+           event.type() == QEvent.KeyPress:
+            idx = self.__index.currentIndex()
+            if event.key() == Qt.Key_Up:
+                idx = self.__index.model().index(
+                    idx.row() - 1, idx.column(), idx.parent())
+                if idx.isValid():
+                    self.__index.setCurrentIndex(idx)
+            elif event.key() == Qt.Key_Down:
+                idx = self.__index.model().index(
+                    idx.row() + 1, idx.column(), idx.parent())
+                if idx.isValid():
+                    self.__index.setCurrentIndex(idx)
+            elif event.key() == Qt.Key_Escape:
+                self.emit(SIGNAL("escapePressed()"))
+        elif self.__index and watched == self.__index and \
+             event.type() == QEvent.ContextMenu:
+            idx = self.__index.indexAt(event.pos())
+            if idx.isValid():
+                menu = QMenu()
+                curTab = menu.addAction(self.trUtf8("Open Link"))
+                newTab = menu.addAction(self.trUtf8("Open Link in New Tab"))
+                menu.move(self.__index.mapToGlobal(event.pos()))
+                
+                act = menu.exec_()
+                if act == curTab:
+                    self.__index.activateCurrentItem()
+                elif act == newTab:
+                    model = self.__index.model()
+                    if model is not None:
+                        keyword = model.data(idx, Qt.DisplayRole).toString()
+                        links = model.linksForKeyword(keyword)
+                        if len(links) == 1:
+                            self.__mw.newTab(links.values()[0])
+                        elif len(links) > 1:
+                            dlg = HelpTopicDialog(self, keyword, links)
+                            if dlg.exec_() == QDialog.Accepted:
+                                self.__mw.newTab(dlg.link())
+        elif self.__index and watched == self.__index.viewport() and \
+             event.type() == QEvent.MouseButtonRelease:
+            idx = self.__index.indexAt(event.pos())
+            if idx.isValid() and event.button() == Qt.MidButton:
+                model = self.__index.model()
+                if model is not None:
+                    keyword = model.data(idx, Qt.DisplayRole).toString()
+                    links = model.linksForKeyword(keyword)
+                    if len(links) == 1:
+                        self.__mw.newTab(links.values()[0])
+                    elif len(links) > 1:
+                        dlg = HelpTopicDialog(self, keyword, links)
+                        if dlg.exec_() == QDialog.Accepted:
+                            self.__mw.newTab(dlg.link())
+        
+        return QWidget.eventFilter(self, watched, event)

eric ide

mercurial