Commit a343ff3be889983ad0e39f47a070ac23d18fa21e
1 parent
50d89b62
Exists in
master
and in
68 other branches
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 | 35 | import session as ses |
| 36 | 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 | 43 | class Frame(wx.Frame): |
| 44 | 44 | """ |
| ... | ... | @@ -53,19 +53,15 @@ class Frame(wx.Frame): |
| 53 | 53 | size=wx.Size(1024, 748), #size = wx.DisplaySize(), |
| 54 | 54 | style=wx.DEFAULT_FRAME_STYLE, title='InVesalius 3') |
| 55 | 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 | 60 | # Set menus, status and task bar |
| 61 | 61 | self.SetMenuBar(MenuBar(self)) |
| 62 | 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 | 65 | TaskBarIcon(self) |
| 70 | 66 | |
| 71 | 67 | # Create aui manager and insert content in it |
| ... | ... | @@ -79,18 +75,19 @@ class Frame(wx.Frame): |
| 79 | 75 | """ |
| 80 | 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 | 92 | def __bind_events_wx(self): |
| 96 | 93 | """ |
| ... | ... | @@ -123,16 +120,16 @@ class Frame(wx.Frame): |
| 123 | 120 | aui_manager.AddPane(viewers.Panel(self), wx.aui.AuiPaneInfo(). |
| 124 | 121 | Caption(_("Data panel")).CaptionVisible(False). |
| 125 | 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 | 126 | # This is the DICOM import panel. When the two panels above |
| 130 | 127 | # are shown, this should be hiden |
| 128 | + caption = _("Preview medical data to be reconstructed") | |
| 131 | 129 | aui_manager.AddPane(imp.Panel(self), wx.aui.AuiPaneInfo(). |
| 132 | 130 | Name("Import").Centre().Hide(). |
| 133 | 131 | MaximizeButton(True).Floatable(True). |
| 134 | - Caption(_("Preview medical data to be reconstructed")). | |
| 135 | - CaptionVisible(True)) | |
| 132 | + Caption(caption).CaptionVisible(True)) | |
| 136 | 133 | |
| 137 | 134 | # Add toolbars to manager |
| 138 | 135 | # This is pretty tricky -- order on win32 is inverted when |
| ... | ... | @@ -189,7 +186,7 @@ class Frame(wx.Frame): |
| 189 | 186 | try: |
| 190 | 187 | wx.EndBusyCursor() |
| 191 | 188 | except wx._core.PyAssertionError: |
| 192 | - #xEndBusyCursor(): no matching wxBeginBusyCursor() for wxEndBusyCursor() | |
| 189 | + #no matching wxBeginBusyCursor() for wxEndBusyCursor() | |
| 193 | 190 | pass |
| 194 | 191 | |
| 195 | 192 | def _Exit(self, pubsub_evt): |
| ... | ... | @@ -330,7 +327,8 @@ class Frame(wx.Frame): |
| 330 | 327 | """ |
| 331 | 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 | 332 | webbrowser.open(path) |
| 335 | 333 | |
| 336 | 334 | def ShowImportDicomPanel(self): |
| ... | ... | @@ -357,7 +355,8 @@ class Frame(wx.Frame): |
| 357 | 355 | |
| 358 | 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 | 361 | def __init__(self, parent): |
| 363 | 362 | wx.MenuBar.__init__(self) |
| ... | ... | @@ -382,7 +381,8 @@ class MenuBar(wx.MenuBar): |
| 382 | 381 | # events should be binded directly from wx.Menu / wx.MenuBar |
| 383 | 382 | # message "Binding events of wx.MenuBar" on [wxpython-users] |
| 384 | 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 | 387 | def __init_items(self): |
| 388 | 388 | """ |
| ... | ... | @@ -392,48 +392,54 @@ class MenuBar(wx.MenuBar): |
| 392 | 392 | |
| 393 | 393 | # FILE |
| 394 | 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 | 402 | file_menu.AppendSeparator() |
| 402 | - #file_menu.Append(const.ID_PROJECT_INFO, _("Project Information...")) | |
| 403 | + #app(const.ID_PROJECT_INFO, _("Project Information...")) | |
| 403 | 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 | 407 | #file_menu.AppendSeparator() |
| 407 | - #file_menu.Append(1, "C:\InvData\sample.inv") | |
| 408 | + #app(1, "C:\InvData\sample.inv") | |
| 408 | 409 | #file_menu.AppendSeparator() |
| 409 | - file_menu.Append(const.ID_EXIT, _("Exit")) | |
| 410 | + app(const.ID_EXIT, _("Exit")) | |
| 410 | 411 | |
| 411 | 412 | # EDIT |
| 412 | 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 | 419 | # VIEW |
| 418 | 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 | 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 | 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 | 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 | 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 | 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 | 444 | # TOOLS |
| 439 | 445 | #tools_menu = wx.Menu() |
| ... | ... | @@ -452,13 +458,17 @@ class MenuBar(wx.MenuBar): |
| 452 | 458 | |
| 453 | 459 | # TODO: Check what is necessary under MacOS to show |
| 454 | 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 | 465 | # TODO: Google about this |
| 458 | 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 | 472 | self.Append(file_menu, _("File")) |
| 463 | 473 | #self.Append(file_edit, "Edit") |
| 464 | 474 | #self.Append(view_menu, "View") |
| ... | ... | @@ -466,7 +476,6 @@ class MenuBar(wx.MenuBar): |
| 466 | 476 | #self.Append(options_menu, "Options") |
| 467 | 477 | self.Append(help_menu, _("Help")) |
| 468 | 478 | |
| 469 | - | |
| 470 | 479 | def OnEnableState(self, pubsub_evt): |
| 471 | 480 | """ |
| 472 | 481 | Based on given state, enables or disables menu items which |
| ... | ... | @@ -496,7 +505,6 @@ class MenuBar(wx.MenuBar): |
| 496 | 505 | # ------------------------------------------------------------------ |
| 497 | 506 | # ------------------------------------------------------------------ |
| 498 | 507 | |
| 499 | - | |
| 500 | 508 | class ProgressBar(wx.Gauge): |
| 501 | 509 | """ |
| 502 | 510 | Progress bar / gauge. |
| ... | ... | @@ -513,8 +521,8 @@ class ProgressBar(wx.Gauge): |
| 513 | 521 | """ |
| 514 | 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 | 527 | def _Layout(self, evt_pubsub=None): |
| 520 | 528 | """ |
| ... | ... | @@ -538,7 +546,6 @@ class ProgressBar(wx.Gauge): |
| 538 | 546 | # ------------------------------------------------------------------ |
| 539 | 547 | # ------------------------------------------------------------------ |
| 540 | 548 | |
| 541 | - | |
| 542 | 549 | class StatusBar(wx.StatusBar): |
| 543 | 550 | """ |
| 544 | 551 | Control general status (both text and gauge) |
| ... | ... | @@ -562,10 +569,9 @@ class StatusBar(wx.StatusBar): |
| 562 | 569 | """ |
| 563 | 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 | 576 | def _SetProgressValue(self, pubsub_evt): |
| 571 | 577 | """ |
| ... | ... | @@ -593,12 +599,17 @@ class StatusBar(wx.StatusBar): |
| 593 | 599 | label = pubsub_evt.data |
| 594 | 600 | self.SetStatusText(label, 0) |
| 595 | 601 | |
| 596 | - | |
| 597 | 602 | # ------------------------------------------------------------------ |
| 598 | 603 | # ------------------------------------------------------------------ |
| 599 | 604 | # ------------------------------------------------------------------ |
| 600 | 605 | |
| 601 | 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 | 613 | def __init__(self, parent=None): |
| 603 | 614 | wx.TaskBarIcon.__init__(self) |
| 604 | 615 | self.frame = parent |
| ... | ... | @@ -614,67 +625,91 @@ class TaskBarIcon(wx.TaskBarIcon): |
| 614 | 625 | def OnTaskBarActivate(self): |
| 615 | 626 | pass |
| 616 | 627 | |
| 617 | - | |
| 618 | 628 | # ------------------------------------------------------------------ |
| 619 | 629 | # ------------------------------------------------------------------ |
| 620 | 630 | # ------------------------------------------------------------------ |
| 621 | 631 | |
| 622 | 632 | class ProjectToolBar(wx.ToolBar): |
| 633 | + """ | |
| 634 | + Toolbar related to general project operations, including: import, | |
| 635 | + open, save and saveas, among others. | |
| 636 | + """ | |
| 623 | 637 | def __init__(self, parent): |
| 638 | + style = wx.TB_FLAT|wx.TB_NODIVIDER| wx.TB_DOCKABLE | |
| 624 | 639 | wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition, |
| 625 | 640 | wx.DefaultSize, |
| 626 | - wx.TB_FLAT|wx.TB_NODIVIDER| wx.TB_DOCKABLE) | |
| 627 | - | |
| 641 | + style) | |
| 628 | 642 | self.SetToolBitmapSize(wx.Size(32,32)) |
| 629 | 643 | |
| 630 | 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 | 650 | self.__init_items() |
| 632 | 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 | 663 | def __init_items(self): |
| 638 | - | |
| 664 | + """ | |
| 665 | + Add tools into toolbar. | |
| 666 | + """ | |
| 667 | + # Load bitmaps | |
| 668 | + d = const.ICON_DIR | |
| 639 | 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 | 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 | 707 | self.AddLabelTool(const.ID_DICOM_IMPORT, |
| 676 | 708 | _("Import medical image..."), |
| 677 | 709 | BMP_IMPORT) |
| 710 | + #self.AddLabelTool(const.ID_DICOM_LOAD_NET, | |
| 711 | + # "Load medical image...", | |
| 712 | + # BMP_NET) | |
| 678 | 713 | self.AddLabelTool(const.ID_PROJECT_OPEN, |
| 679 | 714 | _("Open InVesalius 3 project..."), |
| 680 | 715 | BMP_OPEN) |
| ... | ... | @@ -687,56 +722,32 @@ class ProjectToolBar(wx.ToolBar): |
| 687 | 722 | #self.AddLabelTool(const.ID_PRINT_SCREENSHOT, |
| 688 | 723 | # "Print medical image...", |
| 689 | 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 | 731 | state = pubsub_evt.data |
| 705 | 732 | if state: |
| 706 | 733 | self.SetStateProjectOpen() |
| 707 | 734 | else: |
| 708 | 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 | 755 | # ------------------------------------------------------------------ |
| 745 | 756 | |
| 746 | 757 | class ObjectToolBar(wx.ToolBar): |
| 758 | + """ | |
| 759 | + Toolbar related to general object operations, including: zoom | |
| 760 | + move, rotate, brightness/contrast, etc. | |
| 761 | + """ | |
| 747 | 762 | def __init__(self, parent): |
| 763 | + style = wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE | |
| 748 | 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 | 767 | self.SetToolBitmapSize(wx.Size(32,32)) |
| 768 | + | |
| 753 | 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 | 776 | self.__init_items() |
| 756 | 777 | self.__bind_events() |
| 757 | 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 | 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 | 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 | 835 | self.AddLabelTool(const.STATE_ZOOM, |
| 795 | 836 | _("Zoom"), |
| 796 | 837 | BMP_ZOOM, |
| 797 | 838 | kind = wx.ITEM_CHECK) |
| 798 | - | |
| 799 | 839 | self.AddLabelTool(const.STATE_ZOOM_SL, |
| 800 | 840 | _("Zoom based on selection"), |
| 801 | 841 | BMP_ZOOM_SELECT, |
| 802 | 842 | kind = wx.ITEM_CHECK) |
| 803 | - | |
| 804 | 843 | self.AddLabelTool(const.STATE_SPIN, |
| 805 | 844 | _("Rotate"), BMP_ROTATE, |
| 806 | 845 | kind = wx.ITEM_CHECK) |
| 807 | - | |
| 808 | 846 | self.AddLabelTool(const.STATE_PAN, |
| 809 | 847 | _("Move"), BMP_MOVE, |
| 810 | 848 | kind = wx.ITEM_CHECK) |
| 811 | - | |
| 812 | 849 | self.AddLabelTool(const.STATE_WL, |
| 813 | 850 | _("Window and Level"), BMP_CONTRAST, |
| 814 | 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 | 858 | state = pubsub_evt.data |
| 825 | 859 | if state: |
| 826 | 860 | self.SetStateProjectOpen() |
| 827 | 861 | else: |
| 828 | 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 | 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 | 878 | id = evt.GetId() |
| 851 | 879 | state = self.GetToolState(id) |
| 852 | 880 | if state: |
| ... | ... | @@ -859,83 +887,114 @@ class ObjectToolBar(wx.ToolBar): |
| 859 | 887 | state = self.GetToolState(item) |
| 860 | 888 | if state and (item != id): |
| 861 | 889 | self.ToggleTool(item, False) |
| 862 | - | |
| 863 | 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 | 911 | class SliceToolBar(wx.ToolBar): |
| 912 | + """ | |
| 913 | + Toolbar related to 2D slice specific operations, including: cross | |
| 914 | + intersection reference and scroll slices. | |
| 915 | + """ | |
| 878 | 916 | def __init__(self, parent): |
| 917 | + style = wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE | |
| 879 | 918 | wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition, |
| 880 | 919 | wx.DefaultSize, |
| 881 | - wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE) | |
| 920 | + style) | |
| 882 | 921 | |
| 883 | 922 | self.SetToolBitmapSize(wx.Size(32,32)) |
| 884 | 923 | |
| 885 | 924 | self.parent = parent |
| 925 | + self.enable_items = [const.SLICE_STATE_SCROLL, | |
| 926 | + const.SLICE_STATE_CROSS] | |
| 886 | 927 | self.__init_items() |
| 887 | 928 | self.__bind_events() |
| 888 | 929 | self.__bind_events_wx() |
| 889 | 930 | |
| 931 | + self.Realize() | |
| 932 | + self.SetStateProjectClose() | |
| 933 | + | |
| 890 | 934 | def __init_items(self): |
| 935 | + """ | |
| 936 | + Add tools into toolbar. | |
| 937 | + """ | |
| 938 | + d = const.ICON_DIR | |
| 891 | 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 | 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 | 952 | self.AddCheckTool(const.SLICE_STATE_SCROLL, BMP_SLICE) |
| 907 | 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 | 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 | 974 | state = pubsub_evt.data |
| 931 | 975 | if state: |
| 932 | 976 | self.SetStateProjectOpen() |
| 933 | 977 | else: |
| 934 | 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 | 998 | id = evt.GetId() |
| 940 | 999 | state = self.GetToolState(id) |
| 941 | 1000 | |
| ... | ... | @@ -952,115 +1011,168 @@ class SliceToolBar(wx.ToolBar): |
| 952 | 1011 | |
| 953 | 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 | 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 | 1037 | def __init__(self, parent): |
| 1038 | + style = wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE | |
| 971 | 1039 | wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition, |
| 972 | 1040 | wx.DefaultSize, |
| 973 | - wx.TB_FLAT|wx.TB_NODIVIDER | wx.TB_DOCKABLE) | |
| 1041 | + style) | |
| 974 | 1042 | |
| 975 | 1043 | self.SetToolBitmapSize(wx.Size(32,32)) |
| 976 | 1044 | |
| 977 | 1045 | self.parent = parent |
| 978 | 1046 | self.__init_items() |
| 979 | - self.__bind_events_wx() | |
| 980 | 1047 | self.__bind_events() |
| 1048 | + self.__bind_events_wx() | |
| 1049 | + | |
| 981 | 1050 | self.ontool_layout = False |
| 982 | 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 | 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 | 1121 | state = pubsub_evt.data |
| 1040 | 1122 | if state: |
| 1041 | 1123 | self.SetStateProjectOpen() |
| 1042 | 1124 | else: |
| 1043 | 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 | 1143 | id = event.GetId() |
| 1052 | 1144 | if id == ID_LAYOUT: |
| 1053 | - self.OnLayout() | |
| 1145 | + self.ToggleLayout() | |
| 1054 | 1146 | elif id== ID_TEXT: |
| 1055 | - self.OnText() | |
| 1056 | - | |
| 1147 | + self.ToggleText() | |
| 1057 | 1148 | |
| 1058 | 1149 | for item in VIEW_TOOLS: |
| 1059 | 1150 | state = self.GetToolState(item) |
| 1060 | 1151 | if state and (item != id): |
| 1061 | 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 | 1176 | if self.ontool_layout: |
| 1065 | 1177 | self.SetToolNormalBitmap(ID_LAYOUT,self.BMP_WITHOUT_MENU) |
| 1066 | 1178 | ps.Publisher().sendMessage('Show task panel') |
| ... | ... | @@ -1073,7 +1185,10 @@ shortHelp= _("Hide task panel")) |
| 1073 | 1185 | self.SetToolShortHelp(ID_LAYOUT, _("Show task panel")) |
| 1074 | 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 | 1192 | if self.ontool_text: |
| 1078 | 1193 | self.SetToolNormalBitmap(ID_TEXT,self.BMP_WITH_TEXT) |
| 1079 | 1194 | ps.Publisher().sendMessage('Hide text actors on viewers') |
| ... | ... | @@ -1087,8 +1202,3 @@ shortHelp= _("Hide task panel")) |
| 1087 | 1202 | ps.Publisher().sendMessage('Update AUI') |
| 1088 | 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) | ... | ... |