16 |
16 |
17 class OpenSearchEngineModel(QAbstractTableModel): |
17 class OpenSearchEngineModel(QAbstractTableModel): |
18 """ |
18 """ |
19 Class implementing a model for search engines. |
19 Class implementing a model for search engines. |
20 """ |
20 """ |
|
21 |
21 def __init__(self, manager, parent=None): |
22 def __init__(self, manager, parent=None): |
22 """ |
23 """ |
23 Constructor |
24 Constructor |
24 |
25 |
25 @param manager reference to the search engine manager |
26 @param manager reference to the search engine manager |
26 (OpenSearchManager) |
27 (OpenSearchManager) |
27 @param parent reference to the parent object (QObject) |
28 @param parent reference to the parent object (QObject) |
28 """ |
29 """ |
29 super().__init__(parent) |
30 super().__init__(parent) |
30 |
31 |
31 self.__manager = manager |
32 self.__manager = manager |
32 manager.changed.connect(self.__enginesChanged) |
33 manager.changed.connect(self.__enginesChanged) |
33 |
34 |
34 self.__headers = [ |
35 self.__headers = [ |
35 self.tr("Name"), |
36 self.tr("Name"), |
36 self.tr("Keywords"), |
37 self.tr("Keywords"), |
37 ] |
38 ] |
38 |
39 |
39 def removeRows(self, row, count, parent=None): |
40 def removeRows(self, row, count, parent=None): |
40 """ |
41 """ |
41 Public method to remove entries from the model. |
42 Public method to remove entries from the model. |
42 |
43 |
43 @param row start row (integer) |
44 @param row start row (integer) |
44 @param count number of rows to remove (integer) |
45 @param count number of rows to remove (integer) |
45 @param parent parent index (QModelIndex) |
46 @param parent parent index (QModelIndex) |
46 @return flag indicating success (boolean) |
47 @return flag indicating success (boolean) |
47 """ |
48 """ |
48 if parent is None: |
49 if parent is None: |
49 parent = QModelIndex() |
50 parent = QModelIndex() |
50 |
51 |
51 if parent.isValid(): |
52 if parent.isValid(): |
52 return False |
53 return False |
53 |
54 |
54 if count <= 0: |
55 if count <= 0: |
55 return False |
56 return False |
56 |
57 |
57 if self.rowCount() <= 1: |
58 if self.rowCount() <= 1: |
58 return False |
59 return False |
59 |
60 |
60 lastRow = row + count - 1 |
61 lastRow = row + count - 1 |
61 |
62 |
62 self.beginRemoveRows(parent, row, lastRow) |
63 self.beginRemoveRows(parent, row, lastRow) |
63 |
64 |
64 nameList = self.__manager.allEnginesNames() |
65 nameList = self.__manager.allEnginesNames() |
65 for index in range(row, lastRow + 1): |
66 for index in range(row, lastRow + 1): |
66 self.__manager.removeEngine(nameList[index]) |
67 self.__manager.removeEngine(nameList[index]) |
67 |
68 |
68 return True |
69 return True |
69 |
70 |
70 def rowCount(self, parent=None): |
71 def rowCount(self, parent=None): |
71 """ |
72 """ |
72 Public method to get the number of rows of the model. |
73 Public method to get the number of rows of the model. |
73 |
74 |
74 @param parent parent index (QModelIndex) |
75 @param parent parent index (QModelIndex) |
75 @return number of rows (integer) |
76 @return number of rows (integer) |
76 """ |
77 """ |
77 if parent is None: |
78 if parent is None: |
78 parent = QModelIndex() |
79 parent = QModelIndex() |
79 |
80 |
80 if parent.isValid(): |
81 if parent.isValid(): |
81 return 0 |
82 return 0 |
82 else: |
83 else: |
83 return self.__manager.enginesCount() |
84 return self.__manager.enginesCount() |
84 |
85 |
85 def columnCount(self, parent=None): |
86 def columnCount(self, parent=None): |
86 """ |
87 """ |
87 Public method to get the number of columns of the model. |
88 Public method to get the number of columns of the model. |
88 |
89 |
89 @param parent parent index (QModelIndex) (Unused) |
90 @param parent parent index (QModelIndex) (Unused) |
90 @return number of columns (integer) |
91 @return number of columns (integer) |
91 """ |
92 """ |
92 return 2 |
93 return 2 |
93 |
94 |
94 def flags(self, index): |
95 def flags(self, index): |
95 """ |
96 """ |
96 Public method to get flags for a model cell. |
97 Public method to get flags for a model cell. |
97 |
98 |
98 @param index index of the model cell (QModelIndex) |
99 @param index index of the model cell (QModelIndex) |
99 @return flags (Qt.ItemFlags) |
100 @return flags (Qt.ItemFlags) |
100 """ |
101 """ |
101 if index.column() == 1: |
102 if index.column() == 1: |
102 return ( |
103 return ( |
103 Qt.ItemFlag.ItemIsEnabled | |
104 Qt.ItemFlag.ItemIsEnabled |
104 Qt.ItemFlag.ItemIsSelectable | |
105 | Qt.ItemFlag.ItemIsSelectable |
105 Qt.ItemFlag.ItemIsEditable |
106 | Qt.ItemFlag.ItemIsEditable |
106 ) |
107 ) |
107 else: |
108 else: |
108 return ( |
109 return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable |
109 Qt.ItemFlag.ItemIsEnabled | |
110 |
110 Qt.ItemFlag.ItemIsSelectable |
|
111 ) |
|
112 |
|
113 def data(self, index, role): |
111 def data(self, index, role): |
114 """ |
112 """ |
115 Public method to get data from the model. |
113 Public method to get data from the model. |
116 |
114 |
117 @param index index to get data for (QModelIndex) |
115 @param index index to get data for (QModelIndex) |
118 @param role role of the data to retrieve (integer) |
116 @param role role of the data to retrieve (integer) |
119 @return requested data |
117 @return requested data |
120 """ |
118 """ |
121 if index.row() >= self.__manager.enginesCount() or index.row() < 0: |
119 if index.row() >= self.__manager.enginesCount() or index.row() < 0: |
122 return None |
120 return None |
123 |
121 |
124 engine = self.__manager.engine( |
122 engine = self.__manager.engine(self.__manager.allEnginesNames()[index.row()]) |
125 self.__manager.allEnginesNames()[index.row()]) |
123 |
126 |
|
127 if engine is None: |
124 if engine is None: |
128 return None |
125 return None |
129 |
126 |
130 if index.column() == 0: |
127 if index.column() == 0: |
131 if role == Qt.ItemDataRole.DisplayRole: |
128 if role == Qt.ItemDataRole.DisplayRole: |
132 return engine.name() |
129 return engine.name() |
133 |
130 |
134 elif role == Qt.ItemDataRole.DecorationRole: |
131 elif role == Qt.ItemDataRole.DecorationRole: |
135 image = engine.image() |
132 image = engine.image() |
136 if image.isNull(): |
133 if image.isNull(): |
137 from WebBrowser.WebBrowserWindow import WebBrowserWindow |
134 from WebBrowser.WebBrowserWindow import WebBrowserWindow |
|
135 |
138 icon = WebBrowserWindow.icon(QUrl(engine.imageUrl())) |
136 icon = WebBrowserWindow.icon(QUrl(engine.imageUrl())) |
139 else: |
137 else: |
140 icon = QIcon(QPixmap.fromImage(image)) |
138 icon = QIcon(QPixmap.fromImage(image)) |
141 return icon |
139 return icon |
142 |
140 |
143 elif role == Qt.ItemDataRole.ToolTipRole: |
141 elif role == Qt.ItemDataRole.ToolTipRole: |
144 description = self.tr( |
142 description = self.tr("<strong>Description:</strong> {0}").format( |
145 "<strong>Description:</strong> {0}" |
143 engine.description() |
146 ).format(engine.description()) |
144 ) |
147 if engine.providesSuggestions(): |
145 if engine.providesSuggestions(): |
148 description += "<br/>" |
146 description += "<br/>" |
149 description += self.tr( |
147 description += self.tr( |
150 "<strong>Provides contextual suggestions</strong>") |
148 "<strong>Provides contextual suggestions</strong>" |
151 |
149 ) |
|
150 |
152 return description |
151 return description |
153 elif index.column() == 1: |
152 elif index.column() == 1: |
154 if role in [Qt.ItemDataRole.EditRole, Qt.ItemDataRole.DisplayRole]: |
153 if role in [Qt.ItemDataRole.EditRole, Qt.ItemDataRole.DisplayRole]: |
155 return ",".join(self.__manager.keywordsForEngine(engine)) |
154 return ",".join(self.__manager.keywordsForEngine(engine)) |
156 elif role == Qt.ItemDataRole.ToolTipRole: |
155 elif role == Qt.ItemDataRole.ToolTipRole: |
157 return self.tr( |
156 return self.tr( |
158 "Comma-separated list of keywords that may" |
157 "Comma-separated list of keywords that may" |
159 " be entered in the location bar followed by search terms" |
158 " be entered in the location bar followed by search terms" |
160 " to search with this engine") |
159 " to search with this engine" |
161 |
160 ) |
|
161 |
162 return None |
162 return None |
163 |
163 |
164 def setData(self, index, value, role=Qt.ItemDataRole.EditRole): |
164 def setData(self, index, value, role=Qt.ItemDataRole.EditRole): |
165 """ |
165 """ |
166 Public method to set the data of a model cell. |
166 Public method to set the data of a model cell. |
167 |
167 |
168 @param index index of the model cell (QModelIndex) |
168 @param index index of the model cell (QModelIndex) |
169 @param value value to be set |
169 @param value value to be set |
170 @param role role of the data (integer) |
170 @param role role of the data (integer) |
171 @return flag indicating success (boolean) |
171 @return flag indicating success (boolean) |
172 """ |
172 """ |
173 if not index.isValid() or index.column() != 1: |
173 if not index.isValid() or index.column() != 1: |
174 return False |
174 return False |
175 |
175 |
176 if index.row() >= self.rowCount() or index.row() < 0: |
176 if index.row() >= self.rowCount() or index.row() < 0: |
177 return False |
177 return False |
178 |
178 |
179 if role != Qt.ItemDataRole.EditRole: |
179 if role != Qt.ItemDataRole.EditRole: |
180 return False |
180 return False |
181 |
181 |
182 engineName = self.__manager.allEnginesNames()[index.row()] |
182 engineName = self.__manager.allEnginesNames()[index.row()] |
183 keywords = re.split("[ ,]+", value) |
183 keywords = re.split("[ ,]+", value) |
184 self.__manager.setKeywordsForEngine( |
184 self.__manager.setKeywordsForEngine(self.__manager.engine(engineName), keywords) |
185 self.__manager.engine(engineName), keywords) |
185 |
186 |
|
187 return True |
186 return True |
188 |
187 |
189 def headerData(self, section, orientation, |
188 def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole): |
190 role=Qt.ItemDataRole.DisplayRole): |
|
191 """ |
189 """ |
192 Public method to get the header data. |
190 Public method to get the header data. |
193 |
191 |
194 @param section section number (integer) |
192 @param section section number (integer) |
195 @param orientation header orientation (Qt.Orientation) |
193 @param orientation header orientation (Qt.Orientation) |
196 @param role data role (Qt.ItemDataRole) |
194 @param role data role (Qt.ItemDataRole) |
197 @return header data |
195 @return header data |
198 """ |
196 """ |
199 if ( |
197 if ( |
200 orientation == Qt.Orientation.Horizontal and |
198 orientation == Qt.Orientation.Horizontal |
201 role == Qt.ItemDataRole.DisplayRole |
199 and role == Qt.ItemDataRole.DisplayRole |
202 ): |
200 ): |
203 with contextlib.suppress(IndexError): |
201 with contextlib.suppress(IndexError): |
204 return self.__headers[section] |
202 return self.__headers[section] |
205 |
203 |
206 return None |
204 return None |
207 |
205 |
208 def __enginesChanged(self): |
206 def __enginesChanged(self): |
209 """ |
207 """ |
210 Private slot handling a change of the registered engines. |
208 Private slot handling a change of the registered engines. |
211 """ |
209 """ |
212 self.beginResetModel() |
210 self.beginResetModel() |