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