src/eric7/WebBrowser/OpenSearch/OpenSearchEngineModel.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9413
80c06d472826
equal deleted inserted replaced
9220:e9e7eca7efee 9221:bf71ee032bb4
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()

eric ide

mercurial