--- a/eric7/HelpViewer/HelpViewerWidget.py Tue Oct 19 19:55:21 2021 +0200 +++ b/eric7/HelpViewer/HelpViewerWidget.py Tue Oct 19 19:57:26 2021 +0200 @@ -24,6 +24,9 @@ WEBENGINE_AVAILABLE = False from EricWidgets import EricFileDialog, EricMessageBox +from EricWidgets.EricTextEditSearchWidget import ( + EricTextEditSearchWidget, EricTextEditType +) import UI.PixmapCache import Utilities @@ -167,7 +170,14 @@ self.__buttonLine3.setFrameShadow(QFrame.Shadow.Sunken) self.__navButtonsLayout.addWidget(self.__buttonLine3) - # TODO: add find button to show the find widget + self.__searchButton = QToolButton(self) + self.__searchButton.setIcon(UI.PixmapCache.getIcon("find")) + self.__searchButton.setToolTip( + self.tr("Show or hide the search pane")) + self.__searchButton.setCheckable(True) + self.__searchButton.setChecked(False) + self.__searchButton.clicked.connect(self.showHideSearch) + self.__navButtonsLayout.addWidget(self.__searchButton) self.__navButtonsLayout.addStretch() @@ -193,7 +203,11 @@ ################################################################### - # TODO: addd a search widget (EricTextEditSearchWidget) + self.__searchWidget = EricTextEditSearchWidget( + self, widthForHeight=False, enableClose=True) + self.__layout.addWidget(self.__searchWidget) + self.__searchWidget.closePressed.connect(self.__searchWidgetClosed) + self.__searchWidget.hide() ################################################################### @@ -436,7 +450,7 @@ if url is None: url = QUrl("about:blank") - viewer = self.__newViewer() + viewer, viewerType = self.__newViewer() viewer.setLink(url) cv = self.currentViewer() @@ -450,6 +464,7 @@ self.__helpStack.addWidget(viewer) self.__openPagesList.addPage(viewer, background=background) viewer.setFocus(Qt.FocusReason.OtherFocusReason) + self.__searchWidget.attachTextEdit(viewer, editType=viewerType) return viewer @@ -520,19 +535,22 @@ """ Private method to create a new help viewer. - @return help viewer - @rtype HelpViewerImpl + @return tuple containing the reference to the created help viewer + object and its type + @rtype tuple of (HelpViewerImpl, EricTextEditType) """ if WEBENGINE_AVAILABLE: from .HelpViewerImplQWE import HelpViewerImplQWE viewer = HelpViewerImplQWE(self.__helpEngine, self) + viewerType = EricTextEditType.QWEBENGINEVIEW else: from .HelpViewerImplQTB import HelpViewerImplQTB viewer = HelpViewerImplQTB(self.__helpEngine, self) + viewerType = EricTextEditType.QTEXTBROWSER viewer.zoomChanged.connect(self.__checkActionButtons) - return viewer + return viewer, viewerType def currentViewer(self): """ @@ -791,6 +809,14 @@ self.__checkActionButtons() cv = self.currentViewer() if cv: + self.__searchWidget.attachTextEdit( + cv, + editType=( + EricTextEditType.QWEBENGINEVIEW + if WEBENGINE_AVAILABLE else + EricTextEditType.QTEXTBROWSER + ) + ) cv.setFocus(Qt.FocusReason.OtherFocusReason) ####################################################################### @@ -1138,6 +1164,45 @@ "PdfViewerEnabled")) ####################################################################### + ## Search widget related methods below + ####################################################################### + + @pyqtSlot() + def __searchWidgetClosed(self): + """ + Private slot to handle the closing of the search widget. + """ + self.__searchButton.setChecked(False) + + @pyqtSlot(bool) + def showHideSearch(self, visible): + """ + Public slot to show or hide the search widget. + + @param visible flag indicating to show or hide the search widget + @type bool + """ + self.__searchWidget.setVisible(visible) + if visible: + self.__searchWidget.activate() + else: + self.__searchWidget.deactivate() + + @pyqtSlot() + def searchPrev(self): + """ + Public slot to find the previous occurrence of the current search term. + """ + self.__searchWidget.findPrev() + + @pyqtSlot() + def searchNext(self): + """ + Public slot to find the next occurrence of the current search term. + """ + self.__searchWidget.findNext() + + ####################################################################### ## Utility methods below #######################################################################