root/trunk/RBSkinning/RBSkinning/wxTools/wxIncrementalTreeModel.py

Revision 733, 6.5 kB (checked in by gwm, 5 years ago)

Completed work on ComposedLayoutDockView?

Line 
1 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 #~ Imports
3 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5 from __future__ import generators
6 import weakref
7 from wxPython import wx
8 from RBFoundation.SubObs.Event import ObjectEventProperty
9
10 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11 #~ Definitions
12 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13
14 class wxTreeItemBehaviorBase(object):
15     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16     #~ Constants / Variables / Etc.
17     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18
19     populated = False
20
21     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22     #~ Public Methods
23     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24
25     def SetTreeModel(self, treemodel):
26         try:
27             self.treemodel = weakref.proxy(treemodel)
28         except TypeError:
29             self.treemodel = treemodel
30         self.populated = False
31
32     def __len__(self):
33         return 0
34
35     def __iter__(self):
36         raise StopIteration
37
38     def SetTreeNode(self, treenode, treewin):
39         self.treenode = treenode
40
41     def GetTreeLabel(self):
42         return repr(self)
43
44     def PopulateNode(self):
45         if not self.populated:
46             self.treemodel.PopulateNodeChildren(self, self.treenode, True)
47
48     #~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
49
50     def OnExpanding(self, evt):
51         self.PopulateNode()
52
53     #def OnDrag(self, evt): pass
54     #def OnRightDrag(self, evt): pass
55     #def OnEndDrag(self, evt): pass
56     #def OnLabelEdit(self, evt): pass
57     #def OnEndLabelEdit(self, evt): pass
58     #def OnActivated(self, evt): pass
59     #def OnRightClick(self, evt): pass
60     #def OnMiddleClick(self, evt): pass
61     #def OnKeyDown(self, evt): pass
62     #def OnDeleteItem(self, evt): pass
63     #def OnCollapsed(self, evt): pass
64     #def OnCollapsing(self, evt): pass
65     #def OnExpanded(self, evt): pass
66     #def OnExpanding(self, evt): pass
67     #def OnSelectionChanged(self, evt): pass
68     #def OnSelectionChanging(self, evt): pass
69
70 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
71
72 class wxIncrementalTreeModel(object):
73     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
74     #~ Events
75     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
76
77     OnAddedNode = ObjectEventProperty() # treemodel, treenode
78     OnCleared = ObjectEventProperty() # treemodel
79
80     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81     #~ Public Methods
82     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
83
84     def __init__(self, treewin=None):
85         self.imagelists = {}
86         if treewin is not None:
87             self.SetTreeWindow(treewin)
88
89     def SetImageList(self, imagelist, kind='normal'):
90         self.imagelists[kind] = imagelist
91         if kind == 'normal':
92             self.treewin.SetImageList(imagelist)
93         elif kind == 'state':
94             self.treewin.SetStateImageList(imagelist)
95         else:
96             raise KeyError, '%r is not a vaild imagelist kind' % (kind,)
97
98     def ClearTree(self):
99         self.treewin.DeleteAllItems()
100         for imagelist in self.imagelists.itervalues():
101             imagelist.RemoveAll()
102         self.OnCleared()
103
104     #~ Tree population~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
105
106     def PopulateTree(self, node):
107         self.PopulateNode(node, None, True)
108
109     def PopulateNode(self, node, parentTreenode=None, recurse=False):
110         node.SetTreeModel(self)
111         if parentTreenode is None:
112             self.ClearTree()
113             treenode = self.treewin.AddRoot(node.GetTreeLabel())
114         else:
115             treenode = self.treewin.AppendItem(parentTreenode, node.GetTreeLabel())
116
117         # Associate parentTreenode with the node
118         self.treewin.SetPyData(treenode, node)
119         node.SetTreeNode(treenode, self.treewin)
120         self.PopulateNodeChildren(node, treenode, recurse)
121
122     def PopulateNodeChildren(self, node, treenode, recurse=False):
123         self.treewin.DeleteChildren(treenode)
124         node.populated = recurse
125         if recurse:
126             for subnode in node:
127                 self.PopulateNode(subnode, treenode, recurse-1)
128         else:
129             self.treewin.SetItemHasChildren(treenode, bool(node))
130         self.OnAddedNode(node)
131
132     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
133     #~ Event Reflections
134     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
135
136     def SetTreeWindow(self, treewin):
137         self.treewin = treewin
138         if self.treewin is not None:
139             treeid = self.treewin.GetId()
140             wx.EVT_TREE_BEGIN_DRAG(self.treewin, treeid, self._CallbackReflection('OnDrag'))
141             wx.EVT_TREE_BEGIN_RDRAG(self.treewin, treeid, self._CallbackReflection('OnRightDrag'))
142             wx.EVT_TREE_END_DRAG(self.treewin, treeid, self._CallbackReflection('OnEndDrag'))
143
144             wx.EVT_TREE_BEGIN_LABEL_EDIT(self.treewin, treeid, self._CallbackReflection('OnLabelEdit'))
145             wx.EVT_TREE_END_LABEL_EDIT(self.treewin, treeid, self._CallbackReflection('OnEndLabelEdit'))
146
147             wx.EVT_TREE_ITEM_ACTIVATED(self.treewin, treeid, self._CallbackReflection('OnActivated'))
148             wx.EVT_TREE_ITEM_RIGHT_CLICK(self.treewin, treeid, self._CallbackReflection('OnRightClick'))
149             wx.EVT_TREE_ITEM_MIDDLE_CLICK(self.treewin, treeid, self._CallbackReflection('OnMiddleClick'))
150             wx.EVT_TREE_KEY_DOWN(self.treewin, treeid, self._CallbackReflection('OnKeyDown'))
151
152             wx.EVT_TREE_DELETE_ITEM(self.treewin, treeid, self._CallbackReflection('OnDeleteItem'))
153
154             wx.EVT_TREE_ITEM_COLLAPSED(self.treewin, treeid, self._CallbackReflection('OnCollapsed'))
155             wx.EVT_TREE_ITEM_COLLAPSING(self.treewin, treeid, self._CallbackReflection('OnCollapsing'))
156
157             wx.EVT_TREE_ITEM_EXPANDED(self.treewin, treeid, self._CallbackReflection('OnExpanded'))
158             wx.EVT_TREE_ITEM_EXPANDING(self.treewin, treeid, self._CallbackReflection('OnExpanding'))
159
160             wx.EVT_TREE_SEL_CHANGED(self.treewin, treeid, self._CallbackReflection('OnSelectionChanged'))
161             wx.EVT_TREE_SEL_CHANGING(self.treewin, treeid, self._CallbackReflection('OnSelectionChanging'))
162    
163     class _Reflection(object):
164         def __init__(self, treewin, callname):
165             self.treewin = treewin
166             self.callname = callname
167         def __call__(self, evt):
168             item = self.treewin.GetPyData(evt.GetItem())
169             try: callback = getattr(item, self.callname)
170             except AttributeError: evt.Skip()
171             else: return callback(evt)
172
173     def _CallbackReflection(self, *args, **kw):
174         return self._Reflection(self.treewin, *args, **kw)
175
Note: See TracBrowser for help on using the browser.