Mercurial > traipse
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 |