src/eric7/EricWidgets/EricTreeWidget.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9473
3f23dbf37dbe
equal deleted inserted replaced
9220:e9e7eca7efee 9221:bf71ee032bb4
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:
94 if not lst: 96 if not lst:
95 return False 97 return False
96 parentItem = lst[0] 98 parentItem = lst[0]
97 if parentItem is None: 99 if parentItem is None:
98 return False 100 return False
99 101
100 self.__allTreeItems.append(item) 102 self.__allTreeItems.append(item)
101 parentItem.addChild(item) 103 parentItem.addChild(item)
102 return True 104 return True
103 105
104 def prependToParentItem(self, parent, item): 106 def prependToParentItem(self, parent, item):
105 """ 107 """
106 Public method to prepend an item to a parent item. 108 Public method to prepend an item to a parent item.
107 109
108 @param parent text of the parent item (string) or 110 @param parent text of the parent item (string) or
109 the parent item (QTreeWidgetItem) 111 the parent item (QTreeWidgetItem)
110 @param item item to be prepended (QTreeWidgetItem) 112 @param item item to be prepended (QTreeWidgetItem)
111 @return flag indicating success (boolean) 113 @return flag indicating success (boolean)
112 @exception RuntimeError raised to indicate an illegal type for 114 @exception RuntimeError raised to indicate an illegal type for
113 the parent 115 the parent
114 """ 116 """
115 if not isinstance(parent, (QTreeWidgetItem, str)): 117 if not isinstance(parent, (QTreeWidgetItem, str)):
116 raise RuntimeError("illegal type for parent") 118 raise RuntimeError("illegal type for parent")
117 119
118 if isinstance(parent, QTreeWidgetItem): 120 if isinstance(parent, QTreeWidgetItem):
119 if parent is None or parent.treeWidget() != self: 121 if parent is None or parent.treeWidget() != self:
120 return False 122 return False
121 parentItem = parent 123 parentItem = parent
122 else: 124 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)

eric ide

mercurial