eric6/E5Gui/E5TreeWidget.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2009 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing specialized tree views.
8 """
9
10 from __future__ import unicode_literals
11
12 from PyQt5.QtCore import pyqtSignal, Qt
13 from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QAbstractItemView
14
15
16 class E5TreeWidget(QTreeWidget):
17 """
18 Class implementing an extended tree widget.
19
20 @signal itemControlClicked(QTreeWidgetItem) emitted after a Ctrl-Click
21 on an item
22 @signal itemMiddleButtonClicked(QTreeWidgetItem) emitted after a click
23 of the middle button on an item
24 """
25 ItemsCollapsed = 0
26 ItemsExpanded = 1
27
28 itemControlClicked = pyqtSignal(QTreeWidgetItem)
29 itemMiddleButtonClicked = pyqtSignal(QTreeWidgetItem)
30
31 def __init__(self, parent=None):
32 """
33 Constructor
34
35 @param parent reference to the parent widget (QWidget)
36 """
37 super(E5TreeWidget, self).__init__(parent)
38
39 self.__refreshAllItemsNeeded = True
40 self.__allTreeItems = []
41 self.__showMode = E5TreeWidget.ItemsCollapsed
42
43 self.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
44
45 self.itemChanged.connect(self.__scheduleRefresh)
46
47 def setDefaultItemShowMode(self, mode):
48 """
49 Public method to set the default item show mode.
50
51 @param mode default mode (ItemsCollapsed, ItemsExpanded)
52 """
53 assert mode in [E5TreeWidget.ItemsCollapsed,
54 E5TreeWidget.ItemsExpanded]
55
56 self.__showMode = mode
57
58 def allItems(self):
59 """
60 Public method to get a list of all items.
61
62 @return list of all items (list of QTreeWidgetItem)
63 """
64 if self.__refreshAllItemsNeeded:
65 self.__allTreeItems = []
66 self.__iterateAllItems(None)
67 self.__refreshAllItemsNeeded = False
68
69 return self.__allTreeItems
70
71 def appendToParentItem(self, parent, item):
72 """
73 Public method to append an item to a parent item.
74
75 @param parent text of the parent item (string) or
76 the parent item (QTreeWidgetItem)
77 @param item item to be appended (QTreeWidgetItem)
78 @return flag indicating success (boolean)
79 @exception RuntimeError raised to indicate an illegal type for
80 the parent
81 """
82 if isinstance(parent, QTreeWidgetItem):
83 if parent is None or parent.treeWidget() != self:
84 return False
85 parentItem = parent
86 elif isinstance(parent, str):
87 lst = self.findItems(parent, Qt.MatchExactly)
88 if not lst:
89 return False
90 parentItem = lst[0]
91 if parentItem is None:
92 return False
93 else:
94 raise RuntimeError("illegal type for parent")
95
96 self.__allTreeItems.append(item)
97 parentItem.addChild(item)
98 return True
99
100 def prependToParentItem(self, parent, item):
101 """
102 Public method to prepend an item to a parent item.
103
104 @param parent text of the parent item (string) or
105 the parent item (QTreeWidgetItem)
106 @param item item to be prepended (QTreeWidgetItem)
107 @return flag indicating success (boolean)
108 @exception RuntimeError raised to indicate an illegal type for
109 the parent
110 """
111 if isinstance(parent, QTreeWidgetItem):
112 if parent is None or parent.treeWidget() != self:
113 return False
114 parentItem = parent
115 elif isinstance(parent, str):
116 lst = self.findItems(parent, Qt.MatchExactly)
117 if not lst:
118 return False
119 parentItem = lst[0]
120 if parentItem is None:
121 return False
122 else:
123 raise RuntimeError("illegal type for parent")
124
125 self.__allTreeItems.append(item)
126 parentItem.insertChild(0, item)
127 return True
128
129 def addTopLevelItem(self, item):
130 """
131 Public method to add a top level item.
132
133 @param item item to be added as a top level item (QTreeWidgetItem)
134 """
135 self.__allTreeItems.append(item)
136 super(E5TreeWidget, self).addTopLevelItem(item)
137
138 def addTopLevelItems(self, items):
139 """
140 Public method to add a list of top level items.
141
142 @param items items to be added as top level items
143 (list of QTreeWidgetItem)
144 """
145 self.__allTreeItems.extend(items)
146 super(E5TreeWidget, self).addTopLevelItems(items)
147
148 def insertTopLevelItem(self, index, item):
149 """
150 Public method to insert a top level item.
151
152 @param index index for the insertion (integer)
153 @param item item to be inserted as a top level item (QTreeWidgetItem)
154 """
155 self.__allTreeItems.append(item)
156 super(E5TreeWidget, self).insertTopLevelItem(index, item)
157
158 def insertTopLevelItems(self, index, items):
159 """
160 Public method to insert a list of top level items.
161
162 @param index index for the insertion (integer)
163 @param items items to be inserted as top level items
164 (list of QTreeWidgetItem)
165 """
166 self.__allTreeItems.extend(items)
167 super(E5TreeWidget, self).insertTopLevelItems(index, items)
168
169 def deleteItem(self, item):
170 """
171 Public method to delete an item.
172
173 @param item item to be deleted (QTreeWidgetItem)
174 """
175 if item in self.__allTreeItems:
176 self.__allTreeItems.remove(item)
177
178 self.__refreshAllItemsNeeded = True
179
180 del item
181
182 def deleteItems(self, items):
183 """
184 Public method to delete a list of items.
185
186 @param items items to be deleted (list of QTreeWidgetItem)
187 """
188 for item in items:
189 self.deleteItem(item)
190
191 def filterString(self, filterStr):
192 """
193 Public slot to set a new filter.
194
195 @param filterStr filter to be set (string)
196 """
197 self.expandAll()
198 allItems = self.allItems()
199
200 if filterStr:
201 lFilter = filterStr.lower()
202 for itm in allItems:
203 itm.setHidden(lFilter not in itm.text(0).lower())
204 itm.setExpanded(True)
205 for index in range(self.topLevelItemCount()):
206 self.topLevelItem(index).setHidden(False)
207
208 firstItm = self.topLevelItem(0)
209 belowItm = self.itemBelow(firstItm)
210 topLvlIndex = 0
211 while firstItm:
212 if lFilter in firstItm.text(0).lower():
213 firstItm.setHidden(False)
214 elif not firstItm.parent() and not belowItm:
215 firstItm.setHidden(True)
216 elif not belowItm:
217 break
218 elif not firstItm.parent() and not belowItm.parent():
219 firstItm.setHidden(True)
220
221 topLvlIndex += 1
222 firstItm = self.topLevelItem(topLvlIndex)
223 belowItm = self.itemBelow(firstItm)
224 else:
225 for itm in allItems:
226 itm.setHidden(False)
227 for index in range(self.topLevelItemCount()):
228 self.topLevelItem(index).setHidden(False)
229 if self.__showMode == E5TreeWidget.ItemsCollapsed:
230 self.collapseAll()
231
232 def clear(self):
233 """
234 Public slot to clear the tree.
235 """
236 self.__allTreeItems = []
237 super(E5TreeWidget, self).clear()
238
239 def __scheduleRefresh(self):
240 """
241 Private slot to schedule a refresh of the tree.
242 """
243 self.__refreshAllItemsNeeded = True
244
245 def mousePressEvent(self, evt):
246 """
247 Protected method handling mouse press events.
248
249 @param evt mouse press event (QMouseEvent)
250 """
251 if evt.modifiers() == Qt.ControlModifier and \
252 evt.buttons() == Qt.LeftButton:
253 self.itemControlClicked.emit(self.itemAt(evt.pos()))
254 return
255 elif evt.buttons() == Qt.MidButton:
256 self.itemMiddleButtonClicked.emit(self.itemAt(evt.pos()))
257 return
258 else:
259 super(E5TreeWidget, self).mousePressEvent(evt)
260
261 def __iterateAllItems(self, parent):
262 """
263 Private method to iterate over the child items of the parent.
264
265 @param parent parent item to iterate (QTreeWidgetItem)
266 """
267 if parent:
268 count = parent.childCount()
269 else:
270 count = self.topLevelItemCount()
271
272 for index in range(count):
273 if parent:
274 itm = parent.child(index)
275 else:
276 itm = self.topLevelItem(index)
277
278 if itm.childCount() == 0:
279 self.__allTreeItems.append(itm)
280
281 self.__iterateAllItems(itm)

eric ide

mercurial