Tue, 19 Oct 2021 19:57:26 +0200
***
--- a/eric7/EricWidgets/EricTextEditSearchWidget.py Tue Oct 19 19:55:21 2021 +0200 +++ b/eric7/EricWidgets/EricTextEditSearchWidget.py Tue Oct 19 19:57:26 2021 +0200 @@ -9,7 +9,7 @@ import enum -from PyQt6.QtCore import pyqtSlot, Qt, QMetaObject, QSize +from PyQt6.QtCore import pyqtSlot, pyqtSignal, Qt, QMetaObject, QSize from PyQt6.QtGui import QPalette, QBrush, QColor, QTextDocument, QTextCursor from PyQt6.QtWidgets import ( QWidget, QVBoxLayout, QHBoxLayout, QLabel, QComboBox, QCheckBox, @@ -32,7 +32,12 @@ class EricTextEditSearchWidget(QWidget): """ Class implementing a horizontal search widget for QTextEdit. + + @signal closePressed() emitted to indicate the closing of the widget via + the close button """ + closePressed = pyqtSignal() + def __init__(self, parent=None, widthForHeight=True, enableClose=False): """ Constructor @@ -51,7 +56,7 @@ self.__textedit = None self.__texteditType = EricTextEditType.UNKNOWN - self.__findBackwards = True + self.__findBackwards = False self.__defaultBaseColor = ( self.findtextCombo.lineEdit().palette().color( @@ -237,14 +242,34 @@ self.__texteditType = EricTextEditType.UNKNOWN @pyqtSlot() + def activate(self): + """ + Public slot to activate the widget. + """ + self.show() + self.findtextCombo.setFocus( + Qt.FocusReason.ActiveWindowFocusReason) + self.findtextCombo.lineEdit().selectAll() + + @pyqtSlot() + def deactivate(self): + """ + Public slot to deactivate the widget. + """ + if self.__textedit: + self.__textedit.setFocus(Qt.FocusReason.ActiveWindowFocusReason) + if self.closeButton is not None: + self.hide() + self.closePressed.emit() + + @pyqtSlot() def __closeButtonClicked(self): """ Private slot to close the widget. Note: The widget is just hidden. """ - self.__textedit.setFocus(Qt.FocusReason.ActiveWindowFocusReason) - self.hide() + self.deactivate() def keyPressEvent(self, event): """ @@ -258,10 +283,7 @@ modifiers = event.modifiers() if key == Qt.Key.Key_Escape: - self.__textedit.setFocus( - Qt.FocusReason.ActiveWindowFocusReason) - if self.closeButton is not None: - self.hide() + self.deactivate() event.accept() elif key == Qt.Key.Key_F3: @@ -318,6 +340,20 @@ """ self.__find(False) + @pyqtSlot() + def findPrev(self): + """ + Public slot to find the previous occurrence of the current search term. + """ + self.on_findPrevButton_clicked() + + @pyqtSlot() + def findNext(self): + """ + Public slot to find the next occurrence of the current search term. + """ + self.on_findNextButton_clicked() + def __find(self, backwards): """ Private method to search the associated text edit.
--- a/eric7/HelpViewer/HelpViewerImplQTB.py Tue Oct 19 19:55:21 2021 +0200 +++ b/eric7/HelpViewer/HelpViewerImplQTB.py Tue Oct 19 19:57:26 2021 +0200 @@ -348,8 +348,9 @@ @type QKeyEvent """ key = evt.key() - isControlModifier = bool( - evt.modifiers() & Qt.KeyboardModifier.ControlModifier) + isControlModifier = ( + evt.modifiers() == Qt.KeyboardModifier.ControlModifier + ) if ( key == Qt.Key.Key_ZoomIn or @@ -375,6 +376,21 @@ elif key == Qt.Key.Key_Right and isControlModifier: self.forward() evt.accept() + elif key == Qt.Key.Key_F and isControlModifier: + self.__helpViewerWidget.showHideSearch(True) + evt.accept() + elif ( + key == Qt.Key.Key_F3 and + evt.modifiers() == Qt.KeyboardModifier.NoModifier + ): + self.__helpViewerWidget.searchNext() + evt.accept() + elif ( + key == Qt.Key.Key_F3 and + evt.modifiers() == Qt.KeyboardModifier.ShiftModifier + ): + self.__helpViewerWidget.searchPrev() + evt.accept() else: super().keyPressEvent(evt)
--- a/eric7/HelpViewer/HelpViewerImplQWE.py Tue Oct 19 19:55:21 2021 +0200 +++ b/eric7/HelpViewer/HelpViewerImplQWE.py Tue Oct 19 19:57:26 2021 +0200 @@ -407,8 +407,9 @@ @type QKeyEvent """ key = evt.key() - isControlModifier = bool( - evt.modifiers() & Qt.KeyboardModifier.ControlModifier) + isControlModifier = ( + evt.modifiers() == Qt.KeyboardModifier.ControlModifier + ) if ( key == Qt.Key.Key_ZoomIn or @@ -434,6 +435,21 @@ elif key == Qt.Key.Key_Right and isControlModifier: self.forward() evt.accept() + elif key == Qt.Key.Key_F and isControlModifier: + self.__helpViewerWidget.showHideSearch(True) + evt.accept() + elif ( + key == Qt.Key.Key_F3 and + evt.modifiers() == Qt.KeyboardModifier.NoModifier + ): + self.__helpViewerWidget.searchNext() + evt.accept() + elif ( + key == Qt.Key.Key_F3 and + evt.modifiers() == Qt.KeyboardModifier.ShiftModifier + ): + self.__helpViewerWidget.searchPrev() + evt.accept() def _mouseReleaseEvent(self, evt): """
--- 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 #######################################################################