comparison orpg/gametree/nodehandlers/core.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 d02e9197c066
comparison
equal deleted inserted replaced
27:51428d30c59e 28:ff154cf3350c
19 # 19 #
20 # File: core.py 20 # File: core.py
21 # Author: Chris Davis 21 # Author: Chris Davis
22 # Maintainer: 22 # Maintainer:
23 # Version: 23 # Version:
24 # $Id: core.py,v 1.49 2007/12/07 20:39:48 digitalxero Exp $ 24 # $Id: core.py,v Traipse 'Ornery-Orc' prof.ebral Exp $
25 # 25 #
26 # Description: The file contains code for the core nodehanlers 26 # Description: The file contains code for the core nodehanlers
27 # 27 #
28 28
29 __version__ = "$Id: core.py,v 1.49 2007/12/07 20:39:48 digitalxero Exp $" 29 __version__ = "$Id: core.py,v Traipse 'Ornery-Orc' prof.ebral Exp $"
30 30
31 from nodehandler_version import NODEHANDLER_VERSION 31 from nodehandler_version import NODEHANDLER_VERSION
32 from orpg.tools.InterParse import Parse
33
32 try: 34 try:
33 from orpg.orpg_windows import * 35 from orpg.orpg_windows import *
34 from orpg.dirpath import dir_struct 36 from orpg.dirpath import dir_struct
35 from orpg.orpgCore import component 37 from orpg.orpgCore import component
36 import webbrowser 38 import webbrowser, os
37 from orpg.mapper import map 39 from orpg.mapper import map
38 import os 40 from wx import DisplaySize
39 except: 41 except:
40 import wx 42 import wx
41 43
44 from xml.etree.ElementTree import ElementTree, Element, tostring, XML
45 from orpg.tools.orpg_log import debug
42 46
43 #html defaults 47 #html defaults
44 TH_BG = "#E9E9E9" 48 TH_BG = "#E9E9E9"
45 ########################## 49 ##########################
46 ## base node handler 50 ## base node handler
47 ########################## 51 ##########################
48 class node_handler: 52 class node_handler:
49 """ Base nodehandler with virtual functions and standard implmentations """ 53 """ Base nodehandler with virtual functions and standard implmentations """
50 def __init__(self,xml_dom,tree_node): 54 def __init__(self,xml,tree_node):
51 self.master_dom = xml_dom 55 self.xml = xml
52 self.mytree_node = tree_node 56 self.mytree_node = tree_node
53 self.tree = component.get('tree') 57 self.tree = component.get('tree')
54 self.frame = component.get('frame') 58 self.frame = component.get('frame')
55 self.chat = component.get('chat') 59 self.chat = component.get('chat')
56 self.xml = component.get('xml') #Not used?
57 self.drag = True 60 self.drag = True
58 self.myeditor = None # designing 61 self.myeditor = None # designing
59 self.myviewer = None # pretty print 62 self.myviewer = None # prett print
60 self.mywindow = None # using 63 self.mywindow = None # using
61 # call version hook 64 # call version hook
62 self.on_version(self.master_dom.getAttribute("version")) 65 self.on_version(self.xml.get("version"))
63 # set to current version 66 # set to current version
64 self.master_dom.setAttribute("version",NODEHANDLER_VERSION) 67 self.xml.set("version",NODEHANDLER_VERSION)
65 # null events 68 # null events
69 self.frame_size = None
70 self.frame_pos = None
71 try:
72 frame = self.xml.get("frame")
73 if len(frame):
74 (sx,sy,px,py) = [int(value) for value in frame.split(',')]
75 self.frame_size = (sx, sy)
76 (maxx, maxy) = DisplaySize()
77 if px < maxx-80 and py < maxy-50: self.frame_pos = (px, py) #if it's off screen ignore the saved pos
78 except: pass
66 79
67 def on_version(self,old_version): 80 def on_version(self,old_version):
68 ## added version control code here or implement a new on_version in your derived class. 81 ## added version control code here or implement a new on_version in your derived class.
69 ## always call the base class on_version ! 82 ## always call the base class on_version !
70 pass 83 pass
73 self.tree.do_std_menu(evt,self) 86 self.tree.do_std_menu(evt,self)
74 87
75 def on_ldclick(self,evt): 88 def on_ldclick(self,evt):
76 return 0 89 return 0
77 90
78 def traverse(self, traverseroot, function, cookie=0, event=None, recursive=True):
79 """ walk tree control """
80 if traverseroot.IsOk():
81 # step in subtree if there are items or ...
82 if self.tree.ItemHasChildren(traverseroot) and recursive:
83 firstchild, cookie = self.tree.GetFirstChild(traverseroot)
84 obj = self.tree.GetPyData(firstchild)
85 function(obj, event)
86 self.traverse(firstchild, function, cookie, event, recursive)
87
88 # ... loop siblings
89 obj = self.tree.GetPyData(traverseroot)
90 function(obj, event)
91
92 child = self.tree.GetNextSibling(traverseroot)
93 if child.IsOk():
94 self.traverse(child, function, cookie, event, recursive)
95
96
97 def usefulness(self,text): 91 def usefulness(self,text):
98 if text=="useful": 92 if text=="useful": self.xml.set('status',"useful")
99 self.master_dom.setAttribute('status',"useful") 93 elif text=="useless": self.xml.set('status',"useless")
100 elif text=="useless": 94 elif text=="indifferent": self.xml.set('status',"indifferent")
101 self.master_dom.setAttribute('status',"useless")
102 elif text=="indifferent":
103 self.master_dom.setAttribute('status',"indifferent")
104 95
105 def on_design(self,evt): 96 def on_design(self,evt):
106 try: 97 try:
107 self.myeditor.Show() 98 self.myeditor.Show()
108 self.myeditor.Raise() 99 self.myeditor.Raise()
112 self.myeditor.Show() 103 self.myeditor.Show()
113 self.myeditor.Raise() 104 self.myeditor.Raise()
114 else: return 105 else: return
115 wx.CallAfter(self.myeditor.Layout) 106 wx.CallAfter(self.myeditor.Layout)
116 107
117
118 def create_designframe(self): 108 def create_designframe(self):
119 title = self.master_dom.getAttribute('name') + " Editor" 109 title = self.xml.get('name') + " Editor"
120 self.myeditor = wx.Frame(None, -1, title) 110 self.myeditor = wx.Frame(None, -1, title)
121 self.myeditor.Freeze() 111 self.myeditor.Freeze()
122 if wx.Platform == '__WXMSW__': 112 if wx.Platform == '__WXMSW__':
123 icon = wx.Icon(dir_struct["icon"] + 'grid.ico', wx.BITMAP_TYPE_ICO) 113 icon = wx.Icon(orpg.dirpath.dir_struct["icon"] + 'grid.ico', wx.BITMAP_TYPE_ICO)
124 self.myeditor.SetIcon(icon) 114 self.myeditor.SetIcon(icon)
125 del icon 115 del icon
126 116
127 self.myeditor.panel = self.get_design_panel(self.myeditor) 117 self.myeditor.panel = self.get_design_panel(self.myeditor)
128 if self.myeditor.panel == None: 118 if self.myeditor.panel == None:
133 123
134 self.myeditor.SetSizer(sizer) 124 self.myeditor.SetSizer(sizer)
135 self.myeditor.SetAutoLayout(True) 125 self.myeditor.SetAutoLayout(True)
136 126
137 (x, y) = self.myeditor.GetSize() 127 (x, y) = self.myeditor.GetSize()
138 if x < 400: 128 if x < 400: x = 400
139 x = 400 129 if y < 400: y = 400
140 if y < 400:
141 y = 400
142 130
143 self.myeditor.SetSize((x, y)) 131 self.myeditor.SetSize((x, y))
144 self.myeditor.Layout() 132 self.myeditor.Layout()
145 self.myeditor.Thaw() 133 self.myeditor.Thaw()
146
147 return True 134 return True
148 135
149 def on_use(self,evt): 136 def on_use(self, evt):
150 try: 137 try:
151 self.mywindow.Show() 138 self.mywindow.Show()
152 self.mywindow.Raise() 139 self.mywindow.Raise()
153 except: 140 except:
154 del self.mywindow 141 del self.mywindow
155 if self.create_useframe(): 142 if self.create_useframe():
143 self.mywindow.SetSize(self.frame_size)
144 if self.frame_pos: self.mywindow.SetPosition(self.frame_pos)
156 self.mywindow.Show() 145 self.mywindow.Show()
157 self.mywindow.Raise() 146 self.mywindow.Raise()
158 else: 147 else: return
159 return
160 wx.CallAfter(self.mywindow.Layout) 148 wx.CallAfter(self.mywindow.Layout)
161 149
162 def create_useframe(self): 150 def create_useframe(self):
163 caption = self.master_dom.getAttribute('name') 151 caption = self.xml.get('name', '')
164 self.mywindow = wx.Frame(None, -1, caption) 152 self.mywindow = wx.Frame(None, -1, caption)
165 self.mywindow.Freeze() 153 self.mywindow.Freeze()
166
167 if wx.Platform == '__WXMSW__': 154 if wx.Platform == '__WXMSW__':
168 icon = wx.Icon(dir_struct["icon"] + 'note.ico', wx.BITMAP_TYPE_ICO) 155 icon = wx.Icon(orpg.dirpath.dir_struct["icon"] + 'note.ico', wx.BITMAP_TYPE_ICO)
169 self.mywindow.SetIcon(icon) 156 self.mywindow.SetIcon(icon)
170 del icon 157 del icon
171 self.mywindow.panel = self.get_use_panel(self.mywindow) 158 self.mywindow.panel = self.get_use_panel(self.mywindow)
172 if self.mywindow.panel == None: 159 if self.mywindow.panel == None:
173 self.mywindow.Destroy() 160 self.mywindow.Destroy()
176 sizer.Add(self.mywindow.panel, 2, wx.EXPAND) 163 sizer.Add(self.mywindow.panel, 2, wx.EXPAND)
177 164
178 self.mywindow.SetSizer(sizer) 165 self.mywindow.SetSizer(sizer)
179 self.mywindow.SetAutoLayout(True) 166 self.mywindow.SetAutoLayout(True)
180 167
181 (x, y) = self.mywindow.GetSize() 168 if self.frame_size is None:
182 if x < 400: 169 self.frame_size = self.mywindow.GetSize()
183 x = 400 170 if self.frame_size.x < 400: self.frame_size.x = 400
184 if y < 400: 171 if self.frame_size.y < 400: self.frame_size.y = 400
185 y = 400 172
186
187 self.mywindow.SetSize((x, y))
188 self.mywindow.Layout() 173 self.mywindow.Layout()
189 self.mywindow.Thaw() 174 self.mywindow.Thaw()
190 175 self.mywindow.Bind(wx.EVT_CLOSE, self.close_useframe)
191 return True 176 return True
192 177
178 def close_useframe(self, evt):
179 self.frame_size = self.mywindow.GetSize()
180 self.frame_pos = self.mywindow.GetPosition()
181 frame_values = str(self.frame_size.x)+','+str(self.frame_size.y)+','+str(self.frame_pos.x)+','+str(self.frame_pos.y)
182 self.xml.set("frame", frame_values)
183 self.mywindow.Destroy()
184
193 185
194 def on_html_view(self,evt): 186 def on_html_view(self,evt):
195 try: 187 try: self.myviewer.Raise()
196 self.myviewer.Raise()
197 except: 188 except:
198 caption = self.master_dom.getAttribute('name') 189 caption = self.xml.get('name')
199 self.myviewer = wx.Frame(None, -1, caption) 190 self.myviewer = wx.Frame(None, -1, caption)
200 if wx.Platform == '__WXMSW__': 191 if wx.Platform == '__WXMSW__':
201 icon = wx.Icon(dir_struct["icon"] + 'grid.ico', wx.BITMAP_TYPE_ICO) 192 icon = wx.Icon(orpg.dirpath.dir_struct["icon"] + 'grid.ico', wx.BITMAP_TYPE_ICO)
202 self.myviewer.SetIcon(icon) 193 self.myviewer.SetIcon(icon)
203 del icon 194 del icon
204 self.myviewer.panel = self.get_html_panel(self.myviewer) 195 self.myviewer.panel = self.get_html_panel(self.myviewer)
205 self.myviewer.Show() 196 self.myviewer.Show()
206 197
211 return 1; 202 return 1;
212 203
213 def on_del(self,evt): 204 def on_del(self,evt):
214 print "on del" 205 print "on del"
215 206
216 def on_new_data(self,xml_dom): 207 def on_new_data(self,xml):
217 pass 208 pass
218 209
219 def get_scaled_bitmap(self,x,y): 210 def get_scaled_bitmap(self,x,y):
220 return None 211 return None
221 212
223 pass 214 pass
224 215
225 def on_send_to_chat(self,evt): 216 def on_send_to_chat(self,evt):
226 self.chat.ParsePost(self.tohtml(),True,True) 217 self.chat.ParsePost(self.tohtml(),True,True)
227 218
228 def on_drop(self,evt): 219 def on_drop(self, evt):
229 drag_obj = self.tree.drag_obj 220 drag_obj = self.tree.drag_obj
230 if drag_obj == self or self.tree.is_parent_node(self.mytree_node,drag_obj.mytree_node): 221 if drag_obj == self or self.tree.is_parent_node(self.mytree_node, drag_obj.mytree_node):
231 return 222 return
232 #if self.is_my_child(self.mytree_node,drag_obj.mytree_node): 223 drop_xml = self.tree.drag_obj.delete()
233 # return
234 xml_dom = self.tree.drag_obj.delete()
235 parent = self.master_dom._get_parentNode()
236 xml_dom = parent.insertBefore(xml_dom,self.master_dom)
237 parent_node = self.tree.GetItemParent(self.mytree_node) 224 parent_node = self.tree.GetItemParent(self.mytree_node)
238 prev_sib = self.tree.GetPrevSibling(self.mytree_node) 225 prev_sib = self.tree.GetPrevSibling(self.mytree_node)
226 if parent_node == self.tree.root: parent_xml = self.tree.GetPyData(parent_node)
227 else: parent_xml = self.tree.GetPyData(parent_node).xml
228 for i in range(len(parent_xml)):
229 if parent_xml[i] is self.xml:
230 parent_xml.insert(i, drop_xml)
231 break
239 if not prev_sib.IsOk(): 232 if not prev_sib.IsOk():
240 prev_sib = parent_node 233 prev_sib = parent_node
241 self.tree.load_xml(xml_dom, parent_node, prev_sib) 234 self.tree.load_xml(drop_xml, parent_node, prev_sib)
235
236 def get_tree(self):
237 family = []
238 test = treenode
239 while test != self.tree.root:
240 test = self.tree.GetItemParent(test)
241 parent = self.tree.GetItemText(test)
242 family.append(parent)
243 return family
242 244
243 def toxml(self,pretty=0): 245 def toxml(self,pretty=0):
244 return component.get('xml').toxml(self.master_dom,pretty) 246 return tostring(self.xml) #toxml(self.master_dom,pretty)
245 247
246 def tohtml(self): 248 def tohtml(self):
247 return self.master_dom.getAttribute("name") 249 return self.xml.get("name")
248 250
249 def delete(self): 251 def delete(self):
250 """ removes the tree_node and xml_node, and returns the removed xml_node """ 252 """ removes the tree_node and xml_node, and returns the removed xml_node """
251 253 parent_node = self.tree.GetItemParent(self.mytree_node)
254 if parent_node == self.tree.root: parent_xml = self.tree.GetPyData(parent_node)
255 else: parent_xml = self.tree.GetPyData(parent_node).xml
256 parent_xml.remove(self.xml)
252 self.tree.Delete(self.mytree_node) 257 self.tree.Delete(self.mytree_node)
253 parent = self.master_dom._get_parentNode() 258 return self.xml
254 return parent.removeChild(self.master_dom)
255 259
256 def rename(self,name): 260 def rename(self,name):
257 if len(name): 261 if len(name):
258 self.tree.SetItemText(self.mytree_node,name) 262 self.tree.SetItemText(self.mytree_node,name)
259 self.master_dom.setAttribute('name', name) 263 self.xml.set('name', name)
260 264
261 def change_icon(self,icon): 265 def change_icon(self,icon):
262 self.master_dom.setAttribute("icon",icon) 266 self.xml.set("icon",icon)
263 self.tree.SetItemImage(self.mytree_node, self.tree.icons[icon]) 267 self.tree.SetItemImage(self.mytree_node, self.tree.icons[icon])
264 self.tree.SetItemImage(self.mytree_node, self.tree.icons[icon], wx.TreeItemIcon_Selected) 268 self.tree.SetItemImage(self.mytree_node, self.tree.icons[icon], wx.TreeItemIcon_Selected)
265 self.tree.Refresh() 269 self.tree.Refresh()
266 270
267 def on_save(self,evt): 271 def on_save(self,evt):
268 f = wx.FileDialog(self.tree,"Select a file", dir_struct["user"],"","XML files (*.xml)|*.xml",wx.SAVE) 272 f = wx.FileDialog(self.tree,"Select a file", orpg.dirpath.dir_struct["user"],"","XML files (*.xml)|*.xml",wx.SAVE)
269 if f.ShowModal() == wx.ID_OK: 273 if f.ShowModal() == wx.ID_OK: ElementTree(self.xml).write(f.GetPath())
270 type = f.GetFilterIndex()
271 if f.GetPath()[:len(f.GetPath())-4] != '.xml': file = open(f.GetPath()+'.xml',"w")
272 else: file = open(f.GetPath(),"w")
273 file.write(self.toxml(1))
274 file.close()
275 f.Destroy() 274 f.Destroy()
276 275
277 def get_design_panel(self,parent): 276 def get_design_panel(self,parent):
278 return None 277 return None
279 278
281 return None 280 return None
282 281
283 def get_html_panel(self,parent): 282 def get_html_panel(self,parent):
284 html_str = "<html><body bgcolor=\"#FFFFFF\" >"+self.tohtml()+"</body></html>" 283 html_str = "<html><body bgcolor=\"#FFFFFF\" >"+self.tohtml()+"</body></html>"
285 wnd = wx.html.HtmlWindow(parent,-1) 284 wnd = wx.html.HtmlWindow(parent,-1)
286 html_str = self.chat.ParseDice(html_str) 285 html_str = Parse.Dice(html_str)
287 wnd.SetPage(html_str) 286 wnd.SetPage(html_str)
288 return wnd 287 return wnd
289 288
290 def get_size_constraint(self): 289 def get_size_constraint(self):
291 return 0 290 return 0
292 291
293 def about(self): 292 def about(self):
294 html_str = "<b>"+ self.master_dom.getAttribute('class') 293 """html_str = "<b>"+ self.xml.get('class')
295 html_str += " Applet</b><br />by Chris Davis<br />chris@rpgarchive.com" 294 html_str += " Applet</b><br />by Chris Davis<br />chris@rpgarchive.com"
296 return html_str 295 return html_str"""
296 text = self.xml.get('class') + ' Applet\n'
297 text += 'by Chris Davis chris@rpgarchive.com'
298 return text
299
300 def get_value(self):
301 return None
297 302
298 P_TITLE = 10 303 P_TITLE = 10
299 P_BODY = 20 304 P_BODY = 20
305
300 class text_edit_panel(wx.Panel): 306 class text_edit_panel(wx.Panel):
301 def __init__(self, parent, handler): 307 def __init__(self, parent, handler):
302 wx.Panel.__init__(self, parent, -1) 308 wx.Panel.__init__(self, parent, -1)
303 self.handler = handler 309 self.handler = handler
304 sizer = wx.BoxSizer(wx.VERTICAL) 310 sizer = wx.BoxSizer(wx.VERTICAL)
305 self.text = { P_TITLE : wx.TextCtrl(self, P_TITLE, handler.master_dom.getAttribute('name')), 311 self.text = { P_TITLE : wx.TextCtrl(self, P_TITLE, handler.xml.get('name')),
306 P_BODY : html_text_edit(self,P_BODY,handler.text._get_nodeValue(),self.on_text) 312 P_BODY : html_text_edit(self,P_BODY,handler.text,self.on_text)
307 } 313 }
308 #P_BODY : wx.TextCtrl(self, P_BODY,handler.text._get_nodeValue(), style=wx.TE_MULTILINE)
309
310 sizer.Add(wx.StaticText(self, -1, "Title:"), 0, wx.EXPAND) 314 sizer.Add(wx.StaticText(self, -1, "Title:"), 0, wx.EXPAND)
311 sizer.Add(self.text[P_TITLE], 0, wx.EXPAND) 315 sizer.Add(self.text[P_TITLE], 0, wx.EXPAND)
312 sizer.Add(wx.StaticText(self, -1, "Text Body:"), 0, wx.EXPAND) 316 sizer.Add(wx.StaticText(self, -1, "Text Body:"), 0, wx.EXPAND)
313 sizer.Add(self.text[P_BODY], 1, wx.EXPAND) 317 sizer.Add(self.text[P_BODY], 1, wx.EXPAND)
314 self.sizer = sizer 318 self.sizer = sizer
321 txt = self.text[id].GetValue() 325 txt = self.text[id].GetValue()
322 # The following block strips out 8-bit characters 326 # The following block strips out 8-bit characters
323 u_txt = "" 327 u_txt = ""
324 bad_txt_found = 0 328 bad_txt_found = 0
325 for c in txt: 329 for c in txt:
326 if ord(c) < 128: 330 if ord(c) < 128: u_txt += c
327 u_txt += c 331 else: bad_txt_found = 1
328 else:
329 bad_txt_found = 1
330 if bad_txt_found: 332 if bad_txt_found:
331 wx.MessageBox("Some non 7-bit ASCII characters found and stripped","Warning!") 333 wx.MessageBox("Some non 7-bit ASCII characters found and stripped","Warning!")
332 txt = u_txt 334 txt = u_txt
333 if txt != "": 335 if txt != "":
334 self.handler.master_dom.setAttribute('name',txt) 336 self.handler.xml.set('name',txt)
335 self.handler.rename(txt) 337 self.handler.rename(txt)
336 elif id == P_BODY: 338 elif id == P_BODY:
337 txt = self.text[id].get_text() 339 txt = self.text[id].get_text()
338 u_txt = "" 340 u_txt = ""
339 bad_txt_found = 0 341 bad_txt_found = 0
340 for c in txt: 342 for c in txt:
341 if ord(c) < 128: 343 if ord(c) < 128: u_txt += c
342 u_txt += c 344 else: bad_txt_found = 1
343 else:
344 bad_txt_found = 1
345
346 if bad_txt_found: 345 if bad_txt_found:
347 wx.MessageBox("Some non 7-bit ASCII characters found and stripped","Warning!") 346 wx.MessageBox("Some non 7-bit ASCII characters found and stripped","Warning!")
348 txt = u_txt 347 txt = u_txt
349 self.handler.text._set_nodeValue(txt) 348 self.handler.text._set_nodeValue(txt)
350 349
355 ########################## 354 ##########################
356 class node_loader(node_handler): 355 class node_loader(node_handler):
357 """ clones childe node and insert it at top of tree 356 """ clones childe node and insert it at top of tree
358 <nodehandler name='?' module='core' class='node_loader' /> 357 <nodehandler name='?' module='core' class='node_loader' />
359 """ 358 """
360 def __init__(self,xml_dom,tree_node): 359 def __init__(self,xml,tree_node):
361 node_handler.__init__(self,xml_dom,tree_node) 360 node_handler.__init__(self,xml,tree_node)
362 361
363 def on_rclick(self,evt): 362 def on_rclick(self,evt):
364 pass 363 pass
365 364
366 def on_ldclick(self,evt): 365 def on_ldclick(self,evt):
367 title = self.master_dom.getAttribute('name') 366 title = self.xml.get('name')
368 new_node = self.master_dom._get_firstChild() 367 new_xml = XML(tostring(self.xml[0]))
369 new_node = new_node.cloneNode(True) 368 self.tree.root_xml.insert(0, new_xml)
370 child = self.tree.master_dom._get_firstChild() 369 tree_node = self.tree.load_xml(new_xml,self.tree.root,self.tree.root)
371 new_node = self.tree.master_dom.insertBefore(new_node,child)
372 tree_node = self.tree.load_xml(new_node,self.tree.root,self.tree.root)
373 obj = self.tree.GetPyData(tree_node)
374 return 1 370 return 1
375 #obj.on_design(None)
376 371
377 ########################## 372 ##########################
378 ## file loader 373 ## file loader
379 ########################## 374 ##########################
380 375
382 """ loads file and insert into game tree 377 """ loads file and insert into game tree
383 <nodehandler name='?' module='core' class='file_loader' > 378 <nodehandler name='?' module='core' class='file_loader' >
384 <file name="file_name.xml" /> 379 <file name="file_name.xml" />
385 </nodehandler> 380 </nodehandler>
386 """ 381 """
387 def __init__(self,xml_dom,tree_node): 382 def __init__(self,xml,tree_node):
388 node_handler.__init__(self,xml_dom,tree_node) 383 node_handler.__init__(self,xml,tree_node)
389 self.file_node = self.master_dom._get_firstChild() 384 self.file_node = self.xml[0]
390 self.frame = component.get('frame') 385 self.frame = component.get('frame')
391 386
392 def on_ldclick(self,evt): 387 def on_ldclick(self,evt):
393 file_name = self.file_node.getAttribute("name") 388 file_name = self.file_node.get("name")
394 self.tree.insert_xml(open(dir_struct["nodes"] + file_name,"r").read()) 389 try: self.tree.insert_xml(open(orpg.dirpath.dir_struct["nodes"] + file_name,"r").read())
390 except: wx.MessageBox('Invalid File', 'Error')
395 return 1 391 return 1
396 392
397 def on_design(self,evt): 393 def on_design(self,evt):
398 tlist = ['Title','File Name'] 394 tlist = ['Title','File Name']
399 vlist = [self.master_dom.getAttribute("name"), 395 vlist = [self.xml.get("name"),
400 self.file_node.getAttribute("name")] 396 self.file_node.get("name")]
401 dlg = orpgMultiTextEntry(self.tree.GetParent(),tlist,vlist,"File Loader Edit") 397 dlg = orpgMultiTextEntry(self.tree.GetParent(),tlist,vlist,"File Loader Edit")
402 if dlg.ShowModal() == wx.ID_OK: 398 if dlg.ShowModal() == wx.ID_OK:
403 vlist = dlg.get_values() 399 vlist = dlg.get_values()
404 self.file_node.setAttribute('name', vlist[1]) 400 self.file_node.set('name', vlist[1])
405 self.master_dom.setAttribute('name', vlist[0]) 401 self.xml.set('name', vlist[0])
406 self.tree.SetItemText(self.mytree_node,vlist[0]) 402 self.tree.SetItemText(self.mytree_node,vlist[0])
407 dlg.Destroy() 403 dlg.Destroy()
408 404
409 ########################## 405 ##########################
410 ## URL loader 406 ## URL loader
414 """ loads file from url and insert into game tree 410 """ loads file from url and insert into game tree
415 <nodehandler name='?' module='core' class='url_loader' > 411 <nodehandler name='?' module='core' class='url_loader' >
416 <file name="http://file_name.xml" /> 412 <file name="http://file_name.xml" />
417 </nodehandler> 413 </nodehandler>
418 """ 414 """
419 def __init__(self,xml_dom,tree_node): 415 def __init__(self,xml,tree_node):
420 node_handler.__init__(self,xml_dom,tree_node) 416 node_handler.__init__(self,xml,tree_node)
421 self.file_node = self.master_dom._get_firstChild() 417 self.file_node = self.xml[0]
422 self.frame = component.get('frame') 418 self.frame = component.get('frame')
423 419
424 def on_ldclick(self,evt): 420 def on_ldclick(self,evt):
425 file_name = self.file_node.getAttribute("url") 421 file_name = self.file_node.get("url")
426 file = urllib.urlopen(file_name) 422 file = urllib.urlopen(file_name)
427 self.tree.insert_xml(file.read()) 423 self.tree.insert_xml(file.read())
428 return 1 424 return 1
429 425
430 def on_design(self,evt): 426 def on_design(self,evt):
431 tlist = ['Title','URL'] 427 tlist = ['Title','URL']
432 print "design filename",self.master_dom.getAttribute('name') 428 vlist = [self.xml.get("name"),
433 vlist = [self.master_dom.getAttribute("name"), 429 self.file_node.get("url")]
434 self.file_node.getAttribute("url")]
435 dlg = orpgMultiTextEntry(self.tree.GetParent(),tlist,vlist,"File Loader Edit") 430 dlg = orpgMultiTextEntry(self.tree.GetParent(),tlist,vlist,"File Loader Edit")
436 if dlg.ShowModal() == wx.ID_OK: 431 if dlg.ShowModal() == wx.ID_OK:
437 vlist = dlg.get_values() 432 vlist = dlg.get_values()
438 self.file_node.setAttribute('url', vlist[1]) 433 self.file_node.set('url', vlist[1])
439 self.master_dom.setAttribute('name', vlist[0]) 434 self.xml.set('name', vlist[0])
440 self.tree.SetItemText(self.mytree_node,vlist[0]) 435 self.tree.SetItemText(self.mytree_node,vlist[0])
441 dlg.Destroy() 436 dlg.Destroy()
442 437
443 438
444 ########################## 439 ##########################
446 ########################## 441 ##########################
447 class min_map(node_handler): 442 class min_map(node_handler):
448 """ clones childe node and insert it at top of tree 443 """ clones childe node and insert it at top of tree
449 <nodehandler name='?' module='core' class='min_map' /> 444 <nodehandler name='?' module='core' class='min_map' />
450 """ 445 """
451 def __init__(self,xml_dom,tree_node): 446 def __init__(self,xml,tree_node):
452 node_handler.__init__(self,xml_dom,tree_node) 447 node_handler.__init__(self,xml,tree_node)
453 self.map = component.get('map') 448 self.map = component.get('map')
454 self.mapdata = self.master_dom._get_firstChild() 449 self.mapdata = self.xml.find('map')
455 450
456 def on_ldclick(self,evt): 451 def on_ldclick(self,evt):
457 self.map.new_data(toxml(self.mapdata)) 452 if (component.get('session').my_role() != component.get('session').ROLE_GM):
453 component.get('chat').InfoPost("You must be a GM to use this feature")
454 return
455 self.map.new_data(tostring(self.mapdata))
456 component.get('session').send(tostring(self.mapdata))
457 self.map.canvas.send_map_data()
458 return 1 458 return 1