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