NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)