15 |
15 |
16 class EricTreeWidgetItemsState(enum.Enum): |
16 class EricTreeWidgetItemsState(enum.Enum): |
17 """ |
17 """ |
18 Class defining the items expansion state. |
18 Class defining the items expansion state. |
19 """ |
19 """ |
|
20 |
20 COLLAPSED = 0 |
21 COLLAPSED = 0 |
21 EXPANDED = 1 |
22 EXPANDED = 1 |
22 |
23 |
23 |
24 |
24 class EricTreeWidget(QTreeWidget): |
25 class EricTreeWidget(QTreeWidget): |
25 """ |
26 """ |
26 Class implementing an extended tree widget. |
27 Class implementing an extended tree widget. |
27 |
28 |
28 @signal itemControlClicked(QTreeWidgetItem) emitted after a Ctrl-Click |
29 @signal itemControlClicked(QTreeWidgetItem) emitted after a Ctrl-Click |
29 on an item |
30 on an item |
30 @signal itemMiddleButtonClicked(QTreeWidgetItem) emitted after a click |
31 @signal itemMiddleButtonClicked(QTreeWidgetItem) emitted after a click |
31 of the middle button on an item |
32 of the middle button on an item |
32 """ |
33 """ |
|
34 |
33 itemControlClicked = pyqtSignal(QTreeWidgetItem) |
35 itemControlClicked = pyqtSignal(QTreeWidgetItem) |
34 itemMiddleButtonClicked = pyqtSignal(QTreeWidgetItem) |
36 itemMiddleButtonClicked = pyqtSignal(QTreeWidgetItem) |
35 |
37 |
36 def __init__(self, parent=None): |
38 def __init__(self, parent=None): |
37 """ |
39 """ |
38 Constructor |
40 Constructor |
39 |
41 |
40 @param parent reference to the parent widget (QWidget) |
42 @param parent reference to the parent widget (QWidget) |
41 """ |
43 """ |
42 super().__init__(parent) |
44 super().__init__(parent) |
43 |
45 |
44 self.__refreshAllItemsNeeded = True |
46 self.__refreshAllItemsNeeded = True |
45 self.__allTreeItems = [] |
47 self.__allTreeItems = [] |
46 self.__showMode = EricTreeWidgetItemsState.COLLAPSED |
48 self.__showMode = EricTreeWidgetItemsState.COLLAPSED |
47 |
49 |
48 self.setVerticalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel) |
50 self.setVerticalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel) |
49 |
51 |
50 self.itemChanged.connect(self.__scheduleRefresh) |
52 self.itemChanged.connect(self.__scheduleRefresh) |
51 |
53 |
52 def setDefaultItemShowMode(self, mode): |
54 def setDefaultItemShowMode(self, mode): |
53 """ |
55 """ |
54 Public method to set the default item show mode. |
56 Public method to set the default item show mode. |
55 |
57 |
56 @param mode default mode |
58 @param mode default mode |
57 @type EricTreeWidgetItemsState |
59 @type EricTreeWidgetItemsState |
58 """ |
60 """ |
59 self.__showMode = mode |
61 self.__showMode = mode |
60 |
62 |
61 def allItems(self): |
63 def allItems(self): |
62 """ |
64 """ |
63 Public method to get a list of all items. |
65 Public method to get a list of all items. |
64 |
66 |
65 @return list of all items (list of QTreeWidgetItem) |
67 @return list of all items (list of QTreeWidgetItem) |
66 """ |
68 """ |
67 if self.__refreshAllItemsNeeded: |
69 if self.__refreshAllItemsNeeded: |
68 self.__allTreeItems = [] |
70 self.__allTreeItems = [] |
69 self.__iterateAllItems(None) |
71 self.__iterateAllItems(None) |
70 self.__refreshAllItemsNeeded = False |
72 self.__refreshAllItemsNeeded = False |
71 |
73 |
72 return self.__allTreeItems |
74 return self.__allTreeItems |
73 |
75 |
74 def appendToParentItem(self, parent, item): |
76 def appendToParentItem(self, parent, item): |
75 """ |
77 """ |
76 Public method to append an item to a parent item. |
78 Public method to append an item to a parent item. |
77 |
79 |
78 @param parent text of the parent item (string) or |
80 @param parent text of the parent item (string) or |
79 the parent item (QTreeWidgetItem) |
81 the parent item (QTreeWidgetItem) |
80 @param item item to be appended (QTreeWidgetItem) |
82 @param item item to be appended (QTreeWidgetItem) |
81 @return flag indicating success (boolean) |
83 @return flag indicating success (boolean) |
82 @exception RuntimeError raised to indicate an illegal type for |
84 @exception RuntimeError raised to indicate an illegal type for |
83 the parent |
85 the parent |
84 """ |
86 """ |
85 if not isinstance(parent, (QTreeWidgetItem, str)): |
87 if not isinstance(parent, (QTreeWidgetItem, str)): |
86 raise RuntimeError("illegal type for parent") |
88 raise RuntimeError("illegal type for parent") |
87 |
89 |
88 if isinstance(parent, QTreeWidgetItem): |
90 if isinstance(parent, QTreeWidgetItem): |
89 if parent is None or parent.treeWidget() != self: |
91 if parent is None or parent.treeWidget() != self: |
90 return False |
92 return False |
91 parentItem = parent |
93 parentItem = parent |
92 else: |
94 else: |
124 if not lst: |
126 if not lst: |
125 return False |
127 return False |
126 parentItem = lst[0] |
128 parentItem = lst[0] |
127 if parentItem is None: |
129 if parentItem is None: |
128 return False |
130 return False |
129 |
131 |
130 self.__allTreeItems.append(item) |
132 self.__allTreeItems.append(item) |
131 parentItem.insertChild(0, item) |
133 parentItem.insertChild(0, item) |
132 return True |
134 return True |
133 |
135 |
134 def addTopLevelItem(self, item): |
136 def addTopLevelItem(self, item): |
135 """ |
137 """ |
136 Public method to add a top level item. |
138 Public method to add a top level item. |
137 |
139 |
138 @param item item to be added as a top level item (QTreeWidgetItem) |
140 @param item item to be added as a top level item (QTreeWidgetItem) |
139 """ |
141 """ |
140 self.__allTreeItems.append(item) |
142 self.__allTreeItems.append(item) |
141 super().addTopLevelItem(item) |
143 super().addTopLevelItem(item) |
142 |
144 |
143 def addTopLevelItems(self, items): |
145 def addTopLevelItems(self, items): |
144 """ |
146 """ |
145 Public method to add a list of top level items. |
147 Public method to add a list of top level items. |
146 |
148 |
147 @param items items to be added as top level items |
149 @param items items to be added as top level items |
148 (list of QTreeWidgetItem) |
150 (list of QTreeWidgetItem) |
149 """ |
151 """ |
150 self.__allTreeItems.extend(items) |
152 self.__allTreeItems.extend(items) |
151 super().addTopLevelItems(items) |
153 super().addTopLevelItems(items) |
152 |
154 |
153 def insertTopLevelItem(self, index, item): |
155 def insertTopLevelItem(self, index, item): |
154 """ |
156 """ |
155 Public method to insert a top level item. |
157 Public method to insert a top level item. |
156 |
158 |
157 @param index index for the insertion (integer) |
159 @param index index for the insertion (integer) |
158 @param item item to be inserted as a top level item (QTreeWidgetItem) |
160 @param item item to be inserted as a top level item (QTreeWidgetItem) |
159 """ |
161 """ |
160 self.__allTreeItems.append(item) |
162 self.__allTreeItems.append(item) |
161 super().insertTopLevelItem(index, item) |
163 super().insertTopLevelItem(index, item) |
162 |
164 |
163 def insertTopLevelItems(self, index, items): |
165 def insertTopLevelItems(self, index, items): |
164 """ |
166 """ |
165 Public method to insert a list of top level items. |
167 Public method to insert a list of top level items. |
166 |
168 |
167 @param index index for the insertion (integer) |
169 @param index index for the insertion (integer) |
168 @param items items to be inserted as top level items |
170 @param items items to be inserted as top level items |
169 (list of QTreeWidgetItem) |
171 (list of QTreeWidgetItem) |
170 """ |
172 """ |
171 self.__allTreeItems.extend(items) |
173 self.__allTreeItems.extend(items) |
172 super().insertTopLevelItems(index, items) |
174 super().insertTopLevelItems(index, items) |
173 |
175 |
174 def deleteItem(self, item): |
176 def deleteItem(self, item): |
175 """ |
177 """ |
176 Public method to delete an item. |
178 Public method to delete an item. |
177 |
179 |
178 @param item item to be deleted (QTreeWidgetItem) |
180 @param item item to be deleted (QTreeWidgetItem) |
179 """ |
181 """ |
180 if item in self.__allTreeItems: |
182 if item in self.__allTreeItems: |
181 self.__allTreeItems.remove(item) |
183 self.__allTreeItems.remove(item) |
182 |
184 |
183 self.__refreshAllItemsNeeded = True |
185 self.__refreshAllItemsNeeded = True |
184 |
186 |
185 del item |
187 del item |
186 |
188 |
187 def deleteItems(self, items): |
189 def deleteItems(self, items): |
188 """ |
190 """ |
189 Public method to delete a list of items. |
191 Public method to delete a list of items. |
190 |
192 |
191 @param items items to be deleted (list of QTreeWidgetItem) |
193 @param items items to be deleted (list of QTreeWidgetItem) |
192 """ |
194 """ |
193 for item in items: |
195 for item in items: |
194 self.deleteItem(item) |
196 self.deleteItem(item) |
195 |
197 |
196 def filterString(self, filterStr): |
198 def filterString(self, filterStr): |
197 """ |
199 """ |
198 Public slot to set a new filter. |
200 Public slot to set a new filter. |
199 |
201 |
200 @param filterStr filter to be set (string) |
202 @param filterStr filter to be set (string) |
201 """ |
203 """ |
202 self.expandAll() |
204 self.expandAll() |
203 allItems = self.allItems() |
205 allItems = self.allItems() |
204 |
206 |
205 if filterStr: |
207 if filterStr: |
206 lFilter = filterStr.lower() |
208 lFilter = filterStr.lower() |
207 for itm in allItems: |
209 for itm in allItems: |
208 itm.setHidden(lFilter not in itm.text(0).lower()) |
210 itm.setHidden(lFilter not in itm.text(0).lower()) |
209 itm.setExpanded(True) |
211 itm.setExpanded(True) |
210 for index in range(self.topLevelItemCount()): |
212 for index in range(self.topLevelItemCount()): |
211 self.topLevelItem(index).setHidden(False) |
213 self.topLevelItem(index).setHidden(False) |
212 |
214 |
213 firstItm = self.topLevelItem(0) |
215 firstItm = self.topLevelItem(0) |
214 belowItm = self.itemBelow(firstItm) |
216 belowItm = self.itemBelow(firstItm) |
215 topLvlIndex = 0 |
217 topLvlIndex = 0 |
216 while firstItm: |
218 while firstItm: |
217 if lFilter in firstItm.text(0).lower(): |
219 if lFilter in firstItm.text(0).lower(): |
218 firstItm.setHidden(False) |
220 firstItm.setHidden(False) |
219 elif ( |
221 elif not firstItm.parent() and (not belowItm or not belowItm.parent()): |
220 not firstItm.parent() and |
|
221 (not belowItm or not belowItm.parent()) |
|
222 ): |
|
223 firstItm.setHidden(True) |
222 firstItm.setHidden(True) |
224 elif not belowItm: |
223 elif not belowItm: |
225 break |
224 break |
226 |
225 |
227 topLvlIndex += 1 |
226 topLvlIndex += 1 |
228 firstItm = self.topLevelItem(topLvlIndex) |
227 firstItm = self.topLevelItem(topLvlIndex) |
229 belowItm = self.itemBelow(firstItm) |
228 belowItm = self.itemBelow(firstItm) |
230 else: |
229 else: |
231 for itm in allItems: |
230 for itm in allItems: |
232 itm.setHidden(False) |
231 itm.setHidden(False) |
233 for index in range(self.topLevelItemCount()): |
232 for index in range(self.topLevelItemCount()): |
234 self.topLevelItem(index).setHidden(False) |
233 self.topLevelItem(index).setHidden(False) |
235 if self.__showMode == EricTreeWidgetItemsState.COLLAPSED: |
234 if self.__showMode == EricTreeWidgetItemsState.COLLAPSED: |
236 self.collapseAll() |
235 self.collapseAll() |
237 |
236 |
238 def clear(self): |
237 def clear(self): |
239 """ |
238 """ |
240 Public slot to clear the tree. |
239 Public slot to clear the tree. |
241 """ |
240 """ |
242 self.__allTreeItems = [] |
241 self.__allTreeItems = [] |
243 super().clear() |
242 super().clear() |
244 |
243 |
245 def __scheduleRefresh(self): |
244 def __scheduleRefresh(self): |
246 """ |
245 """ |
247 Private slot to schedule a refresh of the tree. |
246 Private slot to schedule a refresh of the tree. |
248 """ |
247 """ |
249 self.__refreshAllItemsNeeded = True |
248 self.__refreshAllItemsNeeded = True |
250 |
249 |
251 def mousePressEvent(self, evt): |
250 def mousePressEvent(self, evt): |
252 """ |
251 """ |
253 Protected method handling mouse press events. |
252 Protected method handling mouse press events. |
254 |
253 |
255 @param evt mouse press event (QMouseEvent) |
254 @param evt mouse press event (QMouseEvent) |
256 """ |
255 """ |
257 if ( |
256 if ( |
258 evt.modifiers() == Qt.KeyboardModifier.ControlModifier and |
257 evt.modifiers() == Qt.KeyboardModifier.ControlModifier |
259 evt.buttons() == Qt.MouseButton.LeftButton |
258 and evt.buttons() == Qt.MouseButton.LeftButton |
260 ): |
259 ): |
261 self.itemControlClicked.emit(self.itemAt(evt.position().toPoint())) |
260 self.itemControlClicked.emit(self.itemAt(evt.position().toPoint())) |
262 return |
261 return |
263 elif evt.buttons() == Qt.MouseButton.MiddleButton: |
262 elif evt.buttons() == Qt.MouseButton.MiddleButton: |
264 self.itemMiddleButtonClicked.emit( |
263 self.itemMiddleButtonClicked.emit(self.itemAt(evt.position().toPoint())) |
265 self.itemAt(evt.position().toPoint())) |
|
266 return |
264 return |
267 else: |
265 else: |
268 super().mousePressEvent(evt) |
266 super().mousePressEvent(evt) |
269 |
267 |
270 def __iterateAllItems(self, parent): |
268 def __iterateAllItems(self, parent): |
271 """ |
269 """ |
272 Private method to iterate over the child items of the parent. |
270 Private method to iterate over the child items of the parent. |
273 |
271 |
274 @param parent parent item to iterate (QTreeWidgetItem) |
272 @param parent parent item to iterate (QTreeWidgetItem) |
275 """ |
273 """ |
276 count = parent.childCount() if parent else self.topLevelItemCount() |
274 count = parent.childCount() if parent else self.topLevelItemCount() |
277 |
275 |
278 for index in range(count): |
276 for index in range(count): |
279 itm = parent.child(index) if parent else self.topLevelItem(index) |
277 itm = parent.child(index) if parent else self.topLevelItem(index) |
280 |
278 |
281 if itm.childCount() == 0: |
279 if itm.childCount() == 0: |
282 self.__allTreeItems.append(itm) |
280 self.__allTreeItems.append(itm) |
283 |
281 |
284 self.__iterateAllItems(itm) |
282 self.__iterateAllItems(itm) |