Mercurial > traipse
comparison orpg/gametree/nodehandlers/containers.py @ 28:ff154cf3350c ornery-orc
Traipse 'OpenRPG' {100203-00}
Traipse is a distribution of OpenRPG that is designed to be easy to
setup and go. Traipse also makes it easy for developers to work on code
without fear of sacrifice. 'Ornery-Orc' continues the trend of 'Grumpy'
and adds fixes to the code. 'Ornery-Orc's main goal is to offer more
advanced features and enhance the productivity of the user.
Update Summary (Stable)
New Features:
New Bookmarks Feature
New 'boot' command to remote admin
New confirmation window for sent nodes
Miniatures Layer pop up box allows users to turn off Mini labels, from
FlexiRPG
New Zoom Mouse plugin added
New Images added to Plugin UI
Switching to Element Tree
New Map efficiency, from FlexiRPG
New Status Bar to Update Manager
New TrueDebug Class in orpg_log (See documentation for usage)
New Portable Mercurial
New Tip of the Day, from Core and community
New Reference Syntax added for custom PC sheets
New Child Reference for gametree
New Parent Reference for gametree
New Gametree Recursion method, mapping, context sensitivity, and
effeciency..
New Features node with bonus nodes and Node Referencing help added
New Dieroller structure from Core
New DieRoller portability for odd Dice
New 7th Sea die roller; ie [7k3] = [7d10.takeHighest(3).open(10)]
New 'Mythos' System die roller added
New vs. die roller method for WoD; ie [3v3] = [3d10.vs(3)]. Included for
Mythos roller also
New Warhammer FRPG Die Roller (Special thanks to Puu-san for the
support)
New EZ_Tree Reference system. Push a button, Traipse the tree, get a
reference (Beta!)
New Grids act more like Spreadsheets in Use mode, with Auto Calc
Fixes:
Fix to allow for portability to an OpenSUSE linux OS
Fix to mplay_client for Fedora and OpenSUSE
Fix to Text based Server
Fix to Remote Admin Commands
Fix to Pretty Print, from Core
Fix to Splitter Nodes not being created
Fix to massive amounts of images loading, from Core
Fix to Map from gametree not showing to all clients
Fix to gametree about menus
Fix to Password Manager check on startup
Fix to PC Sheets from tool nodes. They now use the tabber_panel
Fix to Whiteboard ID to prevent random line or text deleting.
Fixes to Server, Remote Server, and Server GUI
Fix to Update Manager; cleaner clode for saved repositories
Fixes made to Settings Panel and now reactive settings when Ok is
pressed
Fixes to Alternity roller's attack roll. Uses a simple Tuple instead of
a Splice
Fix to Use panel of Forms and Tabbers. Now longer enters design mode
Fix made Image Fetching. New fetching image and new failed image
Fix to whiteboard ID's to prevent non updated clients from ruining the
fix.
default_manifest.xml renamed to default_upmana.xml
author | sirebral |
---|---|
date | Wed, 03 Feb 2010 22:16:49 -0600 |
parents | 97265586402b |
children | fc48380f0c9f |
comparison
equal
deleted
inserted
replaced
27:51428d30c59e | 28:ff154cf3350c |
---|---|
19 # | 19 # |
20 # File: containers.py | 20 # File: containers.py |
21 # Author: Chris Davis | 21 # Author: Chris Davis |
22 # Maintainer: | 22 # Maintainer: |
23 # Version: | 23 # Version: |
24 # $Id: containers.py,v 1.43 2007/08/08 19:17:17 digitalxero Exp $ | 24 # $Id: containers.py,v Traipse 'Ornery-Orc' prof.ebral Exp $ |
25 # | 25 # |
26 # Description: The file contains code for the container nodehandlers | 26 # Description: The file contains code for the container nodehandlers |
27 # | 27 # |
28 | 28 |
29 | 29 |
30 from core import * | 30 from core import * |
31 from wx.lib.splitter import MultiSplitterWindow | 31 from wx.lib.splitter import MultiSplitterWindow |
32 | 32 from orpg.tools.orpg_log import logger |
33 | 33 from orpg.orpgCore import component |
34 ########################## | 34 |
35 ## base contiainer | 35 ########################## |
36 ## base container | |
36 ########################## | 37 ########################## |
37 | 38 |
38 class container_handler(node_handler): | 39 class container_handler(node_handler): |
39 """ should not be used! only a base class! | 40 """ should not be used! only a base class! |
40 <nodehandler name='?' module='core' class='container_handler' /> | 41 <nodehandler name='?' module='core' class='container_handler' /> |
41 """ | 42 """ |
42 def __init__(self,xml_dom,tree_node): | 43 def __init__(self, xml, tree_node): |
43 node_handler.__init__(self,xml_dom,tree_node) | 44 node_handler.__init__(self, xml, tree_node) |
44 self.load_children() | 45 self.load_children() |
45 | 46 |
46 def load_children(self): | 47 def load_children(self): |
47 children = self.master_dom._get_childNodes() | 48 for child_xml in self.xml: self.tree.load_xml(child_xml,self.mytree_node) |
48 for c in children: | 49 |
49 self.tree.load_xml(c,self.mytree_node) | 50 def check_map_aware(self, treenode, evt): |
50 | 51 node = self.tree.GetPyData(treenode) |
51 def check_map_aware(self, obj, evt): | 52 if hasattr(node,"map_aware") and node.map_aware(): node.on_send_to_map(evt) |
52 if hasattr(obj,"map_aware") and obj.map_aware(): | |
53 obj.on_send_to_map(evt) | |
54 | |
55 | 53 |
56 def on_send_to_map(self, evt): | 54 def on_send_to_map(self, evt): |
57 child = self.tree.GetFirstChild(self.mytree_node) | 55 self.tree.traverse(self.mytree_node, self.check_map_aware, evt) |
58 if child[0].IsOk(): | 56 |
59 self.traverse(child[0], self.check_map_aware, 0, evt) | 57 def checkChildToMap(self, treenode, evt): |
60 | 58 node = self.tree.GetPyData(treenode) |
61 | 59 if hasattr(node,"map_aware") and node.map_aware(): self.mapcheck = True |
62 def checkChildToMap(self, obj, evt): | |
63 if hasattr(obj,"map_aware") and obj.map_aware(): | |
64 self.mapcheck = True | |
65 | 60 |
66 def checkToMapMenu(self): | 61 def checkToMapMenu(self): |
67 self.mapcheck = False | 62 self.mapcheck = False |
68 child = self.tree.GetFirstChild(self.mytree_node) | 63 self.tree.traverse(self.mytree_node, self.checkChildToMap) |
69 if child[0].IsOk(): | |
70 self.traverse(child[0], self.checkChildToMap, 0, self.mapcheck) | |
71 | |
72 return self.mapcheck | 64 return self.mapcheck |
73 | 65 |
74 def on_drop(self,evt): | 66 def on_drop(self,evt): |
75 drag_obj = self.tree.drag_obj | 67 drag_obj = self.tree.drag_obj |
76 if drag_obj == self or self.tree.is_parent_node(self.mytree_node,drag_obj.mytree_node): | 68 if drag_obj == self or self.tree.is_parent_node(self.mytree_node,drag_obj.mytree_node): return |
77 return | |
78 opt = wx.MessageBox("Add node as child?","Container Node",wx.YES_NO|wx.CANCEL) | 69 opt = wx.MessageBox("Add node as child?","Container Node",wx.YES_NO|wx.CANCEL) |
79 if opt == wx.YES: | 70 if opt == wx.YES: |
80 xml_dom = self.tree.drag_obj.delete() | 71 drop_xml = self.tree.drag_obj.delete() |
81 xml_dom = self.master_dom.insertBefore(xml_dom,None) | 72 self.xml.insert(0, drop_xml) |
82 self.tree.load_xml(xml_dom, self.mytree_node) | 73 self.tree.load_xml(drop_xml, self.mytree_node) |
83 self.tree.Expand(self.mytree_node) | 74 self.tree.Expand(self.mytree_node) |
84 elif opt == wx.NO: | 75 elif opt == wx.NO: node_handler.on_drop(self,evt) |
85 node_handler.on_drop(self,evt) | 76 |
86 | 77 def gen_html(self, treenode, evt): |
87 def gen_html(self, obj, evt): | 78 node = self.tree.GetPyData(treenode) |
88 self.html_str += "<p>" + obj.tohtml() | 79 self.html_str += "<p>" + node.tohtml() |
89 | 80 |
90 def tohtml(self): | 81 def tohtml(self): |
91 self.html_str = "<table border=\"1\" ><tr><td>" | 82 self.html_str = "<table border='1' ><tr><td>" |
92 self.html_str += "<b>"+self.master_dom.getAttribute("name") + "</b>" | 83 self.html_str += "<b>"+self.xml.get("name") + "</b>" |
93 self.html_str += "</td></tr>\n" | 84 self.html_str += "</td></tr>\n" |
94 self.html_str += "<tr><td>" | 85 self.html_str += "<tr><td>" |
95 | 86 self.tree.traverse(self.mytree_node, self.gen_html, recurse=False) |
96 child = self.tree.GetFirstChild(self.mytree_node) | |
97 self.traverse(child[0], self.gen_html, 0, None) | |
98 | |
99 self.html_str += "</td></tr></table>" | 87 self.html_str += "</td></tr></table>" |
100 return self.html_str | 88 return self.html_str |
101 | 89 |
102 def get_size_constraint(self): | 90 def get_size_constraint(self): |
103 return 2 | 91 return 2 |
109 class group_handler(container_handler): | 97 class group_handler(container_handler): |
110 """ group nodehandler to be used as a placeholder for other nodehandlers. | 98 """ group nodehandler to be used as a placeholder for other nodehandlers. |
111 This handler will continue parsing child xml data. | 99 This handler will continue parsing child xml data. |
112 <nodehandler name='?' module='core' class='group_handler' /> | 100 <nodehandler name='?' module='core' class='group_handler' /> |
113 """ | 101 """ |
114 def __init__(self,xml_dom,tree_node): | 102 def __init__(self, xml, tree_node): |
115 container_handler.__init__(self,xml_dom,tree_node) | 103 container_handler.__init__(self, xml, tree_node) |
116 | 104 |
117 def load_children(self): | 105 def load_children(self): |
118 self.atts = None | 106 self.atts = None |
119 children = self.master_dom._get_childNodes() | 107 for child_xml in self.xml: |
120 for c in children: | 108 if child_xml.tag == "group_atts": #having the group attributes as a child is bad! |
121 if c._get_tagName() == "group_atts": | 109 self.xml.remove(child_xml) |
122 self.atts = c | 110 elif child_xml: self.tree.load_xml(child_xml, self.mytree_node) |
123 else: | 111 if not self.xml.get('cols'): self.xml.set('cols', '1') |
124 self.tree.load_xml(c,self.mytree_node) | 112 if not self.xml.get('border'): self.xml.set('border', '1') |
125 if not self.atts: | |
126 elem = self.xml.minidom.Element('group_atts') | |
127 elem.setAttribute("cols","1") | |
128 elem.setAttribute("border","1") | |
129 self.atts = self.master_dom.appendChild(elem) | |
130 | 113 |
131 def get_design_panel(self,parent): | 114 def get_design_panel(self,parent): |
132 return group_edit_panel(parent,self) | 115 return group_edit_panel(parent,self) |
133 | 116 |
134 def on_use(self,evt): | 117 def on_use(self,evt): |
135 return | 118 return |
136 | 119 |
137 def gen_html(self, obj, evt): | 120 def gen_html(self, treenode, evt): |
138 if self.i not in self.tdatas: | 121 node = self.tree.GetPyData(treenode) |
139 self.tdatas[self.i] = '' | 122 if self.i not in self.tdatas: self.tdatas[self.i] = '' |
140 self.tdatas[self.i] += "<P>" + obj.tohtml() | 123 self.tdatas[self.i] += "<P>" + node.tohtml() |
141 self.i += 1 | 124 self.i += 1 |
142 if self.i >= self.cols: | 125 if self.i >= self.cols: self.i = 0 |
143 self.i = 0 | |
144 | 126 |
145 def tohtml(self): | 127 def tohtml(self): |
146 cols = self.atts.getAttribute("cols") | 128 cols = self.xml.get("cols") |
147 border = self.atts.getAttribute("border") | 129 border = self.xml.get("border") |
148 self.html_str = "<table border=\""+border+"\" ><tr><td colspan=\""+cols+"\">" | 130 self.html_str = "<table border='"+border+"' ><tr><td colspan='"+cols+"'>" |
149 self.html_str += "<font size=4>"+self.master_dom.getAttribute("name") + "</font>" | 131 self.html_str += "<font size=4>"+self.xml.get("name") + "</font>" |
150 self.html_str += "</td></tr>\n<tr>" | 132 self.html_str += "</td></tr>\n<tr>" |
151 | |
152 self.cols = int(cols) | 133 self.cols = int(cols) |
153 self.i = 0 | 134 self.i = 0 |
154 self.tdatas = {} | 135 self.tdatas = {} |
155 | 136 self.tree.traverse(self.mytree_node, self.gen_html, recurse=False) |
156 child = self.tree.GetFirstChild(self.mytree_node) | 137 for td in self.tdatas: self.html_str += "<td valign='top' >" + self.tdatas[td] + "</td>\n"; |
157 if child[0].IsOk(): | |
158 self.traverse(child[0], self.gen_html, 0, None) | |
159 | |
160 for td in self.tdatas: | |
161 self.html_str += "<td valign=\"top\" >" + self.tdatas[td] + "</td>\n"; | |
162 self.html_str += "</tr></table>" | 138 self.html_str += "</tr></table>" |
163 return self.html_str | 139 return self.html_str |
164 | 140 |
165 GROUP_COLS = wx.NewId() | 141 GROUP_COLS = wx.NewId() |
166 GROUP_BOR = wx.NewId() | 142 GROUP_BOR = wx.NewId() |
167 | 143 |
168 class group_edit_panel(wx.Panel): | 144 class group_edit_panel(wx.Panel): |
169 def __init__(self, parent, handler): | 145 def __init__(self, parent, handler): |
170 wx.Panel.__init__(self, parent, -1) | 146 wx.Panel.__init__(self, parent, -1) |
171 self.handler = handler | 147 self.handler = handler |
148 self.outline = wx.StaticBoxSizer(wx.StaticBox(self, -1, "Group"), wx.VERTICAL) | |
149 | |
172 sizer = wx.BoxSizer(wx.VERTICAL) | 150 sizer = wx.BoxSizer(wx.VERTICAL) |
173 self.text = { P_TITLE : wx.TextCtrl(self, P_TITLE, handler.master_dom.getAttribute('name')) | 151 self.text = {P_TITLE : wx.TextCtrl(self, P_TITLE, handler.xml.get('name')) } |
174 } | |
175 sizer.Add(wx.StaticText(self, -1, "Title:"), 0, wx.EXPAND) | 152 sizer.Add(wx.StaticText(self, -1, "Title:"), 0, wx.EXPAND) |
176 sizer.Add(self.text[P_TITLE], 0, wx.EXPAND) | 153 sizer.Add(self.text[P_TITLE], 0, wx.EXPAND) |
177 sizer.Add(wx.Size(10,10)) | 154 sizer.Add(wx.Size(10,10)) |
178 | 155 |
179 radio_c = wx.RadioBox(self, GROUP_COLS, "Columns", choices=["1","2","3","4"]) | 156 radio_c = wx.RadioBox(self, GROUP_COLS, "Columns", choices=["1","2","3","4"]) |
180 cols = handler.atts.getAttribute("cols") | 157 cols = handler.xml.get("cols") |
181 if cols != "": | 158 if cols != "": radio_c.SetSelection(int(cols)-1) |
182 radio_c.SetSelection(int(cols)-1) | |
183 | 159 |
184 radio_b = wx.RadioBox(self, GROUP_BOR, "Border", choices=["no","yes"]) | 160 radio_b = wx.RadioBox(self, GROUP_BOR, "Border", choices=["no","yes"]) |
185 border = handler.atts.getAttribute("border") | 161 border = handler.xml.get("border") |
186 if border != "": | 162 if border != "": radio_b.SetSelection(int(border)) |
187 radio_b.SetSelection(int(border)) | |
188 | 163 |
189 sizer.Add(radio_c, 0, wx.EXPAND) | 164 sizer.Add(radio_c, 0, wx.EXPAND) |
190 sizer.Add(wx.Size(10,10)) | 165 sizer.Add(wx.Size(10,10)) |
191 sizer.Add(radio_b, 0, wx.EXPAND) | 166 sizer.Add(radio_b, 0, wx.EXPAND) |
192 | 167 |
193 self.sizer = sizer | 168 self.outline.Add(sizer, 0) |
194 self.outline = wx.StaticBox(self,-1,"Group") | 169 self.sizer = self.outline |
195 self.SetSizer(self.sizer) | 170 self.SetSizer(self.sizer) |
196 self.SetAutoLayout(True) | 171 self.SetAutoLayout(True) |
197 self.Fit() | 172 self.Fit() |
198 parent.SetSize(self.GetBestSize()) | 173 parent.SetSize(self.GetBestSize()) |
199 self.Bind(wx.EVT_TEXT, self.on_text, id=P_TITLE) | 174 self.Bind(wx.EVT_TEXT, self.on_text, id=P_TITLE) |
201 self.Bind(wx.EVT_RADIOBOX, self.on_radio_box, id=GROUP_COLS) | 176 self.Bind(wx.EVT_RADIOBOX, self.on_radio_box, id=GROUP_COLS) |
202 | 177 |
203 def on_radio_box(self,evt): | 178 def on_radio_box(self,evt): |
204 id = evt.GetId() | 179 id = evt.GetId() |
205 index = evt.GetInt() | 180 index = evt.GetInt() |
206 if id == GROUP_COLS: | 181 if id == GROUP_COLS: self.handler.xml.set("cols",str(index+1)) |
207 self.handler.atts.setAttribute("cols",str(index+1)) | 182 elif id == GROUP_BOR: self.handler.xml.set("border",str(index)) |
208 elif id == GROUP_BOR: | |
209 self.handler.atts.setAttribute("border",str(index)) | |
210 | 183 |
211 def on_text(self,evt): | 184 def on_text(self,evt): |
212 id = evt.GetId() | 185 id = evt.GetId() |
213 if id == P_TITLE: | 186 if id == P_TITLE: |
214 txt = self.text[id].GetValue() | 187 txt = self.text[id].GetValue() |
215 if txt != "": | 188 if txt != "": |
216 self.handler.master_dom.setAttribute('name',txt) | 189 self.handler.xml.set('name',txt) |
217 self.handler.rename(txt) | 190 self.handler.rename(txt) |
218 | 191 |
219 | 192 |
220 | 193 |
221 ########################## | 194 ########################## |
222 ## tabber node handler | 195 ## tabber node handler |
223 ########################## | 196 ########################## |
224 class tabber_handler(container_handler): | 197 class tabber_handler(container_handler): |
225 """ <nodehandler name='?' module='containers' class='tabber_handler' />""" | 198 """ <nodehandler name='?' module='containers' class='tabber_handler' />""" |
226 | 199 |
227 def __init__(self,xml_dom,tree_node): | 200 def __init__(self, xml, tree_node): |
228 container_handler.__init__(self,xml_dom,tree_node) | 201 container_handler.__init__(self, xml, tree_node) |
229 | 202 |
230 def get_design_panel(self,parent): | 203 def get_design_panel(self, parent): |
231 return tabbed_panel(parent,self,1) | 204 return tabbed_panel(parent, self, 1) |
232 | 205 |
233 def get_use_panel(self,parent): | 206 def get_use_panel(self, parent): |
234 return tabbed_panel(parent,self,2) | 207 return tabbed_panel(parent, self, 0) |
235 | 208 |
236 | 209 |
237 class tabbed_panel(orpgTabberWnd): | 210 class tabbed_panel(orpgTabberWnd): |
238 def __init__(self, parent, handler, mode): | 211 def __init__(self, parent, handler, mode): |
239 orpgTabberWnd.__init__(self, parent, style=FNB.FNB_NO_X_BUTTON) | 212 orpgTabberWnd.__init__(self, parent, style=FNB.FNB_NO_X_BUTTON) |
240 self.handler = handler | 213 self.handler = handler |
241 self.parent = parent | 214 self.parent = parent |
242 tree = self.handler.tree | 215 if mode == 1: self.AddPage(tabbed_edit_panel(parent, handler), 'Tabber', False) |
243 child = tree.GetFirstChild(handler.mytree_node) | 216 handler.tree.traverse(handler.mytree_node, self.pick_panel, mode, False) |
244 if child[0].IsOk(): | |
245 handler.traverse(child[0], self.pick_panel, 0, mode, False) | |
246 | |
247 parent.SetSize(self.GetBestSize()) | 217 parent.SetSize(self.GetBestSize()) |
248 | 218 |
249 def pick_panel(self, obj, mode): | 219 def pick_panel(self, treenode, mode): |
250 if mode == 1: | 220 node = self.handler.tree.GetPyData(treenode) |
251 panel = obj.get_design_panel(self) | 221 |
252 else: | 222 if mode == 1: panel = node.get_design_panel(self) |
253 panel = obj.get_use_panel(self) | 223 else: panel = node.get_use_panel(self) |
254 | 224 name = node.xml.get("name") |
255 name = obj.master_dom.getAttribute("name") | 225 if name == None: ## Fixes broken 3e Inventory child |
256 | 226 if node.xml.tag == 'inventory': |
257 if panel: | 227 node.xml.set('name', 'Inventory') |
258 self.AddPage(panel, name, False) | 228 name = "Inventory" |
229 logger.info('A corrective action was take to a 3e PC Sheet', True) | |
230 component.get('frame').TraipseSuiteWarn('item') | |
231 if panel: self.AddPage(panel, name, False) | |
232 | |
233 class tabbed_edit_panel(wx.Panel): | |
234 def __init__(self, parent, handler): | |
235 wx.Panel.__init__(self, parent, -1, style=FNB.FNB_NO_X_BUTTON) | |
236 self.handler = handler | |
237 self.parent = parent | |
238 main_sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, "Tabber"), wx.VERTICAL) | |
239 self.title = wx.TextCtrl(self, 1, handler.xml.get('name')) | |
240 main_sizer.Add(wx.StaticText(self, -1, "Title:"), 0, wx.EXPAND) | |
241 main_sizer.Add(self.title, 0, wx.EXPAND) | |
242 self.SetSizer(main_sizer) | |
243 self.SetAutoLayout(True) | |
244 self.Fit() | |
245 parent.SetSize(self.GetBestSize()) | |
246 self.Bind(wx.EVT_TEXT, self.on_text, id=1) | |
247 | |
248 | |
249 def on_text(self,evt): | |
250 txt = self.title.GetValue() | |
251 if txt != "": | |
252 self.handler.xml.set('name',txt) | |
253 self.handler.rename(txt) | |
254 | |
259 | 255 |
260 ################################# | 256 ################################# |
261 ## Splitter container | 257 ## Splitter container |
262 ################################# | 258 ################################# |
263 | 259 |
264 class splitter_handler(container_handler): | 260 class splitter_handler(container_handler): |
265 """ <nodehandler name='?' module='containers' class='splitter_handler' />""" | 261 """ <nodehandler name='?' module='containers' class='splitter_handler' />""" |
266 | 262 |
267 def __init__(self,xml_dom,tree_node): | 263 def __init__(self,xml,tree_node): |
268 container_handler.__init__(self,xml_dom,tree_node) | 264 container_handler.__init__(self,xml,tree_node) |
269 | 265 |
270 def load_children(self): | 266 def load_children(self): |
271 self.atts = None | 267 self.atts = None |
272 children = self.master_dom._get_childNodes() | 268 for child_xml in self.xml: |
273 for c in children: | 269 if child_xml.tag == "splitter_atts": print 'splitter_atts exist!'; self.xml.remove(child_xml) #Same here! |
274 if c._get_tagName() == "splitter_atts": | 270 elif child_xml: self.tree.load_xml(child_xml,self.mytree_node) |
275 self.atts = c | 271 if not self.xml.get('horizontal'): self.xml.set('horizontal', '0') |
276 else: | |
277 self.tree.load_xml(c,self.mytree_node) | |
278 if not self.atts: | |
279 elem = self.xml.minidom.Element('splitter_atts') | |
280 elem.setAttribute("horizontal","0") | |
281 self.atts = self.master_dom.appendChild(elem) | |
282 | 272 |
283 def get_design_panel(self,parent): | 273 def get_design_panel(self,parent): |
284 return self.build_splitter_wnd(parent, 1) | 274 return self.build_splitter_wnd(parent, 1) |
285 | 275 |
286 def get_use_panel(self,parent): | 276 def get_use_panel(self,parent): |
287 return self.build_splitter_wnd(parent, 2) | 277 return self.build_splitter_wnd(parent, 0) |
288 | 278 |
289 def on_drop(self,evt): | 279 def on_drop(self,evt): |
290 drag_obj = self.tree.drag_obj | 280 drag_obj = self.tree.drag_obj |
291 container_handler.on_drop(self,evt) | 281 container_handler.on_drop(self,evt) |
292 | 282 |
293 def build_splitter_wnd(self, parent, mode): | 283 def build_splitter_wnd(self, parent, mode): |
294 self.split = self.atts.getAttribute("horizontal") | 284 self.split = self.xml.get("horizontal") |
295 | |
296 self.pane = splitter_panel(parent, self) | 285 self.pane = splitter_panel(parent, self) |
297 | 286 self.splitter = MultiSplitterWindow(self.pane, -1, |
298 self.splitter = MultiSplitterWindow(self.pane, -1, style=wx.SP_LIVE_UPDATE|wx.SP_3DSASH|wx.SP_NO_XP_THEME) | 287 style=wx.SP_LIVE_UPDATE|wx.SP_3DSASH|wx.SP_NO_XP_THEME) |
299 | 288 if self.split == '1': self.splitter.SetOrientation(wx.VERTICAL) |
300 if self.split == '1': | 289 else: self.splitter.SetOrientation(wx.HORIZONTAL) |
301 self.splitter.SetOrientation(wx.VERTICAL) | |
302 else: | |
303 self.splitter.SetOrientation(wx.HORIZONTAL) | |
304 | |
305 self.bestSizex = -1 | 290 self.bestSizex = -1 |
306 self.bestSizey = -1 | 291 self.bestSizey = -1 |
307 | 292 self.tree.traverse(self.mytree_node, self.doSplit, mode, False) |
308 cookie = 0 | |
309 (child, cookie) = self.tree.GetFirstChild(self.mytree_node) | |
310 if child.IsOk(): | |
311 self.traverse(child, self.doSplit, 0, mode, False) | |
312 | |
313 self.pane.sizer.Add(self.splitter, 1, wx.EXPAND) | 293 self.pane.sizer.Add(self.splitter, 1, wx.EXPAND) |
314 | 294 if mode != 1: self.pane.hozCheck.Hide() |
315 | |
316 if mode != 1: | |
317 self.pane.hozCheck.Hide() | |
318 | |
319 self.pane.SetSize((self.bestSizex, self.bestSizey)) | 295 self.pane.SetSize((self.bestSizex, self.bestSizey)) |
320 self.pane.Layout() | 296 self.pane.Layout() |
321 parent.SetSize(self.pane.GetSize()) | 297 parent.SetSize(self.pane.GetSize()) |
322 return self.pane | 298 return self.pane |
323 | 299 |
324 def doSplit(self, obj, mode): | 300 def doSplit(self, treenode, mode): |
325 if mode == 1: | 301 node = self.tree.GetPyData(treenode) |
326 tmp = obj.get_design_panel(self.splitter) | 302 if mode == 1: tmp = node.get_design_panel(self.splitter) |
327 else: | 303 else: tmp = node.get_use_panel(self.splitter) |
328 tmp = obj.get_use_panel(self.splitter) | |
329 | |
330 if self.split == '1': | 304 if self.split == '1': |
331 sash = tmp.GetBestSize()[1]+1 | 305 sash = tmp.GetBestSize()[1]+1 |
332 self.bestSizey += sash+11 | 306 self.bestSizey += sash+11 |
333 if self.bestSizex < tmp.GetBestSize()[0]: | 307 if self.bestSizex < tmp.GetBestSize()[0]: self.bestSizex = tmp.GetBestSize()[0]+10 |
334 self.bestSizex = tmp.GetBestSize()[0]+10 | |
335 else: | 308 else: |
336 sash = tmp.GetBestSize()[0]+1 | 309 sash = tmp.GetBestSize()[0]+1 |
337 self.bestSizex += sash | 310 self.bestSizex += sash |
338 if self.bestSizey < tmp.GetBestSize()[1]: | 311 if self.bestSizey < tmp.GetBestSize()[1]: self.bestSizey = tmp.GetBestSize()[1]+31 |
339 self.bestSizey = tmp.GetBestSize()[1]+31 | |
340 | |
341 self.splitter.AppendWindow(tmp, sash) | 312 self.splitter.AppendWindow(tmp, sash) |
342 | |
343 def get_size_constraint(self): | 313 def get_size_constraint(self): |
344 return 1 | 314 return 1 |
345 | 315 |
346 class splitter_panel(wx.Panel): | 316 class splitter_panel(wx.Panel): |
347 def __init__(self, parent, handler): | 317 def __init__(self, parent, handler): |
348 wx.Panel.__init__(self, parent, -1) | 318 wx.Panel.__init__(self, parent, -1) |
349 self.handler = handler | 319 self.handler = handler |
350 sizer = wx.BoxSizer(wx.VERTICAL) | 320 sizer = wx.BoxSizer(wx.VERTICAL) |
321 self.title = wx.TextCtrl(self, 1, handler.xml.get('name')) | |
351 | 322 |
352 self.hozCheck = wx.CheckBox(self, -1, "Horizontal Split") | 323 self.hozCheck = wx.CheckBox(self, -1, "Horizontal Split") |
353 hoz = self.handler.atts.getAttribute("horizontal") | 324 hoz = self.handler.xml.get("horizontal") |
354 | 325 |
355 if hoz == '1': | 326 if hoz == '1': self.hozCheck.SetValue(True) |
356 self.hozCheck.SetValue(True) | 327 else: self.hozCheck.SetValue(False) |
357 #self.splitsize = wx.BoxSizer(wx.HORIZONTAL) | 328 |
358 else: | 329 sizer.Add(wx.StaticText(self, -1, "Title:"), 0, wx.EXPAND) |
359 self.hozCheck.SetValue(False) | 330 sizer.Add(self.title, 0) |
360 #self.splitsize = wx.BoxSizer(wx.VERTICAL) | |
361 | |
362 sizer.Add(self.hozCheck, 0, wx.EXPAND) | 331 sizer.Add(self.hozCheck, 0, wx.EXPAND) |
363 sizer.Add(wx.Size(10,0)) | 332 sizer.Add(wx.Size(10,0)) |
364 #sizer.Add(self.splitsize, 1, wx.EXPAND) | |
365 | 333 |
366 self.sizer = sizer | 334 self.sizer = sizer |
367 self.SetSizer(self.sizer) | 335 self.SetSizer(self.sizer) |
368 self.SetAutoLayout(True) | 336 self.SetAutoLayout(True) |
369 | 337 self.Bind(wx.EVT_TEXT, self.on_text, id=1) |
370 self.Bind(wx.EVT_CHECKBOX, self.on_check_box, id=self.hozCheck.GetId()) | 338 self.Bind(wx.EVT_CHECKBOX, self.on_check_box, id=self.hozCheck.GetId()) |
371 | 339 |
372 def on_check_box(self,evt): | 340 def on_check_box(self,evt): |
373 state = self.hozCheck.GetValue() | 341 state = self.hozCheck.GetValue() |
374 if state: | 342 if state: self.handler.xml.set("horizontal", "1") |
375 self.handler.atts.setAttribute("horizontal", "1") | 343 else: self.handler.xml.set("horizontal", "0") |
376 else: | 344 |
377 self.handler.atts.setAttribute("horizontal", "0") | 345 def on_text(self,evt): |
346 txt = self.title.GetValue() | |
347 if txt != "": | |
348 self.handler.xml.set('name',txt) | |
349 self.handler.rename(txt) | |
350 |