treeData.py (9041B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\control\treeData.py 2 import collections 3 from signals import Signal 4 5 class TreeData(object): 6 7 def __init__(self, label = None, parent = None, children = None, icon = None, isRemovable = False, settings = None, nodeID = None, **kw): 8 self._label = label 9 self._children = children or [] 10 if isinstance(self._children, tuple): 11 self._children = list(self._children) 12 self._parent = parent 13 if parent: 14 parent.AddChild(self) 15 for child in self._children: 16 child._parent = self 17 18 self._kw = kw 19 self._node_id = nodeID 20 self._icon = icon 21 self._isRemovable = isRemovable 22 self._settings = settings 23 self._is_selected = False 24 self._is_expanded = False 25 self._ConstructSignals() 26 27 def _ConstructSignals(self): 28 self.on_created = Signal('on_created') 29 self.on_destroyed = Signal('on_destroyed') 30 self.on_click = Signal('on_click') 31 self.on_dbl_click = Signal('on_dbl_click') 32 self.on_mouse_down = Signal('on_mouse_down') 33 self.on_mouse_up = Signal('on_mouse_up') 34 self.on_mouse_enter = Signal('on_mouse_enter') 35 self.on_mouse_exit = Signal('on_mouse_exit') 36 self.on_drop_data = Signal('on_drop_data') 37 self.on_drag_enter = Signal('on_drag_enter') 38 self.on_drag_exit = Signal('on_drag_exit') 39 self.on_selected = Signal('on_selected') 40 self.on_deselected = Signal('on_deselected') 41 self.on_descendant_selected = Signal('on_descendant_selected') 42 self.on_descendant_deselected = Signal('on_descendant_deselected') 43 self.on_expanded = Signal('on_expanded') 44 self.on_collapsed = Signal('on_collapsed') 45 self.on_click.connect(self._trigger_root_node_on_click) 46 self.on_dbl_click.connect(self._trigger_root_node_on_dbl_click) 47 self.on_selected.connect(self._trigger_root_node_on_selected) 48 self.on_deselected.connect(self._trigger_root_node_on_deselected) 49 self.on_expanded.connect(self._trigger_root_node_on_expanded) 50 self.on_collapsed.connect(self._trigger_root_node_on_collapsed) 51 52 def _trigger_root_node_on_click(self, node): 53 if not self.IsRoot(): 54 self.GetRootNode().on_click(node) 55 56 def _trigger_root_node_on_dbl_click(self, node): 57 if not self.IsRoot(): 58 self.GetRootNode().on_dbl_click(node) 59 60 def _trigger_root_node_on_selected(self, node, animate = True): 61 if not self.IsRoot(): 62 self.parent._on_descendant_selected(node, animate) 63 64 def _on_descendant_selected(self, node, animate): 65 if self.IsRoot(): 66 self.on_selected(node, animate) 67 else: 68 self.parent._on_descendant_selected(node, animate) 69 self.on_descendant_selected(node, animate) 70 71 def _trigger_root_node_on_deselected(self, node, animate = True): 72 if not self.IsRoot(): 73 self.parent._on_descendant_deselected(node, animate) 74 75 def _on_descendant_deselected(self, node, animate): 76 if self.IsRoot(): 77 self.on_deselected(node, animate) 78 else: 79 self.parent._on_descendant_deselected(node, animate) 80 self.on_descendant_deselected(node, animate) 81 82 def _trigger_root_node_on_expanded(self, node, animate = True): 83 if not self.IsRoot(): 84 self.GetRootNode().on_expanded(node, animate) 85 86 def _trigger_root_node_on_collapsed(self, node, animate = True): 87 if not self.IsRoot(): 88 self.GetRootNode().on_collapsed(node, animate) 89 90 def GetSettings(self): 91 return self._settings 92 93 settings = property(GetSettings) 94 95 def GetParent(self): 96 return self._parent 97 98 parent = property(GetParent) 99 100 def IsRoot(self): 101 return not self.parent 102 103 def IsLeaf(self): 104 return not self.GetChildren() 105 106 def GetRootNode(self): 107 if not self.parent: 108 return self 109 return self.parent.GetRootNode() 110 111 def GetLabel(self): 112 return self._label or '' 113 114 def GetIcon(self): 115 return self._icon 116 117 def GetMenu(self): 118 return [] 119 120 def GetHint(self): 121 return None 122 123 def GetTooltipPointer(self): 124 return None 125 126 def GetID(self): 127 if self._node_id is not None: 128 return self._node_id 129 else: 130 return (self._label, tuple(self._kw.keys())) 131 132 def GetChildren(self): 133 return self._children 134 135 children = property(GetChildren) 136 137 def AddChild(self, child): 138 if child not in self._children: 139 self._children.append(child) 140 child._parent = self 141 142 def AddNode(self, label = None, children = None, icon = None, isRemovable = False, settings = None, nodeID = None, **kw): 143 treeData = TreeData(label=label, parent=self, children=children, icon=icon, isRemovable=isRemovable, settings=settings, nodeID=nodeID, **kw) 144 self.AddChild(treeData) 145 return treeData 146 147 def RemoveChild(self, child): 148 if child in self._children: 149 self._children.remove(child) 150 151 def GetChildByID(self, dataID, recursive = True): 152 if dataID == self.GetID(): 153 return self 154 if self.IsForceCollapsed(): 155 return None 156 children = self.GetChildren() 157 for child in children: 158 if child.GetID() == dataID: 159 return child 160 161 for child in children: 162 ret = child.GetChildByID(dataID) 163 if ret: 164 return ret 165 166 def GetSelected(self): 167 return self._GetSelected([]) 168 169 def _GetSelected(self, ret): 170 if self.IsSelected(): 171 ret.append(self) 172 for child in self._children: 173 child._GetSelected(ret) 174 175 return ret 176 177 def IsDraggable(self): 178 return False 179 180 def HasChildren(self): 181 return bool(self._children) 182 183 def IsRemovable(self): 184 return self._isRemovable 185 186 def IsForceCollapsed(self): 187 return False 188 189 def GetPathToDescendant(self, dataID, forceGetChildren = False): 190 if self.GetID() == dataID: 191 return [self] 192 if self.HasChildren(): 193 if not forceGetChildren and self.IsForceCollapsed(): 194 return None 195 for child in self.GetChildren(): 196 found = child.GetPathToDescendant(dataID, forceGetChildren) 197 if found: 198 return [self] + found 199 200 def GetAncestors(self): 201 parent = self.GetParent() 202 if parent: 203 ancestors = parent.GetAncestors() 204 ancestors.append(parent) 205 return ancestors 206 else: 207 return [] 208 209 def IsAncestor(self, node): 210 return node in self.GetAncestors() 211 212 def GetDescendants(self, forceGetChildren = False): 213 ret = collections.OrderedDict() 214 if self.HasChildren(): 215 if not forceGetChildren and self.IsForceCollapsed(): 216 return {} 217 for child in self.GetChildren(): 218 ret[child.GetID()] = child 219 ret.update(child.GetDescendants()) 220 221 return ret 222 223 def IsDescendantOf(self, invID): 224 parent = self.GetParent() 225 if not parent: 226 return False 227 if invID == parent.GetID(): 228 return True 229 return parent.IsDescendantOf(invID) 230 231 def IsSelectable(self): 232 return True 233 234 def SetSelected(self, animate = True): 235 if not self.IsSelectable(): 236 return 237 was_selected = self._is_selected 238 self._is_selected = True 239 if not was_selected: 240 self.on_selected(self, animate) 241 242 def SetDeselected(self, animate = True): 243 was_selected = self._is_selected 244 self._is_selected = False 245 if was_selected: 246 self.on_deselected(self, animate) 247 248 def IsSelected(self): 249 return self._is_selected 250 251 def SetExpanded(self, animate = True): 252 was_expaned = self._is_expanded 253 self._is_expanded = True 254 if not was_expaned: 255 self.on_expanded(self, animate) 256 257 def SetCollapsed(self, animate = True): 258 was_expaned = self._is_expanded 259 self._is_expanded = False 260 if was_expaned: 261 self.on_collapsed(self, animate) 262 263 def IsExpanded(self): 264 return self._is_expanded 265 266 def ToggleExpanded(self, animate = True): 267 if self.IsExpanded(): 268 self.SetCollapsed(animate) 269 else: 270 self.SetExpanded(animate) 271 272 def IsAnyDescendantSelected(self): 273 if self.IsForceCollapsed(): 274 return False 275 for child in self.GetChildren(): 276 if child.IsSelected() or child.IsAnyDescendantSelected(): 277 return True 278 279 return False 280 281 def DeselectAll(self, animate = True): 282 self.SetDeselected(animate) 283 for child in self.GetChildren(): 284 child.DeselectAll(animate)