src/eric7/PdfViewer/PdfSearchWidget.py

branch
pdf_viewer
changeset 9706
c0ff0b4d5657
parent 9704
6e1650b9b3b5
child 9707
717f95e35ca8
--- a/src/eric7/PdfViewer/PdfSearchWidget.py	Wed Jan 18 16:37:08 2023 +0100
+++ b/src/eric7/PdfViewer/PdfSearchWidget.py	Wed Jan 18 16:38:29 2023 +0100
@@ -24,9 +24,15 @@
 
     @signal rowCountChanged() emitted to indicate a change of the number
         of items
+    @signal searchNextAvailable(bool) emitted to indicate the availability of
+        search results after the current one
+    @signal searchPrevAvailable(bool) emitted to indicate the availability of
+        search results before the current one
     """
 
     rowCountChanged = pyqtSignal()
+    searchNextAvailable = pyqtSignal(bool)
+    searchPrevAvailable = pyqtSignal(bool)
 
     def __init__(self, parent=None):
         """
@@ -48,6 +54,8 @@
         self.__searchModel.modelReset.connect(self.__clear)
         self.__searchModel.rowsInserted.connect(self.__rowsInserted)
 
+        self.currentItemChanged.connect(self.__handleCurrentItemChanged)
+
     def setSearchString(self, searchString):
         """
         Public method to set the search string.
@@ -90,7 +98,10 @@
         Private slot to clear the list of search results.
         """
         self.clear()
+
         self.rowCountChanged.emit()
+        self.searchNextAvailable.emit(False)
+        self.searchPrevAvailable.emit(False)
 
     @pyqtSlot(QModelIndex, int, int)
     def __rowsInserted(self, parent, first, last):
@@ -143,6 +154,7 @@
             self.resizeColumnToContents(column)
 
         self.rowCountChanged.emit()
+        self.searchNextAvailable.emit(True)
 
     def rowCount(self):
         """
@@ -203,13 +215,34 @@
         row = self.indexOfTopLevelItem(item)
         return self.__searchModel.resultAtIndex(row)
 
+    @pyqtSlot()
+    def __handleCurrentItemChanged(self):
+        """
+        Private slot to handle a change of the current item.
+        """
+        hasSearchResults = bool(self.topLevelItemCount())
+        currentRow = self.currentRow()
+        self.searchPrevAvailable.emit(hasSearchResults and currentRow > 0)
+        self.searchNextAvailable.emit(
+            hasSearchResults and currentRow < self.topLevelItemCount() - 1
+        )
+
 
 class PdfSearchWidget(QWidget):
     """
     Class implementing a Search widget.
+
+    @signal searchResultAktivated(QPdfLink) emitted to send the activated search
+        result link
+    @signal searchNextAvailable(bool) emitted to indicate the availability of
+        search results after the current one
+    @signal searchPrevAvailable(bool) emitted to indicate the availability of
+        search results before the current one
     """
 
     searchResultActivated = pyqtSignal(QPdfLink)
+    searchNextAvailable = pyqtSignal(bool)
+    searchPrevAvailable = pyqtSignal(bool)
 
     def __init__(self, document, parent=None):
         """
@@ -271,12 +304,16 @@
         document.statusChanged.connect(self.__handleDocumentStatus)
         self.__searchEdit.returnPressed.connect(self.__search)
         self.__searchEdit.textChanged.connect(self.__searchTextChanged)
-        self.__resultsWidget.rowCountChanged.connect(self.__updateButtons)
-        self.__resultsWidget.currentItemChanged.connect(
-            self.__updateButtons
+        self.__resultsWidget.searchNextAvailable.connect(self.searchNextAvailable)
+        self.__resultsWidget.searchPrevAvailable.connect(self.searchPrevAvailable)
+        self.__resultsWidget.searchNextAvailable.connect(
+            self.__findNextButton.setEnabled
         )
-        self.__findNextButton.clicked.connect(self.__nextResult)
-        self.__findPrevButton.clicked.connect(self.__previousResult)
+        self.__resultsWidget.searchPrevAvailable.connect(
+            self.__findPrevButton.setEnabled
+        )
+        self.__findNextButton.clicked.connect(self.nextResult)
+        self.__findPrevButton.clicked.connect(self.previousResult)
 
     @pyqtSlot(QPdfDocument.Status)
     def __handleDocumentStatus(self, status):
@@ -313,18 +350,6 @@
         searchString = self.__searchEdit.text()
         self.__resultsWidget.setSearchString(searchString)
 
-    @pyqtSlot()
-    def __updateButtons(self):
-        """
-        Private slot to update the state of the navigation buttons.
-        """
-        hasSearchResults = bool(self.__resultsWidget.rowCount())
-        currentRow = self.__resultsWidget.currentRow()
-        self.__findPrevButton.setEnabled(hasSearchResults and currentRow > 0)
-        self.__findNextButton.setEnabled(
-            hasSearchResults and currentRow < self.__resultsWidget.rowCount() - 2
-        )
-
     @pyqtSlot(QTreeWidgetItem)
     def __entrySelected(self, item):
         """
@@ -337,23 +362,31 @@
         self.searchResultActivated.emit(link)
 
     @pyqtSlot()
-    def __nextResult(self):
+    def nextResult(self):
         """
-        Private slot to activate the next result.
+        Public slot to activate the next result.
         """
         row = self.__resultsWidget.currentRow()
-        if row < self.__resultsWidget.rowCount() - 2:
+        if row < self.__resultsWidget.rowCount() - 1:
             nextItem = self.__resultsWidget.topLevelItem(row + 1)
             self.__resultsWidget.setCurrentItem(nextItem)
             self.__entrySelected(nextItem)
 
     @pyqtSlot()
-    def __previousResult(self):
+    def previousResult(self):
         """
-        Private slot to activate the previous result.
+        Public slot to activate the previous result.
         """
         row = self.__resultsWidget.currentRow()
         if row > 0:
             prevItem = self.__resultsWidget.topLevelItem(row - 1)
             self.__resultsWidget.setCurrentItem(prevItem)
             self.__entrySelected(prevItem)
+
+    @pyqtSlot()
+    def activateSearch(self):
+        """
+        Public slot to 'activate' a search.
+        """
+        self.__searchEdit.setFocus(Qt.FocusReason.OtherFocusReason)
+        self.__searchEdit.selectAll()

eric ide

mercurial