Mercurial > traipse_dev
comparison orpg/chat/chatwnd.py @ 140:e842a5f1b775 beta
Traipse Beta 'OpenRPG' {091123-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 Gametree Recursion method, mapping, and context sensitivity. !Infinite Loops return error instead of freezing the
software!
New Syntax added for custom PC sheets
Tip of the Day added, from Core and community
Fixed Whiteboard ID to prevent random line or text deleting. Modified ID's to prevent non updated clients from
ruining the fix.
author | sirebral |
---|---|
date | Mon, 23 Nov 2009 03:36:26 -0600 |
parents | dcf4fbe09b70 |
children | 2345c12d93a7 |
comparison
equal
deleted
inserted
replaced
135:dcf4fbe09b70 | 140:e842a5f1b775 |
---|---|
239 self.Bind(wx.EVT_LEFT_UP, self.LeftUp) | 239 self.Bind(wx.EVT_LEFT_UP, self.LeftUp) |
240 self.Bind(wx.EVT_RIGHT_DOWN, self.onPopup) | 240 self.Bind(wx.EVT_RIGHT_DOWN, self.onPopup) |
241 self.Bind(wx.webview.EVT_WEBVIEW_BEFORE_LOAD, self.OnLinkClicked) | 241 self.Bind(wx.webview.EVT_WEBVIEW_BEFORE_LOAD, self.OnLinkClicked) |
242 | 242 |
243 #Wrapers so I dont have to add special Code | 243 #Wrapers so I dont have to add special Code |
244 | |
245 def SetPage(self, htmlstring): | 244 def SetPage(self, htmlstring): |
246 self.SetPageSource(htmlstring) | 245 self.SetPageSource(htmlstring) |
247 | 246 |
248 | |
249 def AppendToPage(self, htmlstring): | 247 def AppendToPage(self, htmlstring): |
250 self.SetPageSource(self.GetPageSource() + htmlstring) | 248 self.SetPageSource(self.GetPageSource() + htmlstring) |
251 | 249 |
252 | |
253 def GetFont(self): | 250 def GetFont(self): |
254 return self.__font | 251 return self.__font |
255 | 252 |
256 | |
257 def CalculateAllFonts(self, defaultsize): | 253 def CalculateAllFonts(self, defaultsize): |
258 return | 254 return |
259 | 255 |
260 | |
261 def SetDefaultFontAndSize(self, fontname, fontsize): | 256 def SetDefaultFontAndSize(self, fontname, fontsize): |
262 self.__font = wx.Font(int(fontsize), | 257 self.__font = wx.Font(int(fontsize), |
263 wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_NORMAL, | 258 wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_NORMAL, |
264 wx.FONTWEIGHT_NORMAL, faceName=fontname) | 259 wx.FONTWEIGHT_NORMAL, faceName=fontname) |
265 try: self.SetPageSource(self.Header() + self.StripHeader()) | 260 try: self.SetPageSource(self.Header() + self.StripHeader()) |
266 except Exception, e: print e | 261 except Exception, e: print e |
267 return (self.GetFont().GetFaceName(), self.GetFont().GetPointSize()) | 262 return (self.GetFont().GetFaceName(), self.GetFont().GetPointSize()) |
268 | 263 |
269 #Events | 264 #Events |
270 | |
271 def OnLinkClicked(self, linkinfo): | 265 def OnLinkClicked(self, linkinfo): |
272 href = linkinfo.GetHref() | 266 href = linkinfo.GetHref() |
273 wb = webbrowser.get() | 267 wb = webbrowser.get() |
274 wb.open(href) | 268 wb.open(href) |
275 | 269 |
276 | |
277 def onPopup(self, evt): | 270 def onPopup(self, evt): |
278 self.PopupMenu(self.menu) | 271 self.PopupMenu(self.menu) |
279 | 272 |
280 | |
281 def LeftUp(self, event): | 273 def LeftUp(self, event): |
282 event.Skip() | 274 event.Skip() |
283 wx.CallAfter(self.parent.set_chat_text_focus, None) | 275 wx.CallAfter(self.parent.set_chat_text_focus, None) |
284 | 276 |
285 | |
286 def OnM_EditCopy(self, evt): | 277 def OnM_EditCopy(self, evt): |
287 wx.TheClipboard.UsePrimarySelection(False) | 278 wx.TheClipboard.UsePrimarySelection(False) |
288 wx.TheClipboard.Open() | 279 wx.TheClipboard.Open() |
289 wx.TheClipboard.SetData(wx.TextDataObject(self.SelectionToText())) | 280 wx.TheClipboard.SetData(wx.TextDataObject(self.SelectionToText())) |
290 wx.TheClipboard.Close() | 281 wx.TheClipboard.Close() |
291 | 282 |
292 #Cutom Methods | 283 #Cutom Methods |
293 | |
294 def Header(self): | 284 def Header(self): |
295 return "<html><head><style>body {font-size: " + str(self.GetFont().GetPointSize()) + "px;font-family: " + self.GetFont().GetFaceName() + ";color: " + self.parent.textcolor + ";background-color: " + self.parent.bgcolor + ";margin: 0;padding: 0 0;height: 100%;}</style></head><body>" | 285 return "<html><head><style>body {font-size: " + str(self.GetFont().GetPointSize()) + "px;font-family: " + self.GetFont().GetFaceName() + ";color: " + self.parent.textcolor + ";background-color: " + self.parent.bgcolor + ";margin: 0;padding: 0 0;height: 100%;}</style></head><body>" |
296 | 286 |
297 | |
298 def StripHeader(self): | 287 def StripHeader(self): |
299 tmp = self.GetPageSource().split('<BODY>') | 288 tmp = self.GetPageSource().split('<BODY>') |
300 if tmp[-1].find('<body>') > -1: tmp = tmp[-1].split('<body>') | 289 if tmp[-1].find('<body>') > -1: tmp = tmp[-1].split('<body>') |
301 return tmp[-1] | 290 return tmp[-1] |
302 | 291 |
303 | |
304 def build_menu(self): | 292 def build_menu(self): |
305 self.menu = wx.Menu() | 293 self.menu = wx.Menu() |
306 item = wx.MenuItem(self.menu, wx.ID_ANY, "Copy", "Copy") | 294 item = wx.MenuItem(self.menu, wx.ID_ANY, "Copy", "Copy") |
307 self.Bind(wx.EVT_MENU, self.OnM_EditCopy, item) | 295 self.Bind(wx.EVT_MENU, self.OnM_EditCopy, item) |
308 self.menu.AppendItem(item) | 296 self.menu.AppendItem(item) |
309 | 297 |
310 | |
311 def scroll_down(self): | 298 def scroll_down(self): |
312 maxrange = self.GetScrollRange(wx.VERTICAL) | 299 maxrange = self.GetScrollRange(wx.VERTICAL) |
313 pagesize = self.GetScrollPageSize(wx.VERTICAL) | 300 pagesize = self.GetScrollPageSize(wx.VERTICAL) |
314 self.Scroll(-1, maxrange-pagesize) | 301 self.Scroll(-1, maxrange-pagesize) |
315 | 302 |
316 | |
317 def mouse_wheel(self, event): | 303 def mouse_wheel(self, event): |
318 amt = event.GetWheelRotation() | 304 amt = event.GetWheelRotation() |
319 units = amt/(-(event.GetWheelDelta())) | 305 units = amt/(-(event.GetWheelDelta())) |
320 self.ScrollLines(units*3) | 306 self.ScrollLines(units*3) |
321 chat_html_window = ChatHtmlWindow | 307 chat_html_window = ChatHtmlWindow |
377 self.GMChatPanel = None | 363 self.GMChatPanel = None |
378 if self.settings.get_setting("GMWhisperTab") == '1': | 364 if self.settings.get_setting("GMWhisperTab") == '1': |
379 self.create_gm_tab() | 365 self.create_gm_tab() |
380 self.SetSelection(0) | 366 self.SetSelection(0) |
381 | 367 |
382 | |
383 def get_tab_index(self, chatpanel): | 368 def get_tab_index(self, chatpanel): |
384 "Return the index of a chatpanel in the wxNotebook." | 369 "Return the index of a chatpanel in the wxNotebook." |
385 | 370 |
386 for i in xrange(self.GetPageCount()): | 371 for i in xrange(self.GetPageCount()): |
387 if (self.GetPage(i) == chatpanel): | 372 if (self.GetPage(i) == chatpanel): |
388 return i | 373 return i |
389 | 374 |
390 | |
391 def create_gm_tab(self): | 375 def create_gm_tab(self): |
392 if self.GMChatPanel == None: | 376 if self.GMChatPanel == None: |
393 self.GMChatPanel = chat_panel(self, -1, MAIN_TAB, 'gm') | 377 self.GMChatPanel = chat_panel(self, -1, MAIN_TAB, 'gm') |
394 self.AddPage(self.GMChatPanel, "GM", False) | 378 self.AddPage(self.GMChatPanel, "GM", False) |
395 self.SetPageImage(self.GetPageCount()-1, 1) | 379 self.SetPageImage(self.GetPageCount()-1, 1) |
396 self.GMChatPanel.chatwnd.SetDefaultFontAndSize(self.font, self.fontsize) | 380 self.GMChatPanel.chatwnd.SetDefaultFontAndSize(self.font, self.fontsize) |
397 | 381 |
398 | |
399 def create_whisper_tab(self, playerid): | 382 def create_whisper_tab(self, playerid): |
400 "Add a new chatpanel directly connected to integer 'playerid' via whispering." | 383 "Add a new chatpanel directly connected to integer 'playerid' via whispering." |
401 private_tab = chat_panel(self, -1, WHISPER_TAB, playerid) | 384 private_tab = chat_panel(self, -1, WHISPER_TAB, playerid) |
402 playername = strip_html(self.MainChatPanel.session.get_player_by_player_id(playerid)[0]) | 385 playername = strip_html(self.MainChatPanel.session.get_player_by_player_id(playerid)[0]) |
403 self.AddPage(private_tab, playername, False) | 386 self.AddPage(private_tab, playername, False) |
406 self.newMsg(self.GetPageCount()-1) | 389 self.newMsg(self.GetPageCount()-1) |
407 self.AliasLib = component.get('alias') | 390 self.AliasLib = component.get('alias') |
408 wx.CallAfter(self.AliasLib.RefreshAliases) | 391 wx.CallAfter(self.AliasLib.RefreshAliases) |
409 return private_tab | 392 return private_tab |
410 | 393 |
411 | |
412 def create_group_tab(self, group_name): | 394 def create_group_tab(self, group_name): |
413 "Add a new chatpanel directly connected to integer 'playerid' via whispering." | 395 "Add a new chatpanel directly connected to integer 'playerid' via whispering." |
414 private_tab = chat_panel(self, -1, GROUP_TAB, group_name) | 396 private_tab = chat_panel(self, -1, GROUP_TAB, group_name) |
415 self.AddPage(private_tab, group_name, False) | 397 self.AddPage(private_tab, group_name, False) |
416 private_tab.chatwnd.SetDefaultFontAndSize(self.font, self.fontsize) | 398 private_tab.chatwnd.SetDefaultFontAndSize(self.font, self.fontsize) |
418 self.newMsg(self.GetPageCount()-1) | 400 self.newMsg(self.GetPageCount()-1) |
419 self.AliasLib = component.get('alias') | 401 self.AliasLib = component.get('alias') |
420 wx.CallAfter(self.AliasLib.RefreshAliases) | 402 wx.CallAfter(self.AliasLib.RefreshAliases) |
421 return private_tab | 403 return private_tab |
422 | 404 |
423 | |
424 def create_null_tab(self, tab_name): | 405 def create_null_tab(self, tab_name): |
425 "Add a new chatpanel directly connected to integer 'playerid' via whispering." | 406 "Add a new chatpanel directly connected to integer 'playerid' via whispering." |
426 private_tab = chat_panel(self, -1, NULL_TAB, tab_name) | 407 private_tab = chat_panel(self, -1, NULL_TAB, tab_name) |
427 self.AddPage(private_tab, tab_name, False) | 408 self.AddPage(private_tab, tab_name, False) |
428 private_tab.chatwnd.SetDefaultFontAndSize(self.font, self.fontsize) | 409 private_tab.chatwnd.SetDefaultFontAndSize(self.font, self.fontsize) |
430 self.newMsg(self.GetPageCount()-1) | 411 self.newMsg(self.GetPageCount()-1) |
431 self.AliasLib = component.get('alias') | 412 self.AliasLib = component.get('alias') |
432 wx.CallAfter(self.AliasLib.RefreshAliases) | 413 wx.CallAfter(self.AliasLib.RefreshAliases) |
433 return private_tab | 414 return private_tab |
434 | 415 |
435 | |
436 def onCloseTab(self, evt): | 416 def onCloseTab(self, evt): |
437 try: tabid = evt.GetSelection() | 417 try: tabid = evt.GetSelection() |
438 except: tabid = self.GetSelection() | 418 except: tabid = self.GetSelection() |
439 | |
440 if self.GetPageText(tabid) == 'Main Room': | 419 if self.GetPageText(tabid) == 'Main Room': |
441 #send no close error to chat | 420 #send no close error to chat |
442 evt.Veto() | 421 evt.Veto() |
443 return | 422 return |
444 if self.GetPageText(tabid) == 'GM': | 423 if self.GetPageText(tabid) == 'GM': |
445 msg = "Are You Sure You Want To Close This Page?" | 424 msg = "Are You Sure You Want To Close This Page?" |
446 dlg = wx.MessageDialog(self, msg, "NotebookCtrl Question", | 425 dlg = wx.MessageDialog(self, msg, "NotebookCtrl Question", |
447 wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) | 426 wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) |
448 | |
449 if wx.Platform != '__WXMAC__': | 427 if wx.Platform != '__WXMAC__': |
450 dlg.SetFont(wx.Font(8, wx.NORMAL, wx.NORMAL, wx.NORMAL, False)) | 428 dlg.SetFont(wx.Font(8, wx.NORMAL, wx.NORMAL, wx.NORMAL, False)) |
451 | 429 |
452 if dlg.ShowModal() in [wx.ID_NO]: | 430 if dlg.ShowModal() in [wx.ID_NO]: |
453 dlg.Destroy() | 431 dlg.Destroy() |
459 panel = self.GetPage(tabid) | 437 panel = self.GetPage(tabid) |
460 if panel in self.whisper_tabs: self.whisper_tabs.remove(panel) | 438 if panel in self.whisper_tabs: self.whisper_tabs.remove(panel) |
461 elif panel in self.group_tabs: self.group_tabs.remove(panel) | 439 elif panel in self.group_tabs: self.group_tabs.remove(panel) |
462 elif panel in self.null_tabs: self.null_tabs.remove(panel) | 440 elif panel in self.null_tabs: self.null_tabs.remove(panel) |
463 | 441 |
464 | |
465 def newMsg(self, tabid): | 442 def newMsg(self, tabid): |
466 if tabid != self.GetSelection(): self.SetPageImage(tabid, 0) | 443 if tabid != self.GetSelection(): self.SetPageImage(tabid, 0) |
467 | 444 |
468 | |
469 def onPageChanging(self, event): | 445 def onPageChanging(self, event): |
470 """When private chattabs are selected, set the bitmap back to 'normal'.""" | 446 """When private chattabs are selected, set the bitmap back to 'normal'.""" |
471 event.Skip() | 447 event.Skip() |
472 | 448 |
473 | |
474 def onPageChanged(self, event): | 449 def onPageChanged(self, event): |
475 """When private chattabs are selected, set the bitmap back to 'normal'.""" | 450 """When private chattabs are selected, set the bitmap back to 'normal'.""" |
476 selected_idx = event.GetSelection() | 451 selected_idx = event.GetSelection() |
477 self.SetPageImage(selected_idx, 1) | 452 self.SetPageImage(selected_idx, 1) |
478 page = self.GetPage(selected_idx) | 453 page = self.GetPage(selected_idx) |
565 except: pass | 540 except: pass |
566 self.font = self.chatwnd.GetFont().GetFaceName() | 541 self.font = self.chatwnd.GetFont().GetFaceName() |
567 self.fontsize = self.chatwnd.GetFont().GetPointSize() | 542 self.fontsize = self.chatwnd.GetFont().GetPointSize() |
568 self.scroll_down() | 543 self.scroll_down() |
569 | 544 |
570 | |
571 def set_default_font(self, fontname=None, fontsize=None): | 545 def set_default_font(self, fontname=None, fontsize=None): |
572 """Set all chatpanels to new default fontname/fontsize. | 546 """Set all chatpanels to new default fontname/fontsize. |
573 Returns current font settings in a (fontname, fontsize) tuple.""" | 547 Returns current font settings in a (fontname, fontsize) tuple.""" |
574 if (fontname is not None): newfont = fontname | 548 if (fontname is not None): newfont = fontname |
575 else: newfont = self.font | 549 else: newfont = self.font |
579 self.InfoPost("Font is now " + newfont + " point size " + `newfontsize`) | 553 self.InfoPost("Font is now " + newfont + " point size " + `newfontsize`) |
580 self.font = newfont | 554 self.font = newfont |
581 self.fontsize = newfontsize | 555 self.fontsize = newfontsize |
582 return (self.font, self.fontsize) | 556 return (self.font, self.fontsize) |
583 | 557 |
584 | |
585 def build_menu(self): | 558 def build_menu(self): |
586 top_frame = component.get('frame') | 559 top_frame = component.get('frame') |
587 menu = wx.Menu() | 560 menu = wx.Menu() |
588 item = wx.MenuItem(menu, wx.ID_ANY, "&Background color", "Background color") | 561 item = wx.MenuItem(menu, wx.ID_ANY, "&Background color", "Background color") |
589 top_frame.Bind(wx.EVT_MENU, self.OnMB_BackgroundColor, item) | 562 top_frame.Bind(wx.EVT_MENU, self.OnMB_BackgroundColor, item) |
671 settingmenu.AppendMenu(wx.ID_ANY, 'Chat Tool Bars', toolmenu) | 644 settingmenu.AppendMenu(wx.ID_ANY, 'Chat Tool Bars', toolmenu) |
672 menu.AppendMenu(wx.ID_ANY, 'Chat Settings', settingmenu) | 645 menu.AppendMenu(wx.ID_ANY, 'Chat Settings', settingmenu) |
673 top_frame.mainmenu.Insert(2, menu, '&Chat') | 646 top_frame.mainmenu.Insert(2, menu, '&Chat') |
674 | 647 |
675 ## Settings Menu Events | 648 ## Settings Menu Events |
676 | |
677 def OnMB_ShowImages(self, event): | 649 def OnMB_ShowImages(self, event): |
678 if event.IsChecked(): self.settings.set_setting("Show_Images_In_Chat", '1') | 650 if event.IsChecked(): self.settings.set_setting("Show_Images_In_Chat", '1') |
679 else: self.settings.set_setting("Show_Images_In_Chat", '0') | 651 else: self.settings.set_setting("Show_Images_In_Chat", '0') |
680 | 652 |
681 | |
682 def OnMB_StripHTML(self, event): | 653 def OnMB_StripHTML(self, event): |
683 if event.IsChecked(): self.settings.set_setting("Sstriphtml", '1') | 654 if event.IsChecked(): self.settings.set_setting("striphtml", '1') |
684 else: self.settings.set_setting("striphtml", '0') | 655 else: self.settings.set_setting("striphtml", '0') |
685 | 656 |
686 | |
687 def OnMB_ChatTimeIndex(self, event): | 657 def OnMB_ChatTimeIndex(self, event): |
688 if event.IsChecked(): self.settings.set_setting("Chat_Time_Indexing", '1') | 658 if event.IsChecked(): self.settings.set_setting("Chat_Time_Indexing", '1') |
689 else: self.settings.set_setting("Chat_Time_Indexing", '0') | 659 else: self.settings.set_setting("Chat_Time_Indexing", '0') |
690 | 660 |
691 | |
692 def OnMB_ChatAutoComplete(self, event): | 661 def OnMB_ChatAutoComplete(self, event): |
693 if event.IsChecked(): self.settings.set_setting("SuppressChatAutoComplete", '0') | 662 if event.IsChecked(): self.settings.set_setting("SuppressChatAutoComplete", '0') |
694 else: self.settings.set_setting("SuppressChatAutoComplete", '1') | 663 else: self.settings.set_setting("SuppressChatAutoComplete", '1') |
695 | 664 |
696 | |
697 def OnMB_ShowIDinChat(self, event): | 665 def OnMB_ShowIDinChat(self, event): |
698 if event.IsChecked(): self.settings.set_setting("ShowIDInChat", '1') | 666 if event.IsChecked(): self.settings.set_setting("ShowIDInChat", '1') |
699 else: self.settings.set_setting("ShowIDInChat", '0') | 667 else: self.settings.set_setting("ShowIDInChat", '0') |
700 | 668 |
701 | |
702 def OnMB_LogTimeIndex(self, event): | 669 def OnMB_LogTimeIndex(self, event): |
703 if event.IsChecked(): self.settings.set_setting("TimeStampGameLog", '1') | 670 if event.IsChecked(): self.settings.set_setting("TimeStampGameLog", '1') |
704 else: self.settings.set_setting("TimeStampGameLog", '0') | 671 else: self.settings.set_setting("TimeStampGameLog", '0') |
705 | 672 |
706 | |
707 def OnMB_TabbedWhispers(self, event): | 673 def OnMB_TabbedWhispers(self, event): |
708 if event.IsChecked(): self.settings.set_setting("tabbedwhispers", '1') | 674 if event.IsChecked(): self.settings.set_setting("tabbedwhispers", '1') |
709 else: self.settings.set_setting("tabbedwhispers", '0') | 675 else: self.settings.set_setting("tabbedwhispers", '0') |
710 | 676 |
711 | |
712 def OnMB_GMTab(self, event): | 677 def OnMB_GMTab(self, event): |
713 if event.IsChecked(): | 678 if event.IsChecked(): |
714 self.settings.set_setting("GMWhisperTab", '1') | 679 self.settings.set_setting("GMWhisperTab", '1') |
715 self.parent.create_gm_tab() | 680 self.parent.create_gm_tab() |
716 else: self.settings.set_setting("GMWhisperTab", '0') | 681 else: self.settings.set_setting("GMWhisperTab", '0') |
717 | 682 |
718 | |
719 def OnMB_GroupWhisperTabs(self, event): | 683 def OnMB_GroupWhisperTabs(self, event): |
720 if event.IsChecked(): self.settings.set_setting("GroupWhisperTab", '1') | 684 if event.IsChecked(): self.settings.set_setting("GroupWhisperTab", '1') |
721 else: self.settings.set_setting("GroupWhisperTab", '0') | 685 else: self.settings.set_setting("GroupWhisperTab", '0') |
722 | 686 |
723 | |
724 def OnMB_DiceBar(self, event): | 687 def OnMB_DiceBar(self, event): |
725 act = '0' | 688 act = '0' |
726 if event.IsChecked(): | 689 if event.IsChecked(): |
727 self.settings.set_setting("DiceButtons_On", '1') | 690 self.settings.set_setting("DiceButtons_On", '1') |
728 act = '1' | 691 act = '1' |
732 except: pass | 695 except: pass |
733 for panel in self.parent.whisper_tabs: panel.toggle_dice(act) | 696 for panel in self.parent.whisper_tabs: panel.toggle_dice(act) |
734 for panel in self.parent.group_tabs: panel.toggle_dice(act) | 697 for panel in self.parent.group_tabs: panel.toggle_dice(act) |
735 for panel in self.parent.null_tabs: panel.toggle_dice(act) | 698 for panel in self.parent.null_tabs: panel.toggle_dice(act) |
736 | 699 |
737 | |
738 def OnMB_FormatButtons(self, event): | 700 def OnMB_FormatButtons(self, event): |
739 act = '0' | 701 act = '0' |
740 if event.IsChecked(): | 702 if event.IsChecked(): |
741 self.settings.set_setting("FormattingButtons_On", '1') | 703 self.settings.set_setting("FormattingButtons_On", '1') |
742 act = '1' | 704 act = '1' |
747 except: pass | 709 except: pass |
748 for panel in self.parent.whisper_tabs: panel.toggle_formating(act) | 710 for panel in self.parent.whisper_tabs: panel.toggle_formating(act) |
749 for panel in self.parent.group_tabs: panel.toggle_formating(act) | 711 for panel in self.parent.group_tabs: panel.toggle_formating(act) |
750 for panel in self.parent.null_tabs: panel.toggle_formating(act) | 712 for panel in self.parent.null_tabs: panel.toggle_formating(act) |
751 | 713 |
752 | |
753 def OnMB_AliasTool(self, event): | 714 def OnMB_AliasTool(self, event): |
754 act = '0' | 715 act = '0' |
755 if event.IsChecked(): | 716 if event.IsChecked(): |
756 self.settings.set_setting("AliasTool_On", '1') | 717 self.settings.set_setting("AliasTool_On", '1') |
757 act = '1' | 718 act = '1' |
761 except: pass | 722 except: pass |
762 for panel in self.parent.whisper_tabs: panel.toggle_alias(act) | 723 for panel in self.parent.whisper_tabs: panel.toggle_alias(act) |
763 for panel in self.parent.group_tabs: panel.toggle_alias(act) | 724 for panel in self.parent.group_tabs: panel.toggle_alias(act) |
764 for panel in self.parent.null_tabs:panel.toggle_alias(act) | 725 for panel in self.parent.null_tabs:panel.toggle_alias(act) |
765 | 726 |
766 | |
767 def OnMB_BackgroundColor(self, event): | 727 def OnMB_BackgroundColor(self, event): |
768 top_frame = component.get('frame') | 728 top_frame = component.get('frame') |
769 hexcolor = self.get_color() | 729 hexcolor = self.get_color() |
770 if hexcolor != None: | 730 if hexcolor != None: |
771 self.bgcolor = hexcolor | 731 self.bgcolor = hexcolor |
872 self.chattxt.Bind(wx.EVT_MOUSEWHEEL, self.chatwnd.mouse_wheel) | 832 self.chattxt.Bind(wx.EVT_MOUSEWHEEL, self.chatwnd.mouse_wheel) |
873 self.chattxt.Bind(wx.EVT_CHAR, self.chattxt.OnChar) | 833 self.chattxt.Bind(wx.EVT_CHAR, self.chattxt.OnChar) |
874 self.chattxt.Bind(wx.EVT_TEXT_COPY, self.chatwnd.OnM_EditCopy) | 834 self.chattxt.Bind(wx.EVT_TEXT_COPY, self.chatwnd.OnM_EditCopy) |
875 # def build_ctrls - end | 835 # def build_ctrls - end |
876 | 836 |
877 | |
878 def build_bar(self): | 837 def build_bar(self): |
879 self.toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL) | 838 self.toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL) |
880 self.scroll_lock = None | 839 self.scroll_lock = None |
881 self.numDieText = None | 840 self.numDieText = None |
882 self.dieModText = None | 841 self.dieModText = None |
894 def build_scroll(self): | 853 def build_scroll(self): |
895 self.scroll_lock = wx.Button( self, wx.ID_ANY, "Scroll ON",size= wx.Size(80,25)) | 854 self.scroll_lock = wx.Button( self, wx.ID_ANY, "Scroll ON",size= wx.Size(80,25)) |
896 | 855 |
897 | 856 |
898 def build_alias(self): | 857 def build_alias(self): |
899 self.aliasSizer = wx.BoxSizer(wx.HORIZONTAL) ## Future ## Add these to a sizer, then turn the toolbar_sizer into a grid so these can adjust to the frame. | 858 self.aliasSizer = wx.BoxSizer(wx.HORIZONTAL) |
900 self.aliasList = wx.Choice(self, wx.ID_ANY, size=(100, 25), choices=[self.defaultAliasName]) | 859 self.aliasList = wx.Choice(self, wx.ID_ANY, size=(100, 25), choices=[self.defaultAliasName]) |
901 self.aliasButton = createMaskedButton( self, dir_struct["icon"] + 'player.gif', | 860 self.aliasButton = createMaskedButton( self, dir_struct["icon"] + 'player.gif', |
902 'Refresh list of aliases from Game Tree', wx.ID_ANY, '#bdbdbd' ) | 861 'Refresh list of aliases from Game Tree', |
862 wx.ID_ANY, '#bdbdbd' ) | |
903 self.aliasList.SetSelection(0) | 863 self.aliasList.SetSelection(0) |
904 self.filterList = wx.Choice(self, wx.ID_ANY, size=(100, 25), choices=[self.defaultFilterName]) | 864 self.filterList = wx.Choice(self, wx.ID_ANY, size=(100, 25), choices=[self.defaultFilterName]) |
905 self.filterButton = createMaskedButton( self, dir_struct["icon"] + 'add_filter.gif', | 865 self.filterButton = createMaskedButton( self, dir_struct["icon"] + 'add_filter.gif', |
906 'Refresh list of filters from Game Tree', wx.ID_ANY, '#bdbdbd' ) | 866 'Refresh list of filters from Game Tree', |
867 wx.ID_ANY, '#bdbdbd' ) | |
907 self.filterList.SetSelection(0) | 868 self.filterList.SetSelection(0) |
908 | 869 |
909 self.aliasSizer.Add( self.aliasButton, 0, wx.EXPAND ) | 870 self.aliasSizer.Add( self.aliasButton, 0, wx.EXPAND ) |
910 self.aliasSizer.Add( self.aliasList,0,wx.EXPAND) | 871 self.aliasSizer.Add( self.aliasList,0,wx.EXPAND) |
911 self.aliasSizer.Add( self.filterButton, 0, wx.EXPAND ) | 872 self.aliasSizer.Add( self.filterButton, 0, wx.EXPAND ) |
913 | 874 |
914 self.toolbar_sizer.Add(self.aliasSizer, 0, wx.EXPAND) | 875 self.toolbar_sizer.Add(self.aliasSizer, 0, wx.EXPAND) |
915 | 876 |
916 if self.settings.get_setting('AliasTool_On') == '0': self.toggle_alias('0') | 877 if self.settings.get_setting('AliasTool_On') == '0': self.toggle_alias('0') |
917 else: self.toggle_alias('1') | 878 else: self.toggle_alias('1') |
918 | |
919 | 879 |
920 def toggle_alias(self, act): | 880 def toggle_alias(self, act): |
921 if act == '0': self.toolbar_sizer.Show(self.aliasSizer, False) | 881 if act == '0': self.toolbar_sizer.Show(self.aliasSizer, False) |
922 else: self.toolbar_sizer.Show(self.aliasSizer, True) | 882 else: self.toolbar_sizer.Show(self.aliasSizer, True) |
923 self.toolbar_sizer.Layout() | 883 self.toolbar_sizer.Layout() |
925 def build_text(self): | 885 def build_text(self): |
926 self.textpop_lock = createMaskedButton(self, dir_struct["icon"]+'note.gif', 'Open Text View Of Chat Session', wx.ID_ANY, '#bdbdbd') | 886 self.textpop_lock = createMaskedButton(self, dir_struct["icon"]+'note.gif', 'Open Text View Of Chat Session', wx.ID_ANY, '#bdbdbd') |
927 | 887 |
928 | 888 |
929 def build_dice(self): | 889 def build_dice(self): |
930 self.numDieText = wx.TextCtrl( self, wx.ID_ANY, "1", size= wx.Size(25, 25), validator=orpg.tools.inputValidator.MathOnlyValidator() ) | 890 self.diceSizer = wx.BoxSizer(wx.HORIZONTAL) |
931 self.dieModText = wx.TextCtrl( self, wx.ID_ANY, "", size= wx.Size(50, 25), validator=orpg.tools.inputValidator.MathOnlyValidator() ) | 891 self.numDieText = wx.TextCtrl( self, wx.ID_ANY, "1", |
892 size= wx.Size(25, 25), validator=orpg.tools.inputValidator.MathOnlyValidator() ) | |
893 self.dieModText = wx.TextCtrl( self, wx.ID_ANY, "", | |
894 size= wx.Size(50, 25), validator=orpg.tools.inputValidator.MathOnlyValidator() ) | |
932 self.d4Button = createMaskedButton(self, dir_struct["icon"]+'b_d4.gif', 'Roll d4', wx.ID_ANY) | 895 self.d4Button = createMaskedButton(self, dir_struct["icon"]+'b_d4.gif', 'Roll d4', wx.ID_ANY) |
933 self.d6Button = createMaskedButton(self, dir_struct["icon"]+'b_d6.gif', 'Roll d6', wx.ID_ANY) | 896 self.d6Button = createMaskedButton(self, dir_struct["icon"]+'b_d6.gif', 'Roll d6', wx.ID_ANY) |
934 self.d8Button = createMaskedButton(self, dir_struct["icon"]+'b_d8.gif', 'Roll d8', wx.ID_ANY) | 897 self.d8Button = createMaskedButton(self, dir_struct["icon"]+'b_d8.gif', 'Roll d8', wx.ID_ANY) |
935 self.d10Button = createMaskedButton(self, dir_struct["icon"]+'b_d10.gif', 'Roll d10', wx.ID_ANY) | 898 self.d10Button = createMaskedButton(self, dir_struct["icon"]+'b_d10.gif', 'Roll d10', wx.ID_ANY) |
936 self.d12Button = createMaskedButton(self, dir_struct["icon"]+'b_d12.gif', 'Roll d12', wx.ID_ANY) | 899 self.d12Button = createMaskedButton(self, dir_struct["icon"]+'b_d12.gif', 'Roll d12', wx.ID_ANY) |
937 self.d20Button = createMaskedButton(self, dir_struct["icon"]+'b_d20.gif', 'Roll d20', wx.ID_ANY) | 900 self.d20Button = createMaskedButton(self, dir_struct["icon"]+'b_d20.gif', 'Roll d20', wx.ID_ANY) |
938 self.d100Button = createMaskedButton(self, dir_struct["icon"]+'b_d100.gif', 'Roll d100', wx.ID_ANY) | 901 self.d100Button = createMaskedButton(self, dir_struct["icon"]+'b_d100.gif', 'Roll d100', wx.ID_ANY) |
939 self.toolbar_sizer.Add( self.numDieText, 0, wx.ALIGN_CENTER | wx.EXPAND) | 902 |
940 self.toolbar_sizer.Add( self.d4Button, 0 ,wx.EXPAND) | 903 self.diceSizer.Add( self.numDieText, 0, wx.ALIGN_CENTER | wx.EXPAND) |
941 self.toolbar_sizer.Add( self.d6Button, 0 ,wx.EXPAND) | 904 self.diceSizer.Add( self.d4Button, 0 ,wx.EXPAND) |
942 self.toolbar_sizer.Add( self.d8Button, 0 ,wx.EXPAND) | 905 self.diceSizer.Add( self.d6Button, 0 ,wx.EXPAND) |
943 self.toolbar_sizer.Add( self.d10Button, 0 ,wx.EXPAND) | 906 self.diceSizer.Add( self.d8Button, 0 ,wx.EXPAND) |
944 self.toolbar_sizer.Add( self.d12Button, 0 ,wx.EXPAND) | 907 self.diceSizer.Add( self.d10Button, 0 ,wx.EXPAND) |
945 self.toolbar_sizer.Add( self.d20Button, 0 ,wx.EXPAND) | 908 self.diceSizer.Add( self.d12Button, 0 ,wx.EXPAND) |
946 self.toolbar_sizer.Add( self.d100Button, 0 ,wx.EXPAND) | 909 self.diceSizer.Add( self.d20Button, 0 ,wx.EXPAND) |
947 self.toolbar_sizer.Add( self.dieModText, 0, wx.ALIGN_CENTER, 5 ) | 910 self.diceSizer.Add( self.d100Button, 0 ,wx.EXPAND) |
911 self.diceSizer.Add( self.dieModText, 0, wx.ALIGN_CENTER, 5 ) | |
912 | |
913 self.toolbar_sizer.Add( self.diceSizer, 0, wx.EXPAND) | |
948 if self.settings.get_setting('DiceButtons_On') == '0': self.toggle_dice('0') | 914 if self.settings.get_setting('DiceButtons_On') == '0': self.toggle_dice('0') |
949 else: self.toggle_dice('1') | 915 else: self.toggle_dice('1') |
950 | 916 |
951 | 917 |
952 def toggle_dice(self, act): | 918 def toggle_dice(self, act): |
953 if act == '0': | 919 if act == '0': self.toolbar_sizer.Show(self.diceSizer, False) |
954 self.toolbar_sizer.Show(self.numDieText, False) | 920 else: self.toolbar_sizer.Show(self.diceSizer, True) |
955 self.toolbar_sizer.Show(self.d4Button, False) | 921 self.toolbar_sizer.Layout() |
956 self.toolbar_sizer.Show(self.d6Button, False) | |
957 self.toolbar_sizer.Show(self.d8Button, False) | |
958 self.toolbar_sizer.Show(self.d10Button, False) | |
959 self.toolbar_sizer.Show(self.d12Button, False) | |
960 self.toolbar_sizer.Show(self.d20Button, False) | |
961 self.toolbar_sizer.Show(self.d100Button, False) | |
962 self.toolbar_sizer.Show(self.dieModText, False) | |
963 self.toolbar_sizer.Layout() | |
964 else: | |
965 self.toolbar_sizer.Show(self.numDieText, True) | |
966 self.toolbar_sizer.Show(self.d4Button, True) | |
967 self.toolbar_sizer.Show(self.d6Button, True) | |
968 self.toolbar_sizer.Show(self.d8Button, True) | |
969 self.toolbar_sizer.Show(self.d10Button, True) | |
970 self.toolbar_sizer.Show(self.d12Button, True) | |
971 self.toolbar_sizer.Show(self.d20Button, True) | |
972 self.toolbar_sizer.Show(self.d100Button, True) | |
973 self.toolbar_sizer.Show(self.dieModText, True) | |
974 self.toolbar_sizer.Layout() | |
975 | 922 |
976 | 923 |
977 def build_formating(self): | 924 def build_formating(self): |
925 self.formatSizer = wx.BoxSizer(wx.HORIZONTAL) | |
978 self.boldButton = createMaskedButton( self, dir_struct["icon"]+'bold.gif', | 926 self.boldButton = createMaskedButton( self, dir_struct["icon"]+'bold.gif', |
979 'Make the selected text Bold', wx.ID_ANY, '#bdbdbd') | 927 'Make the selected text Bold', wx.ID_ANY, '#bdbdbd') |
980 self.italicButton = createMaskedButton( self, dir_struct["icon"]+'italic.gif', | 928 self.italicButton = createMaskedButton( self, dir_struct["icon"]+'italic.gif', |
981 'Italicize the selected text', wx.ID_ANY, '#bdbdbd' ) | 929 'Italicize the selected text', wx.ID_ANY, '#bdbdbd' ) |
982 self.underlineButton = createMaskedButton( self, dir_struct["icon"]+'underlined.gif', | 930 self.underlineButton = createMaskedButton( self, dir_struct["icon"]+'underlined.gif', |
983 'Underline the selected text', wx.ID_ANY, '#bdbdbd' ) | 931 'Underline the selected text', wx.ID_ANY, '#bdbdbd' ) |
984 self.toolbar_sizer.Add( self.boldButton, 0, wx.EXPAND ) | 932 |
985 self.toolbar_sizer.Add( self.italicButton, 0, wx.EXPAND ) | 933 self.formatSizer.Add( self.boldButton, 0, wx.EXPAND ) |
986 self.toolbar_sizer.Add( self.underlineButton, 0, wx.EXPAND ) | 934 self.formatSizer.Add( self.italicButton, 0, wx.EXPAND ) |
935 self.formatSizer.Add( self.underlineButton, 0, wx.EXPAND ) | |
936 self.toolbar_sizer.Add( self.formatSizer, 0, wx.EXPAND ) | |
987 if self.settings.get_setting('FormattingButtons_On') == '0': self.toggle_formating('0') | 937 if self.settings.get_setting('FormattingButtons_On') == '0': self.toggle_formating('0') |
988 else: self.toggle_formating('1') | 938 else: self.toggle_formating('1') |
989 | 939 |
990 | 940 |
991 def toggle_formating(self, act): | 941 def toggle_formating(self, act): |
992 if act == '0': | 942 if act == '0': self.toolbar_sizer.Show(self.formatSizer, False) |
993 self.toolbar_sizer.Show(self.boldButton, False) | 943 else: self.toolbar_sizer.Show(self.formatSizer, True) |
994 self.toolbar_sizer.Show(self.italicButton, False) | 944 self.toolbar_sizer.Layout() |
995 self.toolbar_sizer.Show(self.underlineButton, False) | |
996 self.toolbar_sizer.Layout() | |
997 else: | |
998 self.toolbar_sizer.Show(self.boldButton, True) | |
999 self.toolbar_sizer.Show(self.italicButton, True) | |
1000 self.toolbar_sizer.Show(self.underlineButton, True) | |
1001 self.toolbar_sizer.Layout() | |
1002 | 945 |
1003 # Heroman - Ideally, we would use static labels... | 946 # Heroman - Ideally, we would use static labels... |
1004 | 947 |
1005 def build_colorbutton(self): | 948 def build_colorbutton(self): |
1006 self.color_button = createMaskedButton(self, dir_struct["icon"]+'textcolor.gif', | 949 self.color_button = createMaskedButton(self, dir_struct["icon"]+'textcolor.gif', |
1073 logger.general("EXCEPTION: " + str(e)) | 1016 logger.general("EXCEPTION: " + str(e)) |
1074 #end mDuo13 added code | 1017 #end mDuo13 added code |
1075 if self.lastSend: # This will be zero when not typing, so equiv to if is_typing | 1018 if self.lastSend: # This will be zero when not typing, so equiv to if is_typing |
1076 thisTime = time.time() # thisTime is a local temp variable | 1019 thisTime = time.time() # thisTime is a local temp variable |
1077 if (thisTime - self.lastPress) > 4: # Check to see if it's been 5 seconds since our last keystroke | 1020 if (thisTime - self.lastPress) > 4: # Check to see if it's been 5 seconds since our last keystroke |
1078 # If we're not already typing, then self.lastSend will be 0 | 1021 # If we're not already typing, then self.lastSend will be 0 |
1079 | 1022 |
1080 self.sendTyping(0) # send a typing event here (0 for False) | 1023 self.sendTyping(0) # send a typing event here (0 for False) |
1081 # This subroutine actually takes care of sending the messages for typing/not_typing events | 1024 # This subroutine actually takes care of sending the messages for typing/not_typing events |
1082 # | 1025 # |
1083 # self: duh | 1026 # self: duh |
1756 log( self.settings, c, name+s2 ) | 1699 log( self.settings, c, name+s2 ) |
1757 else: | 1700 else: |
1758 newline = "<div class='"+c+"'> " + self.TimeIndexString() + name + s + "</div>" | 1701 newline = "<div class='"+c+"'> " + self.TimeIndexString() + name + s + "</div>" |
1759 log( self.settings, c, name+s ) | 1702 log( self.settings, c, name+s ) |
1760 else: send = False | 1703 else: send = False |
1761 newline = component.get('xml').strip_unicode(newline) | 1704 newline = chat_util.strip_unicode(newline) |
1762 if self.lockscroll == 0: | 1705 if self.lockscroll == 0: |
1763 self.chatwnd.AppendToPage(newline) | 1706 self.chatwnd.AppendToPage(newline) |
1764 self.scroll_down() | 1707 self.scroll_down() |
1765 else: self.storedata.append(newline) | 1708 else: self.storedata.append(newline) |
1766 if send: | 1709 if send: |
1799 | 1742 |
1800 def ParsePost(self, s, send=False, myself=False): | 1743 def ParsePost(self, s, send=False, myself=False): |
1801 s = self.NormalizeParse(s) | 1744 s = self.NormalizeParse(s) |
1802 self.set_colors() | 1745 self.set_colors() |
1803 self.Post(s,send,myself) | 1746 self.Post(s,send,myself) |
1804 | |
1805 | 1747 |
1806 def NormalizeParse(self, s): | 1748 def NormalizeParse(self, s): |
1807 for plugin_fname in self.activeplugins.keys(): | 1749 for plugin_fname in self.activeplugins.keys(): |
1808 plugin = self.activeplugins[plugin_fname] | 1750 plugin = self.activeplugins[plugin_fname] |
1809 try: s = plugin.pre_parse(s) | 1751 try: s = plugin.pre_parse(s) |
1815 s = self.ParseNode(s) | 1757 s = self.ParseNode(s) |
1816 s = self.ParseDice(s) | 1758 s = self.ParseDice(s) |
1817 s = self.ParseFilter(s) | 1759 s = self.ParseFilter(s) |
1818 self.parsed = 1 | 1760 self.parsed = 1 |
1819 return s | 1761 return s |
1820 | |
1821 | 1762 |
1822 def ParseFilter(self, s): | 1763 def ParseFilter(self, s): |
1823 s = self.GetFilteredText(s) | 1764 s = self.GetFilteredText(s) |
1824 return s | 1765 return s |
1825 | 1766 |
1831 matches = reg.findall(s) | 1772 matches = reg.findall(s) |
1832 for i in xrange(0,len(matches)): | 1773 for i in xrange(0,len(matches)): |
1833 newstr = self.ParseNode(self.resolve_nodes(matches[i][1])) | 1774 newstr = self.ParseNode(self.resolve_nodes(matches[i][1])) |
1834 s = s.replace(matches[i][0], newstr, 1) | 1775 s = s.replace(matches[i][0], newstr, 1) |
1835 return s | 1776 return s |
1836 | |
1837 | 1777 |
1838 def ParseDice(self, s): | 1778 def ParseDice(self, s): |
1839 """Parses player input for embedded dice rolls""" | 1779 """Parses player input for embedded dice rolls""" |
1840 reg = re.compile("\[([^]]*?)\]") | 1780 reg = re.compile("\[([^]]*?)\]") |
1841 matches = reg.findall(s) | 1781 matches = reg.findall(s) |
1850 except: pass | 1790 except: pass |
1851 if qmode == 1: | 1791 if qmode == 1: |
1852 s = s.replace("[" + matches[i] + "]", "<!-- Official Roll [" + newstr1 + "] => " + newstr + "-->" + newstr, 1) | 1792 s = s.replace("[" + matches[i] + "]", "<!-- Official Roll [" + newstr1 + "] => " + newstr + "-->" + newstr, 1) |
1853 else: s = s.replace("[" + matches[i] + "]", "[" + newstr1 + "<!-- Official Roll -->] => " + newstr, 1) | 1793 else: s = s.replace("[" + matches[i] + "]", "[" + newstr1 + "<!-- Official Roll -->] => " + newstr, 1) |
1854 return s | 1794 return s |
1855 | |
1856 | 1795 |
1857 def PraseUnknowns(self, s): | 1796 def PraseUnknowns(self, s): |
1858 # Uses a tuple. Usage: ?Label}dY. If no Label is assigned then use ?}DY | 1797 # Uses a tuple. Usage: ?Label}dY. If no Label is assigned then use ?}DY |
1859 newstr = "0" | 1798 newstr = "0" |
1860 reg = re.compile("(\?\{*)([a-zA-Z ]*)(\}*)") | 1799 reg = re.compile("(\?\{*)([a-zA-Z ]*)(\}*)") |
1873 dlg.Destroy() | 1812 dlg.Destroy() |
1874 return s | 1813 return s |
1875 | 1814 |
1876 # This subroutine builds a chat display name. | 1815 # This subroutine builds a chat display name. |
1877 # | 1816 # |
1878 | |
1879 def chat_display_name(self, player): | 1817 def chat_display_name(self, player): |
1880 if self.settings.get_setting("ShowIDInChat") == "0": | 1818 if self.settings.get_setting("ShowIDInChat") == "0": |
1881 display_name = player[0] | 1819 display_name = player[0] |
1882 else: | 1820 else: |
1883 display_name = "("+player[2]+") " + player[0] | 1821 display_name = "("+player[2]+") " + player[0] |
1884 return display_name | 1822 return display_name |
1885 | 1823 |
1886 # This subroutine will get a hex color and return it, or return nothing | 1824 # This subroutine will get a hex color and return it, or return nothing |
1887 # | 1825 # |
1888 | |
1889 def get_color(self): | 1826 def get_color(self): |
1890 data = wx.ColourData() | 1827 data = wx.ColourData() |
1891 data.SetChooseFull(True) | 1828 data.SetChooseFull(True) |
1892 dlg = wx.ColourDialog(self, data) | 1829 dlg = wx.ColourDialog(self, data) |
1893 if dlg.ShowModal() == wx.ID_OK: | 1830 if dlg.ShowModal() == wx.ID_OK: |
1899 else: | 1836 else: |
1900 dlg.Destroy() | 1837 dlg.Destroy() |
1901 return None | 1838 return None |
1902 # def get_color - end | 1839 # def get_color - end |
1903 | 1840 |
1904 | |
1905 def replace_quotes(self, s): | 1841 def replace_quotes(self, s): |
1906 in_tag = 0 | 1842 in_tag = 0 |
1907 i = 0 | 1843 i = 0 |
1908 rs = s[:] | 1844 rs = s[:] |
1909 for c in s: | 1845 for c in s: |
1926 for child in child_list: | 1862 for child in child_list: |
1927 if step == depth: break | 1863 if step == depth: break |
1928 if child.get('name') == path[step]: | 1864 if child.get('name') == path[step]: |
1929 node = child | 1865 node = child |
1930 step += 1 | 1866 step += 1 |
1931 self.resolve_loop(node, path, step, depth) | 1867 if node.get('class') in ('dnd35char_handler', "SWd20char_handler", "d20char_handler", "dnd3echar_handler"): self.resolve_cust_loop(node, path, step, depth) |
1868 elif node.get('class') == 'rpg_grid_handler': self.resolve_grid(node, path, step, depth) | |
1869 else: self.resolve_loop(node, path, step, depth) | |
1870 | |
1871 | |
1872 def resolve_grid(self, node, path, step, depth): | |
1873 if step == depth: | |
1874 self.data = 'Invalid Grid Reference!' | |
1875 return | |
1876 cell = tuple(path[step].strip('(').strip(')').split(',')) | |
1877 grid = node.find('grid') | |
1878 rows = grid.findall('row') | |
1879 col = rows[int(cell[0])].findall('cell') | |
1880 self.data = col[int(cell[1])].text or 'No Cell Data!' | |
1881 return | |
1882 | |
1883 def resolve_cust_loop(self, node, path, step, depth): | |
1884 node_class = node.get('class') | |
1885 if step == depth: | |
1886 self.resolution(node) | |
1887 ##Build Abilities dictionary## | |
1888 if node_class not in ('d20char_handler', "SWd20char_handler"): ab = node.find('character').find('abilities') | |
1889 else: ab = node.find('abilities') | |
1890 ab_list = ab.findall('stat'); pc_stats = {} | |
1891 | |
1892 for ability in ab_list: | |
1893 pc_stats[ability.get('name')] = ( str(ability.get('base')), str((int(ability.get('base'))-10)/2) ) | |
1894 pc_stats[ability.get('abbr')] = ( str(ability.get('base')), str((int(ability.get('base'))-10)/2) ) | |
1895 | |
1896 if node_class not in ('d20char_handler', "SWd20char_handler"): ab = node.find('character').find('saves') | |
1897 else: ab = node.find('saves') | |
1898 ab_list = ab.findall('save') | |
1899 for save in ab_list: | |
1900 pc_stats[save.get('name')] = ( str(save.get('base')), str(int(save.get('magmod')) + int(save.get('miscmod')) + int(pc_stats[save.get('stat')][1]) ) ) | |
1901 if save.get('name') == 'Fortitude': abbr = 'Fort' | |
1902 if save.get('name') == 'Reflex': abbr = 'Ref' | |
1903 if save.get('name') == 'Will': abbr = 'Will' | |
1904 pc_stats[abbr] = ( str(save.get('base')), str(int(save.get('magmod')) + int(save.get('miscmod')) + int(pc_stats[save.get('stat')][1]) ) ) | |
1905 | |
1906 if path[step].lower() == 'skill': | |
1907 if node_class not in ('d20char_handler', "SWd20char_handler"): node = node.find('snf') | |
1908 node = node.find('skills') | |
1909 child_list = node.findall('skill') | |
1910 for child in child_list: | |
1911 if path[step+1].lower() == child.get('name').lower(): | |
1912 if step+2 == depth: self.data = child.get('rank') | |
1913 elif path[step+2].lower() == 'check': | |
1914 self.data = '<b>Skill Check:</b> ' + child.get('name') + ' [1d20+'+str( int(child.get('rank')) + int(pc_stats[child.get('stat')][1]) )+']' | |
1915 return | |
1916 | |
1917 if path[step].lower() == 'feat': | |
1918 if node_class not in ('d20char_handler', "SWd20char_handler"): node = node.find('snf') | |
1919 node = node.find('feats') | |
1920 child_list = node.findall('feat') | |
1921 for child in child_list: | |
1922 if path[step+1].lower() == child.get('name').lower(): | |
1923 if step+2 == depth: self.data = '<b>'+child.get('name')+'</b>'+': '+child.get('desc') | |
1924 return | |
1925 if path[step].lower() == 'cast': | |
1926 if node_class not in ('d20char_handler', "SWd20char_handler"): node = node.find('snp') | |
1927 node = node.find('spells') | |
1928 child_list = node.findall('spell') | |
1929 for child in child_list: | |
1930 if path[step+1].lower() == child.get('name').lower(): | |
1931 if step+2 == depth: self.data = '<b>'+child.get('name')+'</b>'+': '+child.get('desc') | |
1932 return | |
1933 if path[step].lower() == 'attack': | |
1934 if node_class not in ('d20char_handler', "SWd20char_handler"): node = node.find('combat') | |
1935 if path[step+1].lower() == 'melee' or path[step+1].lower() == 'm': | |
1936 bonus_text = '(Melee)' | |
1937 bonus = node.find('attacks') | |
1938 bonus = bonus.find('melee') | |
1939 bonus = bonus.attrib; d = 0 | |
1940 elif path[step+1].lower() == 'ranged' or path[step+1].lower() == 'r': | |
1941 bonus_text = '(Ranged)' | |
1942 bonus = node.find('attacks') | |
1943 bonus = bonus.find('ranged') | |
1944 bonus = bonus.attrib; d = 0 | |
1945 for b in bonus: | |
1946 d += int(bonus[b]) | |
1947 bonus = str(d) | |
1948 if path[step+2] == None: self.data = bonus | |
1949 else: | |
1950 weapons = node.find('attacks') | |
1951 weapons = weapons.findall('weapon') | |
1952 for child in weapons: | |
1953 if path[step+2].lower() == child.get('name').lower(): | |
1954 self.data = '<b>Attack: '+bonus_text+'</b> '+child.get('name')+' [1d20+'+bonus+'] ' + 'Damage: ['+child.get('damage')+']' | |
1955 return | |
1956 elif pc_stats.has_key(path[step]): | |
1957 if step+1 == depth: self.data = pc_stats[path[step]][0] + ' +('+pc_stats[path[step]][1]+')' | |
1958 elif path[step+1].lower() == 'mod': self.data = pc_stats[path[step]][1] | |
1959 elif path[step+1].lower() == 'check': self.data = '<b>'+path[step]+' Check:</b> [1d20+'+str(pc_stats[path[step]][1])+']' | |
1960 return | |
1932 | 1961 |
1933 def resolution(self, node): | 1962 def resolution(self, node): |
1934 if self.passed == False: | 1963 if self.passed == False: |
1935 self.passed = True | 1964 self.passed = True |
1936 if node.get('class') == 'textctrl_handler': self.data = str(node.find('text').text) | 1965 if node.get('class') == 'textctrl_handler': self.data = str(node.find('text').text) |
1937 else: self.data = 'Nodehandler for '+ node.get('class') + ' not done!' or 'No Data!' | 1966 else: self.data = 'Nodehandler for '+ node.get('class') + ' not done!' or 'Invalid Reference!' |
1938 else: | 1967 else: |
1939 self.data = '' | 1968 self.data = '' |
1940 pass | 1969 pass |
1941 self.data = self.ParseMap(self.data, node) | 1970 self.data = self.ParseMap(self.data, node) |
1942 | 1971 |
1943 def ParseMap(self, s, node): | 1972 def ParseMap(self, s, node): |
1944 """Parses player input for embedded nodes rolls""" | 1973 """Parses player input for embedded nodes rolls""" |
1945 cur_loc = 0 | 1974 cur_loc = 0 |
1946 reg = re.compile("(!!(.*?)!!)") | 1975 reg = re.compile("(!!(.*?)!!)") |
1947 matches = reg.findall(s) | 1976 matches = reg.findall(s) |
1948 print matches | |
1949 for i in xrange(0,len(matches)): | 1977 for i in xrange(0,len(matches)): |
1950 newstr = txt = '!@' + node.get('map') + '::' + matches[i][1] + '@!' | 1978 newstr = txt = '!@' + node.get('map') + '::' + matches[i][1] + '@!' |
1951 s = s.replace(matches[i][0], newstr, 1) | 1979 s = s.replace(matches[i][0], newstr, 1) |
1952 s = self.ParseNode(s) | 1980 s = self.ParseNode(s) |
1953 return s | 1981 return s |
1954 | 1982 |
1955 def resolve_nodes(self, s): | 1983 def resolve_nodes(self, s): |
1956 self.passed = False | 1984 self.passed = False |
1957 self.data = 'No Data!' | 1985 self.data = 'Invalid Reference!' |
1958 value = "" | 1986 value = "" |
1959 path = s.split('::') | 1987 path = s.split('::') |
1960 depth = len(path) | 1988 depth = len(path) |
1961 self.gametree = component.get('tree') | 1989 self.gametree = component.get('tree') |
1962 dom = self.gametree.xml_root.getchildren() | 1990 node = self.gametree.tree_map[path[0]]['node'] |
1963 for node in dom: | 1991 if node.get('class') in ('dnd35char_handler', "SWd20char_handler", "d20char_handler", "dnd3echar_handler"): self.resolve_cust_loop(node, path, 1, depth) |
1964 if node.get('name') == path[0]: | 1992 elif node.get('class') == 'rpg_grid_handler': self.resolve_grid(node, path, 1, depth) |
1965 self.resolve_loop(node, path, 1, len(path)) | 1993 else: self.resolve_loop(node, path, 1, depth) |
1966 return self.data | 1994 return self.data |