Commit a343ff3be889983ad0e39f47a070ac23d18fa21e

Authored by tatiana
1 parent 50d89b62

STL: Added comments / cleaned up code

Showing 1 changed file with 430 additions and 320 deletions   Show diff stats
invesalius/gui/frame.py
@@ -35,10 +35,10 @@ import project as prj @@ -35,10 +35,10 @@ import project as prj
35 import session as ses 35 import session as ses
36 import utils 36 import utils
37 37
38 -  
39 -# Layout tools' IDs - this is used only locally, therefore doesn't need  
40 -# to be defined in constants.py  
41 -VIEW_TOOLS = [ID_LAYOUT, ID_TEXT] = [wx.NewId() for number in range(2)] 38 +# Layout tools' IDs - this is used only locally, therefore doesn't
  39 +# need to be defined in constants.py
  40 +VIEW_TOOLS = [ID_LAYOUT, ID_TEXT] =\
  41 + [wx.NewId() for number in range(2)]
42 42
43 class Frame(wx.Frame): 43 class Frame(wx.Frame):
44 """ 44 """
@@ -53,19 +53,15 @@ class Frame(wx.Frame): @@ -53,19 +53,15 @@ class Frame(wx.Frame):
53 size=wx.Size(1024, 748), #size = wx.DisplaySize(), 53 size=wx.Size(1024, 748), #size = wx.DisplaySize(),
54 style=wx.DEFAULT_FRAME_STYLE, title='InVesalius 3') 54 style=wx.DEFAULT_FRAME_STYLE, title='InVesalius 3')
55 self.Center(wx.BOTH) 55 self.Center(wx.BOTH)
56 - self.SetIcon(wx.Icon(os.path.join(const.ICON_DIR, "invesalius.ico"),  
57 - wx.BITMAP_TYPE_ICO))  
58 - self.Maximize() 56 + icon_path = os.path.join(const.ICON_DIR, "invesalius.ico")
  57 + self.SetIcon(wx.Icon(icon_path, wx.BITMAP_TYPE_ICO))
  58 + #self.Maximize()
59 59
60 # Set menus, status and task bar 60 # Set menus, status and task bar
61 self.SetMenuBar(MenuBar(self)) 61 self.SetMenuBar(MenuBar(self))
62 self.SetStatusBar(StatusBar(self)) 62 self.SetStatusBar(StatusBar(self))
63 63
64 - # TaskBarIcon has different behaviours according to the  
65 - # platform:  
66 - # - win32: Show icon on "Notification Area" at "Task Bar"  
67 - # - darwin: Show icon on Dock  
68 - # - linux2: ? - TODO: find what it does 64 + # Set TaskBarIcon
69 TaskBarIcon(self) 65 TaskBarIcon(self)
70 66
71 # Create aui manager and insert content in it 67 # Create aui manager and insert content in it
@@ -79,18 +75,19 @@ class Frame(wx.Frame): @@ -79,18 +75,19 @@ class Frame(wx.Frame):
79 """ 75 """
80 Bind events related to pubsub. 76 Bind events related to pubsub.
81 """ 77 """
82 - ps.Publisher().subscribe(self._BeginBusyCursor, 'Begin busy cursor')  
83 - ps.Publisher().subscribe(self._ShowContentPanel, 'Cancel DICOM load')  
84 - ps.Publisher().subscribe(self._Exit, 'Close Window')  
85 - ps.Publisher().subscribe(self._EndBusyCursor, 'End busy cursor')  
86 - ps.Publisher().subscribe(self._HideContentPanel, 'Hide content panel')  
87 - ps.Publisher().subscribe(self._HideImportPanel, 'Hide import panel')  
88 - ps.Publisher().subscribe(self._HideTask, 'Hide task panel')  
89 - ps.Publisher().subscribe(self._SetProjectName, 'Set project name')  
90 - ps.Publisher().subscribe(self._ShowContentPanel, 'Show content panel')  
91 - ps.Publisher().subscribe(self._ShowImportPanel, 'Show import panel in frame')  
92 - ps.Publisher().subscribe(self._ShowTask, 'Show task panel')  
93 - ps.Publisher().subscribe(self._UpdateAUI, 'Update AUI') 78 + sub = ps.Publisher().subscribe
  79 + sub(self._BeginBusyCursor, 'Begin busy cursor')
  80 + sub(self._ShowContentPanel, 'Cancel DICOM load')
  81 + sub(self._Exit, 'Close Window')
  82 + sub(self._EndBusyCursor, 'End busy cursor')
  83 + sub(self._HideContentPanel, 'Hide content panel')
  84 + sub(self._HideImportPanel, 'Hide import panel')
  85 + sub(self._HideTask, 'Hide task panel')
  86 + sub(self._SetProjectName, 'Set project name')
  87 + sub(self._ShowContentPanel, 'Show content panel')
  88 + sub(self._ShowImportPanel, 'Show import panel in frame')
  89 + sub(self._ShowTask, 'Show task panel')
  90 + sub(self._UpdateAUI, 'Update AUI')
94 91
95 def __bind_events_wx(self): 92 def __bind_events_wx(self):
96 """ 93 """
@@ -123,16 +120,16 @@ class Frame(wx.Frame): @@ -123,16 +120,16 @@ class Frame(wx.Frame):
123 aui_manager.AddPane(viewers.Panel(self), wx.aui.AuiPaneInfo(). 120 aui_manager.AddPane(viewers.Panel(self), wx.aui.AuiPaneInfo().
124 Caption(_("Data panel")).CaptionVisible(False). 121 Caption(_("Data panel")).CaptionVisible(False).
125 Centre().CloseButton(False).Floatable(False). 122 Centre().CloseButton(False).Floatable(False).
126 - Hide().Layer(1).MaximizeButton(True).Name("Data").  
127 - Position(1)) 123 + Hide().Layer(1).MaximizeButton(True).
  124 + Name("Data").Position(1))
128 125
129 # This is the DICOM import panel. When the two panels above 126 # This is the DICOM import panel. When the two panels above
130 # are shown, this should be hiden 127 # are shown, this should be hiden
  128 + caption = _("Preview medical data to be reconstructed")
131 aui_manager.AddPane(imp.Panel(self), wx.aui.AuiPaneInfo(). 129 aui_manager.AddPane(imp.Panel(self), wx.aui.AuiPaneInfo().
132 Name("Import").Centre().Hide(). 130 Name("Import").Centre().Hide().
133 MaximizeButton(True).Floatable(True). 131 MaximizeButton(True).Floatable(True).
134 - Caption(_("Preview medical data to be reconstructed")).  
135 - CaptionVisible(True)) 132 + Caption(caption).CaptionVisible(True))
136 133
137 # Add toolbars to manager 134 # Add toolbars to manager
138 # This is pretty tricky -- order on win32 is inverted when 135 # This is pretty tricky -- order on win32 is inverted when
@@ -189,7 +186,7 @@ class Frame(wx.Frame): @@ -189,7 +186,7 @@ class Frame(wx.Frame):
189 try: 186 try:
190 wx.EndBusyCursor() 187 wx.EndBusyCursor()
191 except wx._core.PyAssertionError: 188 except wx._core.PyAssertionError:
192 - #xEndBusyCursor(): no matching wxBeginBusyCursor() for wxEndBusyCursor() 189 + #no matching wxBeginBusyCursor() for wxEndBusyCursor()
193 pass 190 pass
194 191
195 def _Exit(self, pubsub_evt): 192 def _Exit(self, pubsub_evt):
@@ -330,7 +327,8 @@ class Frame(wx.Frame): @@ -330,7 +327,8 @@ class Frame(wx.Frame):
330 """ 327 """
331 Show getting started window. 328 Show getting started window.
332 """ 329 """
333 - path = os.path.join(const.DOC_DIR, "user_guide_invesalius3a.pdf") 330 + path = os.path.join(const.DOC_DIR,
  331 + "user_guide_invesalius3a.pdf")
334 webbrowser.open(path) 332 webbrowser.open(path)
335 333
336 def ShowImportDicomPanel(self): 334 def ShowImportDicomPanel(self):
@@ -357,7 +355,8 @@ class Frame(wx.Frame): @@ -357,7 +355,8 @@ class Frame(wx.Frame):
357 355
358 class MenuBar(wx.MenuBar): 356 class MenuBar(wx.MenuBar):
359 """ 357 """
360 - MenuBar which contains menus used to control project, tools and help. 358 + MenuBar which contains menus used to control project, tools and
  359 + help.
361 """ 360 """
362 def __init__(self, parent): 361 def __init__(self, parent):
363 wx.MenuBar.__init__(self) 362 wx.MenuBar.__init__(self)
@@ -382,7 +381,8 @@ class MenuBar(wx.MenuBar): @@ -382,7 +381,8 @@ class MenuBar(wx.MenuBar):
382 # events should be binded directly from wx.Menu / wx.MenuBar 381 # events should be binded directly from wx.Menu / wx.MenuBar
383 # message "Binding events of wx.MenuBar" on [wxpython-users] 382 # message "Binding events of wx.MenuBar" on [wxpython-users]
384 # mail list in Oct 20 2008 383 # mail list in Oct 20 2008
385 - ps.Publisher().subscribe(self.OnEnableState, "Enable state project") 384 + sub = ps.Publisher().subscribe
  385 + sub(self.OnEnableState, "Enable state project")
386 386
387 def __init_items(self): 387 def __init_items(self):
388 """ 388 """
@@ -392,48 +392,54 @@ class MenuBar(wx.MenuBar): @@ -392,48 +392,54 @@ class MenuBar(wx.MenuBar):
392 392
393 # FILE 393 # FILE
394 file_menu = wx.Menu() 394 file_menu = wx.Menu()
395 - file_menu.Append(const.ID_DICOM_IMPORT, _("Import DICOM...\tCtrl+I"))  
396 - #file_menu.Append(const.ID_DICOM_LOAD_NET, _("Import DICOM from PACS..."))  
397 - file_menu.Append(const.ID_PROJECT_OPEN, _("Open Project...\tCtrl+O"))  
398 - file_menu.Append(const.ID_PROJECT_SAVE, _("Save Project\tCtrl+S"))  
399 - file_menu.Append(const.ID_PROJECT_SAVE_AS, _("Save Project As..."))  
400 - file_menu.Append(const.ID_PROJECT_CLOSE, _("Close Project")) 395 + app = file_menu.Append
  396 + app(const.ID_DICOM_IMPORT, _("Import DICOM...\tCtrl+I"))
  397 + #app(const.ID_DICOM_LOAD_NET, _("Import DICOM from PACS..."))
  398 + app(const.ID_PROJECT_OPEN, _("Open Project...\tCtrl+O"))
  399 + app(const.ID_PROJECT_SAVE, _("Save Project\tCtrl+S"))
  400 + app(const.ID_PROJECT_SAVE_AS, _("Save Project As..."))
  401 + app(const.ID_PROJECT_CLOSE, _("Close Project"))
401 file_menu.AppendSeparator() 402 file_menu.AppendSeparator()
402 - #file_menu.Append(const.ID_PROJECT_INFO, _("Project Information...")) 403 + #app(const.ID_PROJECT_INFO, _("Project Information..."))
403 #file_menu.AppendSeparator() 404 #file_menu.AppendSeparator()
404 - #file_menu.Append(const.ID_SAVE_SCREENSHOT, _("Save Screenshot"))  
405 - #file_menu.Append(const.ID_PRINT_SCREENSHOT, _("Print Screenshot")) 405 + #app(const.ID_SAVE_SCREENSHOT, _("Save Screenshot"))
  406 + #app(const.ID_PRINT_SCREENSHOT, _("Print Screenshot"))
406 #file_menu.AppendSeparator() 407 #file_menu.AppendSeparator()
407 - #file_menu.Append(1, "C:\InvData\sample.inv") 408 + #app(1, "C:\InvData\sample.inv")
408 #file_menu.AppendSeparator() 409 #file_menu.AppendSeparator()
409 - file_menu.Append(const.ID_EXIT, _("Exit")) 410 + app(const.ID_EXIT, _("Exit"))
410 411
411 # EDIT 412 # EDIT
412 #file_edit = wx.Menu() 413 #file_edit = wx.Menu()
413 - #file_edit.Append(wx.ID_UNDO, "Undo\tCtrl+Z")  
414 - #file_edit.Append(wx.ID_REDO, "Redo\tCtrl+Y")  
415 - #file_edit.Append(const.ID_EDIT_LIST, "Show Undo List...") 414 + #app = file_edit.Append
  415 + #app(wx.ID_UNDO, "Undo\tCtrl+Z")
  416 + #app(wx.ID_REDO, "Redo\tCtrl+Y")
  417 + #app(const.ID_EDIT_LIST, "Show Undo List...")
416 418
417 # VIEW 419 # VIEW
418 #view_tool_menu = wx.Menu() 420 #view_tool_menu = wx.Menu()
419 - #view_tool_menu.Append(const.ID_TOOL_PROJECT, "Project Toolbar")  
420 - #view_tool_menu.Append(const.ID_TOOL_LAYOUT, "Layout Toolbar")  
421 - #view_tool_menu.Append(const.ID_TOOL_OBJECT, "Object Toolbar")  
422 - #view_tool_menu.Append(const.ID_TOOL_SLICE, "Slice Toolbar") 421 + #app = view_tool_menu.Append
  422 + #app(const.ID_TOOL_PROJECT, "Project Toolbar")
  423 + #app(const.ID_TOOL_LAYOUT, "Layout Toolbar")
  424 + #app(const.ID_TOOL_OBJECT, "Object Toolbar")
  425 + #app(const.ID_TOOL_SLICE, "Slice Toolbar")
423 426
424 #view_layout_menu = wx.Menu() 427 #view_layout_menu = wx.Menu()
425 - #view_layout_menu.Append(const.ID_TASK_BAR, "Task Bar")  
426 - #view_layout_menu.Append(const.ID_VIEW_FOUR, "Four View") 428 + #app = view_layout_menu.Append
  429 + #app(const.ID_TASK_BAR, "Task Bar")
  430 + #app(const.ID_VIEW_FOUR, "Four View")
427 431
428 #view_menu = wx.Menu() 432 #view_menu = wx.Menu()
429 - #view_menu.AppendMenu(-1, "Toolbars",view_tool_menu)  
430 - #view_menu.AppendMenu(-1, "Layout", view_layout_menu) 433 + #app = view_menu.Append
  434 + #appm = view_menu.AppendMenu
  435 + #appm(-1, "Toolbars",view_tool_menu)
  436 + #appm(-1, "Layout", view_layout_menu)
431 #view_menu.AppendSeparator() 437 #view_menu.AppendSeparator()
432 - #view_menu.Append(const.ID_VIEW_FULL, "Fullscreen\tCtrl+F") 438 + #app(const.ID_VIEW_FULL, "Fullscreen\tCtrl+F")
433 #view_menu.AppendSeparator() 439 #view_menu.AppendSeparator()
434 - #view_menu.Append(const.ID_VIEW_TEXT, "2D & 3D Text") 440 + #app(const.ID_VIEW_TEXT, "2D & 3D Text")
435 #view_menu.AppendSeparator() 441 #view_menu.AppendSeparator()
436 - #view_menu.Append(const.ID_VIEW_3D_BACKGROUND, "3D Background Colour") 442 + #app(const.ID_VIEW_3D_BACKGROUND, "3D Background Colour")
437 443
438 # TOOLS 444 # TOOLS
439 #tools_menu = wx.Menu() 445 #tools_menu = wx.Menu()
@@ -452,13 +458,17 @@ class MenuBar(wx.MenuBar): @@ -452,13 +458,17 @@ class MenuBar(wx.MenuBar):
452 458
453 # TODO: Check what is necessary under MacOS to show 459 # TODO: Check what is necessary under MacOS to show
454 # InVesalius and not Python 460 # InVesalius and not Python
455 - # first menu item... Didn't manage to solve it up to now, the 3 lines  
456 - # bellow are a frustated test, based on wxPython Demo 461 + # first menu item... Didn't manage to solve it up to now,
  462 + # the 3 lines bellow are a frustated test, based on wxPython
  463 + # Demo
  464 +
457 # TODO: Google about this 465 # TODO: Google about this
458 #test_menu = wx.Menu() 466 #test_menu = wx.Menu()
459 - #test_item = test_menu.Append(-1, '&About InVesalius','InVesalius')  
460 - #wx.App.SetMacAboutMenuItemId(test_item.GetId()) 467 + #item = test_menu.Append(-1,
  468 + # &About InVesalius','InVesalius')
  469 + #wx.App.SetMacAboutMenuItemId(item.GetId())
461 470
  471 + # Add all menus to menubar
462 self.Append(file_menu, _("File")) 472 self.Append(file_menu, _("File"))
463 #self.Append(file_edit, "Edit") 473 #self.Append(file_edit, "Edit")
464 #self.Append(view_menu, "View") 474 #self.Append(view_menu, "View")
@@ -466,7 +476,6 @@ class MenuBar(wx.MenuBar): @@ -466,7 +476,6 @@ class MenuBar(wx.MenuBar):
466 #self.Append(options_menu, "Options") 476 #self.Append(options_menu, "Options")
467 self.Append(help_menu, _("Help")) 477 self.Append(help_menu, _("Help"))
468 478
469 -  
470 def OnEnableState(self, pubsub_evt): 479 def OnEnableState(self, pubsub_evt):
471 """ 480 """
472 Based on given state, enables or disables menu items which 481 Based on given state, enables or disables menu items which
@@ -496,7 +505,6 @@ class MenuBar(wx.MenuBar): @@ -496,7 +505,6 @@ class MenuBar(wx.MenuBar):
496 # ------------------------------------------------------------------ 505 # ------------------------------------------------------------------
497 # ------------------------------------------------------------------ 506 # ------------------------------------------------------------------
498 507
499 -  
500 class ProgressBar(wx.Gauge): 508 class ProgressBar(wx.Gauge):
501 """ 509 """
502 Progress bar / gauge. 510 Progress bar / gauge.
@@ -513,8 +521,8 @@ class ProgressBar(wx.Gauge): @@ -513,8 +521,8 @@ class ProgressBar(wx.Gauge):
513 """ 521 """
514 Bind events related to pubsub. 522 Bind events related to pubsub.
515 """ 523 """
516 - ps.Publisher().subscribe(self._Layout,  
517 - 'ProgressBar Reposition') 524 + sub = ps.Publisher().subscribe
  525 + sub(self._Layout, 'ProgressBar Reposition')
518 526
519 def _Layout(self, evt_pubsub=None): 527 def _Layout(self, evt_pubsub=None):
520 """ 528 """
@@ -538,7 +546,6 @@ class ProgressBar(wx.Gauge): @@ -538,7 +546,6 @@ class ProgressBar(wx.Gauge):
538 # ------------------------------------------------------------------ 546 # ------------------------------------------------------------------
539 # ------------------------------------------------------------------ 547 # ------------------------------------------------------------------
540 548
541 -  
542 class StatusBar(wx.StatusBar): 549 class StatusBar(wx.StatusBar):
543 """ 550 """
544 Control general status (both text and gauge) 551 Control general status (both text and gauge)
@@ -562,10 +569,9 @@ class StatusBar(wx.StatusBar): @@ -562,10 +569,9 @@ class StatusBar(wx.StatusBar):
562 """ 569 """
563 Bind events related to pubsub. 570 Bind events related to pubsub.
564 """ 571 """
565 - ps.Publisher().subscribe(self._SetProgressValue,  
566 - 'Update status in GUI')  
567 - ps.Publisher().subscribe(self._SetProgressLabel,  
568 - 'Update status text in GUI') 572 + sub = ps.Publisher().subscribe
  573 + sub(self._SetProgressValue, 'Update status in GUI')
  574 + sub(self._SetProgressLabel, 'Update status text in GUI')
569 575
570 def _SetProgressValue(self, pubsub_evt): 576 def _SetProgressValue(self, pubsub_evt):
571 """ 577 """
@@ -593,12 +599,17 @@ class StatusBar(wx.StatusBar): @@ -593,12 +599,17 @@ class StatusBar(wx.StatusBar):
593 label = pubsub_evt.data 599 label = pubsub_evt.data
594 self.SetStatusText(label, 0) 600 self.SetStatusText(label, 0)
595 601
596 -  
597 # ------------------------------------------------------------------ 602 # ------------------------------------------------------------------
598 # ------------------------------------------------------------------ 603 # ------------------------------------------------------------------
599 # ------------------------------------------------------------------ 604 # ------------------------------------------------------------------
600 605
601 class TaskBarIcon(wx.TaskBarIcon): 606 class TaskBarIcon(wx.TaskBarIcon):
  607 + """
  608 + TaskBarIcon has different behaviours according to the platform:
  609 + - win32: Show icon on "Notification Area" at "Task Bar"
  610 + - darwin: Show icon on Dock
  611 + - linux2: ? - TODO: find what it does
  612 + """
602 def __init__(self, parent=None): 613 def __init__(self, parent=None):
603 wx.TaskBarIcon.__init__(self) 614 wx.TaskBarIcon.__init__(self)
604 self.frame = parent 615 self.frame = parent
@@ -614,67 +625,91 @@ class TaskBarIcon(wx.TaskBarIcon): @@ -614,67 +625,91 @@ class TaskBarIcon(wx.TaskBarIcon):
614 def OnTaskBarActivate(self): 625 def OnTaskBarActivate(self):
615 pass 626 pass
616 627
617 -  
618 # ------------------------------------------------------------------ 628 # ------------------------------------------------------------------
619 # ------------------------------------------------------------------ 629 # ------------------------------------------------------------------
620 # ------------------------------------------------------------------ 630 # ------------------------------------------------------------------
621 631
622 class ProjectToolBar(wx.ToolBar): 632 class ProjectToolBar(wx.ToolBar):
  633 + """
  634 + Toolbar related to general project operations, including: import,
  635 + open, save and saveas, among others.
  636 + """
623 def __init__(self, parent): 637 def __init__(self, parent):
  638 + style = wx.TB_FLAT|wx.TB_NODIVIDER| wx.TB_DOCKABLE
624 wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition, 639 wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition,
625 wx.DefaultSize, 640 wx.DefaultSize,
626 - wx.TB_FLAT|wx.TB_NODIVIDER| wx.TB_DOCKABLE)  
627 - 641 + style)
628 self.SetToolBitmapSize(wx.Size(32,32)) 642 self.SetToolBitmapSize(wx.Size(32,32))
629 643
630 self.parent = parent 644 self.parent = parent
  645 +
  646 + # Used to enable/disable menu items if project is opened or
  647 + # not. Eg. save should only be available if a project is open
  648 + self.enable_items = [const.ID_PROJECT_SAVE]
  649 +
631 self.__init_items() 650 self.__init_items()
632 self.__bind_events() 651 self.__bind_events()
633 652
634 - #FIXME:  
635 - self.save_as = True 653 + self.Realize()
  654 + self.SetStateProjectClose()
  655 +
  656 + def __bind_events(self):
  657 + """
  658 + Bind events related to pubsub.
  659 + """
  660 + sub = ps.Publisher().subscribe
  661 + sub(self._EnableState, "Enable state project")
636 662
637 def __init_items(self): 663 def __init_items(self):
638 - 664 + """
  665 + Add tools into toolbar.
  666 + """
  667 + # Load bitmaps
  668 + d = const.ICON_DIR
639 if sys.platform == 'darwin': 669 if sys.platform == 'darwin':
640 - BMP_NET = wx.Bitmap(os.path.join(const.ICON_DIR,  
641 - "file_from_internet_original.png"),  
642 - wx.BITMAP_TYPE_PNG)  
643 - BMP_IMPORT = wx.Bitmap(os.path.join(const.ICON_DIR,  
644 - "file_import_original.png"),  
645 - wx.BITMAP_TYPE_PNG)  
646 - BMP_OPEN = wx.Bitmap(os.path.join(const.ICON_DIR,"file_open_original.png"),  
647 - wx.BITMAP_TYPE_PNG)  
648 - BMP_SAVE = wx.Bitmap(os.path.join(const.ICON_DIR,  
649 - "file_save_original.png"),  
650 - wx.BITMAP_TYPE_PNG)  
651 - BMP_PRINT = wx.Bitmap(os.path.join(const.ICON_DIR,  
652 - "print_original.png"),  
653 - wx.BITMAP_TYPE_PNG)  
654 - BMP_PHOTO = wx.Bitmap(os.path.join(const.ICON_DIR,  
655 - "tool_photo_original.png"),  
656 - wx.BITMAP_TYPE_PNG) 670 + path = os.path.join(d,"file_from_internet_original.png")
  671 + BMP_NET = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  672 +
  673 + path = os.path.join(d, "file_import_original.png")
  674 + BMP_IMPORT = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  675 +
  676 + path = os.path.join(d, "file_open_original.png")
  677 + BMP_OPEN = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  678 +
  679 + path = os.path.join(d, "file_save_original.png")
  680 + BMP_SAVE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  681 +
  682 + path = os.path.join(d, "print_original.png")
  683 + BMP_PRINT = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  684 +
  685 + path = os.path.join(d, "tool_photo_original.png")
  686 + BMP_PHOTO = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
657 else: 687 else:
658 - BMP_NET = wx.Bitmap(os.path.join(const.ICON_DIR,"file_from_internet.png"),  
659 - wx.BITMAP_TYPE_PNG)  
660 - BMP_IMPORT = wx.Bitmap(os.path.join(const.ICON_DIR, "file_import.png"),  
661 - wx.BITMAP_TYPE_PNG)  
662 - BMP_OPEN = wx.Bitmap(os.path.join(const.ICON_DIR,"file_open.png"),  
663 - wx.BITMAP_TYPE_PNG)  
664 - BMP_SAVE = wx.Bitmap(os.path.join(const.ICON_DIR, "file_save.png"),  
665 - wx.BITMAP_TYPE_PNG)  
666 - BMP_PRINT = wx.Bitmap(os.path.join(const.ICON_DIR, "print.png"),  
667 - wx.BITMAP_TYPE_PNG)  
668 - BMP_PHOTO = wx.Bitmap(os.path.join(const.ICON_DIR, "tool_photo.png"),  
669 - wx.BITMAP_TYPE_PNG) 688 + path = os.path.join(d, "file_from_internet.png")
  689 + BMP_NET = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
670 690
  691 + path = os.path.join(d, "file_import.png")
  692 + BMP_IMPORT = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  693 +
  694 + path = os.path.join(d, "file_open.png")
  695 + BMP_OPEN = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
671 696
672 - #self.AddLabelTool(const.ID_DICOM_LOAD_NET,  
673 - # "Load medical image...",  
674 - # BMP_NET) 697 + path = os.path.join(d, "file_save.png")
  698 + BMP_SAVE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  699 +
  700 + path = os.path.join(d, "print.png"),
  701 + BMP_PRINT = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  702 +
  703 + path = os.path.join(d, "tool_photo.png"),
  704 + BMP_PHOTO = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  705 +
  706 + # Create tool items based on bitmaps
675 self.AddLabelTool(const.ID_DICOM_IMPORT, 707 self.AddLabelTool(const.ID_DICOM_IMPORT,
676 _("Import medical image..."), 708 _("Import medical image..."),
677 BMP_IMPORT) 709 BMP_IMPORT)
  710 + #self.AddLabelTool(const.ID_DICOM_LOAD_NET,
  711 + # "Load medical image...",
  712 + # BMP_NET)
678 self.AddLabelTool(const.ID_PROJECT_OPEN, 713 self.AddLabelTool(const.ID_PROJECT_OPEN,
679 _("Open InVesalius 3 project..."), 714 _("Open InVesalius 3 project..."),
680 BMP_OPEN) 715 BMP_OPEN)
@@ -687,56 +722,32 @@ class ProjectToolBar(wx.ToolBar): @@ -687,56 +722,32 @@ class ProjectToolBar(wx.ToolBar):
687 #self.AddLabelTool(const.ID_PRINT_SCREENSHOT, 722 #self.AddLabelTool(const.ID_PRINT_SCREENSHOT,
688 # "Print medical image...", 723 # "Print medical image...",
689 # BMP_PRINT) 724 # BMP_PRINT)
690 - self.enable_items = [const.ID_PROJECT_SAVE]  
691 -  
692 - self.Realize()  
693 - self.SetStateProjectClose()  
694 -  
695 - def SetStateProjectOpen(self):  
696 - for tool in self.enable_items:  
697 - self.EnableTool(tool, True)  
698 725
699 - def SetStateProjectClose(self):  
700 - for tool in self.enable_items:  
701 - self.EnableTool(tool, False)  
702 -  
703 - def OnEnableState(self, pubsub_evt): 726 + def _EnableState(self, pubsub_evt):
  727 + """
  728 + Based on given state, enable or disable menu items which
  729 + depend if project is open or not.
  730 + """
704 state = pubsub_evt.data 731 state = pubsub_evt.data
705 if state: 732 if state:
706 self.SetStateProjectOpen() 733 self.SetStateProjectOpen()
707 else: 734 else:
708 self.SetStateProjectClose() 735 self.SetStateProjectClose()
709 736
710 - def __bind_events(self):  
711 - ps.Publisher().subscribe(self.OnEnableState, "Enable state project")  
712 -  
713 - #self.Bind(wx.EVT_TOOL, self.OnToolSave, id=const.ID_PROJECT_SAVE)  
714 - #self.Bind(wx.EVT_TOOL, self.OnToolOpen, id=const.ID_PROJECT_OPEN)  
715 - #self.Bind(wx.EVT_TOOL, self.OnToolImport, id=const.ID_DICOM_IMPORT)  
716 -  
717 - def OnToolImport(self, event):  
718 - dirpath = dlg.ShowImportDirDialog()  
719 - if dirpath:  
720 - ps.Publisher().sendMessage("Load data to import panel", dirpath)  
721 - event.Skip()  
722 -  
723 - def OnToolOpen(self, event):  
724 - filepath = dlg.ShowOpenProjectDialog()  
725 - if filepath:  
726 - ps.Publisher().sendMessage('Open Project', filepath)  
727 - event.Skip()  
728 -  
729 - def OnToolSave(self, event):  
730 - proj = prj.Project()  
731 - filename = (prj.name).replace(' ','_')  
732 - if prj.save_as:  
733 - filename = dlg.ShowSaveAsProjectDialog(filename)  
734 - if filename:  
735 - prj.save_as = False  
736 - else:  
737 - return  
738 - ps.Publisher().sendMessage('Save Project',filename)  
739 - event.Skip() 737 + def SetStateProjectClose(self):
  738 + """
  739 + Disable menu items (e.g. save) when project is closed.
  740 + """
  741 + for tool in self.enable_items:
  742 + self.EnableTool(tool, False)
  743 +
  744 + def SetStateProjectOpen(self):
  745 + """
  746 + Enable menu items (e.g. save) when project is opened.
  747 + """
  748 + for tool in self.enable_items:
  749 + self.EnableTool(tool, True)
  750 +
740 751
741 752
742 # ------------------------------------------------------------------ 753 # ------------------------------------------------------------------
@@ -744,109 +755,126 @@ class ProjectToolBar(wx.ToolBar): @@ -744,109 +755,126 @@ class ProjectToolBar(wx.ToolBar):
744 # ------------------------------------------------------------------ 755 # ------------------------------------------------------------------
745 756
746 class ObjectToolBar(wx.ToolBar): 757 class ObjectToolBar(wx.ToolBar):
  758 + """
  759 + Toolbar related to general object operations, including: zoom
  760 + move, rotate, brightness/contrast, etc.
  761 + """
747 def __init__(self, parent): 762 def __init__(self, parent):
  763 + style = wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE
748 wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition, 764 wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition,
749 - wx.DefaultSize,  
750 - wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE) 765 + wx.DefaultSize, style)
751 766
752 self.SetToolBitmapSize(wx.Size(32,32)) 767 self.SetToolBitmapSize(wx.Size(32,32))
  768 +
753 self.parent = parent 769 self.parent = parent
  770 + # Used to enable/disable menu items if project is opened or
  771 + # not. Eg. save should only be available if a project is open
  772 + self.enable_items = [const.STATE_WL, const.STATE_PAN,
  773 + const.STATE_SPIN, const.STATE_ZOOM_SL,
  774 + const.STATE_ZOOM]
754 775
755 self.__init_items() 776 self.__init_items()
756 self.__bind_events() 777 self.__bind_events()
757 self.__bind_events_wx() 778 self.__bind_events_wx()
758 779
759 - def __init_items(self): 780 + self.Realize()
  781 + self.SetStateProjectClose()
  782 +
  783 + def __bind_events(self):
  784 + """
  785 + Bind events related to pubsub.
  786 + """
  787 + sub = ps.Publisher().subscribe
  788 + sub(self._EnableState, "Enable state project")
  789 + sub(self._UntoggleAllItems, 'Untoggle object toolbar items')
  790 +
  791 +
  792 + def __bind_events_wx(self):
  793 + """
  794 + Bind normal events from wx (except pubsub related).
  795 + """
  796 + self.Bind(wx.EVT_TOOL, self.OnToggle)
760 797
  798 + def __init_items(self):
  799 + """
  800 + Add tools into toolbar.
  801 + """
  802 + d = const.ICON_DIR
761 if sys.platform == 'darwin': 803 if sys.platform == 'darwin':
762 - BMP_ROTATE = wx.Bitmap(os.path.join(const.ICON_DIR,  
763 - "tool_rotate_original.gif"),  
764 - wx.BITMAP_TYPE_GIF)  
765 - BMP_MOVE =wx.Bitmap(os.path.join(const.ICON_DIR,  
766 - "tool_translate_original.png"),  
767 - wx.BITMAP_TYPE_PNG)  
768 - BMP_ZOOM = wx.Bitmap(os.path.join(const.ICON_DIR,  
769 - "tool_zoom_original.png"),  
770 - wx.BITMAP_TYPE_PNG)  
771 - BMP_ZOOM_SELECT = wx.Bitmap(os.path.join(const.ICON_DIR,  
772 - "tool_zoom_select_original.png"),  
773 - wx.BITMAP_TYPE_PNG)  
774 - BMP_CONTRAST = wx.Bitmap(os.path.join(const.ICON_DIR,  
775 - "tool_contrast_original.png"),  
776 - wx.BITMAP_TYPE_PNG) 804 + path = os.path.join(d, "tool_rotate_original.gif")
  805 + BMP_ROTATE = wx.Bitmap(path, wx.BITMAP_TYPE_GIF)
  806 +
  807 + path = os.path.join(d, "tool_translate_original.png")
  808 + BMP_MOVE =wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  809 +
  810 + path = os.path.join(d, "tool_zoom_original.png")
  811 + BMP_ZOOM = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  812 +
  813 + path = os.path.join(d, "tool_zoom_select_original.png")
  814 + BMP_ZOOM_SELECT = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  815 +
  816 + path = os.path.join(d, "tool_contrast_original.png")
  817 + BMP_CONTRAST = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
777 else: 818 else:
  819 + path = os.path.join(d, "tool_rotate.gif")
  820 + BMP_ROTATE = wx.Bitmap(path, wx.BITMAP_TYPE_GIF)
  821 +
  822 + path = os.path.join(d, "tool_translate.png")
  823 + BMP_MOVE =wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  824 +
  825 + path = os.path.join(d, "tool_zoom.png")
  826 + BMP_ZOOM = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
778 827
779 - BMP_ROTATE = wx.Bitmap(os.path.join(const.ICON_DIR,  
780 - "tool_rotate.gif"),  
781 - wx.BITMAP_TYPE_GIF)  
782 - BMP_MOVE = wx.Bitmap(os.path.join(const.ICON_DIR,  
783 - "tool_translate.gif"),  
784 - wx.BITMAP_TYPE_GIF)  
785 - BMP_ZOOM = wx.Bitmap(os.path.join(const.ICON_DIR, "tool_zoom.png"),  
786 - wx.BITMAP_TYPE_PNG)  
787 - BMP_ZOOM_SELECT = wx.Bitmap(os.path.join(const.ICON_DIR,  
788 - "tool_zoom_select.png"),  
789 - wx.BITMAP_TYPE_PNG)  
790 - BMP_CONTRAST = wx.Bitmap(os.path.join(const.ICON_DIR,  
791 - "tool_contrast.png"),  
792 - wx.BITMAP_TYPE_PNG) 828 + path = os.path.join(d, "tool_zoom_select.png")
  829 + BMP_ZOOM_SELECT = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
793 830
  831 + path = os.path.join(d, "tool_contrast.png")
  832 + BMP_CONTRAST = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
  833 +
  834 + # Create tool items based on bitmaps
794 self.AddLabelTool(const.STATE_ZOOM, 835 self.AddLabelTool(const.STATE_ZOOM,
795 _("Zoom"), 836 _("Zoom"),
796 BMP_ZOOM, 837 BMP_ZOOM,
797 kind = wx.ITEM_CHECK) 838 kind = wx.ITEM_CHECK)
798 -  
799 self.AddLabelTool(const.STATE_ZOOM_SL, 839 self.AddLabelTool(const.STATE_ZOOM_SL,
800 _("Zoom based on selection"), 840 _("Zoom based on selection"),
801 BMP_ZOOM_SELECT, 841 BMP_ZOOM_SELECT,
802 kind = wx.ITEM_CHECK) 842 kind = wx.ITEM_CHECK)
803 -  
804 self.AddLabelTool(const.STATE_SPIN, 843 self.AddLabelTool(const.STATE_SPIN,
805 _("Rotate"), BMP_ROTATE, 844 _("Rotate"), BMP_ROTATE,
806 kind = wx.ITEM_CHECK) 845 kind = wx.ITEM_CHECK)
807 -  
808 self.AddLabelTool(const.STATE_PAN, 846 self.AddLabelTool(const.STATE_PAN,
809 _("Move"), BMP_MOVE, 847 _("Move"), BMP_MOVE,
810 kind = wx.ITEM_CHECK) 848 kind = wx.ITEM_CHECK)
811 -  
812 self.AddLabelTool(const.STATE_WL, 849 self.AddLabelTool(const.STATE_WL,
813 _("Window and Level"), BMP_CONTRAST, 850 _("Window and Level"), BMP_CONTRAST,
814 kind = wx.ITEM_CHECK) 851 kind = wx.ITEM_CHECK)
815 852
816 - self.enable_items = [const.STATE_WL, const.STATE_PAN, const.STATE_SPIN,  
817 - const.STATE_ZOOM_SL, const.STATE_ZOOM,]  
818 -  
819 - self.Realize()  
820 - self.SetStateProjectClose()  
821 -  
822 -  
823 - def OnEnableState(self, pubsub_evt): 853 + def _EnableState(self, pubsub_evt):
  854 + """
  855 + Based on given state, enable or disable menu items which
  856 + depend if project is open or not.
  857 + """
824 state = pubsub_evt.data 858 state = pubsub_evt.data
825 if state: 859 if state:
826 self.SetStateProjectOpen() 860 self.SetStateProjectOpen()
827 else: 861 else:
828 self.SetStateProjectClose() 862 self.SetStateProjectClose()
829 863
830 - def SetStateProjectOpen(self):  
831 - for tool in self.enable_items:  
832 - self.EnableTool(tool, True)  
833 -  
834 - def SetStateProjectClose(self):  
835 - for tool in self.enable_items:  
836 - self.EnableTool(tool, False)  
837 - self.UntoggleAllItems()  
838 -  
839 -  
840 - def __bind_events_wx(self):  
841 - self.Bind(wx.EVT_TOOL, self.OnToggle)  
842 -  
843 - def __bind_events(self):  
844 - ps.Publisher().subscribe(self.UntoggleAllItems,  
845 - 'Untoggle object toolbar items')  
846 - ps.Publisher().subscribe(self.OnEnableState, "Enable state project")  
847 - 864 + def _UntoggleAllItems(self, pubsub_evt=None):
  865 + """
  866 + Untoggle all items on toolbar.
  867 + """
  868 + for id in const.TOOL_STATES:
  869 + state = self.GetToolState(id)
  870 + if state:
  871 + self.ToggleTool(id, False)
848 872
849 def OnToggle(self, evt): 873 def OnToggle(self, evt):
  874 + """
  875 + Update status of other items on toolbar (only one item
  876 + should be toggle each time).
  877 + """
850 id = evt.GetId() 878 id = evt.GetId()
851 state = self.GetToolState(id) 879 state = self.GetToolState(id)
852 if state: 880 if state:
@@ -859,83 +887,114 @@ class ObjectToolBar(wx.ToolBar): @@ -859,83 +887,114 @@ class ObjectToolBar(wx.ToolBar):
859 state = self.GetToolState(item) 887 state = self.GetToolState(item)
860 if state and (item != id): 888 if state and (item != id):
861 self.ToggleTool(item, False) 889 self.ToggleTool(item, False)
862 -  
863 evt.Skip() 890 evt.Skip()
864 891
  892 + def SetStateProjectClose(self):
  893 + """
  894 + Disable menu items (e.g. zoom) when project is closed.
  895 + """
  896 + for tool in self.enable_items:
  897 + self.EnableTool(tool, False)
  898 + self._UntoggleAllItems()
865 899
866 - def UntoggleAllItems(self, pubsub_evt=None):  
867 - for id in const.TOOL_STATES:  
868 - state = self.GetToolState(id)  
869 - if state:  
870 - self.ToggleTool(id, False)  
871 - 900 + def SetStateProjectOpen(self):
  901 + """
  902 + Enable menu items (e.g. zoom) when project is opened.
  903 + """
  904 + for tool in self.enable_items:
  905 + self.EnableTool(tool, True)
872 906
873 # ------------------------------------------------------------------ 907 # ------------------------------------------------------------------
874 # ------------------------------------------------------------------ 908 # ------------------------------------------------------------------
875 # ------------------------------------------------------------------ 909 # ------------------------------------------------------------------
876 910
877 class SliceToolBar(wx.ToolBar): 911 class SliceToolBar(wx.ToolBar):
  912 + """
  913 + Toolbar related to 2D slice specific operations, including: cross
  914 + intersection reference and scroll slices.
  915 + """
878 def __init__(self, parent): 916 def __init__(self, parent):
  917 + style = wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE
879 wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition, 918 wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition,
880 wx.DefaultSize, 919 wx.DefaultSize,
881 - wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE) 920 + style)
882 921
883 self.SetToolBitmapSize(wx.Size(32,32)) 922 self.SetToolBitmapSize(wx.Size(32,32))
884 923
885 self.parent = parent 924 self.parent = parent
  925 + self.enable_items = [const.SLICE_STATE_SCROLL,
  926 + const.SLICE_STATE_CROSS]
886 self.__init_items() 927 self.__init_items()
887 self.__bind_events() 928 self.__bind_events()
888 self.__bind_events_wx() 929 self.__bind_events_wx()
889 930
  931 + self.Realize()
  932 + self.SetStateProjectClose()
  933 +
890 def __init_items(self): 934 def __init_items(self):
  935 + """
  936 + Add tools into toolbar.
  937 + """
  938 + d = const.ICON_DIR
891 if sys.platform == 'darwin': 939 if sys.platform == 'darwin':
892 - BMP_SLICE = wx.Bitmap(os.path.join(const.ICON_DIR,  
893 - "slice_original.png"),  
894 - wx.BITMAP_TYPE_PNG) 940 + path = os.path.join(d, "slice_original.png")
  941 + BMP_SLICE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
895 942
896 - BMP_CROSS = wx.Bitmap(os.path.join(const.ICON_DIR,"cross_original.png"),  
897 - wx.BITMAP_TYPE_PNG) 943 + path = os.path.join(d,"cross_original.png")
  944 + BMP_CROSS = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
898 else: 945 else:
899 - BMP_SLICE = wx.Bitmap(os.path.join(const.ICON_DIR, "slice.png"),  
900 - wx.BITMAP_TYPE_PNG)  
901 -  
902 - BMP_CROSS = wx.Bitmap(os.path.join(const.ICON_DIR, "cross.png"),  
903 - wx.BITMAP_TYPE_PNG) 946 + path = os.path.join(d, "slice.png")
  947 + BMP_SLICE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
904 948
  949 + path = os.path.join(d,"cross.png")
  950 + BMP_CROSS = wx.Bitmap(path, wx.BITMAP_TYPE_PNG)
905 951
906 self.AddCheckTool(const.SLICE_STATE_SCROLL, BMP_SLICE) 952 self.AddCheckTool(const.SLICE_STATE_SCROLL, BMP_SLICE)
907 self.AddCheckTool(const.SLICE_STATE_CROSS, BMP_CROSS) 953 self.AddCheckTool(const.SLICE_STATE_CROSS, BMP_CROSS)
908 954
909 - self.enable_items = [const.SLICE_STATE_SCROLL, const.SLICE_STATE_CROSS,]  
910 - self.Realize()  
911 - self.SetStateProjectClose()  
912 -  
913 - def SetStateProjectOpen(self):  
914 - for tool in self.enable_items:  
915 - self.EnableTool(tool, True)  
916 -  
917 - def SetStateProjectClose(self):  
918 - for tool in self.enable_items:  
919 - self.EnableTool(tool, False) 955 + def __bind_events(self):
  956 + """
  957 + Bind events related to pubsub.
  958 + """
  959 + sub = ps.Publisher().subscribe
  960 + sub(self._EnableState, "Enable state project")
  961 + sub(self._UntoggleAllItems, 'Untoggle slice toolbar items')
920 962
921 def __bind_events_wx(self): 963 def __bind_events_wx(self):
922 - self.Bind(wx.EVT_TOOL, self.OnClick)  
923 -  
924 - def __bind_events(self):  
925 - ps.Publisher().subscribe(self.UntoggleAllItems,  
926 - 'Untoggle slice toolbar items')  
927 - ps.Publisher().subscribe(self.OnEnableState, "Enable state project") 964 + """
  965 + Bind normal events from wx (except pubsub related).
  966 + """
  967 + self.Bind(wx.EVT_TOOL, self.OnToggle)
928 968
929 - def OnEnableState(self, pubsub_evt): 969 + def _EnableState(self, pubsub_evt):
  970 + """
  971 + Based on given state, enable or disable menu items which
  972 + depend if project is open or not.
  973 + """
930 state = pubsub_evt.data 974 state = pubsub_evt.data
931 if state: 975 if state:
932 self.SetStateProjectOpen() 976 self.SetStateProjectOpen()
933 else: 977 else:
934 self.SetStateProjectClose() 978 self.SetStateProjectClose()
935 - self.UntoggleAllItems() 979 + self._UntoggleAllItems()
936 980
  981 + def _UntoggleAllItems(self, pubsub_evt=None):
  982 + """
  983 + Untoggle all items on toolbar.
  984 + """
  985 + for id in const.TOOL_SLICE_STATES:
  986 + state = self.GetToolState(id)
  987 + if state:
  988 + self.ToggleTool(id, False)
  989 + if id == const.SLICE_STATE_CROSS:
  990 + msg = 'Set cross visibility'
  991 + ps.Publisher().sendMessage(msg, 0)
937 992
938 - def OnClick(self, evt): 993 + def OnToggle(self, evt):
  994 + """
  995 + Update status of other items on toolbar (only one item
  996 + should be toggle each time).
  997 + """
939 id = evt.GetId() 998 id = evt.GetId()
940 state = self.GetToolState(id) 999 state = self.GetToolState(id)
941 1000
@@ -952,115 +1011,168 @@ class SliceToolBar(wx.ToolBar): @@ -952,115 +1011,168 @@ class SliceToolBar(wx.ToolBar):
952 1011
953 evt.Skip() 1012 evt.Skip()
954 1013
  1014 + def SetStateProjectClose(self):
  1015 + """
  1016 + Disable menu items (e.g. cross) when project is closed.
  1017 + """
  1018 + for tool in self.enable_items:
  1019 + self.EnableTool(tool, False)
955 1020
956 - def UntoggleAllItems(self, pubsub_evt=None):  
957 - for id in const.TOOL_SLICE_STATES:  
958 - state = self.GetToolState(id)  
959 - if state:  
960 - self.ToggleTool(id, False)  
961 - if id == const.SLICE_STATE_CROSS:  
962 - ps.Publisher().sendMessage('Set cross visibility', 0)  
963 - 1021 + def SetStateProjectOpen(self):
  1022 + """
  1023 + Enable menu items (e.g. cross) when project is opened.
  1024 + """
  1025 + for tool in self.enable_items:
  1026 + self.EnableTool(tool, True)
964 1027
965 # ------------------------------------------------------------------ 1028 # ------------------------------------------------------------------
966 # ------------------------------------------------------------------ 1029 # ------------------------------------------------------------------
967 # ------------------------------------------------------------------ 1030 # ------------------------------------------------------------------
968 1031
969 class LayoutToolBar(wx.ToolBar): 1032 class LayoutToolBar(wx.ToolBar):
  1033 + """
  1034 + Toolbar related to general layout/ visualization configuration
  1035 + e.g: show/hide task panel and show/hide text on viewers.
  1036 + """
970 def __init__(self, parent): 1037 def __init__(self, parent):
  1038 + style = wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE
971 wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition, 1039 wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition,
972 wx.DefaultSize, 1040 wx.DefaultSize,
973 - wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE) 1041 + style)
974 1042
975 self.SetToolBitmapSize(wx.Size(32,32)) 1043 self.SetToolBitmapSize(wx.Size(32,32))
976 1044
977 self.parent = parent 1045 self.parent = parent
978 self.__init_items() 1046 self.__init_items()
979 - self.__bind_events_wx()  
980 self.__bind_events() 1047 self.__bind_events()
  1048 + self.__bind_events_wx()
  1049 +
981 self.ontool_layout = False 1050 self.ontool_layout = False
982 self.ontool_text = True 1051 self.ontool_text = True
  1052 + self.enable_items = [ID_TEXT]
983 1053
984 - def __init_items(self): 1054 + self.Realize()
  1055 + self.SetStateProjectClose()
  1056 +
  1057 + def __bind_events(self):
  1058 + """
  1059 + Bind events related to pubsub.
  1060 + """
  1061 + sub = ps.Publisher().subscribe
  1062 + sub(self._EnableState, "Enable state project")
  1063 + sub(self._SetLayoutWithTask, "Set layout button data only")
  1064 + sub(self._SetLayoutWithoutTask, "Set layout button full")
  1065 +
  1066 + def __bind_events_wx(self):
  1067 + """
  1068 + Bind normal events from wx (except pubsub related).
  1069 + """
  1070 + self.Bind(wx.EVT_TOOL, self.OnToggle)
985 1071
  1072 + def __init_items(self):
  1073 + """
  1074 + Add tools into toolbar.
  1075 + """
  1076 + d = const.ICON_DIR
986 if sys.platform == 'darwin': 1077 if sys.platform == 'darwin':
987 - self.BMP_WITHOUT_MENU =\  
988 - wx.Bitmap(os.path.join(const.ICON_DIR,  
989 - "layout_data_only_original.gif"),  
990 - wx.BITMAP_TYPE_GIF)  
991 - self.BMP_WITH_MENU = wx.Bitmap(os.path.join(const.ICON_DIR,  
992 - "layout_full_original.gif"),  
993 - wx.BITMAP_TYPE_GIF) 1078 + # Bitmaps for show/hide task panel item
  1079 + p = os.path.join(d, "layout_data_only_original.gif")
  1080 + self.BMP_WITHOUT_MENU = wx.Bitmap(p, wx.BITMAP_TYPE_GIF)
994 1081
995 - self.BMP_WITHOUT_TEXT =\  
996 - wx.Bitmap(os.path.join(const.ICON_DIR,"text_inverted_original.png")) 1082 + p = os.path.join(d, "layout_full_original.gif")
  1083 + self.BMP_WITHOUT_MENU = wx.Bitmap(p, wx.BITMAP_TYPE_GIF)
997 1084
998 - self.BMP_WITH_TEXT = wx.Bitmap(os.path.join(const.ICON_DIR,"text_original.png")) 1085 + # Bitmaps for show/hide task item
  1086 + p = os.path.join(d, "text_inverted_original.png")
  1087 + self.BMP_WITHOUT_TEXT = wx.Bitmap(p, wx.BITMAP_TYPE_PNG)
999 1088
1000 - else:  
1001 - self.BMP_WITHOUT_MENU = wx.Bitmap(os.path.join(const.ICON_DIR,  
1002 - "layout_data_only.gif"),  
1003 - wx.BITMAP_TYPE_GIF)  
1004 - self.BMP_WITH_MENU = wx.Bitmap(os.path.join(const.ICON_DIR,  
1005 - "layout_full.gif"),  
1006 - wx.BITMAP_TYPE_GIF)  
1007 - self.BMP_WITH_TEXT = wx.Bitmap(os.path.join(const.ICON_DIR,"text.gif"), wx.BITMAP_TYPE_GIF)  
1008 - self.BMP_WITHOUT_TEXT = wx.Bitmap(os.path.join(const.ICON_DIR,"text_inverted.png"))  
1009 -  
1010 - self.AddLabelTool(ID_LAYOUT, "",bitmap=self.BMP_WITHOUT_MENU,  
1011 -shortHelp= _("Hide task panel"))  
1012 - self.AddLabelTool(ID_TEXT, "",bitmap=self.BMP_WITH_TEXT, shortHelp= _("Hide text")) 1089 + p = os.path.join(d, "text_original.png")
  1090 + self.BMP_WITH_TEXT = wx.Bitmap(p, wx.BITMAP_TYPE_PNG)
1013 1091
1014 - self.enable_items = [ID_TEXT]  
1015 - self.Realize()  
1016 - self.SetStateProjectClose() 1092 + else:
  1093 + # Bitmaps for show/hide task panel item
  1094 + p = os.path.join(d, "layout_data_only.gif")
  1095 + self.BMP_WITHOUT_MENU = wx.Bitmap(p, wx.BITMAP_TYPE_GIF)
1017 1096
1018 - def SetStateProjectOpen(self):  
1019 - self.ontool_text = False  
1020 - self.OnText()  
1021 - for tool in self.enable_items:  
1022 - self.EnableTool(tool, True) 1097 + p = os.path.join(d, "layout_full.gif")
  1098 + self.BMP_WITHOUT_MENU = wx.Bitmap(p, wx.BITMAP_TYPE_GIF)
1023 1099
1024 - def SetStateProjectClose(self):  
1025 - self.ontool_text = True  
1026 - self.OnText()  
1027 - for tool in self.enable_items:  
1028 - self.EnableTool(tool, False) 1100 + # Bitmaps for show/hide task item
  1101 + p = os.path.join(d, "text_inverted.png")
  1102 + self.BMP_WITHOUT_TEXT = wx.Bitmap(p, wx.BITMAP_TYPE_PNG)
1029 1103
1030 - def __bind_events(self):  
1031 - ps.Publisher().subscribe(self.SetLayoutButtonOnlyData,  
1032 - "Set layout button data only")  
1033 - ps.Publisher().subscribe(self.SetLayoutButtonFull,  
1034 - "Set layout button full") 1104 + p = os.path.join(d, "text.png")
  1105 + self.BMP_WITH_TEXT = wx.Bitmap(p, wx.BITMAP_TYPE_PNG)
1035 1106
1036 - ps.Publisher().subscribe(self.OnEnableState, "Enable state project") 1107 + self.AddLabelTool(ID_LAYOUT,
  1108 + "",
  1109 + bitmap=self.BMP_WITHOUT_MENU,
  1110 + shortHelp= _("Hide task panel"))
  1111 + self.AddLabelTool(ID_TEXT,
  1112 + "",
  1113 + bitmap=self.BMP_WITH_TEXT,
  1114 + shortHelp= _("Hide text"))
1037 1115
1038 - def OnEnableState(self, pubsub_evt): 1116 + def _EnableState(self, pubsub_evt):
  1117 + """
  1118 + Based on given state, enable or disable menu items which
  1119 + depend if project is open or not.
  1120 + """
1039 state = pubsub_evt.data 1121 state = pubsub_evt.data
1040 if state: 1122 if state:
1041 self.SetStateProjectOpen() 1123 self.SetStateProjectOpen()
1042 else: 1124 else:
1043 self.SetStateProjectClose() 1125 self.SetStateProjectClose()
1044 1126
  1127 + def _SetLayoutWithoutTask(self, pubsub_evt):
  1128 + """
  1129 + Set item bitmap to task panel hiden.
  1130 + """
  1131 + self.SetToolNormalBitmap(ID_LAYOUT,self.BMP_WITHOUT_MENU)
1045 1132
  1133 + def _SetLayoutWithTask(self, pubsub_evt):
  1134 + """
  1135 + Set item bitmap to task panel shown.
  1136 + """
  1137 + self.SetToolNormalBitmap(ID_LAYOUT,self.BMP_WITH_MENU)
1046 1138
1047 - def __bind_events_wx(self):  
1048 - self.Bind(wx.EVT_TOOL, self.OnClick)  
1049 -  
1050 - def OnClick(self, event): 1139 + def OnToggle(self, event):
  1140 + """
  1141 + Update status of toolbar item (bitmap and help)
  1142 + """
1051 id = event.GetId() 1143 id = event.GetId()
1052 if id == ID_LAYOUT: 1144 if id == ID_LAYOUT:
1053 - self.OnLayout() 1145 + self.ToggleLayout()
1054 elif id== ID_TEXT: 1146 elif id== ID_TEXT:
1055 - self.OnText()  
1056 - 1147 + self.ToggleText()
1057 1148
1058 for item in VIEW_TOOLS: 1149 for item in VIEW_TOOLS:
1059 state = self.GetToolState(item) 1150 state = self.GetToolState(item)
1060 if state and (item != id): 1151 if state and (item != id):
1061 self.ToggleTool(item, False) 1152 self.ToggleTool(item, False)
1062 1153
1063 - def OnLayout(self): 1154 + def SetStateProjectClose(self):
  1155 + """
  1156 + Disable menu items (e.g. text) when project is closed.
  1157 + """
  1158 + self.ontool_text = True
  1159 + self.ToggleText()
  1160 + for tool in self.enable_items:
  1161 + self.EnableTool(tool, False)
  1162 +
  1163 + def SetStateProjectOpen(self):
  1164 + """
  1165 + Disable menu items (e.g. text) when project is closed.
  1166 + """
  1167 + self.ontool_text = False
  1168 + self.ToggleText()
  1169 + for tool in self.enable_items:
  1170 + self.EnableTool(tool, True)
  1171 +
  1172 + def ToggleLayout(self):
  1173 + """
  1174 + Based on previous layout item state, toggle it.
  1175 + """
1064 if self.ontool_layout: 1176 if self.ontool_layout:
1065 self.SetToolNormalBitmap(ID_LAYOUT,self.BMP_WITHOUT_MENU) 1177 self.SetToolNormalBitmap(ID_LAYOUT,self.BMP_WITHOUT_MENU)
1066 ps.Publisher().sendMessage('Show task panel') 1178 ps.Publisher().sendMessage('Show task panel')
@@ -1073,7 +1185,10 @@ shortHelp= _("Hide task panel")) @@ -1073,7 +1185,10 @@ shortHelp= _("Hide task panel"))
1073 self.SetToolShortHelp(ID_LAYOUT, _("Show task panel")) 1185 self.SetToolShortHelp(ID_LAYOUT, _("Show task panel"))
1074 self.ontool_layout = True 1186 self.ontool_layout = True
1075 1187
1076 - def OnText(self): 1188 + def ToggleText(self):
  1189 + """
  1190 + Based on previous text item state, toggle it.
  1191 + """
1077 if self.ontool_text: 1192 if self.ontool_text:
1078 self.SetToolNormalBitmap(ID_TEXT,self.BMP_WITH_TEXT) 1193 self.SetToolNormalBitmap(ID_TEXT,self.BMP_WITH_TEXT)
1079 ps.Publisher().sendMessage('Hide text actors on viewers') 1194 ps.Publisher().sendMessage('Hide text actors on viewers')
@@ -1087,8 +1202,3 @@ shortHelp= _("Hide task panel")) @@ -1087,8 +1202,3 @@ shortHelp= _("Hide task panel"))
1087 ps.Publisher().sendMessage('Update AUI') 1202 ps.Publisher().sendMessage('Update AUI')
1088 self.ontool_text = True 1203 self.ontool_text = True
1089 1204
1090 - def SetLayoutButtonOnlyData(self, pubsub_evt):  
1091 - self.SetToolNormalBitmap(ID_LAYOUT,self.BMP_WITH_MENU)  
1092 -  
1093 - def SetLayoutButtonFull(self, pubsub_evt):  
1094 - self.SetToolNormalBitmap(ID_LAYOUT,self.BMP_WITHOUT_MENU)