comparison orpg/gametree/nodehandlers/StarWarsd20.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
comparison
equal deleted inserted replaced
27:51428d30c59e 28:ff154cf3350c
19 # 19 #
20 # File: StarWarsd20.py 20 # File: StarWarsd20.py
21 # Author: Chris Davis; Mark Twombley 21 # Author: Chris Davis; Mark Twombley
22 # Maintainer: Mark Twombley 22 # Maintainer: Mark Twombley
23 # Version: 23 # Version:
24 # $Id: StarWarsd20.py,v 1.18 2006/11/15 12:11:23 digitalxero Exp $ 24 # $Id: StarWarsd20.py,v Traipse 'Ornery-Orc' prof.ebral Exp $
25 # 25 #
26 # Description: The file contains code for the StarWarsd20 nodehanlers 26 # Description: The file contains code for the StarWarsd20 nodehanlers
27 # 27 #
28 28
29 __version__ = "$Id: StarWarsd20.py,v 1.18 2006/11/15 12:11:23 digitalxero Exp $" 29 __version__ = "$Id: StarWarsd20.py,v Traipse 'Ornery-Orc' prof.ebral Exp $"
30 30
31 from core import * 31 from core import *
32 from containers import *
33 from orpg.tools.orpg_log import debug
34 from xml.etree.ElementTree import parse
32 35
33 SWD20_EXPORT = wx.NewId() 36 SWD20_EXPORT = wx.NewId()
34 ############################ 37 ############################
35 ## StarWarsd20 character node handler 38 ## StarWarsd20 character node handler
36 ############################ 39 ############################
42 def __init__(self,xml_dom,tree_node): 45 def __init__(self,xml_dom,tree_node):
43 node_handler.__init__(self,xml_dom,tree_node) 46 node_handler.__init__(self,xml_dom,tree_node)
44 self.load_children() 47 self.load_children()
45 48
46 def load_children(self): 49 def load_children(self):
47 children = self.master_dom._get_childNodes() 50 children = self.xml.getchildren()
48 for c in children: 51 for c in children:
49 self.tree.load_xml(c,self.mytree_node) 52 self.tree.load_xml(c,self.mytree_node)
50
51 53
52 def on_drop(self,evt): 54 def on_drop(self,evt):
53 drag_obj = self.tree.drag_obj 55 drag_obj = self.tree.drag_obj
54 #if self.is_my_child(self.mytree_node,drag_obj.mytree_node): 56 #if self.is_my_child(self.mytree_node,drag_obj.mytree_node):
55 # return 57 # return
56 if drag_obj == self: 58 if drag_obj == self:
57 return 59 return
58 opt = wx.MessageBox("Add node as child?","Container Node",wx.YES_NO|wx.CANCEL) 60 opt = wx.MessageBox("Add node as child?","Container Node",wx.YES_NO|wx.CANCEL)
59 if opt == wx.YES: 61 if opt == wx.YES:
60 xml_dom = self.tree.drag_obj.delete() 62 xml_dom = self.tree.drag_obj.delete()
61 xml_dom = self.master_dom.insertBefore(xml_dom,None) 63 xml_dom = self.xml.insertBefore(xml_dom,None)
62 self.tree.load_xml(xml_dom, self.mytree_node) 64 self.tree.load_xml(xml_dom, self.mytree_node)
63 self.tree.Expand(self.mytree_node) 65 self.tree.Expand(self.mytree_node)
64 elif opt == wx.NO: 66 elif opt == wx.NO:
65 node_handler.on_drop(self,evt) 67 node_handler.on_drop(self,evt)
66 68
67 def tohtml(self): 69 def tohtml(self):
68 cookie = 0 70 cookie = 0
69 html_str = "<table border=\"1\" ><tr><td>" 71 html_str = "<table border=\"1\" ><tr><td>"
70 html_str += "<b>"+self.master_dom.getAttribute("name") + "</b>" 72 html_str += "<b>"+self.xml.get("name") + "</b>"
71 html_str += "</td></tr>\n" 73 html_str += "</td></tr>\n"
72 html_str += "<tr><td>" 74 html_str += "<tr><td>"
73 max = tree.GetChildrenCount(handler.mytree_node) 75 max = tree.GetChildrenCount(handler.mytree_node)
74 try: 76 try: (child,cookie)=self.tree.GetFirstChild(self.mytree_node,cookie)
75 (child,cookie)=self.tree.GetFirstChild(self.mytree_node,cookie) 77 except: (child,cookie)=self.tree.GetFirstChild(self.mytree_node)
76 except: # If this happens we probably have a newer version of wxPython
77 (child,cookie)=self.tree.GetFirstChild(self.mytree_node)
78 obj = self.tree.GetPyData(child) 78 obj = self.tree.GetPyData(child)
79 for m in xrange(max): 79 for m in xrange(max):
80 html_str += "<p>" + obj.tohtml() 80 html_str += "<p>" + obj.tohtml()
81 if m < max-1: 81 if m < max-1:
82 child = self.tree.GetNextSibling(child) 82 child = self.tree.GetNextSibling(child)
88 return 1 88 return 1
89 89
90 def get_char_name( self ): 90 def get_char_name( self ):
91 return self.child_handlers['general'].get_char_name() 91 return self.child_handlers['general'].get_char_name()
92 92
93 ## def set_char_pp(self,attr,evl):
94 ## return self.child_handlers['pp'].set_char_pp(attr,evl)
95 ##
96 ## def get_char_pp( self, attr ):
97 ## return self.child_handlers['pp'].get_char_pp(attr)
98 ##
99 def get_char_lvl( self, attr ): 93 def get_char_lvl( self, attr ):
100 return self.child_handlers['classes'].get_char_lvl(attr) 94 return self.child_handlers['classes'].get_char_lvl(attr)
101
102 95
103 96
104 class SWd20char_handler(node_handler): 97 class SWd20char_handler(node_handler):
105 """ Node handler for a SWd20 charactor 98 """ Node handler for a SWd20 charactor
106 <nodehandler name='?' module='StarWarsd20' class='SWd20char_handler' /> 99 <nodehandler name='?' module='StarWarsd20' class='SWd20char_handler' />
125 118
126 119
127 def on_version(self,old_version): 120 def on_version(self,old_version):
128 node_handler.on_version(self,old_version) 121 node_handler.on_version(self,old_version)
129 if old_version == "": 122 if old_version == "":
130 tmp = open(dir_struct["nodes"]+"StarWars_d20character.xml","r") 123 tree = parse(dir_struct["nodes"]+"StarWars_d20character.xml")
131 xml_dom = parseXml_with_dlg(self.tree,tmp.read()) 124 xml_dom = tree.getroot()
132 xml_dom = xml_dom._get_firstChild()
133 tmp.close()
134 ## add new nodes 125 ## add new nodes
135 for tag in ("howtouse","inventory","powers","divine","pp"): 126 for tag in ("howtouse","inventory","powers","divine","pp"):
136 node_list = xml_dom.getElementsByTagName(tag) 127 node_list = xml_dom.findall(tag)
137 self.master_dom.appendChild(node_list[0]) 128 self.xml.append(node_list[0])
138 129
139 ## add new atts 130 ## add new atts
140 melee_attack = self.master_dom.getElementsByTagName('melee')[0] 131 melee_attack = self.xml.findall('melee')[0]
141 melee_attack.setAttribute("second","0") 132 melee_attack.set("second","0")
142 melee_attack.setAttribute("third","0") 133 melee_attack.set("third","0")
143 melee_attack.setAttribute("forth","0") 134 melee_attack.set("forth","0")
144 melee_attack.setAttribute("fifth","0") 135 melee_attack.set("fifth","0")
145 melee_attack.setAttribute("sixth","0") 136 melee_attack.set("sixth","0")
146 range_attack = self.master_dom.getElementsByTagName('ranged')[0] 137 range_attack = self.xml.findall('ranged')[0]
147 range_attack.setAttribute("second","0") 138 range_attack.set("second","0")
148 range_attack.setAttribute("third","0") 139 range_attack.set("third","0")
149 range_attack.setAttribute("forth","0") 140 range_attack.set("forth","0")
150 range_attack.setAttribute("fifth","0") 141 range_attack.set("fifth","0")
151 range_attack.setAttribute("sixth","0") 142 range_attack.set("sixth","0")
152 143 gen_list = self.xml.findall('general')[0]
153 gen_list = self.master_dom.getElementsByTagName('general')[0]
154 144
155 for tag in ("currentxp","xptolevel"): 145 for tag in ("currentxp","xptolevel"):
156 node_list = xml_dom.getElementsByTagName(tag) 146 node_list = xml_dom.findall(tag)
157 gen_list.appendChild(node_list[0]) 147 gen_list.append(node_list[0])
158 ## temp fix
159 #parent = self.master_dom._get_parentNode()
160 #old_dom = parent.replaceChild(xml_dom,self.master_dom)
161 #self.master_dom = xml_dom
162 print old_version 148 print old_version
163 149
164 150
165 def get_char_name( self ): 151 def get_char_name( self ):
166 return self.child_handlers['general'].get_char_name() 152 return self.child_handlers['general'].get_char_name()
167 153
168 ## def set_char_pp(self,attr,evl):
169 ## return self.child_handlers['pp'].set_char_pp(attr,evl)
170 ##
171 ## def get_char_pp( self, attr ):
172 ## return self.child_handlers['pp'].get_char_pp(attr)
173
174 def get_char_lvl( self, attr ): 154 def get_char_lvl( self, attr ):
175 return self.child_handlers['classes'].get_char_lvl(attr) 155 return self.child_handlers['classes'].get_char_lvl(attr)
176 156
177 157
178 def new_child_handler(self,tag,text,handler_class,icon='gear'): 158 def new_child_handler(self,tag,text,handler_class,icon='gear'):
179 node_list = self.master_dom.getElementsByTagName(tag) 159 node_list = self.xml.findall(tag)
180 tree = self.tree 160 tree = self.tree
181 i = self.tree.icons[icon] 161 i = self.tree.icons[icon]
182 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i) 162 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i)
183 handler = handler_class(node_list[0],new_tree_node,self) 163 handler = handler_class(node_list[0],new_tree_node,self)
184 tree.SetPyData(new_tree_node,handler) 164 tree.SetPyData(new_tree_node,handler)
188 return tabbed_panel(parent,self,1) 168 return tabbed_panel(parent,self,1)
189 169
190 170
191 def get_use_panel(self,parent): 171 def get_use_panel(self,parent):
192 return tabbed_panel(parent,self,2) 172 return tabbed_panel(parent,self,2)
193
194 173
195 def tohtml(self): 174 def tohtml(self):
196 html_str = "<table><tr><td colspan=2 >"+self.child_handlers['general'].tohtml()+"</td></tr>" 175 html_str = "<table><tr><td colspan=2 >"+self.child_handlers['general'].tohtml()+"</td></tr>"
197 html_str += "<tr><td width='50%' valign=top >"+self.child_handlers['abilities'].tohtml() 176 html_str += "<tr><td width='50%' valign=top >"+self.child_handlers['abilities'].tohtml()
198 html_str += "<P>" + self.child_handlers['saves'].tohtml() 177 html_str += "<P>" + self.child_handlers['saves'].tohtml()
199 html_str += "<P>" + self.child_handlers['attacks'].tohtml() 178 html_str += "<P>" + self.child_handlers['attacks'].tohtml()
200 html_str += "<P>" + self.child_handlers['ac'].tohtml() 179 html_str += "<P>" + self.child_handlers['ac'].tohtml()
201 html_str += "<P>" + self.child_handlers['feats'].tohtml() 180 html_str += "<P>" + self.child_handlers['feats'].tohtml()
202 #html_str += "<P>" + self.child_handlers['spells'].tohtml()
203 #html_str += "<P>" + self.child_handlers['divine'].tohtml()
204 #html_str += "<P>" + self.child_handlers['powers'].tohtml()
205 html_str += "<P>" + self.child_handlers['inventory'].tohtml() +"</td>" 181 html_str += "<P>" + self.child_handlers['inventory'].tohtml() +"</td>"
206 html_str += "<td width='50%' valign=top >"+self.child_handlers['classes'].tohtml() 182 html_str += "<td width='50%' valign=top >"+self.child_handlers['classes'].tohtml()
207 html_str += "<P>" + self.child_handlers['wp'].tohtml() 183 html_str += "<P>" + self.child_handlers['wp'].tohtml()
208 html_str += "<P>" + self.child_handlers['vp'].tohtml() 184 html_str += "<P>" + self.child_handlers['vp'].tohtml()
209 #html_str += "<P>" + self.child_handlers['pp'].tohtml()
210 html_str += "<P>" + self.child_handlers['skills'].tohtml() +"</td>" 185 html_str += "<P>" + self.child_handlers['skills'].tohtml() +"</td>"
211 html_str += "</tr></table>" 186 html_str += "</tr></table>"
212 return html_str 187 return html_str
213 188
214 def about(self): 189 def about(self):
215 html_str = "<img src='" + dir_struct["icon"]+'d20_logo.gif' "><br /><b>d20 Character Tool v0.7 beta</b>" 190 """html_str = "<img src='" + dir_struct["icon"]+'d20_logo.gif' "><br /><b>d20 Character Tool v0.7 beta</b>"
216 html_str += "<br />by Chris Davis<br />chris@rpgarchive.com" 191 html_str += "<br />by Chris Davis<br />chris@rpgarchive.com"
217 return html_str 192 return html_str"""
193 text = 'd20 Character Tool 0.7 beta\n'
194 text += 'by Chris Davis chris@rpgarchive.com'
195 return text
218 196
219 def get_char_name( self ): 197 def get_char_name( self ):
220 return self.child_handlers['general'].get_char_name() 198 return self.child_handlers['general'].get_char_name()
221 def get_armor_class( self ): 199 def get_armor_class( self ):
222 return self.child_handlers['ac'].get_armor_class() 200 return self.child_handlers['ac'].get_armor_class()
226 return self.child_handlers['wp'].get_current_hp() 204 return self.child_handlers['wp'].get_current_hp()
227 def get_max_vp( self ): 205 def get_max_vp( self ):
228 return self.child_handlers['vp'].get_max_vp() 206 return self.child_handlers['vp'].get_max_vp()
229 def get_current_vp( self ): 207 def get_current_vp( self ):
230 return self.child_handlers['vp'].get_current_vp() 208 return self.child_handlers['vp'].get_current_vp()
231
232 ## def set_char_pp(self,attr,evl):
233 ## return self.child_handlers['pp'].set_char_pp(attr,evl)
234 ##
235 ## def get_char_pp( self, attr ):
236 ## return self.child_handlers['pp'].get_char_pp(attr)
237
238 def get_char_lvl( self, attr ): 209 def get_char_lvl( self, attr ):
239 return self.child_handlers['classes'].get_char_lvl(attr) 210 return self.child_handlers['classes'].get_char_lvl(attr)
240 211
212 """ Removed to use the supplied Tabbed Panel
241 class tabbed_panel(wx.Notebook): 213 class tabbed_panel(wx.Notebook):
242 def __init__(self, parent, handler, mode): 214 def __init__(self, parent, handler, mode):
243 wx.Notebook.__init__(self, parent, -1, size=(1200,800)) 215 wx.Notebook.__init__(self, parent, -1, size=(1200,800))
244 self.handler = handler 216 self.handler = handler
245 self.parent = parent 217 self.parent = parent
251 except: # If this happens we probably have a newer version of wxPython 223 except: # If this happens we probably have a newer version of wxPython
252 (child,cookie)=tree.GetFirstChild(handler.mytree_node) 224 (child,cookie)=tree.GetFirstChild(handler.mytree_node)
253 obj = tree.GetPyData(child) 225 obj = tree.GetPyData(child)
254 for m in xrange(max): 226 for m in xrange(max):
255 227
256 if mode == 1: 228 if mode == 1: panel = obj.get_design_panel(self)
257 panel = obj.get_design_panel(self) 229 else: panel = obj.get_use_panel(self)
258 else: 230 name = obj.xml.get("name")
259 panel = obj.get_use_panel(self) 231 if panel: self.AddPage(panel,name)
260 name = obj.master_dom.getAttribute("name")
261
262 if panel:
263 self.AddPage(panel,name)
264 if m < max-1: 232 if m < max-1:
265 child = tree.GetNextSibling(child) 233 child = tree.GetNextSibling(child)
266 obj = tree.GetPyData(child) 234 obj = tree.GetPyData(child)
267
268 235
269 def about(self): 236 def about(self):
270 html_str = "<img src='" + dir_struct["icon"]+'d20_logo.gif' "><br /><b>d20 Character Tool v0.7 beta</b>" 237 html_str = "<img src='" + dir_struct["icon"]+'d20_logo.gif' "><br /><b>d20 Character Tool v0.7 beta</b>"
271 html_str += "<br />by Chris Davis<br />chris@rpgarchive.com" 238 html_str += "<br />by Chris Davis<br />chris@rpgarchive.com"
272 return html_str 239 return html_str
273 240
274 def get_char_name( self ): 241 def get_char_name( self ):
275 return self.child_handlers['general'].get_char_name() 242 return self.child_handlers['general'].get_char_name()
276 243
277 ## def set_char_pp(self,attr,evl):
278 ## return self.child_handlers['pp'].set_char_pp(attr,evl)
279 ##
280 ## def get_char_pp( self, attr ):
281 ## return self.child_handlers['pp'].get_char_pp(attr)
282
283 def get_char_lvl( self, attr ): 244 def get_char_lvl( self, attr ):
284 return self.child_handlers['classes'].get_char_lvl(attr) 245 return self.child_handlers['classes'].get_char_lvl(attr)
246 """
285 247
286 class SWd20_char_child(node_handler): 248 class SWd20_char_child(node_handler):
287 """ Node Handler for skill. This handler will be 249 """ Node Handler for skill. This handler will be
288 created by SWd20char_handler. 250 created by SWd20char_handler.
289 """ 251 """
290 def __init__(self, xml_dom, tree_node, parent): 252 def __init__(self, xml_dom, tree_node, parent):
291 node_handler.__init__(self,xml_dom, tree_node) 253 node_handler.__init__(self, xml_dom, tree_node)
292 self.char_hander = parent 254 self.char_hander = parent
293 self.drag = False 255 self.drag = False
294 self.frame = component.get('frame') 256 self.frame = component.get('frame')
295 self.myeditor = None 257 self.myeditor = None
296 258
297 259 def on_drop(self, evt):
298 def on_drop(self,evt):
299 pass 260 pass
300 261
301 def on_rclick(self,evt): 262 def on_rclick(self, evt):
302 pass 263 pass
303 264
304 def on_ldclick(self,evt): #Function needs help. Needs an OnClose I think. 265 def on_ldclick(self, evt):
305 if self.myeditor == None or self.myeditor.destroyed: 266 return
306 title = self.master_dom.getAttribute('name') + " Editor" 267
307 # Frame created in correctly. 268 def on_html(self, evt):
308 self.myeditor = wx.Frame(self.frame,title,dir_struct["icon"]+'grid.ico')
309 wnd = self.get_design_panel(self.myeditor)
310 self.myeditor.panel = wnd
311 self.wnd = wnd
312 self.myeditor.Show(1)
313 else:
314 self.myeditor.Raise()
315
316 def on_html(self,evt):
317 html_str = self.tohtml() 269 html_str = self.tohtml()
318 wnd = http_html_window(self.frame.note,-1) 270 wnd = http_html_window(self.frame.note,-1)
319 wnd.title = self.master_dom.getAttribute('name') 271 wnd.title = self.xml.get('name')
320 self.frame.add_panel(wnd) 272 self.frame.add_panel(wnd)
321 wnd.SetPage(html_str) 273 wnd.SetPage(html_str)
322 274
323 def get_design_panel(self,parent): 275 def get_design_panel(self, parent):
324 pass 276 pass
325 277
326 def get_use_panel(self,parent): 278 def get_use_panel(self, parent):
327 return self.get_design_panel(parent) 279 return self.get_design_panel(parent)
328 280
329 def delete(self): 281 def delete(self):
330 pass 282 pass
331 283
336 """ 288 """
337 def __init__(self, xml_dom, tree_node, parent): 289 def __init__(self, xml_dom, tree_node, parent):
338 SWd20_char_child.__init__(self, xml_dom, tree_node, parent) 290 SWd20_char_child.__init__(self, xml_dom, tree_node, parent)
339 tree = self.tree 291 tree = self.tree
340 icons = self.tree.icons 292 icons = self.tree.icons
341 node_list = self.master_dom.getElementsByTagName('skill') 293 node_list = self.xml.findall('skill')
342 self.skills={} 294 self.skills={}
343 for n in node_list: 295 for n in node_list:
344 name = n.getAttribute('name') 296 name = n.get('name')
345 self.skills[name] = n 297 self.skills[name] = n
346 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['gear'],icons['gear']) 298 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['gear'],icons['gear'])
347 tree.SetPyData(new_tree_node,self) 299 tree.SetPyData(new_tree_node,self)
348 300
349 def get_mod(self,name): 301 def get_mod(self,name):
350 skill = self.skills[name] 302 skill = self.skills[name]
351 stat = skill.getAttribute('stat') 303 stat = skill.get('stat')
352 ac = int(skill.getAttribute('armorcheck')) 304 ac = int(skill.get('armorcheck'))
353 if ac: 305 if ac:
354 ac = self.char_hander.child_handlers['ac'].get_check_pen() 306 ac = self.char_hander.child_handlers['ac'].get_check_pen()
355 stat_mod = self.char_hander.child_handlers['abilities'].get_mod(stat) 307 stat_mod = self.char_hander.child_handlers['abilities'].get_mod(stat)
356 rank = int(skill.getAttribute('rank')) 308 rank = int(skill.get('rank'))
357 misc = int(skill.getAttribute('misc')) 309 misc = int(skill.get('misc'))
358 total = stat_mod + rank + misc + ac 310 total = stat_mod + rank + misc + ac
359 return total 311 return total
360 312
361 def on_rclick(self,evt): 313 def on_rclick(self,evt):
362 #updated with code for untrained use check 314 #updated with code for untrained use check
363 item = self.tree.GetSelection() 315 item = self.tree.GetSelection()
364 name = self.tree.GetItemText(item) 316 name = self.tree.GetItemText(item)
365 skill = self.skills[name] 317 skill = self.skills[name]
366 rank = int(skill.getAttribute('rank')) 318 rank = int(skill.get('rank'))
367 untrained = int(skill.getAttribute('untrained')) 319 untrained = int(skill.get('untrained'))
368 chat = self.chat 320 chat = self.chat
369 if item == self.mytree_node: 321 if item == self.mytree_node:
370 SWd20_char_child.on_ldclick(self,evt) 322 SWd20_char_child.on_ldclick(self,evt)
371 else: 323 else:
372 if rank == 0 and untrained == 0: 324 if rank == 0 and untrained == 0: chat.Post("Can't use untrained!",True,True)
373 chat.Post('Can\'t use untrained!',True,True)
374 else: 325 else:
375 mod = self.get_mod(name) 326 mod = self.get_mod(name)
376 if mod >= 0: 327 if mod >= 0: mod1 = "+"
377 mod1 = "+" 328 else: mod1 = ""
378 else:
379 mod1 = ""
380 txt = '%s Skill Check: [1d20%s%s]' % (name, mod1, mod) 329 txt = '%s Skill Check: [1d20%s%s]' % (name, mod1, mod)
381 chat.ParsePost(txt,True,True) 330 chat.ParsePost(txt,True,True)
382 331
383 def get_design_panel(self,parent): 332 def get_design_panel(self,parent):
384 wnd = outline_panel(parent,self,skill_grid,"Skills") 333 wnd = outline_panel(parent,self,skill_grid,"Skills")
386 return wnd 335 return wnd
387 336
388 def tohtml(self): 337 def tohtml(self):
389 html_str = """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 ><th width='30%'>Skill</th><th>Key</th> 338 html_str = """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 ><th width='30%'>Skill</th><th>Key</th>
390 <th>Rank</th><th>Abil</th><th>Misc</th><th>Total</th></tr>""" 339 <th>Rank</th><th>Abil</th><th>Misc</th><th>Total</th></tr>"""
391 node_list = self.master_dom.getElementsByTagName('skill') 340 node_list = self.xml.findall('skill')
392 for n in node_list: 341 for n in node_list:
393 name = n.getAttribute('name') 342 name = n.get('name')
394 stat = n.getAttribute('stat') 343 stat = n.get('stat')
395 rank = n.getAttribute('rank') 344 rank = n.get('rank')
396 html_str = html_str + "<tr ALIGN='center'><td>"+name+"</td><td>"+stat+"</td><td>"+rank+"</td>" 345 html_str = html_str + "<tr ALIGN='center'><td>"+name+"</td><td>"+stat+"</td><td>"+rank+"</td>"
397 stat_mod = str(self.char_hander.child_handlers['abilities'].get_mod(stat)) 346 stat_mod = str(self.char_hander.child_handlers['abilities'].get_mod(stat))
398 misc = n.getAttribute('misc') 347 misc = n.get('misc')
399 mod = str(self.get_mod(name)) 348 mod = str(self.get_mod(name))
400 if mod >= 0: 349 if mod >= 0: mod1 = "+"
401 mod1 = "+" 350 else: mod1 = ""
402 else:
403 mod1 = ""
404 html_str = html_str + "<td>"+stat_mod+"</td><td>"+misc+'</td><td>%s%s</td></tr>' % (mod1, mod) 351 html_str = html_str + "<td>"+stat_mod+"</td><td>"+misc+'</td><td>%s%s</td></tr>' % (mod1, mod)
405 html_str = html_str + "</table>" 352 html_str = html_str + "</table>"
406 return html_str 353 return html_str
407 354
408 355
411 created by SWd20char_handler. 358 created by SWd20char_handler.
412 """ 359 """
413 def __init__(self, xml_dom, tree_node, parent): 360 def __init__(self, xml_dom, tree_node, parent):
414 SWd20_char_child.__init__(self, xml_dom, tree_node, parent) 361 SWd20_char_child.__init__(self, xml_dom, tree_node, parent)
415 self.abilities = {} 362 self.abilities = {}
416 node_list = self.master_dom.getElementsByTagName('stat') 363 node_list = self.xml.findall('stat')
417 tree = self.tree 364 tree = self.tree
418 icons = tree.icons 365 icons = tree.icons
419 for n in node_list: 366 for n in node_list:
420 name = n.getAttribute('abbr') 367 name = n.get('abbr')
421 self.abilities[name] = n 368 self.abilities[name] = n
422 new_tree_node = tree.AppendItem( self.mytree_node, name, icons['gear'], icons['gear'] ) 369 new_tree_node = tree.AppendItem( self.mytree_node, name, icons['gear'], icons['gear'] )
423 tree.SetPyData( new_tree_node, self ) 370 tree.SetPyData( new_tree_node, self )
424 371
425 def on_rclick( self, evt ): 372 def on_rclick( self, evt ):
427 name = self.tree.GetItemText( item ) 374 name = self.tree.GetItemText( item )
428 if item == self.mytree_node: 375 if item == self.mytree_node:
429 SWd20_char_child.on_ldclick( self, evt ) 376 SWd20_char_child.on_ldclick( self, evt )
430 else: 377 else:
431 mod = self.get_mod( name ) 378 mod = self.get_mod( name )
432 if mod >= 0: 379 if mod >= 0: mod1 = "+"
433 mod1 = "+" 380 else: mod1 = ""
434 else:
435 mod1 = ""
436 chat = self.chat 381 chat = self.chat
437 txt = '%s check: [1d20%s%s]' % ( name, mod1, mod ) 382 txt = '%s check: [1d20%s%s]' % ( name, mod1, mod )
438 chat.ParsePost( txt, True, True ) 383 chat.ParsePost( txt, True, True )
439 384
440 def get_mod(self,abbr): 385 def get_mod(self,abbr):
441 score = int(self.abilities[abbr].getAttribute('base')) 386 score = int(self.abilities[abbr].get('base'))
442 mod = (score - 10) / 2 387 mod = (score - 10) / 2
443 return mod 388 return mod
444 389
445 def set_score(self,abbr,score): 390 def set_score(self,abbr,score):
446 if score >= 0: 391 if score >= 0:
447 self.abilities[abbr].setAttribute("base",str(score)) 392 self.abilities[abbr].set("base",str(score))
448 393
449 def get_design_panel(self,parent): 394 def get_design_panel(self,parent):
450 wnd = outline_panel(parent,self,abil_grid,"Abilities") 395 wnd = outline_panel(parent,self,abil_grid,"Abilities")
451 wnd.title = "Abilities (edit)" 396 wnd.title = "Abilities (edit)"
452 return wnd 397 return wnd
453 398
454 def tohtml(self): 399 def tohtml(self):
455 html_str = """<table border='1' width=100%><tr BGCOLOR=#E9E9E9 ><th width='50%'>Ability</th> 400 html_str = """<table border='1' width=100%><tr BGCOLOR=#E9E9E9 ><th width='50%'>Ability</th>
456 <th>Base</th><th>Modifier</th></tr>""" 401 <th>Base</th><th>Modifier</th></tr>"""
457 node_list = self.master_dom.getElementsByTagName('stat') 402 node_list = self.xml.findall('stat')
458 for n in node_list: 403 for n in node_list:
459 name = n.getAttribute('name') 404 name = n.get('name')
460 abbr = n.getAttribute('abbr') 405 abbr = n.get('abbr')
461 base = n.getAttribute('base') 406 base = n.get('base')
462 mod = str(self.get_mod(abbr)) 407 mod = str(self.get_mod(abbr))
463 if mod >= 0: 408 if mod >= 0: mod1 = "+"
464 mod1 = "+" 409 else: mod1 = ""
465 else:
466 mod1 = ""
467 html_str = html_str + "<tr ALIGN='center'><td>"+name+"</td><td>"+base+'</td><td>%s%s</td></tr>' % (mod1, mod) 410 html_str = html_str + "<tr ALIGN='center'><td>"+name+"</td><td>"+base+'</td><td>%s%s</td></tr>' % (mod1, mod)
468 html_str = html_str + "</table>" 411 html_str = html_str + "</table>"
469 return html_str 412 return html_str
470 413
471 class SWd20saves(SWd20_char_child): 414 class SWd20saves(SWd20_char_child):
474 """ 417 """
475 def __init__(self, xml_dom, tree_node, parent): 418 def __init__(self, xml_dom, tree_node, parent):
476 SWd20_char_child.__init__(self, xml_dom, tree_node, parent) 419 SWd20_char_child.__init__(self, xml_dom, tree_node, parent)
477 tree = self.tree 420 tree = self.tree
478 icons = self.tree.icons 421 icons = self.tree.icons
479 node_list = self.master_dom.getElementsByTagName('save') 422 node_list = self.xml.findall('save')
480 self.saves={} 423 self.saves={}
481 for n in node_list: 424 for n in node_list:
482 name = n.getAttribute('name') 425 name = n.get('name')
483 self.saves[name] = n 426 self.saves[name] = n
484 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['gear'],icons['gear']) 427 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['gear'],icons['gear'])
485 tree.SetPyData(new_tree_node,self) 428 tree.SetPyData(new_tree_node,self)
486 429
487 def get_mod(self,name): 430 def get_mod(self,name):
488 save = self.saves[name] 431 save = self.saves[name]
489 stat = save.getAttribute('stat') 432 stat = save.get('stat')
490 stat_mod = self.char_hander.child_handlers['abilities'].get_mod(stat) 433 stat_mod = self.char_hander.child_handlers['abilities'].get_mod(stat)
491 base = int(save.getAttribute('base')) 434 base = int(save.get('base'))
492 miscmod = int(save.getAttribute('miscmod')) 435 miscmod = int(save.get('miscmod'))
493 # magmod = int(save.getAttribute('magmod'))
494 # total = stat_mod + base + miscmod + magmod
495 total = stat_mod + base + miscmod 436 total = stat_mod + base + miscmod
496 return total 437 return total
497 438
498 def on_rclick(self,evt): 439 def on_rclick(self,evt):
499 item = self.tree.GetSelection() 440 item = self.tree.GetSelection()
503 #wnd = save_grid(self.frame.note,self) 444 #wnd = save_grid(self.frame.note,self)
504 #wnd.title = "Saves" 445 #wnd.title = "Saves"
505 #self.frame.add_panel(wnd) 446 #self.frame.add_panel(wnd)
506 else: 447 else:
507 mod = self.get_mod(name) 448 mod = self.get_mod(name)
508 if mod >= 0: 449 if mod >= 0: mod1 = "+"
509 mod1 = "+" 450 else: mod1 = ""
510 else:
511 mod1 = ""
512 chat = self.chat 451 chat = self.chat
513 txt = '%s save: [1d20%s%s]' % (name, mod1, mod) 452 txt = '%s save: [1d20%s%s]' % (name, mod1, mod)
514 chat.ParsePost( txt, True, True ) 453 chat.ParsePost( txt, True, True )
515 454
516 def get_design_panel(self,parent): 455 def get_design_panel(self,parent):
520 459
521 def tohtml(self): 460 def tohtml(self):
522 html_str = """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 ><th width='30%'>Save</th> 461 html_str = """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 ><th width='30%'>Save</th>
523 <th>Key</th><th>Base</th><th>Abil</th><th>Magic</th> 462 <th>Key</th><th>Base</th><th>Abil</th><th>Magic</th>
524 <th>Misc</th><th>Total</th></tr>""" 463 <th>Misc</th><th>Total</th></tr>"""
525 node_list = self.master_dom.getElementsByTagName('save') 464 node_list = self.xml.findall('save')
526 for n in node_list: 465 for n in node_list:
527 name = n.getAttribute('name') 466 name = n.get('name')
528 stat = n.getAttribute('stat') 467 stat = n.get('stat')
529 base = n.getAttribute('base') 468 base = n.get('base')
530 html_str = html_str + "<tr ALIGN='center'><td>"+name+"</td><td>"+stat+"</td><td>"+base+"</td>" 469 html_str = html_str + "<tr ALIGN='center'><td>"+name+"</td><td>"+stat+"</td><td>"+base+"</td>"
531 stat_mod = str(self.char_hander.child_handlers['abilities'].get_mod(stat)) 470 stat_mod = str(self.char_hander.child_handlers['abilities'].get_mod(stat))
532 mag = n.getAttribute('magmod') 471 mag = n.get('magmod')
533 misc = n.getAttribute('miscmod') 472 misc = n.get('miscmod')
534 mod = str(self.get_mod(name)) 473 mod = str(self.get_mod(name))
535 if mod >= 0: 474 if mod >= 0: mod1 = "+"
536 mod1 = "+" 475 else: mod1 = ""
537 else:
538 mod1 = ""
539 html_str = html_str + "<td>"+stat_mod+"</td><td>"+mag+"</td>" 476 html_str = html_str + "<td>"+stat_mod+"</td><td>"+mag+"</td>"
540 html_str = html_str + '<td>'+misc+'</td><td>%s%s</td></tr>' % (mod1, mod) 477 html_str = html_str + '<td>'+misc+'</td><td>%s%s</td></tr>' % (mod1, mod)
541 html_str = html_str + "</table>" 478 html_str = html_str + "</table>"
542 return html_str 479 return html_str
543 480
553 wnd = outline_panel(parent,self,gen_grid,"General Information") 490 wnd = outline_panel(parent,self,gen_grid,"General Information")
554 wnd.title = "General Info" 491 wnd.title = "General Info"
555 return wnd 492 return wnd
556 493
557 def tohtml(self): 494 def tohtml(self):
558 n_list = self.master_dom._get_childNodes() 495 n_list = self.xml.getchildren()
559 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>General Information</th></tr><tr><td>" 496 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>General Information</th></tr><tr><td>"
560 for n in n_list: 497 for n in n_list:
561 t_node = component.get('xml').safe_get_text_node(n) 498 html_str += "<B>"+n.tag.capitalize() +":</B> "
562 html_str += "<B>"+n._get_tagName().capitalize() +":</B> " 499 html_str += n.text + ", "
563 html_str += t_node._get_nodeValue() + ", "
564 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 500 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
565 return html_str 501 return html_str
566 502
567 def on_name_change(self,name): 503 def on_name_change(self,name):
568 self.char_hander.rename(name) 504 self.char_hander.rename(name)
569 505
570 def get_char_name( self ): 506 def get_char_name( self ):
571 node = self.master_dom.getElementsByTagName( 'name' )[0] 507 node = self.xml.findall( 'name' )[0]
572 t_node = component.get('xml').safe_get_text_node( node ) 508 return node.text
573 return t_node._get_nodeValue()
574 509
575 510
576 class SWd20classes(SWd20_char_child): 511 class SWd20classes(SWd20_char_child):
577 """ Node Handler for classes. This handler will be 512 """ Node Handler for classes. This handler will be
578 created by SWd20char_handler. 513 created by SWd20char_handler.
585 wnd.title = "Classes" 520 wnd.title = "Classes"
586 return wnd 521 return wnd
587 522
588 def tohtml(self): 523 def tohtml(self):
589 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Classes</th></tr><tr><td>" 524 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Classes</th></tr><tr><td>"
590 n_list = self.master_dom._get_childNodes() 525 n_list = self.xml.getchildren()
591 for n in n_list: 526 for n in n_list: html_str += n.get('name') + " ("+n.get('level')+"), "
592 html_str += n.getAttribute('name') + " ("+n.getAttribute('level')+"), "
593 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 527 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
594 return html_str 528 return html_str
595 529
596 def get_char_lvl( self, attr ): 530 def get_char_lvl( self, attr ):
597 node_list = self.master_dom.getElementsByTagName('class') 531 node_list = self.xml.findall('class')
598 for n in node_list: 532 for n in node_list:
599 lvl = n.getAttribute('level') 533 lvl = n.get('level')
600 type = n.getAttribute('name') 534 type = n.get('name')
601 if attr == "level": 535 if attr == "level": return lvl
602 return lvl 536 elif attr == "class": return type
603 elif attr == "class":
604 return type
605 537
606 538
607 class SWd20feats(SWd20_char_child): 539 class SWd20feats(SWd20_char_child):
608 """ Node Handler for classes. This handler will be 540 """ Node Handler for classes. This handler will be
609 created by d20char_handler. 541 created by d20char_handler.
616 wnd.title = "Feats" 548 wnd.title = "Feats"
617 return wnd 549 return wnd
618 550
619 def tohtml(self): 551 def tohtml(self):
620 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Feats</th></tr><tr><td>" 552 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Feats</th></tr><tr><td>"
621 n_list = self.master_dom._get_childNodes() 553 n_list = self.xml.getchildren()
622 for n in n_list: 554 for n in n_list: html_str += n.get('name')+ ", "
623 html_str += n.getAttribute('name')+ ", "
624 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 555 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
625 return html_str 556 return html_str
626 557
627 class SWd20howto(SWd20_char_child): 558 class SWd20howto(SWd20_char_child):
628 """ Node Handler for hit points. This handler will be 559 """ Node Handler for hit points. This handler will be
647 wnd = outline_panel(parent,self,inventory_grid,"Inventory") 578 wnd = outline_panel(parent,self,inventory_grid,"Inventory")
648 wnd.title = "General Info" 579 wnd.title = "General Info"
649 return wnd 580 return wnd
650 581
651 def tohtml(self): 582 def tohtml(self):
652 n_list = self.master_dom._get_childNodes() 583 n_list = self.xml.getchildren()
653 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>General Information</th></tr><tr><td>" 584 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>General Information</th></tr><tr><td>"
654 for n in n_list: 585 for n in n_list:
655 t_node = component.get('xml').safe_get_text_node(n) 586 html_str += "<B>"+n.tag.capitalize() +":</B> "
656 html_str += "<B>"+n._get_tagName().capitalize() +":</B> " 587 html_str += n.text + "<br />"
657 html_str += t_node._get_nodeValue() + "<br />"
658 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 588 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
659 return html_str 589 return html_str
660 590
661 def on_name_change(self,name): 591 def on_name_change(self,name):
662 self.char_hander.rename(name) 592 self.char_hander.rename(name)
663 593
664 def get_char_name( self ): 594 def get_char_name( self ):
665 node = self.master_dom.getElementsByTagName( 'name' )[0] 595 node = self.xml.findall( 'name' )[0]
666 t_node = component.get('xml').safe_get_text_node( node ) 596 return node.text
667 return t_node._get_nodeValue()
668 597
669 class SWd20hp(SWd20_char_child): 598 class SWd20hp(SWd20_char_child):
670 """ Node Handler for hit points. This handler will be 599 """ Node Handler for hit points. This handler will be
671 created by d20char_handler. 600 created by d20char_handler.
672 """ 601 """
678 wnd.title = "Wound Points" 607 wnd.title = "Wound Points"
679 return wnd 608 return wnd
680 609
681 def tohtml(self): 610 def tohtml(self):
682 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th colspan=4>Wound Points</th></tr>" 611 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th colspan=4>Wound Points</th></tr>"
683 html_str += "<tr><th>Max:</th><td>"+self.master_dom.getAttribute('max')+"</td>" 612 html_str += "<tr><th>Max:</th><td>"+self.xml.get('max')+"</td>"
684 html_str += "<th>Current:</th><td>"+self.master_dom.getAttribute('current')+"</td>" 613 html_str += "<th>Current:</th><td>"+self.xml.get('current')+"</td>"
685 html_str += "</tr></table>" 614 html_str += "</tr></table>"
686 return html_str 615 return html_str
687 616
688 def get_max_hp( self ): 617 def get_max_hp( self ):
689 try: 618 try: return eval( self.xml.get( 'max' ) )
690 return eval( self.master_dom.getAttribute( 'max' ) ) 619 except: return 0
691 except:
692 return 0
693 def get_current_hp( self ): 620 def get_current_hp( self ):
694 try: 621 try: return eval( self.xml.get( 'current' ) )
695 return eval( self.master_dom.getAttribute( 'current' ) ) 622 except: return 0
696 except:
697 return 0
698 623
699 class SWd20vp(SWd20_char_child): 624 class SWd20vp(SWd20_char_child):
700 """ Node Handler for hit points. This handler will be 625 """ Node Handler for hit points. This handler will be
701 created by d20char_handler. 626 created by d20char_handler.
702 """ 627 """
708 wnd.title = "Vitality Points" 633 wnd.title = "Vitality Points"
709 return wnd 634 return wnd
710 635
711 def tohtml(self): 636 def tohtml(self):
712 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th colspan=4>Vitality Points</th></tr>" 637 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th colspan=4>Vitality Points</th></tr>"
713 html_str += "<tr><th>Max:</th><td>"+self.master_dom.getAttribute('max')+"</td>" 638 html_str += "<tr><th>Max:</th><td>"+self.xml.get('max')+"</td>"
714 html_str += "<th>Current:</th><td>"+self.master_dom.getAttribute('current')+"</td>" 639 html_str += "<th>Current:</th><td>"+self.xml.get('current')+"</td>"
715 html_str += "</tr></table>" 640 html_str += "</tr></table>"
716 return html_str 641 return html_str
717 642
718 def get_max_vp( self ): 643 def get_max_vp( self ):
719 try: 644 try: return eval( self.xml.get( 'max' ) )
720 return eval( self.master_dom.getAttribute( 'max' ) ) 645 except: return 0
721 except:
722 return 0
723 def get_current_vp( self ): 646 def get_current_vp( self ):
724 try: 647 try: return eval( self.xml.get( 'current' ) )
725 return eval( self.master_dom.getAttribute( 'current' ) ) 648 except: return 0
726 except:
727 return 0
728 649
729 class SWd20attacks(SWd20_char_child): 650 class SWd20attacks(SWd20_char_child):
730 """ Node Handler for attacks. This handler will be 651 """ Node Handler for attacks. This handler will be
731 created by d20char_handler. 652 created by d20char_handler.
732 """ 653 """
733 def __init__(self,xml_dom,tree_node,parent): 654 def __init__(self,xml_dom,tree_node,parent):
734 SWd20_char_child.__init__(self,xml_dom,tree_node,parent) 655 SWd20_char_child.__init__(self,xml_dom,tree_node,parent)
735 node_list = self.master_dom.getElementsByTagName('melee') 656 node_list = self.xml.findall('melee')
736 self.melee = node_list[0] 657 self.melee = node_list[0]
737 node_list = self.master_dom.getElementsByTagName('ranged') 658 node_list = self.xml.findall('ranged')
738 self.ranged = node_list[0] 659 self.ranged = node_list[0]
739 self.refresh_weapons() 660 self.refresh_weapons()
740 661
741 def refresh_weapons(self): 662 def refresh_weapons(self):
742 self.weapons = {} 663 self.weapons = {}
743 tree = self.tree 664 tree = self.tree
744 icons = self.tree.icons 665 icons = self.tree.icons
745 tree.CollapseAndReset(self.mytree_node) 666 tree.CollapseAndReset(self.mytree_node)
746 node_list = self.master_dom.getElementsByTagName('weapon') 667 node_list = self.xml.findall('weapon')
747 for n in node_list: 668 for n in node_list:
748 name = n.getAttribute('name') 669 name = n.get('name')
749 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['sword'],icons['sword']) 670 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['sword'],icons['sword'])
750 tree.SetPyData(new_tree_node,self) 671 tree.SetPyData(new_tree_node,self)
751 self.weapons[name]=n 672 self.weapons[name]=n
752 673
753 def get_mod(self,type='m'): 674 def get_mod(self,type='m'):
759 stat_mod = self.char_hander.child_handlers['abilities'].get_mod('Str') 680 stat_mod = self.char_hander.child_handlers['abilities'].get_mod('Str')
760 temp = self.melee 681 temp = self.melee
761 else: 682 else:
762 stat_mod = self.char_hander.child_handlers['abilities'].get_mod('Dex') 683 stat_mod = self.char_hander.child_handlers['abilities'].get_mod('Dex')
763 temp = self.ranged 684 temp = self.ranged
764 base = int(temp.getAttribute('base')) 685 base = int(temp.get('base'))
765 base2 = int(temp.getAttribute('second')) 686 base2 = int(temp.get('second'))
766 base3 = int(temp.getAttribute('third')) 687 base3 = int(temp.get('third'))
767 base4 = int(temp.getAttribute('forth')) 688 base4 = int(temp.get('forth'))
768 base5 = int(temp.getAttribute('fifth')) 689 base5 = int(temp.get('fifth'))
769 base6 = int(temp.getAttribute('sixth')) 690 base6 = int(temp.get('sixth'))
770 misc = int(temp.getAttribute('misc')) 691 misc = int(temp.get('misc'))
771 return (base, base2, base3, base4, base5, base6, stat_mod ,misc) 692 return (base, base2, base3, base4, base5, base6, stat_mod ,misc)
772 693
773 def on_rclick(self,evt): 694 def on_rclick(self,evt):
774 #removed the DnD specific code 695 #removed the DnD specific code
775 item = self.tree.GetSelection() 696 item = self.tree.GetSelection()
776 name = self.tree.GetItemText(item) 697 name = self.tree.GetItemText(item)
777 if item == self.mytree_node: 698 if item == self.mytree_node:
778 SWd20_char_child.on_ldclick(self,evt) 699 SWd20_char_child.on_ldclick(self,evt)
779 #self.frame.add_panel(self.get_design_panel(self.frame.note)) 700 #self.frame.add_panel(self.get_design_panel(self.frame.note))
780 else: 701 else:
781 mod = int(self.weapons[name].getAttribute('mod')) 702 mod = int(self.weapons[name].get('mod'))
782 if self.weapons[name].getAttribute('range') == '0': 703 if self.weapons[name].get('range') == '0':
783 mod = mod + self.get_mod('m') 704 mod = mod + self.get_mod('m')
784 if mod >= 0: 705 if mod >= 0: mod1 = "+"
785 mod1 = "+" 706 else: mod1 = ""
786 else:
787 mod1 = ""
788 else: 707 else:
789 mod = mod + self.get_mod('r') 708 mod = mod + self.get_mod('r')
790 if mod >= 0: 709 if mod >= 0: mod1 = "+"
791 mod1 = "+" 710 else: mod1 = ""
792 else:
793 mod1 = ""
794 chat = self.chat 711 chat = self.chat
795 dmg = self.weapons[name].getAttribute('damage') 712 dmg = self.weapons[name].get('damage')
796 lvl = self.get_char_lvl('level') 713 lvl = self.get_char_lvl('level')
797 cname = self.char_hander.get_char_name() 714 cname = self.char_hander.get_char_name()
798 txt = '%s %s Attack Roll: [1d20%s%s] ===> DMG: [%s%s%s]' % (cname, name, mod1, mod, dmg, mod1, mod) 715 txt = '%s %s Attack Roll: [1d20%s%s] ===> DMG: [%s%s%s]' % (cname, name, mod1, mod, dmg, mod1, mod)
799 chat.ParsePost( txt, True, False ) 716 chat.ParsePost( txt, True, False )
800 temp = self.melee 717 temp = self.melee
823 html_str += "<td>"+str(ranged[0]+ranged[1]+ranged[2])+"</td>" 740 html_str += "<td>"+str(ranged[0]+ranged[1]+ranged[2])+"</td>"
824 html_str += "<td>"+str(ranged[0])+"</td>" 741 html_str += "<td>"+str(ranged[0])+"</td>"
825 html_str += "<td>"+str(ranged[1])+"</td>" 742 html_str += "<td>"+str(ranged[1])+"</td>"
826 html_str += "<td>"+str(ranged[2])+"</td></tr></table>" 743 html_str += "<td>"+str(ranged[2])+"</td></tr></table>"
827 744
828 n_list = self.master_dom.getElementsByTagName('weapon') 745 n_list = self.xml.findall('weapon')
829 for n in n_list: 746 for n in n_list:
830 mod = n.getAttribute('mod') 747 mod = n.get('mod')
831 if mod >= 0: 748 if mod >= 0: mod1 = "+"
832 mod1 = "+" 749 else: mod1 = ""
833 else: 750 ran = n.get('range')
834 mod1 = ""
835 ran = n.getAttribute('range')
836 total = str(int(mod) + self.get_mod(ran)) 751 total = str(int(mod) + self.get_mod(ran))
837 html_str += """<P><table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th colspan=2>Weapon</th> 752 html_str += """<P><table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th colspan=2>Weapon</th>
838 <th>Attack</th><th >Damage</th><th>Critical</th></tr>""" 753 <th>Attack</th><th >Damage</th><th>Critical</th></tr>"""
839 html_str += "<tr ALIGN='center' ><td colspan=2>"+n.getAttribute('name')+"</td><td>"+total+"</td>" 754 html_str += "<tr ALIGN='center' ><td colspan=2>"+n.get('name')+"</td><td>"+total+"</td>"
840 html_str += "<td>"+n.getAttribute('damage')+"</td><td>"+n.getAttribute('critical')+"</td></tr>" 755 html_str += "<td>"+n.get('damage')+"</td><td>"+n.get('critical')+"</td></tr>"
841 html_str += """<tr BGCOLOR=#E9E9E9 ><th>Range</th><th>Weight</th> 756 html_str += """<tr BGCOLOR=#E9E9E9 ><th>Range</th><th>Weight</th>
842 <th>Type</th><th>Size</th><th>Misc Mod</th></tr>""" 757 <th>Type</th><th>Size</th><th>Misc Mod</th></tr>"""
843 html_str += "<tr ALIGN='center'><td>"+ran+"</td><td>"+n.getAttribute('weight')+"</td>" 758 html_str += "<tr ALIGN='center'><td>"+ran+"</td><td>"+n.get('weight')+"</td>"
844 html_str += "<td>"+n.getAttribute('type')+"</td><td>"+n.getAttribute('size')+"</td>" 759 html_str += "<td>"+n.get('type')+"</td><td>"+n.get('size')+"</td>"
845 html_str += '<td>%s%s</td></tr></table>' % (mod1, mod) 760 html_str += '<td>%s%s</td></tr></table>' % (mod1, mod)
846 return html_str 761 return html_str
847 762
848 class SWd20armor(SWd20_char_child): 763 class SWd20armor(SWd20_char_child):
849 """ Node Handler for ac. This handler will be 764 """ Node Handler for ac. This handler will be
861 def get_armor_class(self): 776 def get_armor_class(self):
862 ac_total = 10 777 ac_total = 10
863 ac_total += self.get_total('bonus') 778 ac_total += self.get_total('bonus')
864 dex_mod = self.char_hander.child_handlers['abilities'].get_mod('Dex') 779 dex_mod = self.char_hander.child_handlers['abilities'].get_mod('Dex')
865 max_dex = self.get_max_dex() 780 max_dex = self.get_max_dex()
866 if dex_mod < max_dex: 781 if dex_mod < max_dex: ac_total += dex_mod
867 ac_total += dex_mod 782 else: ac_total += max_dex
868 else:
869 ac_total += max_dex
870 return ac_total 783 return ac_total
871 784
872 def get_max_dex(self): 785 def get_max_dex(self):
873 armor_list = self.master_dom.getElementsByTagName('armor') 786 armor_list = self.xml.findall('armor')
874 dex = 10 787 dex = 10
875 for a in armor_list: 788 for a in armor_list:
876 temp = int(a.getAttribute("maxdex")) 789 temp = int(a.get("maxdex"))
877 if temp < dex: 790 if temp < dex: dex = temp
878 dex = temp
879 return dex 791 return dex
880 792
881 def get_total(self,attr): 793 def get_total(self,attr):
882 armor_list = self.master_dom.getElementsByTagName('armor') 794 armor_list = self.xml.findall('armor')
883 total = 0 795 total = 0
884 for a in armor_list: 796 for a in armor_list: total += int(a.get(attr))
885 total += int(a.getAttribute(attr))
886 return total 797 return total
887 798
888 def get_design_panel(self,parent): 799 def get_design_panel(self,parent):
889 wnd = outline_panel(parent,self,ac_panel,"Armor") 800 wnd = outline_panel(parent,self,ac_panel,"Armor")
890 wnd.title = "Armor" 801 wnd.title = "Armor"
896 html_str += "<tr ALIGN='center' ><td>"+str(self.get_armor_class())+"</td>" 807 html_str += "<tr ALIGN='center' ><td>"+str(self.get_armor_class())+"</td>"
897 html_str += "<td>"+str(self.get_check_pen())+"</td>" 808 html_str += "<td>"+str(self.get_check_pen())+"</td>"
898 html_str += "<td>"+str(self.get_spell_failure())+"</td>" 809 html_str += "<td>"+str(self.get_spell_failure())+"</td>"
899 html_str += "<td>"+str(self.get_max_dex())+"</td>" 810 html_str += "<td>"+str(self.get_max_dex())+"</td>"
900 html_str += "<td>"+str(self.get_total_weight())+"</td></tr></table>" 811 html_str += "<td>"+str(self.get_total_weight())+"</td></tr></table>"
901 n_list = self.master_dom._get_childNodes() 812 n_list = self.xml.getchildren()
902 for n in n_list: 813 for n in n_list:
903 html_str += """<P><table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th colspan=3>Armor</th> 814 html_str += """<P><table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th colspan=3>Armor</th>
904 <th>Type</th><th >Bonus</th></tr>""" 815 <th>Type</th><th >Bonus</th></tr>"""
905 html_str += "<tr ALIGN='center' ><td colspan=3>"+n.getAttribute('name')+"</td>" 816 html_str += "<tr ALIGN='center' ><td colspan=3>"+n.get('name')+"</td>"
906 html_str += "<td>"+n.getAttribute('type')+"</td>" 817 html_str += "<td>"+n.get('type')+"</td>"
907 html_str += "<td>"+n.getAttribute('bonus')+"</td></tr>" 818 html_str += "<td>"+n.get('bonus')+"</td></tr>"
908 html_str += """<tr BGCOLOR=#E9E9E9 ><th>Check Penalty</th><th>Spell Failure</th> 819 html_str += """<tr BGCOLOR=#E9E9E9 ><th>Check Penalty</th><th>Spell Failure</th>
909 <th>Max Dex</th><th>Speed</th><th>Weight</th></tr>""" 820 <th>Max Dex</th><th>Speed</th><th>Weight</th></tr>"""
910 html_str += "<tr ALIGN='center'><td>"+n.getAttribute('checkpenalty')+"</td>" 821 html_str += "<tr ALIGN='center'><td>"+n.get('checkpenalty')+"</td>"
911 html_str += "<td>"+n.getAttribute('maxdex')+"</td>" 822 html_str += "<td>"+n.get('maxdex')+"</td>"
912 html_str += "<td>"+n.getAttribute('speed')+"</td>" 823 html_str += "<td>"+n.get('speed')+"</td>"
913 html_str += "<td>"+n.getAttribute('weight')+"</td></tr></table>" 824 html_str += "<td>"+n.get('weight')+"</td></tr></table>"
914 return html_str 825 return html_str
915 826
916 827
917 ######################## 828 ########################
918 ## d20 char windows 829 ## d20 char windows
920 831
921 class base_panel(wx.Panel): 832 class base_panel(wx.Panel):
922 def __init__(self, parent): 833 def __init__(self, parent):
923 wx.Panel.__init__(self, parent, -1) 834 wx.Panel.__init__(self, parent, -1)
924 835
925 #self.build_ctrls()
926 self.Bind(wx.EVT_SIZE, self.on_size) 836 self.Bind(wx.EVT_SIZE, self.on_size)
927 837
928 def on_size(self,event): 838 def on_size(self,event):
929 s = self.GetClientSizeTuple() 839 s = self.GetClientSizeTuple()
930 #self.splitter.SetDimensions(0,0,s[0],s[1])
931 840
932 class outline_panel(wx.Panel): 841 class outline_panel(wx.Panel):
933 def __init__(self, parent, handler, wnd, txt,): 842 def __init__(self, parent, handler, wnd, txt,):
934 wx.Panel.__init__(self, parent, -1) 843 wx.Panel.__init__(self, parent, -1)
935 self.panel = wnd(self,handler) 844 self.panel = wnd(self,handler)
941 self.panel.SetDimensions(20,20,s[0]-40,s[1]-40) 850 self.panel.SetDimensions(20,20,s[0]-40,s[1]-40)
942 self.outline.SetDimensions(5,5,s[0]-10,s[1]-10) 851 self.outline.SetDimensions(5,5,s[0]-10,s[1]-10)
943 852
944 class char_panel(wx.ScrolledWindow): 853 class char_panel(wx.ScrolledWindow):
945 def __init__(self, parent, handler): 854 def __init__(self, parent, handler):
946 pname = handler.master_dom.setAttribute("name", 'TWO') 855 pname = handler.xml.set("name", 'TWO')
947 wx.ScrolledWindow.__init__(self, parent, -1,style=wx.VSCROLL | wx.SUNKEN_BORDER ) 856 wx.ScrolledWindow.__init__(self, parent, -1,style=wx.VSCROLL | wx.SUNKEN_BORDER )
948 self.height = 1200 857 self.height = 1200
949 self.SetScrollbars(10, 10,80, self.height/10) 858 self.SetScrollbars(10, 10,80, self.height/10)
950 self.main_sizer = wx.BoxSizer(wx.HORIZONTAL) 859 self.main_sizer = wx.BoxSizer(wx.HORIZONTAL)
951 self.panels = {} 860 self.panels = {}
952 keys = handler.child_handlers.keys() 861 keys = handler.child_handlers.keys()
953 for k in keys: 862 for k in keys: self.panels[k] = handler.child_handlers[k].get_design_panel(self, [k])
954 self.panels[k] = handler.child_handlers[k].get_design_panel(self, [k])
955 self.sub_sizer = wx.BoxSizer(wx.VERTICAL) 863 self.sub_sizer = wx.BoxSizer(wx.VERTICAL)
956 self.sub_sizer2 = wx.BoxSizer(wx.VERTICAL) 864 self.sub_sizer2 = wx.BoxSizer(wx.VERTICAL)
957 self.sub_sizer.Add(self.panels['general'], 1, wx.EXPAND) 865 self.sub_sizer.Add(self.panels['general'], 1, wx.EXPAND)
958 self.sub_sizer.Add(self.panels['abilities'], 1, wx.EXPAND) 866 self.sub_sizer.Add(self.panels['abilities'], 1, wx.EXPAND)
959 867
960 self.sub_sizer.Add(self.panels['attacks'], 2, wx.EXPAND) 868 self.sub_sizer.Add(self.panels['attacks'], 2, wx.EXPAND)
961 self.sub_sizer.Add(self.panels['ac'], 1, wx.EXPAND) 869 self.sub_sizer.Add(self.panels['ac'], 1, wx.EXPAND)
962 #self.sub_sizer.Add(self.panels['spells'], 1, wx.EXPAND)
963 870
964 self.sub_sizer2.Add(self.panels['classes'], 2, wx.EXPAND) 871 self.sub_sizer2.Add(self.panels['classes'], 2, wx.EXPAND)
965 self.sub_sizer2.Add(self.panels['wp'], 1, wx.EXPAND) 872 self.sub_sizer2.Add(self.panels['wp'], 1, wx.EXPAND)
966 self.sub_sizer2.Add(self.panels['vp'], 1, wx.EXPAND) 873 self.sub_sizer2.Add(self.panels['vp'], 1, wx.EXPAND)
967 #self.sub_sizer2.Add(self.panels['pp'], 1, wx.EXPAND)
968 self.sub_sizer2.Add(self.panels['saves'], 2, wx.EXPAND) 874 self.sub_sizer2.Add(self.panels['saves'], 2, wx.EXPAND)
969 875
970 self.sub_sizer2.Add(self.panels['feats'], 2, wx.EXPAND) 876 self.sub_sizer2.Add(self.panels['feats'], 2, wx.EXPAND)
971 #self.sub_sizer2.Add(self.panels['powers'], 2, wx.EXPAND)
972 self.sub_sizer2.Add(self.panels['skills'], 3, wx.EXPAND) 877 self.sub_sizer2.Add(self.panels['skills'], 3, wx.EXPAND)
973 878
974 self.main_sizer.Add(self.sub_sizer, 1, wx.EXPAND) 879 self.main_sizer.Add(self.sub_sizer, 1, wx.EXPAND)
975 self.main_sizer.Add(self.sub_sizer2, 1, wx.EXPAND) 880 self.main_sizer.Add(self.sub_sizer2, 1, wx.EXPAND)
976 self.panels['abilities'].panel.char_wnd = self 881 self.panels['abilities'].panel.char_wnd = self
989 894
990 def refresh_data(self): 895 def refresh_data(self):
991 self.panels['saves'].panel.refresh_data() 896 self.panels['saves'].panel.refresh_data()
992 self.panels['skills'].panel.refresh_data() 897 self.panels['skills'].panel.refresh_data()
993 self.panels['attacks'].panel.refresh_data() 898 self.panels['attacks'].panel.refresh_data()
994 # self.panels['powers'].panel.refresh_data()
995 # self.panels['spells'].panel.refresh_data()
996 899
997 HOWTO_MAX = wx.NewId() 900 HOWTO_MAX = wx.NewId()
998 901
999 class howto_panel(wx.Panel): 902 class howto_panel(wx.Panel):
1000 def __init__(self, parent, handler): 903 def __init__(self, parent, handler):
1001 wx.Panel.__init__(self, parent, -1) 904 wx.Panel.__init__(self, parent, -1)
1002 pname = handler.master_dom.setAttribute("name", 'How To') 905 pname = handler.xml.set("name", 'How To')
1003 self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap 906 self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap
1004 self.master_dom = handler.master_dom 907 self.xml = handler.xml
1005 n_list = self.master_dom._get_childNodes() 908 n_list = self.xml.getchildren()
1006 for n in n_list: 909 for n in n_list:
1007 t_node = component.get('xml').safe_get_text_node(n) 910 self.sizer.AddMany([ (wx.StaticText(self, -1, n.text), 0, wx.ALIGN_CENTER_VERTICAL),
1008 self.sizer.AddMany([ (wx.StaticText(self, -1, t_node._get_nodeValue()), 0, wx.ALIGN_CENTER_VERTICAL),
1009 ]) 911 ])
1010 self.sizer.AddGrowableCol(1) 912 self.sizer.AddGrowableCol(1)
1011 self.SetSizer(self.sizer) 913 self.SetSizer(self.sizer)
1012 914
1013 915
1015 WP_MAX = wx.NewId() 917 WP_MAX = wx.NewId()
1016 918
1017 class hp_panel(wx.Panel): 919 class hp_panel(wx.Panel):
1018 def __init__(self, parent, handler): 920 def __init__(self, parent, handler):
1019 wx.Panel.__init__(self, parent, -1) 921 wx.Panel.__init__(self, parent, -1)
1020 pname = handler.master_dom.setAttribute("name", 'WoundPoints') 922 pname = handler.xml.set("name", 'WoundPoints')
1021 self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap 923 self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap
1022 self.master_dom = handler.master_dom 924 self.xml = handler.xml
1023 self.sizer.AddMany([ (wx.StaticText(self, -1, "WP Current:"), 0, wx.ALIGN_CENTER_VERTICAL), 925 self.sizer.AddMany([ (wx.StaticText(self, -1, "WP Current:"), 0, wx.ALIGN_CENTER_VERTICAL),
1024 (wx.TextCtrl(self, WP_CUR, self.master_dom.getAttribute('current')), 0, wx.EXPAND), 926 (wx.TextCtrl(self, WP_CUR, self.xml.get('current')), 0, wx.EXPAND),
1025 (wx.StaticText(self, -1, "WP Max:"), 0, wx.ALIGN_CENTER_VERTICAL), 927 (wx.StaticText(self, -1, "WP Max:"), 0, wx.ALIGN_CENTER_VERTICAL),
1026 (wx.TextCtrl(self, WP_MAX, self.master_dom.getAttribute('max')), 0, wx.EXPAND), 928 (wx.TextCtrl(self, WP_MAX, self.xml.get('max')), 0, wx.EXPAND),
1027 ]) 929 ])
1028 self.sizer.AddGrowableCol(1) 930 self.sizer.AddGrowableCol(1)
1029 self.Bind(wx.EVT_SIZE, self.on_size) 931 self.Bind(wx.EVT_SIZE, self.on_size)
1030 self.Bind(wx.EVT_TEXT, self.on_text, id=WP_MAX) 932 self.Bind(wx.EVT_TEXT, self.on_text, id=WP_MAX)
1031 self.Bind(wx.EVT_TEXT, self.on_text, id=WP_CUR) 933 self.Bind(wx.EVT_TEXT, self.on_text, id=WP_CUR)
1032 self.SetSizer(self.sizer) 934 self.SetSizer(self.sizer)
1033 935
1034 def on_text(self,evt): 936 def on_text(self,evt):
1035 id = evt.GetId() 937 id = evt.GetId()
1036 if id == WP_CUR: 938 if id == WP_CUR:
1037 self.master_dom.setAttribute('current',evt.GetString()) 939 self.xml.set('current',evt.GetString())
1038 elif id == WP_MAX: 940 elif id == WP_MAX:
1039 self.master_dom.setAttribute('max',evt.GetString()) 941 self.xml.set('max',evt.GetString())
1040 942
1041 def on_size(self,evt): 943 def on_size(self,evt):
1042 s = self.GetClientSizeTuple() 944 s = self.GetClientSizeTuple()
1043 self.sizer.SetDimension(0,0,s[0],s[1]) 945 self.sizer.SetDimension(0,0,s[0],s[1])
1044 946
1046 VP_MAX = wx.NewId() 948 VP_MAX = wx.NewId()
1047 949
1048 class vp_panel(wx.Panel): 950 class vp_panel(wx.Panel):
1049 def __init__(self, parent, handler): 951 def __init__(self, parent, handler):
1050 wx.Panel.__init__(self, parent, -1) 952 wx.Panel.__init__(self, parent, -1)
1051 pname = handler.master_dom.setAttribute("name", 'VitalityPoints') 953 pname = handler.xml.set("name", 'VitalityPoints')
1052 self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap 954 self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap
1053 self.master_dom = handler.master_dom 955 self.xml = handler.xml
1054 self.sizer.AddMany([ (wx.StaticText(self, -1, "VP Current:"), 0, wx.ALIGN_CENTER_VERTICAL), 956 self.sizer.AddMany([ (wx.StaticText(self, -1, "VP Current:"), 0, wx.ALIGN_CENTER_VERTICAL),
1055 (wx.TextCtrl(self, VP_CUR, self.master_dom.getAttribute('current')), 0, wx.EXPAND), 957 (wx.TextCtrl(self, VP_CUR, self.xml.get('current')), 0, wx.EXPAND),
1056 (wx.StaticText(self, -1, "VP Max:"), 0, wx.ALIGN_CENTER_VERTICAL), 958 (wx.StaticText(self, -1, "VP Max:"), 0, wx.ALIGN_CENTER_VERTICAL),
1057 (wx.TextCtrl(self, VP_MAX, self.master_dom.getAttribute('max')), 0, wx.EXPAND), 959 (wx.TextCtrl(self, VP_MAX, self.xml.get('max')), 0, wx.EXPAND),
1058 ]) 960 ])
1059 self.sizer.AddGrowableCol(1) 961 self.sizer.AddGrowableCol(1)
1060 self.Bind(wx.EVT_SIZE, self.on_size) 962 self.Bind(wx.EVT_SIZE, self.on_size)
1061 self.Bind(wx.EVT_TEXT, self.on_text, id=VP_MAX) 963 self.Bind(wx.EVT_TEXT, self.on_text, id=VP_MAX)
1062 self.Bind(wx.EVT_TEXT, self.on_text, id=VP_CUR) 964 self.Bind(wx.EVT_TEXT, self.on_text, id=VP_CUR)
1063 self.SetSizer(self.sizer) 965 self.SetSizer(self.sizer)
1064 966
1065 def on_text(self,evt): 967 def on_text(self,evt):
1066 id = evt.GetId() 968 id = evt.GetId()
1067 if id == VP_CUR: 969 if id == VP_CUR: self.xml.set('current',evt.GetString())
1068 self.master_dom.setAttribute('current',evt.GetString()) 970 elif id == VP_MAX: self.xml.set('max',evt.GetString())
1069 elif id == VP_MAX:
1070 self.master_dom.setAttribute('max',evt.GetString())
1071 971
1072 def on_size(self,evt): 972 def on_size(self,evt):
1073 s = self.GetClientSizeTuple() 973 s = self.GetClientSizeTuple()
1074 self.sizer.SetDimension(0,0,s[0],s[1]) 974 self.sizer.SetDimension(0,0,s[0],s[1])
1075 975
1076 #PP_CUR = wx.NewId()
1077 #PP_MAX = wx.NewId()
1078 #PP_FRE = wx.NewId()
1079 #PP_MFRE = wx.NewId()
1080
1081 #class pp_panel(wx.Panel):
1082 # def __init__(self, parent, handler):
1083 # wx.Panel.__init__(self, parent, -1)
1084 # pname = handler.master_dom.setAttribute("name", 'PowerPoints')
1085 # self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap
1086 # self.master_dom = handler.master_dom
1087 #
1088 # self.sizer.AddMany([ (wx.StaticText(self, -1, "PP Current:"), 0, wx.ALIGN_CENTER_VERTICAL),
1089 # (wx.TextCtrl(self, PP_CUR, self.master_dom.getAttribute('current1')), 0, wx.EXPAND),
1090 # (wx.StaticText(self, -1, "PP Max:"), 0, wx.ALIGN_CENTER_VERTICAL),
1091 # (wx.TextCtrl(self, PP_MAX, self.master_dom.getAttribute('max1')), 0, wx.EXPAND),
1092 # (wx.StaticText(self, -1, "Current Free Talants per day:"), 0, wx.ALIGN_CENTER_VERTICAL),
1093 # (wx.TextCtrl(self, PP_FRE, self.master_dom.getAttribute('free')), 0, wx.EXPAND),
1094 # (wx.StaticText(self, -1, "Max Free Talants per day:"), 0, wx.ALIGN_CENTER_VERTICAL),
1095 # (wx.TextCtrl(self, PP_MFRE, self.master_dom.getAttribute('maxfree')), 0, wx.EXPAND),
1096 # ])
1097 # self.sizer.AddGrowableCol(1)
1098 # self.Bind(wx.EVT_SIZE, self.on_size)
1099 # self.Bind(wx.EVT_TEXT, self.on_text, id=PP_MAX)
1100 # self.Bind(wx.EVT_TEXT, self.on_text, id=PP_CUR)
1101 # self.Bind(wx.EVT_TEXT, self.on_text, id=PP_FRE)
1102 # self.Bind(wx.EVT_TEXT, self.on_text, id=PP_MFRE)
1103 #
1104 # def on_text(self,evt):
1105 # id = evt.GetId()
1106 # if id == PP_CUR:
1107 # self.master_dom.setAttribute('current1',evt.GetString())
1108 # elif id == PP_MAX:
1109 # self.master_dom.setAttribute('max1',evt.GetString())
1110 # elif id == PP_FRE:
1111 # self.master_dom.setAttribute('free',evt.GetString())
1112 # elif id == PP_MFRE:
1113 # self.master_dom.setAttribute('maxfree',evt.GetString())
1114 #
1115 # def on_size(self,evt):
1116 # s = self.GetClientSizeTuple()
1117 # self.sizer.SetDimension(0,0,s[0],s[1])
1118
1119 976
1120 class gen_grid(wx.grid.Grid): 977 class gen_grid(wx.grid.Grid):
1121 """grid for gen info""" 978 """grid for gen info"""
1122 def __init__(self, parent, handler): 979 def __init__(self, parent, handler):
1123 pname = handler.master_dom.setAttribute("name", 'General') 980 pname = handler.xml.set("name", 'General')
1124 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 981 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1125 self.Bind(wx.EVT_SIZE, self.on_size) 982 self.Bind(wx.EVT_SIZE, self.on_size)
1126 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 983 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1127 self.handler = handler 984 self.handler = handler
1128 n_list = handler.master_dom._get_childNodes() 985 n_list = handler.xml.getchildren()
1129 self.CreateGrid(len(n_list),2) 986 self.CreateGrid(len(n_list),2)
1130 self.SetRowLabelSize(0) 987 self.SetRowLabelSize(0)
1131 self.SetColLabelSize(0) 988 self.SetColLabelSize(0)
1132 self.n_list = n_list 989 self.n_list = n_list
1133 i = 0 990 i = 0
1134 for i in range(len(n_list)): 991 for i in range(len(n_list)): self.refresh_row(i)
1135 self.refresh_row(i)
1136 992
1137 def on_cell_change(self,evt): 993 def on_cell_change(self,evt):
1138 row = evt.GetRow() 994 row = evt.GetRow()
1139 col = evt.GetCol() 995 col = evt.GetCol()
1140 value = self.GetCellValue(row,col) 996 value = self.GetCellValue(row,col)
1141 t_node = self.n_list[row]._get_firstChild() 997 self.n_list[row].text = value
1142 t_node._set_nodeValue(value)
1143 if row==0: self.handler.on_name_change(value) 998 if row==0: self.handler.on_name_change(value)
1144 999
1145 def refresh_row(self,rowi): 1000 def refresh_row(self,rowi):
1146 t_node = component.get('xml').safe_get_text_node(self.n_list[rowi]) 1001 self.SetCellValue(rowi,0,self.n_list[rowi].tag)
1147 self.SetCellValue(rowi,0,self.n_list[rowi]._get_tagName())
1148 self.SetReadOnly(rowi,0) 1002 self.SetReadOnly(rowi,0)
1149 self.SetCellValue(rowi,1,t_node._get_nodeValue()) 1003 self.SetCellValue(rowi,1,self.n_list[rowi].text)
1150 1004
1151 def on_size(self,evt): 1005 def on_size(self,evt):
1152 (w,h) = self.GetClientSizeTuple() 1006 (w,h) = self.GetClientSizeTuple()
1153 cols = self.GetNumberCols() 1007 cols = self.GetNumberCols()
1154 col_w = w/(cols) 1008 col_w = w/(cols)
1155 for i in range(0,cols): 1009 for i in range(0,cols): self.SetColSize(i,col_w)
1156 self.SetColSize(i,col_w)
1157 evt.Skip() 1010 evt.Skip()
1158 self.Refresh() 1011 self.Refresh()
1159 1012
1160 class inventory_grid(wx.grid.Grid): 1013 class inventory_grid(wx.grid.Grid):
1161 """grid for gen info""" 1014 """grid for gen info"""
1162 def __init__(self, parent, handler): 1015 def __init__(self, parent, handler):
1163 pname = handler.master_dom.setAttribute("name", 'Money and Inventory') 1016 pname = handler.xml.set("name", 'Money and Inventory')
1164 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1017 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1165 self.Bind(wx.EVT_SIZE, self.on_size) 1018 self.Bind(wx.EVT_SIZE, self.on_size)
1166 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 1019 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1167 self.handler = handler 1020 self.handler = handler
1168 n_list = handler.master_dom._get_childNodes() 1021 n_list = handler.xml.getchildren()
1169 self.CreateGrid(len(n_list),2) 1022 self.CreateGrid(len(n_list),2)
1170 self.SetRowLabelSize(0) 1023 self.SetRowLabelSize(0)
1171 self.SetColLabelSize(0) 1024 self.SetColLabelSize(0)
1172 self.n_list = n_list 1025 self.n_list = n_list
1173 i = 0 1026 i = 0
1174 for i in range(len(n_list)): 1027 for i in range(len(n_list)): self.refresh_row(i)
1175 self.refresh_row(i)
1176 1028
1177 def on_cell_change(self,evt): 1029 def on_cell_change(self,evt):
1178 row = evt.GetRow() 1030 row = evt.GetRow()
1179 col = evt.GetCol() 1031 col = evt.GetCol()
1180 value = self.GetCellValue(row,col) 1032 value = self.GetCellValue(row,col)
1181 t_node = self.n_list[row]._get_firstChild() 1033 self.n_list[row].text = value
1182 t_node._set_nodeValue(value)
1183 if row==0: self.handler.on_name_change(value) 1034 if row==0: self.handler.on_name_change(value)
1184 1035
1185 def refresh_row(self,rowi): 1036 def refresh_row(self,rowi):
1186 t_node = component.get('xml').safe_get_text_node(self.n_list[rowi]) 1037 self.SetCellValue(rowi,0, self.n_list[rowi].tag)
1187 self.SetCellValue(rowi,0,self.n_list[rowi]._get_tagName())
1188 self.SetReadOnly(rowi,0) 1038 self.SetReadOnly(rowi,0)
1189 self.SetCellValue(rowi,1,t_node._get_nodeValue()) 1039 self.SetCellValue(rowi,1,self.n_list[rowi].text)
1190 1040
1191 def on_size(self,evt): 1041 def on_size(self,evt):
1192 (w,h) = self.GetClientSizeTuple() 1042 (w,h) = self.GetClientSizeTuple()
1193 cols = self.GetNumberCols() 1043 cols = self.GetNumberCols()
1194 col_w = w/(cols) 1044 col_w = w/(cols)
1195 for i in range(0,cols): 1045 for i in range(0,cols): self.SetColSize(i,col_w)
1196 self.SetColSize(i,col_w)
1197 evt.Skip() 1046 evt.Skip()
1198 self.Refresh() 1047 self.Refresh()
1199 1048
1200 class abil_grid(wx.grid.Grid): 1049 class abil_grid(wx.grid.Grid):
1201 """grid for abilities""" 1050 """grid for abilities"""
1202 def __init__(self, parent, handler): 1051 def __init__(self, parent, handler):
1203 pname = handler.master_dom.setAttribute("name", 'Stats') 1052 pname = handler.xml.set("name", 'Stats')
1204 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1053 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1205 self.Bind(wx.EVT_SIZE, self.on_size) 1054 self.Bind(wx.EVT_SIZE, self.on_size)
1206 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 1055 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1207 self.handler = handler 1056 self.handler = handler
1208 stats = handler.master_dom.getElementsByTagName('stat') 1057 stats = handler.xml.findall('stat')
1209 self.CreateGrid(len(stats),3) 1058 self.CreateGrid(len(stats),3)
1210 self.SetRowLabelSize(0) 1059 self.SetRowLabelSize(0)
1211 col_names = ['Ability','Score','Modifier'] 1060 col_names = ['Ability','Score','Modifier']
1212 for i in range(len(col_names)): 1061 for i in range(len(col_names)): self.SetColLabelValue(i,col_names[i])
1213 self.SetColLabelValue(i,col_names[i])
1214 self.stats = stats 1062 self.stats = stats
1215 i = 0 1063 i = 0
1216 for i in range(len(stats)): 1064 for i in range(len(stats)): self.refresh_row(i)
1217 self.refresh_row(i)
1218 self.char_wnd = None 1065 self.char_wnd = None
1219 1066
1220 def on_cell_change(self,evt): 1067 def on_cell_change(self,evt):
1221 row = evt.GetRow() 1068 row = evt.GetRow()
1222 col = evt.GetCol() 1069 col = evt.GetCol()
1223 value = self.GetCellValue(row,col) 1070 value = self.GetCellValue(row,col)
1224 try: 1071 try:
1225 int(value) 1072 int(value)
1226 self.stats[row].setAttribute('base',value) 1073 self.stats[row].set('base',value)
1227 self.refresh_row(row) 1074 self.refresh_row(row)
1228 except: 1075 except: self.SetCellValue(row,col,"0")
1229 self.SetCellValue(row,col,"0") 1076 if self.char_wnd: self.char_wnd.refresh_data()
1230 if self.char_wnd:
1231 self.char_wnd.refresh_data()
1232 1077
1233 def refresh_row(self,rowi): 1078 def refresh_row(self,rowi):
1234 s = self.stats[rowi] 1079 s = self.stats[rowi]
1235 name = s.getAttribute('name') 1080 name = s.get('name')
1236 abbr = s.getAttribute('abbr') 1081 abbr = s.get('abbr')
1237 self.SetCellValue(rowi,0,name) 1082 self.SetCellValue(rowi,0,name)
1238 self.SetReadOnly(rowi,0) 1083 self.SetReadOnly(rowi,0)
1239 self.SetCellValue(rowi,1,s.getAttribute('base')) 1084 self.SetCellValue(rowi,1,s.get('base'))
1240 self.SetCellValue(rowi,2,str(self.handler.get_mod(abbr))) 1085 self.SetCellValue(rowi,2,str(self.handler.get_mod(abbr)))
1241 self.SetReadOnly(rowi,2) 1086 self.SetReadOnly(rowi,2)
1242 1087
1243 def on_size(self,evt): 1088 def on_size(self,evt):
1244 (w,h) = self.GetClientSizeTuple() 1089 (w,h) = self.GetClientSizeTuple()
1245 cols = self.GetNumberCols() 1090 cols = self.GetNumberCols()
1246 col_w = w/(cols+2) 1091 col_w = w/(cols+2)
1247 self.SetColSize(0,col_w*3) 1092 self.SetColSize(0,col_w*3)
1248 for i in range(1,cols): 1093 for i in range(1,cols): self.SetColSize(i,col_w)
1249 self.SetColSize(i,col_w)
1250 evt.Skip() 1094 evt.Skip()
1251 self.Refresh() 1095 self.Refresh()
1252 1096
1253 def refresh_data(self): 1097 def refresh_data(self):
1254 for r in range(self.GetNumberRows()-1): 1098 for r in range(self.GetNumberRows()-1): self.refresh_row(r)
1255 self.refresh_row(r)
1256 1099
1257 1100
1258 class save_grid(wx.grid.Grid): 1101 class save_grid(wx.grid.Grid):
1259 """grid for saves""" 1102 """grid for saves"""
1260 def __init__(self, parent, handler): 1103 def __init__(self, parent, handler):
1261 pname = handler.master_dom.setAttribute("name", 'Saves') 1104 pname = handler.xml.set("name", 'Saves')
1262 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1105 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1263 self.Bind(wx.EVT_SIZE, self.on_size) 1106 self.Bind(wx.EVT_SIZE, self.on_size)
1264 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 1107 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1265 self.handler = handler 1108 self.handler = handler
1266 saves = handler.master_dom.getElementsByTagName('save') 1109 saves = handler.xml.findall('save')
1267 self.stats = handler.char_hander.child_handlers['abilities'] 1110 self.stats = handler.char_hander.child_handlers['abilities']
1268 self.CreateGrid(len(saves),7) 1111 self.CreateGrid(len(saves),7)
1269 self.SetRowLabelSize(0) 1112 self.SetRowLabelSize(0)
1270 col_names = ['Save','Key','base','Abil','Magic','Misc','Total'] 1113 col_names = ['Save','Key','base','Abil','Magic','Misc','Total']
1271 for i in range(len(col_names)): 1114 for i in range(len(col_names)): self.SetColLabelValue(i,col_names[i])
1272 self.SetColLabelValue(i,col_names[i])
1273 self.saves = saves 1115 self.saves = saves
1274 i = 0 1116 i = 0
1275 for i in range(len(saves)): 1117 for i in range(len(saves)):self.refresh_row(i)
1276 self.refresh_row(i)
1277 1118
1278 def on_cell_change(self,evt): 1119 def on_cell_change(self,evt):
1279 row = evt.GetRow() 1120 row = evt.GetRow()
1280 col = evt.GetCol() 1121 col = evt.GetCol()
1281 value = self.GetCellValue(row,col) 1122 value = self.GetCellValue(row,col)
1282 try: 1123 try:
1283 int(value) 1124 int(value)
1284 if col == 2: 1125 if col == 2: self.saves[row].set('base',value)
1285 self.saves[row].setAttribute('base',value) 1126 elif col == 4:self.saves[row].set('magmod',value)
1286 elif col ==4: 1127 elif col == 4: self.saves[row].set('miscmod',value)
1287 self.saves[row].setAttribute('magmod',value)
1288 elif col ==4:
1289 self.saves[row].setAttribute('miscmod',value)
1290 self.refresh_row(row) 1128 self.refresh_row(row)
1291 except: 1129 except: self.SetCellValue(row,col,"0")
1292 self.SetCellValue(row,col,"0")
1293 1130
1294 def refresh_row(self,rowi): 1131 def refresh_row(self,rowi):
1295 s = self.saves[rowi] 1132 s = self.saves[rowi]
1296 name = s.getAttribute('name') 1133 name = s.get('name')
1297 self.SetCellValue(rowi,0,name) 1134 self.SetCellValue(rowi,0,name)
1298 self.SetReadOnly(rowi,0) 1135 self.SetReadOnly(rowi,0)
1299 stat = s.getAttribute('stat') 1136 stat = s.get('stat')
1300 self.SetCellValue(rowi,1,stat) 1137 self.SetCellValue(rowi,1,stat)
1301 self.SetReadOnly(rowi,1) 1138 self.SetReadOnly(rowi,1)
1302 self.SetCellValue(rowi,2,s.getAttribute('base')) 1139 self.SetCellValue(rowi,2,s.get('base'))
1303 self.SetCellValue(rowi,3,str(self.stats.get_mod(stat))) 1140 self.SetCellValue(rowi,3,str(self.stats.get_mod(stat)))
1304 self.SetReadOnly(rowi,3) 1141 self.SetReadOnly(rowi,3)
1305 self.SetCellValue(rowi,4,s.getAttribute('magmod')) 1142 self.SetCellValue(rowi,4,s.get('magmod'))
1306 self.SetCellValue(rowi,5,s.getAttribute('miscmod')) 1143 self.SetCellValue(rowi,5,s.get('miscmod'))
1307 mod = str(self.handler.get_mod(name)) 1144 mod = str(self.handler.get_mod(name))
1308 self.SetCellValue(rowi,6,mod) 1145 self.SetCellValue(rowi,6,mod)
1309 self.SetReadOnly(rowi,6) 1146 self.SetReadOnly(rowi,6)
1310 1147
1311 def on_size(self,evt): 1148 def on_size(self,evt):
1312 (w,h) = self.GetClientSizeTuple() 1149 (w,h) = self.GetClientSizeTuple()
1313 cols = self.GetNumberCols() 1150 cols = self.GetNumberCols()
1314 col_w = w/(cols+2) 1151 col_w = w/(cols+2)
1315 self.SetColSize(0,col_w*3) 1152 self.SetColSize(0,col_w*3)
1316 for i in range(1,cols): 1153 for i in range(1,cols): self.SetColSize(i,col_w)
1317 self.SetColSize(i,col_w)
1318 evt.Skip() 1154 evt.Skip()
1319 self.Refresh() 1155 self.Refresh()
1320 1156
1321 def refresh_data(self): 1157 def refresh_data(self):
1322 for r in range(self.GetNumberRows()): 1158 for r in range(self.GetNumberRows()): self.refresh_row(r)
1323 self.refresh_row(r)
1324 1159
1325 1160
1326 class skill_grid(wx.grid.Grid): 1161 class skill_grid(wx.grid.Grid):
1327 """ panel for skills """ 1162 """ panel for skills """
1328 def __init__(self, parent, handler): 1163 def __init__(self, parent, handler):
1329 pname = handler.master_dom.setAttribute("name", 'Skills') 1164 pname = handler.xml.set("name", 'Skills')
1330 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1165 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1331 self.Bind(wx.EVT_SIZE, self.on_size) 1166 self.Bind(wx.EVT_SIZE, self.on_size)
1332 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 1167 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1333 self.handler = handler 1168 self.handler = handler
1334 skills = handler.master_dom.getElementsByTagName('skill') 1169 skills = handler.xml.findall('skill')
1335 self.stats = handler.char_hander.child_handlers['abilities'] 1170 self.stats = handler.char_hander.child_handlers['abilities']
1336 self.CreateGrid(len(skills),7) 1171 self.CreateGrid(len(skills),7)
1337 self.SetRowLabelSize(0) 1172 self.SetRowLabelSize(0)
1338 col_names = ['Skill','Key','Rank','Abil','Misc','Total'] 1173 col_names = ['Skill','Key','Rank','Abil','Misc','Total']
1339 for i in range(len(col_names)): 1174 for i in range(len(col_names)): self.SetColLabelValue(i,col_names[i])
1340 self.SetColLabelValue(i,col_names[i])
1341 rowi = 0 1175 rowi = 0
1342 self.skills = skills 1176 self.skills = skills
1343 for i in range(len(skills)): 1177 for i in range(len(skills)):
1344 self.refresh_row(i) 1178 self.refresh_row(i)
1345 1179
1348 col = evt.GetCol() 1182 col = evt.GetCol()
1349 value = self.GetCellValue(row,col) 1183 value = self.GetCellValue(row,col)
1350 #print value 1184 #print value
1351 try: 1185 try:
1352 int(value) 1186 int(value)
1353 if col == 3: 1187 if col == 3: self.skills[row].set('rank',value)
1354 self.skills[row].setAttribute('rank',value) 1188 elif col == 5: self.skills[row].set('misc',value)
1355 elif col ==5: 1189 elif col == 1: self.skills[row].set('untrained',value)
1356 self.skills[row].setAttribute('misc',value)
1357 elif col == 1:
1358 self.skills[row].setAttribute('untrained',value)
1359 self.refresh_row(row) 1190 self.refresh_row(row)
1360 except: 1191 except: self.SetCellValue(row,col,"0")
1361 self.SetCellValue(row,col,"0")
1362 1192
1363 def refresh_row(self,rowi): 1193 def refresh_row(self,rowi):
1364 s = self.skills[rowi] 1194 s = self.skills[rowi]
1365 name = s.getAttribute('name') 1195 name = s.get('name')
1366 self.SetCellValue(rowi,0,name) 1196 self.SetCellValue(rowi,0,name)
1367 self.SetReadOnly(rowi,0) 1197 self.SetReadOnly(rowi,0)
1368 self.SetCellValue(rowi,1,s.getAttribute('untrained')) 1198 self.SetCellValue(rowi,1,s.get('untrained'))
1369 stat = s.getAttribute('stat') 1199 stat = s.get('stat')
1370 self.SetCellValue(rowi,2,stat) 1200 self.SetCellValue(rowi,2,stat)
1371 self.SetReadOnly(rowi,2) 1201 self.SetReadOnly(rowi,2)
1372 self.SetCellValue(rowi,3,s.getAttribute('rank')) 1202 self.SetCellValue(rowi,3,s.get('rank'))
1373 self.SetCellValue(rowi,4,str(self.stats.get_mod(stat))) 1203 self.SetCellValue(rowi,4,str(self.stats.get_mod(stat)))
1374 self.SetReadOnly(rowi,4) 1204 self.SetReadOnly(rowi,4)
1375 self.SetCellValue(rowi,5,s.getAttribute('misc')) 1205 self.SetCellValue(rowi,5,s.get('misc'))
1376 mod = str(self.handler.get_mod(name)) 1206 mod = str(self.handler.get_mod(name))
1377 self.SetCellValue(rowi,6,mod) 1207 self.SetCellValue(rowi,6,mod)
1378 self.SetReadOnly(rowi,6) 1208 self.SetReadOnly(rowi,6)
1379 1209
1380 def on_size(self,evt): 1210 def on_size(self,evt):
1381 (w,h) = self.GetClientSizeTuple() 1211 (w,h) = self.GetClientSizeTuple()
1382 cols = self.GetNumberCols() 1212 cols = self.GetNumberCols()
1383 col_w = w/(cols+2) 1213 col_w = w/(cols+2)
1384 self.SetColSize(0,col_w*3) 1214 self.SetColSize(0,col_w*3)
1385 for i in range(1,cols): 1215 for i in range(1,cols): self.SetColSize(i,col_w)
1386 self.SetColSize(i,col_w)
1387 evt.Skip() 1216 evt.Skip()
1388 self.Refresh() 1217 self.Refresh()
1389 1218
1390 def refresh_data(self): 1219 def refresh_data(self):
1391 for r in range(self.GetNumberRows()): 1220 for r in range(self.GetNumberRows()): self.refresh_row(r)
1392 self.refresh_row(r)
1393
1394 1221
1395 1222
1396 class feat_panel(wx.Panel): 1223 class feat_panel(wx.Panel):
1397 def __init__(self, parent, handler): 1224 def __init__(self, parent, handler):
1398 pname = handler.master_dom.setAttribute("name", 'Feats') 1225 pname = handler.xml.set("name", 'Feats')
1399 wx.Panel.__init__(self, parent, -1) 1226 wx.Panel.__init__(self, parent, -1)
1400 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1227 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1401 sizer = wx.BoxSizer(wx.HORIZONTAL) 1228 sizer = wx.BoxSizer(wx.HORIZONTAL)
1402 remove_btn = wx.Button(self, wx.ID_ANY, "Remove Feat") 1229 remove_btn = wx.Button(self, wx.ID_ANY, "Remove Feat")
1403 add_btn = wx.Button(self, wx.ID_ANY, "Add Feat") 1230 add_btn = wx.Button(self, wx.ID_ANY, "Add Feat")
1408 self.SetSizer(self.sizer) 1235 self.SetSizer(self.sizer)
1409 self.Bind(wx.EVT_SIZE, self.on_size) 1236 self.Bind(wx.EVT_SIZE, self.on_size)
1410 self.Bind(wx.EVT_BUTTON, self.on_remove, remove_btn) 1237 self.Bind(wx.EVT_BUTTON, self.on_remove, remove_btn)
1411 self.Bind(wx.EVT_BUTTON, self.on_add, add_btn) 1238 self.Bind(wx.EVT_BUTTON, self.on_add, add_btn)
1412 1239
1413 n_list = handler.master_dom._get_childNodes() 1240 n_list = handler.xml.getchildren()
1414 self.n_list = n_list 1241 self.n_list = n_list
1415 self.master_dom = handler.master_dom 1242 self.xml = handler.xml
1416 self.grid.CreateGrid(len(n_list),2,1) 1243 self.grid.CreateGrid(len(n_list),2,1)
1417 self.grid.SetRowLabelSize(0) 1244 self.grid.SetRowLabelSize(0)
1418 self.grid.SetColLabelValue(0,"Feat") 1245 self.grid.SetColLabelValue(0,"Feat")
1419 self.grid.SetColLabelValue(1,"Type") 1246 self.grid.SetColLabelValue(1,"Type")
1420 for i in range(len(n_list)): 1247 for i in range(len(n_list)): self.refresh_row(i)
1421 self.refresh_row(i)
1422 self.temp_dom = None 1248 self.temp_dom = None
1423 1249
1424 def refresh_row(self,i): 1250 def refresh_row(self,i):
1425 feat = self.n_list[i] 1251 feat = self.n_list[i]
1426 name = feat.getAttribute('name') 1252 name = feat.get('name')
1427 type = feat.getAttribute('type') 1253 type = feat.get('type')
1428 self.grid.SetCellValue(i,0,name) 1254 self.grid.SetCellValue(i,0,name)
1429 self.grid.SetReadOnly(i,0) 1255 self.grid.SetReadOnly(i,0)
1430 self.grid.SetCellValue(i,1,type) 1256 self.grid.SetCellValue(i,1,type)
1431 self.grid.SetReadOnly(i,1) 1257 self.grid.SetReadOnly(i,1)
1432 1258
1433 def on_remove(self,evt): 1259 def on_remove(self,evt):
1434 rows = self.grid.GetNumberRows() 1260 rows = self.grid.GetNumberRows()
1435 for i in range(rows): 1261 for i in range(rows):
1436 if self.grid.IsInSelection(i,0): 1262 if self.grid.IsInSelection(i,0):
1437 self.grid.DeleteRows(i) 1263 self.grid.DeleteRows(i)
1438 self.master_dom.removeChild(self.n_list[i]) 1264 self.xml.remove(self.n_list[i])
1439 1265
1440 def on_add(self,evt): 1266 def on_add(self,evt):
1441 if not self.temp_dom: 1267 if not self.temp_dom:
1442 tmp = open(dir_struct["SWd20"]+"d20feats.xml","r") 1268 tree = parse(dir_struct["SWd20"]+"d20feats.xml")
1443 xml_dom = parseXml_with_dlg(self,tmp.read()) 1269 self.temp_dom = tree.getroot()
1444 xml_dom = xml_dom._get_firstChild() 1270 f_list = self.temp_dom.findall('feat')
1445 tmp.close()
1446 self.temp_dom = xml_dom
1447 f_list = self.temp_dom.getElementsByTagName('feat')
1448 opts = [] 1271 opts = []
1449 for f in f_list: 1272 for f in f_list: opts.append(f.get('name'))
1450 opts.append(f.getAttribute('name'))
1451 dlg = wx.SingleChoiceDialog(self,'Choose Feat','Feats',opts) 1273 dlg = wx.SingleChoiceDialog(self,'Choose Feat','Feats',opts)
1452 if dlg.ShowModal() == wx.ID_OK: 1274 if dlg.ShowModal() == wx.ID_OK:
1453 i = dlg.GetSelection() 1275 i = dlg.GetSelection()
1454 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 1276 new_node = self.xml.append(f_list[i])
1455 self.grid.AppendRows(1) 1277 self.grid.AppendRows(1)
1456 self.refresh_row(self.grid.GetNumberRows()-1) 1278 self.refresh_row(self.grid.GetNumberRows()-1)
1457 dlg.Destroy() 1279 dlg.Destroy()
1458 1280
1459 1281
1462 self.grid.SetDimensions(0,0,s[0],s[1]-25) 1284 self.grid.SetDimensions(0,0,s[0],s[1]-25)
1463 self.sizer.SetDimension(0,s[1]-25,s[0],25) 1285 self.sizer.SetDimension(0,s[1]-25,s[0],25)
1464 (w,h) = self.grid.GetClientSizeTuple() 1286 (w,h) = self.grid.GetClientSizeTuple()
1465 cols = self.grid.GetNumberCols() 1287 cols = self.grid.GetNumberCols()
1466 col_w = w/(cols) 1288 col_w = w/(cols)
1467 for i in range(0,cols): 1289 for i in range(0,cols): self.grid.SetColSize(i,col_w)
1468 self.grid.SetColSize(i,col_w)
1469 1290
1470 class attack_grid(wx.grid.Grid): 1291 class attack_grid(wx.grid.Grid):
1471 """grid for attacks""" 1292 """grid for attacks"""
1472 def __init__(self, parent, handler): 1293 def __init__(self, parent, handler):
1473 pname = handler.master_dom.setAttribute("name", 'Melee') 1294 pname = handler.xml.set("name", 'Melee')
1474 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1295 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1475 self.parent = parent 1296 self.parent = parent
1476 self.handler = handler 1297 self.handler = handler
1477 self.rows = (self.handler.melee,self.handler.ranged) 1298 self.rows = (self.handler.melee,self.handler.ranged)
1478 self.CreateGrid(2,10) 1299 self.CreateGrid(2,10)
1479 self.SetRowLabelSize(0) 1300 self.SetRowLabelSize(0)
1480 col_names = ['Type','base','base 2','base 3','base 4','base 5','base 6','abil','misc','Total'] 1301 col_names = ['Type','base','base 2','base 3','base 4','base 5','base 6','abil','misc','Total']
1481 for i in range(len(col_names)): 1302 for i in range(len(col_names)): self.SetColLabelValue(i,col_names[i])
1482 self.SetColLabelValue(i,col_names[i])
1483 self.SetCellValue(0,0,"Melee") 1303 self.SetCellValue(0,0,"Melee")
1484 self.SetCellValue(1,0,"Ranged") 1304 self.SetCellValue(1,0,"Ranged")
1485 self.refresh_data() 1305 self.refresh_data()
1486 self.Bind(wx.EVT_SIZE, self.on_size) 1306 self.Bind(wx.EVT_SIZE, self.on_size)
1487 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 1307 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1490 row = evt.GetRow() 1310 row = evt.GetRow()
1491 col = evt.GetCol() 1311 col = evt.GetCol()
1492 value = self.GetCellValue(row,col) 1312 value = self.GetCellValue(row,col)
1493 try: 1313 try:
1494 int(value) 1314 int(value)
1495 if col==1: 1315 if col== 1: self.rows[row].set('base',value)
1496 self.rows[row].setAttribute('base',value) 1316 elif col== 2: self.rows[row].set('second',value)
1497 elif col==2: 1317 elif col== 3: self.rows[row].set('third',value)
1498 self.rows[row].setAttribute('second',value) 1318 elif col== 4: self.rows[row].set('forth',value)
1499 elif col==3: 1319 elif col== 5: self.rows[row].set('fifth',value)
1500 self.rows[row].setAttribute('third',value) 1320 elif col== 6: self.rows[row].set('sixth',value)
1501 elif col==4: 1321 elif col== 8: self.rows[row].set('misc',value)
1502 self.rows[row].setAttribute('forth',value)
1503 elif col==5:
1504 self.rows[row].setAttribute('fifth',value)
1505 elif col==6:
1506 self.rows[row].setAttribute('sixth',value)
1507 elif col==8:
1508 self.rows[row].setAttribute('misc',value)
1509 self.parent.refresh_data() 1322 self.parent.refresh_data()
1510 except: 1323 except: self.SetCellValue(row,col,"0")
1511 self.SetCellValue(row,col,"0")
1512 1324
1513 def refresh_data(self): 1325 def refresh_data(self):
1514 melee = self.handler.get_attack_data('m') 1326 melee = self.handler.get_attack_data('m')
1515 ranged = self.handler.get_attack_data('r') 1327 ranged = self.handler.get_attack_data('r')
1516 for i in range(0,7): 1328 for i in range(0,7):
1523 self.SetReadOnly(0,7) 1335 self.SetReadOnly(0,7)
1524 self.SetReadOnly(1,7) 1336 self.SetReadOnly(1,7)
1525 self.SetReadOnly(0,9) 1337 self.SetReadOnly(0,9)
1526 self.SetReadOnly(1,9) 1338 self.SetReadOnly(1,9)
1527 1339
1528
1529 def on_size(self,evt): 1340 def on_size(self,evt):
1530 (w,h) = self.GetClientSizeTuple() 1341 (w,h) = self.GetClientSizeTuple()
1531 cols = self.GetNumberCols() 1342 cols = self.GetNumberCols()
1532 col_w = w/(cols+1) 1343 col_w = w/(cols+1)
1533 self.SetColSize(0,col_w*2) 1344 self.SetColSize(0,col_w*2)
1534 for i in range(1,cols): 1345 for i in range(1,cols): self.SetColSize(i,col_w)
1535 self.SetColSize(i,col_w)
1536 evt.Skip() 1346 evt.Skip()
1537 self.Refresh() 1347 self.Refresh()
1538 1348
1539 class weapon_panel(wx.Panel): 1349 class weapon_panel(wx.Panel):
1540 def __init__(self, parent, handler): 1350 def __init__(self, parent, handler):
1541 pname = handler.master_dom.setAttribute("name", 'Weapons') 1351 pname = handler.xml.set("name", 'Weapons')
1542 wx.Panel.__init__(self, parent, -1) 1352 wx.Panel.__init__(self, parent, -1)
1543 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1353 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1544 sizer = wx.BoxSizer(wx.HORIZONTAL) 1354 sizer = wx.BoxSizer(wx.HORIZONTAL)
1545 remove_btn = wx.Button(self, 10, "Remove Weapon") 1355 remove_btn = wx.Button(self, 10, "Remove Weapon")
1546 add_btn = wx.Button(self, 20, "Add Weapon") 1356 add_btn = wx.Button(self, 20, "Add Weapon")
1551 self.SetSizer(self.sizer) 1361 self.SetSizer(self.sizer)
1552 self.Bind(wx.EVT_SIZE, self.on_size) 1362 self.Bind(wx.EVT_SIZE, self.on_size)
1553 self.Bind(wx.EVT_BUTTON, self.on_remove, remove_btn) 1363 self.Bind(wx.EVT_BUTTON, self.on_remove, remove_btn)
1554 self.Bind(wx.EVT_BUTTON, self.on_add, add_btn) 1364 self.Bind(wx.EVT_BUTTON, self.on_add, add_btn)
1555 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 1365 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1556 n_list = handler.master_dom.getElementsByTagName('weapon') 1366 n_list = handler.xml.findall('weapon')
1557 self.n_list = n_list 1367 self.n_list = n_list
1558 self.master_dom = handler.master_dom 1368 self.xml = handler.xml
1559 self.handler = handler 1369 self.handler = handler
1560 self.grid.CreateGrid(len(n_list),9,1) 1370 self.grid.CreateGrid(len(n_list),9,1)
1561 self.grid.SetRowLabelSize(0) 1371 self.grid.SetRowLabelSize(0)
1562 col_names = ['Name','damage','mod','critical','type','weight','range','size','Total'] 1372 col_names = ['Name','damage','mod','critical','type','weight','range','size','Total']
1563 for i in range(len(col_names)): 1373 for i in range(len(col_names)): self.grid.SetColLabelValue(i,col_names[i])
1564 self.grid.SetColLabelValue(i,col_names[i])
1565 self.refresh_data() 1374 self.refresh_data()
1566 self.temp_dom = None 1375 self.temp_dom = None
1567 1376
1568 def on_cell_change(self,evt): 1377 def on_cell_change(self,evt):
1569 row = evt.GetRow() 1378 row = evt.GetRow()
1570 col = evt.GetCol() 1379 col = evt.GetCol()
1571 value = self.grid.GetCellValue(row,col) 1380 value = self.grid.GetCellValue(row,col)
1572 if col == 0: 1381 if col == 0: self.n_list[row].set('name',value)
1573 self.n_list[row].setAttribute('name',value)
1574 elif col == 2: 1382 elif col == 2:
1575 try: 1383 try:
1576 int(value) 1384 int(value)
1577 self.n_list[row].setAttribute('mod',value) 1385 self.n_list[row].set('mod',value)
1578 self.refresh_row(row) 1386 self.refresh_row(row)
1579 except: 1387 except: self.grid.SetCellValue(row,col,"1")
1580 self.grid.SetCellValue(row,col,"1") 1388 else: self.n_list[row].set(self.grid.GetColLabelValue(col),value)
1581 else:
1582 self.n_list[row].setAttribute(self.grid.GetColLabelValue(col),value)
1583 1389
1584 def refresh_row(self,i): 1390 def refresh_row(self,i):
1585 n = self.n_list[i] 1391 n = self.n_list[i]
1586 name = n.getAttribute('name') 1392 name = n.get('name')
1587 mod = n.getAttribute('mod') 1393 mod = n.get('mod')
1588 ran = n.getAttribute('range') 1394 ran = n.get('range')
1589 total = str(int(mod) + self.handler.get_mod(ran)) 1395 total = str(int(mod) + self.handler.get_mod(ran))
1590 self.grid.SetCellValue(i,0,name) 1396 self.grid.SetCellValue(i,0,name)
1591 self.grid.SetCellValue(i,1,n.getAttribute('damage')) 1397 self.grid.SetCellValue(i,1,n.get('damage'))
1592 self.grid.SetCellValue(i,2,mod) 1398 self.grid.SetCellValue(i,2,mod)
1593 self.grid.SetCellValue(i,3,n.getAttribute('critical')) 1399 self.grid.SetCellValue(i,3,n.get('critical'))
1594 self.grid.SetCellValue(i,4,n.getAttribute('type')) 1400 self.grid.SetCellValue(i,4,n.get('type'))
1595 self.grid.SetCellValue(i,5,n.getAttribute('weight')) 1401 self.grid.SetCellValue(i,5,n.get('weight'))
1596 self.grid.SetCellValue(i,6,ran) 1402 self.grid.SetCellValue(i,6,ran)
1597 self.grid.SetCellValue(i,7,n.getAttribute('size') ) 1403 self.grid.SetCellValue(i,7,n.get('size') )
1598 self.grid.SetCellValue(i,8,total) 1404 self.grid.SetCellValue(i,8,total)
1599 self.grid.SetReadOnly(i,8) 1405 self.grid.SetReadOnly(i,8)
1600 1406
1601 def on_remove(self,evt): 1407 def on_remove(self,evt):
1602 rows = self.grid.GetNumberRows() 1408 rows = self.grid.GetNumberRows()
1603 for i in range(rows): 1409 for i in range(rows):
1604 if self.grid.IsInSelection(i,0): 1410 if self.grid.IsInSelection(i,0):
1605 self.grid.DeleteRows(i) 1411 self.grid.DeleteRows(i)
1606 self.master_dom.removeChild(self.n_list[i]) 1412 self.xml.remove(self.n_list[i])
1607 self.n_list = self.master_dom.getElementsByTagName('weapon') 1413 self.n_list = self.xml.findall('weapon')
1608 self.handler.refresh_weapons() 1414 self.handler.refresh_weapons()
1609 1415
1610 def on_add(self,evt): 1416 def on_add(self,evt):
1611 if not self.temp_dom: 1417 if not self.temp_dom:
1612 tmp = open(dir_struct["SWd20"]+"d20weapons.xml","r") 1418 tree = parse(dir_struct["SWd20"]+"d20weapons.xml")
1613 xml_dom = parseXml_with_dlg(self,tmp.read()) 1419 self.temp_dom = tree.getroot()
1614 xml_dom = xml_dom._get_firstChild() 1420 f_list = self.temp_dom.findall('weapon')
1615 tmp.close()
1616 self.temp_dom = xml_dom
1617 f_list = self.temp_dom.getElementsByTagName('weapon')
1618 opts = [] 1421 opts = []
1619 for f in f_list: 1422 for f in f_list:
1620 opts.append(f.getAttribute('name')) 1423 opts.append(f.get('name'))
1621 dlg = wx.SingleChoiceDialog(self,'Choose Weapon','Weapon List',opts) 1424 dlg = wx.SingleChoiceDialog(self,'Choose Weapon','Weapon List',opts)
1622 if dlg.ShowModal() == wx.ID_OK: 1425 if dlg.ShowModal() == wx.ID_OK:
1623 i = dlg.GetSelection() 1426 i = dlg.GetSelection()
1624 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 1427 new_node = self.xml.append(f_list[i])
1625 self.grid.AppendRows(1) 1428 self.grid.AppendRows(1)
1626 self.n_list = self.master_dom.getElementsByTagName('weapon') 1429 self.n_list = self.xml.findall('weapon')
1627 self.refresh_row(self.grid.GetNumberRows()-1) 1430 self.refresh_row(self.grid.GetNumberRows()-1)
1628 self.handler.refresh_weapons() 1431 self.handler.refresh_weapons()
1629 dlg.Destroy() 1432 dlg.Destroy()
1630 1433
1631 def on_size(self,event): 1434 def on_size(self,event):
1634 self.sizer.SetDimension(0,s[1]-25,s[0],25) 1437 self.sizer.SetDimension(0,s[1]-25,s[0],25)
1635 (w,h) = self.grid.GetClientSizeTuple() 1438 (w,h) = self.grid.GetClientSizeTuple()
1636 cols = self.grid.GetNumberCols() 1439 cols = self.grid.GetNumberCols()
1637 col_w = w/(cols+1) 1440 col_w = w/(cols+1)
1638 self.grid.SetColSize(0,col_w*2) 1441 self.grid.SetColSize(0,col_w*2)
1639 for i in range(1,cols): 1442 for i in range(1,cols): self.grid.SetColSize(i,col_w)
1640 self.grid.SetColSize(i,col_w)
1641 1443
1642 def refresh_data(self): 1444 def refresh_data(self):
1643 for i in range(len(self.n_list)): 1445 for i in range(len(self.n_list)): self.refresh_row(i)
1644 self.refresh_row(i)
1645 1446
1646 1447
1647 class attack_panel(wx.Panel): 1448 class attack_panel(wx.Panel):
1648 def __init__(self, parent, handler): 1449 def __init__(self, parent, handler):
1649 pname = handler.master_dom.setAttribute("name", 'Melee') 1450 pname = handler.xml.set("name", 'Melee')
1650 wx.Panel.__init__(self, parent, -1) 1451 wx.Panel.__init__(self, parent, -1)
1651
1652 self.a_grid = attack_grid(self, handler) 1452 self.a_grid = attack_grid(self, handler)
1653 self.w_panel = weapon_panel(self, handler) 1453 self.w_panel = weapon_panel(self, handler)
1654 self.sizer = wx.BoxSizer(wx.VERTICAL) 1454 self.sizer = wx.BoxSizer(wx.VERTICAL)
1655 self.sizer.Add(self.a_grid, 1, wx.EXPAND) 1455 self.sizer.Add(self.a_grid, 1, wx.EXPAND)
1656 self.sizer.Add(self.w_panel, 2, wx.EXPAND) 1456 self.sizer.Add(self.w_panel, 2, wx.EXPAND)
1666 self.a_grid.refresh_data() 1466 self.a_grid.refresh_data()
1667 1467
1668 1468
1669 class ac_panel(wx.Panel): 1469 class ac_panel(wx.Panel):
1670 def __init__(self, parent, handler): 1470 def __init__(self, parent, handler):
1671 pname = handler.master_dom.setAttribute("name", 'Armor') 1471 pname = handler.xml.set("name", 'Armor')
1672 wx.Panel.__init__(self, parent, -1) 1472 wx.Panel.__init__(self, parent, -1)
1673 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1473 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1674 sizer = wx.BoxSizer(wx.HORIZONTAL) 1474 sizer = wx.BoxSizer(wx.HORIZONTAL)
1675 remove_btn = wx.Button(self, 10, "Remove Armor") 1475 remove_btn = wx.Button(self, 10, "Remove Armor")
1676 add_btn = wx.Button(self, 20, "Add Armor") 1476 add_btn = wx.Button(self, 20, "Add Armor")
1681 self.SetSizer(self.sizer) 1481 self.SetSizer(self.sizer)
1682 self.Bind(wx.EVT_SIZE, self.on_size) 1482 self.Bind(wx.EVT_SIZE, self.on_size)
1683 self.Bind(wx.EVT_BUTTON, self.on_remove, remove_btn) 1483 self.Bind(wx.EVT_BUTTON, self.on_remove, remove_btn)
1684 self.Bind(wx.EVT_BUTTON, self.on_add, add_btn) 1484 self.Bind(wx.EVT_BUTTON, self.on_add, add_btn)
1685 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 1485 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1686 self.master_dom = handler.master_dom 1486 self.xml = handler.xml
1687 n_list = handler.master_dom._get_childNodes() 1487 n_list = handler.xml.getchildren()
1688 self.n_list = n_list 1488 self.n_list = n_list
1689 col_names = ['Armor','DR','Max Dex','Check Penalty','Weight','Speed (10)','Speed (6)','type'] 1489 col_names = ['Armor','DR','Max Dex','Check Penalty','Weight','Speed (10)','Speed (6)','type']
1690 self.grid.CreateGrid(len(n_list),len(col_names),1) 1490 self.grid.CreateGrid(len(n_list),len(col_names),1)
1691 self.grid.SetRowLabelSize(0) 1491 self.grid.SetRowLabelSize(0)
1692 for i in range(len(col_names)): 1492 for i in range(len(col_names)): self.grid.SetColLabelValue(i,col_names[i])
1693 self.grid.SetColLabelValue(i,col_names[i])
1694 self.atts =['name','bonus','maxdex','checkpenalty','weight','speed','speed6','type'] 1493 self.atts =['name','bonus','maxdex','checkpenalty','weight','speed','speed6','type']
1695 for i in range(len(n_list)): 1494 for i in range(len(n_list)): self.refresh_row(i)
1696 self.refresh_row(i)
1697 self.temp_dom = None 1495 self.temp_dom = None
1698 1496
1699 1497
1700 def on_cell_change(self,evt): 1498 def on_cell_change(self,evt):
1701 row = evt.GetRow() 1499 row = evt.GetRow()
1702 col = evt.GetCol() 1500 col = evt.GetCol()
1703 value = self.grid.GetCellValue(row,col) 1501 value = self.grid.GetCellValue(row,col)
1704 if col >= 1 and col <= 5: 1502 if col >= 1 and col <= 5:
1705 try: 1503 try:
1706 int(value) 1504 int(value)
1707 self.n_list[row].setAttribute(self.atts[col],value) 1505 self.n_list[row].set(self.atts[col],value)
1708 except: 1506 except: self.grid.SetCellValue(row,col,"0")
1709 self.grid.SetCellValue(row,col,"0") 1507 else: self.n_list[row].set(self.atts[col],value)
1710 else:
1711 self.n_list[row].setAttribute(self.atts[col],value)
1712 1508
1713 def refresh_row(self,i): 1509 def refresh_row(self,i):
1714 n = self.n_list[i] 1510 n = self.n_list[i]
1715 for y in range(len(self.atts)): 1511 for y in range(len(self.atts)): self.grid.SetCellValue(i,y,n.get(self.atts[y]))
1716 self.grid.SetCellValue(i,y,n.getAttribute(self.atts[y]))
1717 1512
1718 def on_remove(self,evt): 1513 def on_remove(self,evt):
1719 rows = self.grid.GetNumberRows() 1514 rows = self.grid.GetNumberRows()
1720 for i in range(rows): 1515 for i in range(rows):
1721 if self.grid.IsInSelection(i,0): 1516 if self.grid.IsInSelection(i,0):
1722 self.grid.DeleteRows(i) 1517 self.grid.DeleteRows(i)
1723 self.master_dom.removeChild(self.n_list[i]) 1518 self.xml.remove(self.n_list[i])
1724 1519
1725 def on_add(self,evt): 1520 def on_add(self,evt):
1726 if not self.temp_dom: 1521 if not self.temp_dom:
1727 tmp = open(dir_struct["SWd20"]+"d20armor.xml","r") 1522 tree = parse(dir_struct["SWd20"]+"d20armor.xml")
1728 xml_dom = parseXml_with_dlg(self,tmp.read()) 1523 self.temp_dom = tree.getroot()
1729 xml_dom = xml_dom._get_firstChild() 1524 f_list = self.temp_dom.findall('armor')
1730 tmp.close()
1731 self.temp_dom = xml_dom
1732 f_list = self.temp_dom.getElementsByTagName('armor')
1733 opts = [] 1525 opts = []
1734 for f in f_list: 1526 for f in f_list: opts.append(f.get('name'))
1735 opts.append(f.getAttribute('name'))
1736 dlg = wx.SingleChoiceDialog(self,'Choose Armor:','Armor List',opts) 1527 dlg = wx.SingleChoiceDialog(self,'Choose Armor:','Armor List',opts)
1737 if dlg.ShowModal() == wx.ID_OK: 1528 if dlg.ShowModal() == wx.ID_OK:
1738 i = dlg.GetSelection() 1529 i = dlg.GetSelection()
1739 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 1530 new_node = self.xml.append(f_list[i])
1740 self.grid.AppendRows(1) 1531 self.grid.AppendRows(1)
1741 self.refresh_row(self.grid.GetNumberRows()-1) 1532 self.refresh_row(self.grid.GetNumberRows()-1)
1742 dlg.Destroy() 1533 dlg.Destroy()
1743 1534
1744 def on_size(self,event): 1535 def on_size(self,event):
1747 self.sizer.SetDimension(0,s[1]-25,s[0],25) 1538 self.sizer.SetDimension(0,s[1]-25,s[0],25)
1748 (w,h) = self.grid.GetClientSizeTuple() 1539 (w,h) = self.grid.GetClientSizeTuple()
1749 cols = self.grid.GetNumberCols() 1540 cols = self.grid.GetNumberCols()
1750 col_w = w/(cols+2) 1541 col_w = w/(cols+2)
1751 self.grid.SetColSize(0,col_w*3) 1542 self.grid.SetColSize(0,col_w*3)
1752 for i in range(1,cols): 1543 for i in range(1,cols): self.grid.SetColSize(i,col_w)
1753 self.grid.SetColSize(i,col_w)
1754 1544
1755 1545
1756 class class_panel(wx.Panel): 1546 class class_panel(wx.Panel):
1757 def __init__(self, parent, handler): 1547 def __init__(self, parent, handler):
1758 pname = handler.master_dom.setAttribute("name", 'Class') 1548 pname = handler.xml.set("name", 'Class')
1759 wx.Panel.__init__(self, parent, -1) 1549 wx.Panel.__init__(self, parent, -1)
1760 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1550 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1761 sizer = wx.BoxSizer(wx.HORIZONTAL) 1551 sizer = wx.BoxSizer(wx.HORIZONTAL)
1762 remove_btn = wx.Button(self, wx.ID_ANY, "Remove Class") 1552 remove_btn = wx.Button(self, wx.ID_ANY, "Remove Class")
1763 add_btn = wx.Button(self, wx.ID_ANY, "Add Class") 1553 add_btn = wx.Button(self, wx.ID_ANY, "Add Class")
1769 self.Bind(wx.EVT_SIZE, self.on_size) 1559 self.Bind(wx.EVT_SIZE, self.on_size)
1770 self.Bind(wx.EVT_BUTTON, self.on_remove, remove_btn) 1560 self.Bind(wx.EVT_BUTTON, self.on_remove, remove_btn)
1771 self.Bind(wx.EVT_BUTTON, self.on_add, add_btn) 1561 self.Bind(wx.EVT_BUTTON, self.on_add, add_btn)
1772 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 1562 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1773 1563
1774 n_list = handler.master_dom._get_childNodes() 1564 n_list = handler.xml.getchildren()
1775 self.n_list = n_list 1565 self.n_list = n_list
1776 self.master_dom = handler.master_dom 1566 self.xml = handler.xml
1777 self.grid.CreateGrid(len(n_list),2,1) 1567 self.grid.CreateGrid(len(n_list),2,1)
1778 self.grid.SetRowLabelSize(0) 1568 self.grid.SetRowLabelSize(0)
1779 self.grid.SetColLabelValue(0,"Class") 1569 self.grid.SetColLabelValue(0,"Class")
1780 self.grid.SetColLabelValue(1,"Level") 1570 self.grid.SetColLabelValue(1,"Level")
1781 for i in range(len(n_list)): 1571 for i in range(len(n_list)): self.refresh_row(i)
1782 self.refresh_row(i)
1783 self.temp_dom = None 1572 self.temp_dom = None
1784 1573
1785 def on_cell_change(self,evt): 1574 def on_cell_change(self,evt):
1786 row = evt.GetRow() 1575 row = evt.GetRow()
1787 col = evt.GetCol() 1576 col = evt.GetCol()
1788 value = self.grid.GetCellValue(row,col) 1577 value = self.grid.GetCellValue(row,col)
1789 try: 1578 try:
1790 int(value) 1579 int(value)
1791 self.n_list[row].setAttribute('level',value) 1580 self.n_list[row].set('level',value)
1792 except: 1581 except: self.grid.SetCellValue(row,col,"1")
1793 self.grid.SetCellValue(row,col,"1")
1794 1582
1795 1583
1796 def refresh_row(self,i): 1584 def refresh_row(self,i):
1797 n = self.n_list[i] 1585 n = self.n_list[i]
1798 name = n.getAttribute('name') 1586 name = n.get('name')
1799 level = n.getAttribute('level') 1587 level = n.get('level')
1800 self.grid.SetCellValue(i,0,name) 1588 self.grid.SetCellValue(i,0,name)
1801 self.grid.SetReadOnly(i,0) 1589 self.grid.SetReadOnly(i,0)
1802 self.grid.SetCellValue(i,1,level) 1590 self.grid.SetCellValue(i,1,level)
1803 #self.grid.SetReadOnly(i,1)
1804 1591
1805 def on_remove(self,evt): 1592 def on_remove(self,evt):
1806 rows = self.grid.GetNumberRows() 1593 rows = self.grid.GetNumberRows()
1807 for i in range(rows): 1594 for i in range(rows):
1808 if self.grid.IsInSelection(i,0): 1595 if self.grid.IsInSelection(i,0):
1809 self.grid.DeleteRows(i) 1596 self.grid.DeleteRows(i)
1810 self.master_dom.removeChild(self.n_list[i]) 1597 self.xml.remove(self.n_list[i])
1811 1598
1812 def on_add(self,evt): 1599 def on_add(self,evt):
1813 if not self.temp_dom: 1600 if not self.temp_dom:
1814 tmp = open(dir_struct["SWd20"]+"SWd20classes.xml","r") 1601 tree = parse(dir_struct["SWd20"]+"SWd20classes.xml")
1815 xml_dom = parseXml_with_dlg(self,tmp.read()) 1602 self.temp_dom = tree.getroot()
1816 xml_dom = xml_dom._get_firstChild() 1603 f_list = self.temp_dom.findall('class')
1817 tmp.close()
1818 self.temp_dom = xml_dom
1819 f_list = self.temp_dom.getElementsByTagName('class')
1820 opts = [] 1604 opts = []
1821 for f in f_list: 1605 for f in f_list: opts.append(f.get('name'))
1822 opts.append(f.getAttribute('name'))
1823 dlg = wx.SingleChoiceDialog(self,'Choose Class','Classes',opts) 1606 dlg = wx.SingleChoiceDialog(self,'Choose Class','Classes',opts)
1824 if dlg.ShowModal() == wx.ID_OK: 1607 if dlg.ShowModal() == wx.ID_OK:
1825 i = dlg.GetSelection() 1608 i = dlg.GetSelection()
1826 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 1609 new_node = self.xml.append(f_list[i])
1827 self.grid.AppendRows(1) 1610 self.grid.AppendRows(1)
1828 self.refresh_row(self.grid.GetNumberRows()-1) 1611 self.refresh_row(self.grid.GetNumberRows()-1)
1829 dlg.Destroy() 1612 dlg.Destroy()
1830 1613
1831 1614
1834 self.grid.SetDimensions(0,0,s[0],s[1]-25) 1617 self.grid.SetDimensions(0,0,s[0],s[1]-25)
1835 self.sizer.SetDimension(0,s[1]-25,s[0],25) 1618 self.sizer.SetDimension(0,s[1]-25,s[0],25)
1836 (w,h) = self.grid.GetClientSizeTuple() 1619 (w,h) = self.grid.GetClientSizeTuple()
1837 cols = self.grid.GetNumberCols() 1620 cols = self.grid.GetNumberCols()
1838 col_w = w/(cols) 1621 col_w = w/(cols)
1839 for i in range(0,cols): 1622 for i in range(0,cols): self.grid.SetColSize(i,col_w)
1840 self.grid.SetColSize(i,col_w) 1623