src/eric7/PdfViewer/PdfSearchWidget.py

Fri, 20 Jan 2023 15:50:55 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 20 Jan 2023 15:50:55 +0100
branch
pdf_viewer
changeset 9709
c89fc15ecf56
parent 9707
717f95e35ca8
child 9722
63135ab601e7
permissions
-rw-r--r--

Added an info label to the search widget.

9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de>
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a Search widget.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 from PyQt6.QtCore import Qt, pyqtSlot, QModelIndex, pyqtSignal
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 from PyQt6.QtPdf import QPdfSearchModel, QPdfDocument, QPdfLink
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 from PyQt6.QtWidgets import (
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 QWidget, QVBoxLayout, QLabel, QLineEdit, QHBoxLayout, QToolButton,
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 QAbstractItemView, QTreeWidget, QTreeWidgetItem
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 )
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 from eric7 import Preferences
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 from eric7.EricGui import EricPixmapCache
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 class PdfSearchResultsWidget(QTreeWidget):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 Class implementing a widget to show the search results.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 @signal rowCountChanged() emitted to indicate a change of the number
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 of items
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
27 @signal searchNextAvailable(bool) emitted to indicate the availability of
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
28 search results after the current one
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
29 @signal searchPrevAvailable(bool) emitted to indicate the availability of
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
30 search results before the current one
9707
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
31 @signal searchResult(QPdfLink) emitted to send the link of a search result
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
32 @signal searchCleared() emitted to indicate that the search results have been
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
33 cleared
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 rowCountChanged = pyqtSignal()
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
37 searchNextAvailable = pyqtSignal(bool)
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
38 searchPrevAvailable = pyqtSignal(bool)
9707
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
39 searchResult = pyqtSignal(QPdfLink)
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
40 searchCleared = pyqtSignal()
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 def __init__(self, parent=None):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 Constructor
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @param parent reference to the parent widget (defaults to None)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 @type QWidget (optional)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 super().__init__(parent)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 self.setColumnCount(2)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 self.setHeaderHidden(True)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 self.setAlternatingRowColors(True)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 self.setSortingEnabled(False)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 self.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 self.__searchModel = QPdfSearchModel(self)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 self.__searchModel.modelReset.connect(self.__clear)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 self.__searchModel.rowsInserted.connect(self.__rowsInserted)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
62 self.currentItemChanged.connect(self.__handleCurrentItemChanged)
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
63
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 def setSearchString(self, searchString):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 Public method to set the search string.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 @param searchString search string
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 @type str
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 self.__searchModel.setSearchString(searchString)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 def searchString(self):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 Public method to get the current search string.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 @return search string
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 @rtype str
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 return self.__searchModel.searchString()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 def setDocument(self, document):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 Public method to set the PDF document object to be searched.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 @param document reference to the PDF document object
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 @type QPdfDocument
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 self.__searchModel.setDocument(document)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 def document(self):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 Public method to get the reference to the PDF document object.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 @return reference to the PDF document object
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 @rtype QPdfDocument
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 return self.__searchModel.document()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 @pyqtSlot()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 def __clear(self):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 Private slot to clear the list of search results.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 self.clear()
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
106
9707
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
107 self.searchCleared.emit()
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 self.rowCountChanged.emit()
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
109 self.searchNextAvailable.emit(False)
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
110 self.searchPrevAvailable.emit(False)
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 @pyqtSlot(QModelIndex, int, int)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 def __rowsInserted(self, parent, first, last):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 Private slot to handle the insertion of rows of the search model.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 @param parent reference to the parent index
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 @type QModelIndex
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 @param first first row inserted
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 @type int
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 @param last last row inserted
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 @type int
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 contextLength = Preferences.getPdfViewer("PdfSearchContextLength")
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 for row in range(first, last + 1):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 index = self.__searchModel.index(row, 0)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 itm = QTreeWidgetItem(
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 self,
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 [
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 self.tr("Page {0}").format(
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 self.__searchModel.document().pageLabel(
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 self.__searchModel.data(
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 index, QPdfSearchModel.Role.Page.value
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 )
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 )
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 ),
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 "",
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 ]
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 )
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 contextBefore = self.__searchModel.data(
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 index, QPdfSearchModel.Role.ContextBefore.value
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 )
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 if len(contextBefore) > contextLength:
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 contextBefore = "... {0}".format(contextBefore[-contextLength:])
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 contextAfter = self.__searchModel.data(
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 index, QPdfSearchModel.Role.ContextAfter.value
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 )
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 if len(contextAfter) > contextLength:
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 contextAfter = "{0} ...".format(contextAfter[:contextLength])
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 resultLabel = QLabel(
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 self.tr(
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 "{0}<b>{1}</b>{2}",
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 "context before, search string, context after"
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 ).format(contextBefore, self.searchString(), contextAfter)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 )
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 self.setItemWidget(itm, 1, resultLabel)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158
9707
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
159 if Preferences.getPdfViewer("PdfSearchHighlightAll"):
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
160 self.searchResult.emit(self.__searchModel.resultAtIndex(row))
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
161
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 for column in range(self.columnCount()):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 self.resizeColumnToContents(column)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 self.rowCountChanged.emit()
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
166 self.searchNextAvailable.emit(True)
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 def rowCount(self):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 Public method to get the number of rows.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 @return number of rows
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 @rtype int
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 return self.topLevelItemCount()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 def currentRow(self):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 Public method to get the current row.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 @return current row
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 @rtype int
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 curItem = self.currentItem()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 if curItem is None:
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 return -1
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 else:
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 return self.indexOfTopLevelItem(curItem)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 def setCurrentRow(self, row):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 Public method to set the current row.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 @param row row number to make the current row
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 @type int
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 if 0 <= row < self.topLevelItemCount():
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 self.setCurrentItem(self.topLevelItem(row))
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 def searchResultData(self, item, role):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 Public method to get data of a search result item.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 @param item reference to the search result item
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 @type QTreeWidgetItem
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 @param role item data role
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 @type QPdfSearchModel.Role or Qt.ItemDataRole
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 @return requested data
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 @rtype Any
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 row = self.indexOfTopLevelItem(item)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 index = self.__searchModel.index(row, 0)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 return self.__searchModel.data(index, role)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 def getPdfLink(self, item):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 Public method to get the PDF link associated with a search result item.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 @param item reference to the search result item
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 @type QTreeWidgetItem
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 @return associated PDF link
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 @rtype QPdfLink
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 row = self.indexOfTopLevelItem(item)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 return self.__searchModel.resultAtIndex(row)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
227 @pyqtSlot()
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
228 def __handleCurrentItemChanged(self):
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
229 """
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
230 Private slot to handle a change of the current item.
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
231 """
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
232 hasSearchResults = bool(self.topLevelItemCount())
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
233 currentRow = self.currentRow()
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
234 self.searchPrevAvailable.emit(hasSearchResults and currentRow > 0)
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
235 self.searchNextAvailable.emit(
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
236 hasSearchResults and currentRow < self.topLevelItemCount() - 1
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
237 )
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
238
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 class PdfSearchWidget(QWidget):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 Class implementing a Search widget.
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
243
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
244 @signal searchResultAktivated(QPdfLink) emitted to send the activated search
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
245 result link
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
246 @signal searchNextAvailable(bool) emitted to indicate the availability of
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
247 search results after the current one
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
248 @signal searchPrevAvailable(bool) emitted to indicate the availability of
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
249 search results before the current one
9707
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
250 @signal searchResult(QPdfLink) emitted to send the link of a search result
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
251 @signal searchCleared() emitted to indicate that the search results have been
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
252 cleared
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 searchResultActivated = pyqtSignal(QPdfLink)
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
256 searchNextAvailable = pyqtSignal(bool)
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
257 searchPrevAvailable = pyqtSignal(bool)
9707
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
258 searchResult = pyqtSignal(QPdfLink)
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
259 searchCleared = pyqtSignal()
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 def __init__(self, document, parent=None):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 Constructor
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 @param document reference to the PDF document object
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 @type QPdfDocument
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 @param parent reference to the parent widget (defaults to None)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 @type QWidget (optional)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 super().__init__(parent)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 self.__layout = QVBoxLayout(self)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274 # Line 1: a header label
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 self.__header = QLabel("<h2>{0}</h2>".format(self.tr("Search")))
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 self.__header.setAlignment(Qt.AlignmentFlag.AlignCenter)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 self.__layout.addWidget(self.__header)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 # Line 2: search entry and navigation buttons
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 self.__searchLineLayout = QHBoxLayout()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 self.__searchEdit = QLineEdit(self)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 self.__searchEdit.setPlaceholderText(self.tr("Search ..."))
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 self.__searchEdit.setClearButtonEnabled(True)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 self.__searchLineLayout.addWidget(self.__searchEdit)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 # layout for the navigation buttons
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 self.__buttonsLayout = QHBoxLayout()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 self.__buttonsLayout.setSpacing(0)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 self.__findPrevButton = QToolButton(self)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 self.__findPrevButton.setToolTip(
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 self.tr("Press to move to the previous occurrence")
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 )
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 self.__findPrevButton.setIcon(EricPixmapCache.getIcon("1leftarrow"))
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 self.__buttonsLayout.addWidget(self.__findPrevButton)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 self.__findNextButton = QToolButton(self)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 self.__findNextButton.setToolTip(self.tr("Press to move to the next occurrence"))
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 self.__findNextButton.setIcon(EricPixmapCache.getIcon("1rightarrow"))
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301 self.__buttonsLayout.addWidget(self.__findNextButton)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 self.__searchLineLayout.addLayout(self.__buttonsLayout)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 self.__layout.addLayout(self.__searchLineLayout)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306 self.__resultsWidget = PdfSearchResultsWidget(self)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 self.__resultsWidget.setDocument(document)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 self.__layout.addWidget(self.__resultsWidget)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309
9709
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
310 self.__infoLabel = QLabel(self)
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
311 self.__infoLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
312 self.__layout.addWidget(self.__infoLabel)
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
313
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 self.setLayout(self.__layout)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 self.__searchEdit.setEnabled(False)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 self.__resultsWidget.setEnabled(False)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 self.__findPrevButton.setEnabled(False)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 self.__findNextButton.setEnabled(False)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321 self.__resultsWidget.itemActivated.connect(self.__entrySelected)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 document.statusChanged.connect(self.__handleDocumentStatus)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 self.__searchEdit.returnPressed.connect(self.__search)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 self.__searchEdit.textChanged.connect(self.__searchTextChanged)
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
325 self.__resultsWidget.searchNextAvailable.connect(self.searchNextAvailable)
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
326 self.__resultsWidget.searchPrevAvailable.connect(self.searchPrevAvailable)
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
327 self.__resultsWidget.searchNextAvailable.connect(
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
328 self.__findNextButton.setEnabled
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 )
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
330 self.__resultsWidget.searchPrevAvailable.connect(
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
331 self.__findPrevButton.setEnabled
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
332 )
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
333 self.__findNextButton.clicked.connect(self.nextResult)
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
334 self.__findPrevButton.clicked.connect(self.previousResult)
9707
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
335 self.__resultsWidget.searchCleared.connect(self.searchCleared)
717f95e35ca8 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9706
diff changeset
336 self.__resultsWidget.searchResult.connect(self.searchResult)
9709
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
337 self.__resultsWidget.rowCountChanged.connect(self.__updateInfoLabel)
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
338 self.__resultsWidget.currentItemChanged.connect(self.__updateInfoLabel)
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
339
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
340 self.__updateInfoLabel()
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 @pyqtSlot(QPdfDocument.Status)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 def __handleDocumentStatus(self, status):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 Private slot to handle a change of the document status.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 @param status document status
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 @type QPdfDocument.Status
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 ready = status == QPdfDocument.Status.Ready
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 self.__searchEdit.setEnabled(ready)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353 self.__resultsWidget.setEnabled(ready)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 if not ready:
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 self.__searchEdit.clear()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358 @pyqtSlot(str)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359 def __searchTextChanged(self, text):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 Private slot to handle a change of the search string.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 @param text search string
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364 @type str
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366 if not text:
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367 self.__resultsWidget.setSearchString("")
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
369 @pyqtSlot()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 def __search(self):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372 Private slot to initiate a new search.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 searchString = self.__searchEdit.text()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375 self.__resultsWidget.setSearchString(searchString)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 @pyqtSlot(QTreeWidgetItem)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 def __entrySelected(self, item):
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380 Private slot to handle the selection of a search result entry.
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382 @param index index of the activated entry
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383 @type QModelIndex
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385 link = self.__resultsWidget.getPdfLink(item)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 self.searchResultActivated.emit(link)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388 @pyqtSlot()
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
389 def nextResult(self):
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390 """
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
391 Public slot to activate the next result.
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393 row = self.__resultsWidget.currentRow()
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
394 if row < self.__resultsWidget.rowCount() - 1:
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 nextItem = self.__resultsWidget.topLevelItem(row + 1)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396 self.__resultsWidget.setCurrentItem(nextItem)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
397 self.__entrySelected(nextItem)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
398
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399 @pyqtSlot()
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
400 def previousResult(self):
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
401 """
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
402 Public slot to activate the previous result.
9704
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
403 """
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
404 row = self.__resultsWidget.currentRow()
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
405 if row > 0:
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
406 prevItem = self.__resultsWidget.topLevelItem(row - 1)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
407 self.__resultsWidget.setCurrentItem(prevItem)
6e1650b9b3b5 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
408 self.__entrySelected(prevItem)
9706
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
409
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
410 @pyqtSlot()
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
411 def activateSearch(self):
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
412 """
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
413 Public slot to 'activate' a search.
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
414 """
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
415 self.__searchEdit.setFocus(Qt.FocusReason.OtherFocusReason)
c0ff0b4d5657 PDF Viewer
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9704
diff changeset
416 self.__searchEdit.selectAll()
9709
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
417
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
418 @pyqtSlot()
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
419 def __updateInfoLabel(self):
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
420 """
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
421 Private slot to update the data of the info label.
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
422 """
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
423 rowCount = self.__resultsWidget.rowCount()
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
424 if rowCount:
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
425 currentRow = self.__resultsWidget.currentRow()
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
426 if currentRow == -1: # no result selected yet
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
427 self.__infoLabel.setText(self.tr("%n Result(s)", "", rowCount))
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
428 else:
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
429 self.__infoLabel.setText(
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
430 self.tr("{0} of %n Results", "", rowCount).format(currentRow + 1)
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
431 )
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
432 else:
c89fc15ecf56 Added an info label to the search widget.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9707
diff changeset
433 self.__infoLabel.setText(self.tr("No results"))

eric ide

mercurial