E5Gui/E5TextEditSearchWidget.py

branch
maintenance
changeset 5948
6f958d5765f4
parent 5389
9b1c800daff3
child 5949
22657f04f332
equal deleted inserted replaced
5937:cc296ba99a3f 5948:6f958d5765f4
8 """ 8 """
9 9
10 from __future__ import unicode_literals 10 from __future__ import unicode_literals
11 11
12 from PyQt5.QtCore import pyqtSlot, Qt 12 from PyQt5.QtCore import pyqtSlot, Qt
13 from PyQt5.QtGui import QTextDocument 13 from PyQt5.QtGui import QPalette, QBrush, QColor, QTextDocument, QTextCursor
14 from PyQt5.QtWidgets import QWidget 14 from PyQt5.QtWidgets import QWidget
15
16 from E5Gui import E5MessageBox
17 15
18 from .Ui_E5TextEditSearchWidget import Ui_E5TextEditSearchWidget 16 from .Ui_E5TextEditSearchWidget import Ui_E5TextEditSearchWidget
19 17
20 import UI.PixmapCache 18 import UI.PixmapCache
21 19
32 """ 30 """
33 super(E5TextEditSearchWidget, self).__init__(parent) 31 super(E5TextEditSearchWidget, self).__init__(parent)
34 self.setupUi(self) 32 self.setupUi(self)
35 33
36 self.__textedit = None 34 self.__textedit = None
35 self.__texteditType = ""
37 self.__findBackwards = True 36 self.__findBackwards = True
38 37
39 self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow.png")) 38 self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow.png"))
40 self.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow.png")) 39 self.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow.png"))
40
41 self.__defaultBaseColor = \
42 self.findtextCombo.lineEdit().palette().color(QPalette.Base)
43 self.__defaultTextColor = \
44 self.findtextCombo.lineEdit().palette().color(QPalette.Text)
41 45
42 self.findHistory = [] 46 self.findHistory = []
43 47
44 self.findtextCombo.setCompleter(None) 48 self.findtextCombo.setCompleter(None)
45 self.findtextCombo.lineEdit().returnPressed.connect( 49 self.findtextCombo.lineEdit().returnPressed.connect(
46 self.__findByReturnPressed) 50 self.__findByReturnPressed)
47 51
48 self.__setSearchButtons(False) 52 self.__setSearchButtons(False)
53 self.infoLabel.hide()
49 54
50 self.setFocusProxy(self.findtextCombo) 55 self.setFocusProxy(self.findtextCombo)
51 56
52 def attachTextEdit(self, textedit): 57 def attachTextEdit(self, textedit, editType="QTextEdit"):
53 """ 58 """
54 Public method to attach a QTextEdit widget. 59 Public method to attach a QTextEdit widget.
55 60
56 @param textedit reference to the QTextEdit to be attached (QTextEdit) 61 @param textedit reference to the edit widget to be attached
57 """ 62 @type QTextEdit, QWebEngineView or QWebView
63 @param editType type of the attached edit widget
64 @type str (one of "QTextEdit", "QWebEngineView" or "QWebView")
65 """
66 assert editType in ["QTextEdit", "QWebEngineView", "QWebView"]
67
58 self.__textedit = textedit 68 self.__textedit = textedit
69 self.__texteditType = editType
70
71 self.wordCheckBox.setVisible(editType == "QTextEdit")
59 72
60 def keyPressEvent(self, event): 73 def keyPressEvent(self, event):
61 """ 74 """
62 Protected slot to handle key press events. 75 Protected slot to handle key press events.
63 76
73 Private slot to enable/disable the find buttons. 86 Private slot to enable/disable the find buttons.
74 87
75 @param txt text of the combobox (string) 88 @param txt text of the combobox (string)
76 """ 89 """
77 self.__setSearchButtons(txt != "") 90 self.__setSearchButtons(txt != "")
91
92 self.infoLabel.hide()
93 self.__setFindtextComboBackground(False)
78 94
79 def __setSearchButtons(self, enabled): 95 def __setSearchButtons(self, enabled):
80 """ 96 """
81 Private slot to set the state of the search buttons. 97 Private slot to set the state of the search buttons.
82 98
113 @param backwards flag indicating a backwards search (boolean) 129 @param backwards flag indicating a backwards search (boolean)
114 """ 130 """
115 if not self.__textedit: 131 if not self.__textedit:
116 return 132 return
117 133
134 self.infoLabel.clear()
135 self.infoLabel.hide()
136 self.__setFindtextComboBackground(False)
137
118 txt = self.findtextCombo.currentText() 138 txt = self.findtextCombo.currentText()
139 if not txt:
140 return
119 self.__findBackwards = backwards 141 self.__findBackwards = backwards
120 142
121 # This moves any previous occurrence of this statement to the head 143 # This moves any previous occurrence of this statement to the head
122 # of the list and updates the combobox 144 # of the list and updates the combobox
123 if txt in self.findHistory: 145 if txt in self.findHistory:
124 self.findHistory.remove(txt) 146 self.findHistory.remove(txt)
125 self.findHistory.insert(0, txt) 147 self.findHistory.insert(0, txt)
126 self.findtextCombo.clear() 148 self.findtextCombo.clear()
127 self.findtextCombo.addItems(self.findHistory) 149 self.findtextCombo.addItems(self.findHistory)
128 150
151 if self.__texteditType == "QTextEdit":
152 ok = self.__findPrevNextQTextEdit(backwards)
153 self.__findNextPrevCallback(ok)
154 elif self.__texteditType == "QWebEngineView":
155 self.__findPrevNextQWebEngineView(backwards)
156 elif self.__texteditType == "QWebView":
157 ok = self.__findPrevNextQWebView(backwards)
158 self.__findNextPrevCallback(ok)
159
160 def __findPrevNextQTextEdit(self, backwards):
161 """
162 Private method to to search the associated edit widget of
163 type QTextEdit.
164
165 @param backwards flag indicating a backwards search
166 @type bool
167 @return flag indicating the search result
168 @rtype bool
169 """
129 if backwards: 170 if backwards:
130 flags = QTextDocument.FindFlags(QTextDocument.FindBackward) 171 flags = QTextDocument.FindFlags(QTextDocument.FindBackward)
131 else: 172 else:
132 flags = QTextDocument.FindFlags() 173 flags = QTextDocument.FindFlags()
133 if self.caseCheckBox.isChecked(): 174 if self.caseCheckBox.isChecked():
134 flags |= QTextDocument.FindCaseSensitively 175 flags |= QTextDocument.FindCaseSensitively
135 if self.wordCheckBox.isChecked(): 176 if self.wordCheckBox.isChecked():
136 flags |= QTextDocument.FindWholeWords 177 flags |= QTextDocument.FindWholeWords
137 ok = self.__textedit.find(txt, flags) 178
138 179 ok = self.__textedit.find(self.findtextCombo.currentText(), flags)
139 if not ok: 180 if not ok:
140 E5MessageBox.information( 181 # wrap around once
141 self, 182 cursor = self.__textedit.textCursor()
142 self.tr("Find"), 183 if backwards:
143 self.tr("""'{0}' was not found.""").format(txt)) 184 moveOp = QTextCursor.End # move to end of document
185 else:
186 moveOp = QTextCursor.Start # move to start of document
187 cursor.movePosition(moveOp)
188 self.__textedit.setTextCursor(cursor)
189 ok = self.__textedit.find(self.findtextCombo.currentText(), flags)
190
191 return ok
192
193 def __findPrevNextQWebView(self, backwards):
194 """
195 Private method to to search the associated edit widget of
196 type QWebView.
197
198 @param backwards flag indicating a backwards search
199 @type bool
200 @return flag indicating the search result
201 @rtype bool
202 """
203 from PyQt5.QtWebKitWidgets import QWebPage
204
205 findFlags = QWebPage.FindFlags(QWebPage.FindWrapsAroundDocument)
206 if self.caseCheckBox.isChecked():
207 findFlags |= QWebPage.FindCaseSensitively
208 if backwards:
209 findFlags |= QWebPage.FindBackward
210
211 return self.__textedit.findText(self.findtextCombo.currentText(),
212 findFlags)
213
214 def __findPrevNextQWebEngineView(self, backwards):
215 """
216 Private method to to search the associated edit widget of
217 type QWebEngineView.
218
219 @param backwards flag indicating a backwards search
220 @type bool
221 """
222 from PyQt5.QtWebEngineWidgets import QWebEnginePage
223
224 findFlags = QWebEnginePage.FindFlags()
225 if self.caseCheckBox.isChecked():
226 findFlags |= QWebEnginePage.FindCaseSensitively
227 if backwards:
228 findFlags |= QWebEnginePage.FindBackward
229 self.__textedit.findText(self.findtextCombo.currentText(),
230 findFlags, self.__findNextPrevCallback)
231
232 def __findNextPrevCallback(self, found):
233 """
234 Private method to process the result of the last search.
235
236 @param found flag indicating if the last search succeeded
237 @type bool
238 """
239 if not found:
240 txt = self.findtextCombo.currentText()
241 self.infoLabel.setText(
242 self.tr("'{0}' was not found.").format(txt))
243 self.infoLabel.show()
244 self.__setFindtextComboBackground(True)
245
246 def __setFindtextComboBackground(self, error):
247 """
248 Private slot to change the findtext combo background to indicate
249 errors.
250
251 @param error flag indicating an error condition (boolean)
252 """
253 le = self.findtextCombo.lineEdit()
254 p = le.palette()
255 if error:
256 p.setBrush(QPalette.Base, QBrush(QColor("#FF6666")))
257 p.setBrush(QPalette.Text, QBrush(QColor("#000000")))
258 else:
259 p.setBrush(QPalette.Base, self.__defaultBaseColor)
260 p.setBrush(QPalette.Text, self.__defaultTextColor)
261 le.setPalette(p)
262 le.update()

eric ide

mercurial