Mercurial > traipse_dev
comparison orpg/mapper/miniatures_handler.py @ 135:dcf4fbe09b70 beta
Traipse Beta 'OpenRPG' {091010-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 (Beta)
Added Bookmarks
Fix to Remote Admin Commands
Minor fix to text based Server
Fix to Pretty Print, from Core
Fix to Splitter Nodes not being created
Fix to massive amounts of images loading, from Core
Added 'boot' command to remote admin
Added confirmation window for sent nodes
Minor changes to allow for portability to an OpenSUSE linux OS
Miniatures Layer pop up box allows users to turn off Mini labels, from FlexiRPG
Zoom Mouse plugin added
Images added to Plugin UI
Switching to Element Tree
Map efficiency, from FlexiRPG
Added Status Bar to Update Manager
default_manifest.xml renamed to default_upmana.xml
Cleaner clode for saved repositories
New TrueDebug Class in orpg_log (See documentation for usage)
Mercurial's hgweb folder is ported to upmana
**Pretty important update that can help remove thousands of dead children from your gametree.
**Children, <forms />, <group_atts />, <horizontal />, <cols />, <rows />, <height />, etc... are all tags now. Check your gametree and
look for dead children!!
**New Gamtree Recusion method, mapping, and context sensitivity. !!Alpha - Watch out for infinite loops!!
author | sirebral |
---|---|
date | Tue, 10 Nov 2009 14:11:28 -0600 |
parents | 118fbe111922 |
children | e842a5f1b775 |
comparison
equal
deleted
inserted
replaced
101:394ebb3b6a0f | 135:dcf4fbe09b70 |
---|---|
40 from grid import GRID_ISOMETRIC | 40 from grid import GRID_ISOMETRIC |
41 import os | 41 import os |
42 | 42 |
43 from orpg.tools.orpg_settings import settings | 43 from orpg.tools.orpg_settings import settings |
44 | 44 |
45 LABEL_TOOL = wx.NewId() | 45 from xml.etree.ElementTree import ElementTree, Element |
46 from xml.etree.ElementTree import fromstring, tostring | |
47 | |
48 SHOW_LABELS_TOOL = wx.NewId() | |
49 AUTO_LABEL_TOOL = wx.NewId() | |
46 LAYER_TOOL = wx.NewId() | 50 LAYER_TOOL = wx.NewId() |
47 MIN_LIST_TOOL = wx.NewId() | 51 MIN_LIST_TOOL = wx.NewId() |
48 MIN_TOOL = wx.NewId() | 52 MIN_TOOL = wx.NewId() |
49 MIN_URL = wx.NewId() | 53 MIN_URL = wx.NewId() |
50 SERIAL_TOOL = wx.NewId() | 54 SERIAL_TOOL = wx.NewId() |
101 | 105 |
102 def __init__(self, parent, id, canvas): | 106 def __init__(self, parent, id, canvas): |
103 self.sel_min = None | 107 self.sel_min = None |
104 self.auto_label = 1 | 108 self.auto_label = 1 |
105 self.use_serial = 1 | 109 self.use_serial = 1 |
106 self.auto_label_cb = None | |
107 self.canvas = canvas | 110 self.canvas = canvas |
108 self.settings = settings | 111 self.settings = settings |
109 self.mini_rclick_menu_extra_items = {} | 112 self.mini_rclick_menu_extra_items = {} |
110 self.background_rclick_menu_extra_items = {} | 113 self.background_rclick_menu_extra_items = {} |
111 base_layer_handler.__init__(self, parent, id, canvas) | 114 base_layer_handler.__init__(self, parent, id, canvas) |
117 self.tooltip_delay_miliseconds = 500 | 120 self.tooltip_delay_miliseconds = 500 |
118 self.tooltip_timer = wx.CallLater(self.tooltip_delay_miliseconds, self.on_tooltip_timer) | 121 self.tooltip_timer = wx.CallLater(self.tooltip_delay_miliseconds, self.on_tooltip_timer) |
119 self.tooltip_timer.Stop() | 122 self.tooltip_timer.Stop() |
120 dt = myFileDropTarget(self) | 123 dt = myFileDropTarget(self) |
121 self.canvas.SetDropTarget(dt) | 124 self.canvas.SetDropTarget(dt) |
125 self.tooltip = wx.ToolTip('') | |
122 #wxInitAllImageHandlers() | 126 #wxInitAllImageHandlers() |
123 | 127 |
124 def build_ctrls(self): | 128 def build_ctrls(self): |
125 base_layer_handler.build_ctrls(self) | 129 base_layer_handler.build_ctrls(self) |
126 # add controls in reverse order! (unless you want them after the default tools) | 130 # add controls in reverse order! (unless you want them after the default tools) |
127 self.auto_label_cb = wx.CheckBox(self, wx.ID_ANY, ' Auto Label ', (-1,-1),(-1,-1)) | |
128 self.auto_label_cb.SetValue(self.auto_label) | |
129 self.min_url = wx.ComboBox(self, wx.ID_ANY, "http://", style=wx.CB_DROPDOWN | wx.CB_SORT) | 131 self.min_url = wx.ComboBox(self, wx.ID_ANY, "http://", style=wx.CB_DROPDOWN | wx.CB_SORT) |
130 self.localBrowse = wx.Button(self, wx.ID_ANY, 'Browse', style=wx.BU_EXACTFIT) | 132 self.localBrowse = wx.Button(self, wx.ID_ANY, 'Browse', style=wx.BU_EXACTFIT) |
131 minilist = createMaskedButton( self, dir_struct["icon"]+'questionhead.gif', 'Edit miniature properties', wx.ID_ANY) | 133 minilist = createMaskedButton( self, dir_struct["icon"]+'questionhead.gif', 'Edit miniature properties', wx.ID_ANY) |
132 miniadd = wx.Button(self, wx.ID_OK, "Add Miniature", style=wx.BU_EXACTFIT) | 134 miniadd = wx.Button(self, wx.ID_OK, "Add Miniature", style=wx.BU_EXACTFIT) |
133 self.sizer.Add(self.auto_label_cb,0,wx.ALIGN_CENTER) | |
134 self.sizer.Add((6, 0)) | |
135 self.sizer.Add(self.min_url, 1, wx.ALIGN_CENTER) | 135 self.sizer.Add(self.min_url, 1, wx.ALIGN_CENTER) |
136 self.sizer.Add((6, 0)) | 136 self.sizer.Add((6, 0)) |
137 self.sizer.Add(miniadd, 0, wx.ALIGN_CENTER) | 137 self.sizer.Add(miniadd, 0, wx.ALIGN_CENTER) |
138 self.sizer.Add((6, 0)) | 138 self.sizer.Add((6, 0)) |
139 self.sizer.Add(self.localBrowse, 0, wx.ALIGN_CENTER) | 139 self.sizer.Add(self.localBrowse, 0, wx.ALIGN_CENTER) |
140 self.sizer.Add((6, 0)) | 140 self.sizer.Add((6, 0)) |
141 self.sizer.Add(minilist, 0, wx.ALIGN_CENTER) | 141 self.sizer.Add(minilist, 0, wx.ALIGN_CENTER) |
142 self.Bind(wx.EVT_BUTTON, self.on_min_list, minilist) | 142 self.Bind(wx.EVT_BUTTON, self.on_min_list, minilist) |
143 self.Bind(wx.EVT_BUTTON, self.on_miniature, miniadd) | 143 self.Bind(wx.EVT_BUTTON, self.on_miniature, miniadd) |
144 self.Bind(wx.EVT_BUTTON, self.on_browse, self.localBrowse) | 144 self.Bind(wx.EVT_BUTTON, self.on_browse, self.localBrowse) |
145 self.Bind(wx.EVT_CHECKBOX, self.on_label, self.auto_label_cb) | |
146 | 145 |
147 def on_browse(self, evt): | 146 def on_browse(self, evt): |
148 if not self.role_is_gm_or_player(): return | 147 if not self.role_is_gm_or_player(): return |
149 dlg = wx.FileDialog(None, "Select a Miniature to load", dir_struct["user"]+'webfiles/', | 148 dlg = wx.FileDialog(None, "Select a Miniature to load", dir_struct["user"]+'webfiles/', |
150 wildcard="Image files (*.bmp, *.gif, *.jpg, *.png)|*.bmp;*.gif;*.jpg;*.png", style=wx.OPEN) | 149 wildcard="Image files (*.bmp, *.gif, *.jpg, *.png)|*.bmp;*.gif;*.jpg;*.png", style=wx.OPEN) |
205 | 204 |
206 | 205 |
207 def build_menu(self,label = "Miniature"): | 206 def build_menu(self,label = "Miniature"): |
208 base_layer_handler.build_menu(self,label) | 207 base_layer_handler.build_menu(self,label) |
209 self.main_menu.AppendSeparator() | 208 self.main_menu.AppendSeparator() |
210 self.main_menu.Append(LABEL_TOOL,"&Auto label","",1) | 209 self.main_menu.Append(SHOW_LABELS_TOOL, "&Show Labels", '', 1) |
211 self.main_menu.Check(LABEL_TOOL,self.auto_label) | 210 self.main_menu.Check(SHOW_LABELS_TOOL, self.canvas.layers['miniatures'].show_labels) |
211 self.main_menu.Append(AUTO_LABEL_TOOL,"&Auto label","",1) | |
212 self.main_menu.Check(AUTO_LABEL_TOOL, self.auto_label) | |
212 self.main_menu.Append(SERIAL_TOOL,"&Number minis","",1) | 213 self.main_menu.Append(SERIAL_TOOL,"&Number minis","",1) |
213 self.main_menu.Check(SERIAL_TOOL, self.use_serial) | 214 self.main_menu.Check(SERIAL_TOOL, self.use_serial) |
214 self.main_menu.Append(MAP_REFRESH_MINI_URLS,"&Refresh miniatures") # Add the menu item | 215 self.main_menu.Append(MAP_REFRESH_MINI_URLS,"&Refresh miniatures") # Add the menu item |
215 self.main_menu.AppendSeparator() | 216 self.main_menu.AppendSeparator() |
216 self.main_menu.Append(MIN_MOVE, "Move") | 217 self.main_menu.Append(MIN_MOVE, "Move") |
217 self.canvas.Bind(wx.EVT_MENU, self.on_map_board_menu_item, id=MAP_REFRESH_MINI_URLS) # Set the handler | 218 self.canvas.Bind(wx.EVT_MENU, self.on_map_board_menu_item, id=MAP_REFRESH_MINI_URLS) # Set the handler |
218 self.canvas.Bind(wx.EVT_MENU, self.on_label, id=LABEL_TOOL) | 219 self.canvas.Bind(wx.EVT_MENU, self.on_show_labels, id=SHOW_LABELS_TOOL) |
220 self.canvas.Bind(wx.EVT_MENU, self.on_auto_label, id=AUTO_LABEL_TOOL) | |
219 self.canvas.Bind(wx.EVT_MENU, self.on_serial, id=SERIAL_TOOL) | 221 self.canvas.Bind(wx.EVT_MENU, self.on_serial, id=SERIAL_TOOL) |
220 # build miniature meenu | 222 # build miniature meenu |
221 self.min_menu = wx.Menu() | 223 self.min_menu = wx.Menu() |
222 # Rectangles and hexagons require slightly different menus because of | 224 # Rectangles and hexagons require slightly different menus because of |
223 # facing and heading possibilities. | 225 # facing and heading possibilities. |
353 self.moveSelectedMini(self.last_rclick_pos) | 355 self.moveSelectedMini(self.last_rclick_pos) |
354 self.deselectAndRefresh() | 356 self.deselectAndRefresh() |
355 return | 357 return |
356 elif id == MIN_REMOVE: self.canvas.layers['miniatures'].del_miniature(self.sel_rmin) | 358 elif id == MIN_REMOVE: self.canvas.layers['miniatures'].del_miniature(self.sel_rmin) |
357 elif id == MIN_TO_GAMETREE: | 359 elif id == MIN_TO_GAMETREE: |
358 min_xml = self.sel_rmin.toxml(action="new") | 360 ### Alpha ### implements ElementTree |
359 node_begin = "<nodehandler module='map_miniature_nodehandler' class='map_miniature_handler' name='" | 361 mini = self.sel_rmin.toxml(action="new") |
360 if self.sel_rmin.label: node_begin += self.sel_rmin.label + "'" | 362 node = Element('nodehandler') |
361 else: node_begin += "Unnamed Miniature'" | 363 node.set('module', 'map_miniature_nodehandler') |
362 node_begin += ">" | 364 node.set('class', 'map_miniature_handler') |
363 gametree = component.get('tree') | 365 name = self.sel_rmin.label if self.sel_rmin.label else 'Unnamed Miniature' |
364 node_xml = node_begin + min_xml + '</nodehandler>' | 366 node.set('name', name) |
365 #print "Sending this XML to insert_xml:" + node_xml | 367 node.append(mini) |
366 gametree.insert_xml(str(node_xml)) | 368 gametree = component.get('tree') |
369 gametree.insert_xml(tostring(node)) | |
370 ### ElementTree is a nice decision from Core, kudos!! ### | |
367 elif id == MIN_SHOW_HIDE: | 371 elif id == MIN_SHOW_HIDE: |
368 if self.sel_rmin.hide: self.sel_rmin.hide = 0 | 372 if self.sel_rmin.hide: self.sel_rmin.hide = 0 |
369 else: self.sel_rmin.hide = 1 | 373 else: self.sel_rmin.hide = 1 |
370 elif id == MIN_LOCK_UNLOCK: | 374 elif id == MIN_LOCK_UNLOCK: |
371 if self.sel_rmin.locked: self.sel_rmin.locked = False | 375 if self.sel_rmin.locked: self.sel_rmin.locked = False |
491 self.canvas.send_map_data() | 495 self.canvas.send_map_data() |
492 | 496 |
493 def on_miniature(self, evt): | 497 def on_miniature(self, evt): |
494 session = self.canvas.frame.session | 498 session = self.canvas.frame.session |
495 if (session.my_role() != session.ROLE_GM) and (session.my_role() != session.ROLE_PLAYER) and (session.use_roles()): | 499 if (session.my_role() != session.ROLE_GM) and (session.my_role() != session.ROLE_PLAYER) and (session.use_roles()): |
500 print session.my_role() | |
496 self.infoPost("You must be either a player or GM to use the miniature Layer") | 501 self.infoPost("You must be either a player or GM to use the miniature Layer") |
497 return | 502 return |
498 min_url = self.min_url.GetValue() | 503 min_url = self.min_url.GetValue() |
499 # build url | 504 # build url |
500 if min_url == "" or min_url == "http://": return | 505 if min_url == "" or min_url == "http://": return |
501 if min_url[:7] != "http://" : min_url = "http://" + min_url | 506 if min_url[:7] != "http://" : min_url = "http://" + min_url |
502 # make label | 507 # make label |
508 if self.auto_label: print 'auto-label' | |
509 if not self.auto_label: print 'False' | |
503 if self.auto_label and min_url[-4:-3] == '.': | 510 if self.auto_label and min_url[-4:-3] == '.': |
504 start = min_url.rfind("/") + 1 | 511 start = min_url.rfind("/") + 1 |
505 min_label = min_url[start:len(min_url)-4] | 512 min_label = min_url[start:len(min_url)-4] |
506 if self.use_serial: | 513 if self.use_serial: |
507 min_label = '%s %d' % ( min_label, self.canvas.layers['miniatures'].next_serial() ) | 514 min_label = '%s %d' % ( min_label, self.canvas.layers['miniatures'].next_serial() ) |
508 else: min_label = "" | 515 else: min_label = "" |
509 if self.min_url.FindString(min_url) == -1: self.min_url.Append(min_url) | 516 if self.min_url.FindString(min_url) == -1: self.min_url.Append(min_url) |
510 try: | 517 try: |
511 id = 'mini-' + self.canvas.frame.session.get_next_id() | 518 id = 'mini-' + self.canvas.frame.session.get_next_id() |
512 # make the new mini appear in top left of current viewable map | 519 # make the new mini appear in top left of current viewable map |
520 print id | |
513 dc = wx.ClientDC(self.canvas) | 521 dc = wx.ClientDC(self.canvas) |
514 self.canvas.PrepareDC(dc) | 522 self.canvas.PrepareDC(dc) |
515 dc.SetUserScale(self.canvas.layers['grid'].mapscale,self.canvas.layers['grid'].mapscale) | 523 dc.SetUserScale(self.canvas.layers['grid'].mapscale,self.canvas.layers['grid'].mapscale) |
516 x = dc.DeviceToLogicalX(0) | 524 x = dc.DeviceToLogicalX(0) |
517 y = dc.DeviceToLogicalY(0) | 525 y = dc.DeviceToLogicalY(0) |
527 self.canvas.send_map_data() | 535 self.canvas.send_map_data() |
528 self.canvas.Refresh(False) | 536 self.canvas.Refresh(False) |
529 #except Exception, e: | 537 #except Exception, e: |
530 #wx.MessageBox(str(e),"Miniature Error") | 538 #wx.MessageBox(str(e),"Miniature Error") |
531 | 539 |
532 def on_label(self,evt): | 540 def on_show_labels(self, evt): |
541 show_labels = not self.canvas.layers['miniatures'].show_labels | |
542 self.canvas.layers['miniatures'].show_labels = show_labels | |
543 self.canvas.Refresh() | |
544 | |
545 def on_auto_label(self,evt): | |
533 self.auto_label = not self.auto_label | 546 self.auto_label = not self.auto_label |
534 self.auto_label_cb.SetValue(self.auto_label) | 547 #self.auto_label_cb.SetValue(self.auto_label) |
535 #self.send_map_data() | 548 #self.send_map_data() |
536 #self.Refresh() | 549 #self.Refresh() |
537 | 550 |
538 def on_min_list(self,evt): | 551 def on_min_list(self,evt): |
539 session = self.canvas.frame.session | 552 session = self.canvas.frame.session |
540 if (session.my_role() != session.ROLE_GM): | 553 if (session.my_role() != session.ROLE_GM): |
541 self.infoPost("You must be a GM to use this feature") | 554 self.infoPost("You must be a GM to use this feature") |
542 return | 555 return |
543 #d = min_list_panel(self.frame.GetParent(),self.canvas.layers,"Miniature list") | 556 #d = min_list_panel(self.frame.GetParent(),self.canvas.layers,"Miniature list") |
544 d = min_list_panel(self.canvas.frame,self.canvas.layers,"Miniature list") | 557 d = min_list_panel(self.canvas.frame, self.canvas.layers, "Miniature list") |
545 if d.ShowModal() == wx.ID_OK: d.Destroy() | 558 if d.ShowModal() == wx.ID_OK: d.Destroy() |
546 self.canvas.Refresh(False) | 559 self.canvas.Refresh(False) |
547 | 560 |
548 def on_serial(self, evt): | 561 def on_serial(self, evt): |
549 self.use_serial = not self.use_serial | 562 self.use_serial = not self.use_serial |
628 self.canvas.PrepareDC(dc) | 641 self.canvas.PrepareDC(dc) |
629 dc.SetUserScale(self.canvas.layers['grid'].mapscale,self.canvas.layers['grid'].mapscale) | 642 dc.SetUserScale(self.canvas.layers['grid'].mapscale,self.canvas.layers['grid'].mapscale) |
630 pos = wx.Point(dc.DeviceToLogicalX(pos.x), dc.DeviceToLogicalY(pos.y)) | 643 pos = wx.Point(dc.DeviceToLogicalX(pos.x), dc.DeviceToLogicalY(pos.y)) |
631 mini_list = self.getMiniListOrSelectedMini(pos) | 644 mini_list = self.getMiniListOrSelectedMini(pos) |
632 if len(mini_list) > 0: | 645 if len(mini_list) > 0: |
633 tooltip = self.get_mini_tooltip(mini_list) | 646 tooltip = mini_list[0].label |
634 self.canvas.SetToolTipString(tooltip) | 647 #self.canvas.SetToolTipString(mini_list[0].label) |
635 else: self.canvas.SetToolTipString("") | 648 #Once set, it never unsets, so it sucks. |
649 else: | |
650 self.canvas.SetToolTipString('') | |
636 | 651 |
637 def on_motion(self,evt): | 652 def on_motion(self,evt): |
638 if evt.Dragging() and evt.LeftIsDown(): | 653 if evt.Dragging() and evt.LeftIsDown(): |
639 if self.canvas.drag is None and self.drag_mini is not None: | 654 if self.canvas.drag is None and self.drag_mini is not None: |
640 drag_bmp = self.drag_mini.bmp | 655 drag_bmp = self.drag_mini.bmp |
641 if self.drag_mini.width and self.drag_mini.height: | 656 if self.drag_mini.width and self.drag_mini.height: |
642 tmp_image = drag_bmp.ConvertToImage() | 657 tmp_image = drag_bmp.ConvertToImage() |
643 tmp_image.Rescale(int(self.drag_mini.width * self.canvas.layers['grid'].mapscale), | |
644 int(self.drag_mini.height * self.canvas.layers['grid'].mapscale)) | |
645 tmp_image.ConvertAlphaToMask() | 658 tmp_image.ConvertAlphaToMask() |
646 drag_bmp = tmp_image.ConvertToBitmap() | 659 drag_bmp = tmp_image.ConvertToBitmap() |
647 mask = wx.Mask(drag_bmp, wx.Colour(tmp_image.GetMaskRed(), | 660 mask = wx.Mask(drag_bmp, wx.Colour(tmp_image.GetMaskRed(), |
648 tmp_image.GetMaskGreen(), tmp_image.GetMaskBlue())) | 661 tmp_image.GetMaskGreen(), tmp_image.GetMaskBlue())) |
649 drag_bmp.SetMask(mask) | 662 drag_bmp.SetMask(mask) |
660 int(self.drag_offset.y * self.canvas.layers['grid'].mapscale)), self.canvas, False) | 673 int(self.drag_offset.y * self.canvas.layers['grid'].mapscale)), self.canvas, False) |
661 elif self.canvas.drag is not None: | 674 elif self.canvas.drag is not None: |
662 self.canvas.drag.Move(evt.GetPosition()) | 675 self.canvas.drag.Move(evt.GetPosition()) |
663 self.canvas.drag.Show() | 676 self.canvas.drag.Show() |
664 # reset tool tip timer | 677 # reset tool tip timer |
665 self.canvas.SetToolTipString("") | 678 self.canvas.SetToolTipString('') |
666 self.tooltip_timer.Restart(self.tooltip_delay_miliseconds, evt.GetPosition()) | 679 self.tooltip_timer.Restart(self.tooltip_delay_miliseconds, evt.GetPosition()) |
667 | 680 |
668 def on_left_up(self,evt): | 681 def on_left_up(self,evt): |
669 if self.canvas.drag: | 682 if self.canvas.drag: |
670 self.canvas.drag.Hide() | 683 self.canvas.drag.Hide() |
756 def infoPost(self, message): | 769 def infoPost(self, message): |
757 component.get("chat").InfoPost(message) | 770 component.get("chat").InfoPost(message) |
758 | 771 |
759 def role_is_gm_or_player(self): | 772 def role_is_gm_or_player(self): |
760 session = self.canvas.frame.session | 773 session = self.canvas.frame.session |
761 if (session.my_role() <> session.ROLE_GM) and (session.my_role() <> session.ROLE_PLAYER) and (session.use_roles()): | 774 print session.my_role(), session.ROLE_GM |
775 if (session.my_role() != session.ROLE_GM) and (session.my_role() != session.ROLE_PLAYER) and (session.use_roles()): | |
776 print 'role is gm or player' | |
762 self.infoPost("You must be either a player or GM to use the miniature Layer") | 777 self.infoPost("You must be either a player or GM to use the miniature Layer") |
763 return False | 778 return False |
764 return True | 779 return True |
765 | 780 |
766 def role_is_gm(self): | 781 def role_is_gm(self): |
767 session = self.canvas.frame.session | 782 session = self.canvas.frame.session |
768 if (session.my_role() <> session.ROLE_GM) and (session.use_roles()): return False | 783 if (session.my_role() != session.ROLE_GM) and (session.use_roles()): return False |
769 return True | 784 return True |
770 | 785 |
771 def alreadyDealingWithMenu(self): | 786 def alreadyDealingWithMenu(self): |
772 return self.lastMenuChoice is not None | 787 return self.lastMenuChoice is not None |
773 | 788 |