src/eric7/WebBrowser/OpenSearch/OpenSearchEngineModel.py

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

eric ide

mercurial