--- 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()