src/eric7/PdfViewer/PdfSearchWidget.py

branch
pdf_viewer
changeset 9706
c0ff0b4d5657
parent 9704
6e1650b9b3b5
child 9707
717f95e35ca8
equal deleted inserted replaced
9705:7629a6f23b2e 9706:c0ff0b4d5657
22 """ 22 """
23 Class implementing a widget to show the search results. 23 Class implementing a widget to show the search results.
24 24
25 @signal rowCountChanged() emitted to indicate a change of the number 25 @signal rowCountChanged() emitted to indicate a change of the number
26 of items 26 of items
27 @signal searchNextAvailable(bool) emitted to indicate the availability of
28 search results after the current one
29 @signal searchPrevAvailable(bool) emitted to indicate the availability of
30 search results before the current one
27 """ 31 """
28 32
29 rowCountChanged = pyqtSignal() 33 rowCountChanged = pyqtSignal()
34 searchNextAvailable = pyqtSignal(bool)
35 searchPrevAvailable = pyqtSignal(bool)
30 36
31 def __init__(self, parent=None): 37 def __init__(self, parent=None):
32 """ 38 """
33 Constructor 39 Constructor
34 40
46 52
47 self.__searchModel = QPdfSearchModel(self) 53 self.__searchModel = QPdfSearchModel(self)
48 self.__searchModel.modelReset.connect(self.__clear) 54 self.__searchModel.modelReset.connect(self.__clear)
49 self.__searchModel.rowsInserted.connect(self.__rowsInserted) 55 self.__searchModel.rowsInserted.connect(self.__rowsInserted)
50 56
57 self.currentItemChanged.connect(self.__handleCurrentItemChanged)
58
51 def setSearchString(self, searchString): 59 def setSearchString(self, searchString):
52 """ 60 """
53 Public method to set the search string. 61 Public method to set the search string.
54 62
55 @param searchString search string 63 @param searchString search string
88 def __clear(self): 96 def __clear(self):
89 """ 97 """
90 Private slot to clear the list of search results. 98 Private slot to clear the list of search results.
91 """ 99 """
92 self.clear() 100 self.clear()
101
93 self.rowCountChanged.emit() 102 self.rowCountChanged.emit()
103 self.searchNextAvailable.emit(False)
104 self.searchPrevAvailable.emit(False)
94 105
95 @pyqtSlot(QModelIndex, int, int) 106 @pyqtSlot(QModelIndex, int, int)
96 def __rowsInserted(self, parent, first, last): 107 def __rowsInserted(self, parent, first, last):
97 """ 108 """
98 Private slot to handle the insertion of rows of the search model. 109 Private slot to handle the insertion of rows of the search model.
141 152
142 for column in range(self.columnCount()): 153 for column in range(self.columnCount()):
143 self.resizeColumnToContents(column) 154 self.resizeColumnToContents(column)
144 155
145 self.rowCountChanged.emit() 156 self.rowCountChanged.emit()
157 self.searchNextAvailable.emit(True)
146 158
147 def rowCount(self): 159 def rowCount(self):
148 """ 160 """
149 Public method to get the number of rows. 161 Public method to get the number of rows.
150 162
201 @rtype QPdfLink 213 @rtype QPdfLink
202 """ 214 """
203 row = self.indexOfTopLevelItem(item) 215 row = self.indexOfTopLevelItem(item)
204 return self.__searchModel.resultAtIndex(row) 216 return self.__searchModel.resultAtIndex(row)
205 217
218 @pyqtSlot()
219 def __handleCurrentItemChanged(self):
220 """
221 Private slot to handle a change of the current item.
222 """
223 hasSearchResults = bool(self.topLevelItemCount())
224 currentRow = self.currentRow()
225 self.searchPrevAvailable.emit(hasSearchResults and currentRow > 0)
226 self.searchNextAvailable.emit(
227 hasSearchResults and currentRow < self.topLevelItemCount() - 1
228 )
229
206 230
207 class PdfSearchWidget(QWidget): 231 class PdfSearchWidget(QWidget):
208 """ 232 """
209 Class implementing a Search widget. 233 Class implementing a Search widget.
234
235 @signal searchResultAktivated(QPdfLink) emitted to send the activated search
236 result link
237 @signal searchNextAvailable(bool) emitted to indicate the availability of
238 search results after the current one
239 @signal searchPrevAvailable(bool) emitted to indicate the availability of
240 search results before the current one
210 """ 241 """
211 242
212 searchResultActivated = pyqtSignal(QPdfLink) 243 searchResultActivated = pyqtSignal(QPdfLink)
244 searchNextAvailable = pyqtSignal(bool)
245 searchPrevAvailable = pyqtSignal(bool)
213 246
214 def __init__(self, document, parent=None): 247 def __init__(self, document, parent=None):
215 """ 248 """
216 Constructor 249 Constructor
217 250
269 302
270 self.__resultsWidget.itemActivated.connect(self.__entrySelected) 303 self.__resultsWidget.itemActivated.connect(self.__entrySelected)
271 document.statusChanged.connect(self.__handleDocumentStatus) 304 document.statusChanged.connect(self.__handleDocumentStatus)
272 self.__searchEdit.returnPressed.connect(self.__search) 305 self.__searchEdit.returnPressed.connect(self.__search)
273 self.__searchEdit.textChanged.connect(self.__searchTextChanged) 306 self.__searchEdit.textChanged.connect(self.__searchTextChanged)
274 self.__resultsWidget.rowCountChanged.connect(self.__updateButtons) 307 self.__resultsWidget.searchNextAvailable.connect(self.searchNextAvailable)
275 self.__resultsWidget.currentItemChanged.connect( 308 self.__resultsWidget.searchPrevAvailable.connect(self.searchPrevAvailable)
276 self.__updateButtons 309 self.__resultsWidget.searchNextAvailable.connect(
310 self.__findNextButton.setEnabled
277 ) 311 )
278 self.__findNextButton.clicked.connect(self.__nextResult) 312 self.__resultsWidget.searchPrevAvailable.connect(
279 self.__findPrevButton.clicked.connect(self.__previousResult) 313 self.__findPrevButton.setEnabled
314 )
315 self.__findNextButton.clicked.connect(self.nextResult)
316 self.__findPrevButton.clicked.connect(self.previousResult)
280 317
281 @pyqtSlot(QPdfDocument.Status) 318 @pyqtSlot(QPdfDocument.Status)
282 def __handleDocumentStatus(self, status): 319 def __handleDocumentStatus(self, status):
283 """ 320 """
284 Private slot to handle a change of the document status. 321 Private slot to handle a change of the document status.
311 Private slot to initiate a new search. 348 Private slot to initiate a new search.
312 """ 349 """
313 searchString = self.__searchEdit.text() 350 searchString = self.__searchEdit.text()
314 self.__resultsWidget.setSearchString(searchString) 351 self.__resultsWidget.setSearchString(searchString)
315 352
316 @pyqtSlot()
317 def __updateButtons(self):
318 """
319 Private slot to update the state of the navigation buttons.
320 """
321 hasSearchResults = bool(self.__resultsWidget.rowCount())
322 currentRow = self.__resultsWidget.currentRow()
323 self.__findPrevButton.setEnabled(hasSearchResults and currentRow > 0)
324 self.__findNextButton.setEnabled(
325 hasSearchResults and currentRow < self.__resultsWidget.rowCount() - 2
326 )
327
328 @pyqtSlot(QTreeWidgetItem) 353 @pyqtSlot(QTreeWidgetItem)
329 def __entrySelected(self, item): 354 def __entrySelected(self, item):
330 """ 355 """
331 Private slot to handle the selection of a search result entry. 356 Private slot to handle the selection of a search result entry.
332 357
335 """ 360 """
336 link = self.__resultsWidget.getPdfLink(item) 361 link = self.__resultsWidget.getPdfLink(item)
337 self.searchResultActivated.emit(link) 362 self.searchResultActivated.emit(link)
338 363
339 @pyqtSlot() 364 @pyqtSlot()
340 def __nextResult(self): 365 def nextResult(self):
341 """ 366 """
342 Private slot to activate the next result. 367 Public slot to activate the next result.
343 """ 368 """
344 row = self.__resultsWidget.currentRow() 369 row = self.__resultsWidget.currentRow()
345 if row < self.__resultsWidget.rowCount() - 2: 370 if row < self.__resultsWidget.rowCount() - 1:
346 nextItem = self.__resultsWidget.topLevelItem(row + 1) 371 nextItem = self.__resultsWidget.topLevelItem(row + 1)
347 self.__resultsWidget.setCurrentItem(nextItem) 372 self.__resultsWidget.setCurrentItem(nextItem)
348 self.__entrySelected(nextItem) 373 self.__entrySelected(nextItem)
349 374
350 @pyqtSlot() 375 @pyqtSlot()
351 def __previousResult(self): 376 def previousResult(self):
352 """ 377 """
353 Private slot to activate the previous result. 378 Public slot to activate the previous result.
354 """ 379 """
355 row = self.__resultsWidget.currentRow() 380 row = self.__resultsWidget.currentRow()
356 if row > 0: 381 if row > 0:
357 prevItem = self.__resultsWidget.topLevelItem(row - 1) 382 prevItem = self.__resultsWidget.topLevelItem(row - 1)
358 self.__resultsWidget.setCurrentItem(prevItem) 383 self.__resultsWidget.setCurrentItem(prevItem)
359 self.__entrySelected(prevItem) 384 self.__entrySelected(prevItem)
385
386 @pyqtSlot()
387 def activateSearch(self):
388 """
389 Public slot to 'activate' a search.
390 """
391 self.__searchEdit.setFocus(Qt.FocusReason.OtherFocusReason)
392 self.__searchEdit.selectAll()

eric ide

mercurial