Commit 74219c06df213d0d52d82bd8b791866bfcc4bf93
1 parent
9f741be9
Exists in
master
and in
68 other branches
ADD: Change notebook page based on fold panel
Showing
3 changed files
with
125 additions
and
35 deletions
Show diff stats
invesalius/gui/data_notebook.py
| ... | ... | @@ -28,6 +28,7 @@ import wx.lib.flatnotebook as fnb |
| 28 | 28 | import wx.lib.platebtn as pbtn |
| 29 | 29 | import wx.lib.pubsub as ps |
| 30 | 30 | |
| 31 | +import constants as const | |
| 31 | 32 | import gui.dialogs as dlg |
| 32 | 33 | import gui.widgets.listctrl as listmix |
| 33 | 34 | import utils as ul |
| ... | ... | @@ -49,9 +50,9 @@ class NotebookPanel(wx.Panel): |
| 49 | 50 | book.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) |
| 50 | 51 | |
| 51 | 52 | book.AddPage(MaskPage(book), _("Masks")) |
| 52 | - book.AddPage(SurfacePage(book), _("Surfaces")) | |
| 53 | + book.AddPage(SurfacePage(book), _("3D Surfaces")) | |
| 53 | 54 | book.AddPage(MeasurePage(book), _("Measures")) |
| 54 | - #book.AddPage(AnnotationsListCtrlPanel(book), _("Annotations")) | |
| 55 | + #book.AddPage(AnnotationsListCtrlPanel(book), _("Notes")) | |
| 55 | 56 | |
| 56 | 57 | book.SetSelection(0) |
| 57 | 58 | |
| ... | ... | @@ -60,18 +61,42 @@ class NotebookPanel(wx.Panel): |
| 60 | 61 | self.SetSizer(sizer) |
| 61 | 62 | |
| 62 | 63 | book.Refresh() |
| 64 | + self.book = book | |
| 63 | 65 | |
| 64 | - #def __bind_events(self): | |
| 65 | - # ps.Publisher().subscribe(self._add_measure, | |
| 66 | - # "Add measure to list") | |
| 66 | + self.__bind_events() | |
| 67 | 67 | |
| 68 | - #def _add_measure(self, pubsub_evt): | |
| 69 | - # type = pubsub_evt.data[0] | |
| 70 | - # value = pubsub_evt.data[1] | |
| 71 | - # self.measures_list.AddMeasure(type, value) | |
| 68 | + def __bind_events(self): | |
| 69 | + ps.Publisher().subscribe(self._FoldSurface, | |
| 70 | + 'Fold surface task') | |
| 71 | + ps.Publisher().subscribe(self._FoldSurface, | |
| 72 | + 'Fold surface page') | |
| 73 | + ps.Publisher().subscribe(self._FoldMeasure, | |
| 74 | + 'Fold measure task') | |
| 75 | + ps.Publisher().subscribe(self._FoldMask, | |
| 76 | + 'Fold mask task') | |
| 77 | + ps.Publisher().subscribe(self._FoldMask, | |
| 78 | + 'Fold mask page') | |
| 79 | + | |
| 80 | + | |
| 81 | + def _FoldSurface(self, pubusb_evt): | |
| 82 | + """ | |
| 83 | + Fold surface notebook page. | |
| 84 | + """ | |
| 85 | + self.book.SetSelection(1) | |
| 72 | 86 | |
| 87 | + def _FoldMeasure(self, pubsub_evt): | |
| 88 | + """ | |
| 89 | + Fold measure notebook page. | |
| 90 | + """ | |
| 91 | + self.book.SetSelection(2) | |
| 73 | 92 | |
| 74 | 93 | |
| 94 | + def _FoldMask(self, pubsub_evt): | |
| 95 | + """ | |
| 96 | + Fold mask notebook page. | |
| 97 | + """ | |
| 98 | + self.book.SetSelection(0) | |
| 99 | + | |
| 75 | 100 | class MeasurePage(wx.Panel): |
| 76 | 101 | """ |
| 77 | 102 | Page related to mask items. |
| ... | ... | @@ -123,6 +148,7 @@ class MeasureButtonControlPanel(wx.Panel): |
| 123 | 148 | BMP_NEW, |
| 124 | 149 | style=button_style, |
| 125 | 150 | size = wx.Size(18, 18)) |
| 151 | + self.button_new = button_new | |
| 126 | 152 | button_remove = pbtn.PlateButton(self, BTN_REMOVE, "", |
| 127 | 153 | BMP_REMOVE, |
| 128 | 154 | style=button_style, |
| ... | ... | @@ -131,6 +157,7 @@ class MeasureButtonControlPanel(wx.Panel): |
| 131 | 157 | BMP_DUPLICATE, |
| 132 | 158 | style=button_style, |
| 133 | 159 | size = wx.Size(18, 18)) |
| 160 | + button_duplicate.Disable() | |
| 134 | 161 | |
| 135 | 162 | # Add all controls to gui |
| 136 | 163 | sizer = wx.BoxSizer(wx.HORIZONTAL) |
| ... | ... | @@ -140,6 +167,16 @@ class MeasureButtonControlPanel(wx.Panel): |
| 140 | 167 | self.SetSizer(sizer) |
| 141 | 168 | self.Fit() |
| 142 | 169 | |
| 170 | + menu = wx.Menu() | |
| 171 | + item = wx.MenuItem(menu, const.MEASURE_LINEAR, | |
| 172 | + _("Measure distance")) | |
| 173 | + menu.AppendItem(item) | |
| 174 | + item = wx.MenuItem(menu, const.MEASURE_ANGULAR, | |
| 175 | + _("Measure angle")) | |
| 176 | + menu.AppendItem(item) | |
| 177 | + menu.Bind(wx.EVT_MENU, self.OnMenu) | |
| 178 | + self.menu = menu | |
| 179 | + | |
| 143 | 180 | # Bindings |
| 144 | 181 | self.Bind(wx.EVT_BUTTON, self.OnButton) |
| 145 | 182 | |
| ... | ... | @@ -153,12 +190,17 @@ class MeasureButtonControlPanel(wx.Panel): |
| 153 | 190 | self.OnDuplicate() |
| 154 | 191 | |
| 155 | 192 | def OnNew(self): |
| 156 | - mask_name = dlg.NewMask() | |
| 157 | - if mask_name: | |
| 158 | - ps.Publisher().sendMessage('Set measurement state', mask_name) | |
| 193 | + self.PopupMenu(self.menu) | |
| 194 | + | |
| 195 | + def OnMenu(self, evt): | |
| 196 | + id = evt.GetId() | |
| 197 | + if id == const.MEASURE_LINEAR: | |
| 198 | + ps.Publisher().sendMessage('Set tool linear measure') | |
| 199 | + else: | |
| 200 | + ps.Publisher().sendMessage('Set tool angular measure') | |
| 159 | 201 | |
| 160 | 202 | def OnRemove(self): |
| 161 | - self.parent.listctrl.RemoveMasks() | |
| 203 | + self.parent.listctrl.RemoveMeasurements() | |
| 162 | 204 | |
| 163 | 205 | def OnDuplicate(self): |
| 164 | 206 | selected_items = self.parent.listctrl.GetSelected() |
| ... | ... | @@ -169,6 +211,8 @@ class MeasureButtonControlPanel(wx.Panel): |
| 169 | 211 | |
| 170 | 212 | |
| 171 | 213 | |
| 214 | + | |
| 215 | + | |
| 172 | 216 | class MaskPage(wx.Panel): |
| 173 | 217 | """ |
| 174 | 218 | Page related to mask items. |
| ... | ... | @@ -248,9 +292,17 @@ class ButtonControlPanel(wx.Panel): |
| 248 | 292 | self.OnDuplicate() |
| 249 | 293 | |
| 250 | 294 | def OnNew(self): |
| 251 | - mask_name = dlg.NewMask() | |
| 252 | - if mask_name: | |
| 253 | - ps.Publisher().sendMessage('Create new mask', mask_name) | |
| 295 | + dialog = dlg.NewMask() | |
| 296 | + | |
| 297 | + try: | |
| 298 | + answer = dialog.ShowModal() | |
| 299 | + except(wx._core.PyAssertionError): #TODO: FIX win64 | |
| 300 | + answer = wx.ID_YES | |
| 301 | + | |
| 302 | + if wx.ID_YES: | |
| 303 | + mask_name = dialog.GetValue() | |
| 304 | + if mask_name: | |
| 305 | + ps.Publisher().sendMessage('Create new mask', mask_name) | |
| 254 | 306 | |
| 255 | 307 | def OnRemove(self): |
| 256 | 308 | self.parent.listctrl.RemoveMasks() |
| ... | ... | @@ -886,7 +938,7 @@ class MeasuresListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): |
| 886 | 938 | |
| 887 | 939 | def RemoveMeasurements(self): |
| 888 | 940 | """ |
| 889 | - Remove item given its index. | |
| 941 | + Remove items selected. | |
| 890 | 942 | """ |
| 891 | 943 | # it is necessary to update internal dictionary |
| 892 | 944 | # that maps bitmap given item index |
| ... | ... | @@ -906,7 +958,7 @@ class MeasuresListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): |
| 906 | 958 | |
| 907 | 959 | ps.Publisher().sendMessage('Remove measurements', selected_items) |
| 908 | 960 | else: |
| 909 | - dlg.SurfaceSelectionRequiredForRemoval() | |
| 961 | + dlg.MeasureSelectionRequiredForRemoval() | |
| 910 | 962 | |
| 911 | 963 | |
| 912 | 964 | def OnCloseProject(self, pubsub_evt): |
| ... | ... | @@ -1011,8 +1063,8 @@ class MeasuresListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): |
| 1011 | 1063 | index = pubsub_evt.data[0] |
| 1012 | 1064 | name = pubsub_evt.data[1] |
| 1013 | 1065 | colour = pubsub_evt.data[2] |
| 1014 | - type_ = pubsub_evt.data[3] | |
| 1015 | - location = pubsub_evt.data[4] | |
| 1066 | + location = pubsub_evt.data[3] | |
| 1067 | + type_ = pubsub_evt.data[4] | |
| 1016 | 1068 | value = pubsub_evt.data[5] |
| 1017 | 1069 | |
| 1018 | 1070 | ... | ... |
invesalius/gui/default_tasks.py
| ... | ... | @@ -241,7 +241,8 @@ class UpperTaskPanel(wx.Panel): |
| 241 | 241 | # slice editor. |
| 242 | 242 | if name == _("Select region of interest"): |
| 243 | 243 | self.__id_slice = item.GetId() |
| 244 | - | |
| 244 | + elif name == _("Configure 3D surface"): | |
| 245 | + self.__id_surface = item.GetId() | |
| 245 | 246 | |
| 246 | 247 | fold_panel.Expand(fold_panel.GetFoldPanel(0)) |
| 247 | 248 | self.fold_panel = fold_panel |
| ... | ... | @@ -287,8 +288,11 @@ class UpperTaskPanel(wx.Panel): |
| 287 | 288 | id = evt.GetTag().GetId() |
| 288 | 289 | closed = evt.GetFoldStatus() |
| 289 | 290 | |
| 290 | - if self.__id_slice == id: | |
| 291 | + if id == self.__id_slice: | |
| 291 | 292 | ps.Publisher().sendMessage('Retrieve task slice style') |
| 293 | + ps.Publisher().sendMessage('Fold mask page') | |
| 294 | + elif id == self.__id_surface: | |
| 295 | + ps.Publisher().sendMessage('Fold surface page') | |
| 292 | 296 | else: |
| 293 | 297 | ps.Publisher().sendMessage('Disable task slice style') |
| 294 | 298 | ... | ... |
invesalius/gui/frame.py
| ... | ... | @@ -783,8 +783,8 @@ class ObjectToolBar(wx.ToolBar): |
| 783 | 783 | const.STATE_SPIN, const.STATE_ZOOM_SL, |
| 784 | 784 | const.STATE_ZOOM, |
| 785 | 785 | const.STATE_MEASURE_DISTANCE, |
| 786 | - const.STATE_MEASURE_ANGLE, | |
| 787 | - const.STATE_ANNOTATE] | |
| 786 | + const.STATE_MEASURE_ANGLE,] | |
| 787 | + #const.STATE_ANNOTATE] | |
| 788 | 788 | self.__init_items() |
| 789 | 789 | self.__bind_events() |
| 790 | 790 | self.__bind_events_wx() |
| ... | ... | @@ -799,7 +799,8 @@ class ObjectToolBar(wx.ToolBar): |
| 799 | 799 | sub = ps.Publisher().subscribe |
| 800 | 800 | sub(self._EnableState, "Enable state project") |
| 801 | 801 | sub(self._UntoggleAllItems, 'Untoggle object toolbar items') |
| 802 | - | |
| 802 | + sub(self._ToggleLinearMeasure, "Set tool linear measure") | |
| 803 | + sub(self._ToggleAngularMeasure, "Set tool angular measure") | |
| 803 | 804 | |
| 804 | 805 | def __bind_events_wx(self): |
| 805 | 806 | """ |
| ... | ... | @@ -834,8 +835,8 @@ class ObjectToolBar(wx.ToolBar): |
| 834 | 835 | path = os.path.join(d, "measure_angle_original.png") |
| 835 | 836 | BMP_ANGLE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) |
| 836 | 837 | |
| 837 | - path = os.path.join(d, "tool_annotation_original.png") | |
| 838 | - BMP_ANNOTATE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) | |
| 838 | + #path = os.path.join(d, "tool_annotation_original.png") | |
| 839 | + #BMP_ANNOTATE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) | |
| 839 | 840 | |
| 840 | 841 | else: |
| 841 | 842 | path = os.path.join(d, "tool_rotate.gif") |
| ... | ... | @@ -859,8 +860,8 @@ class ObjectToolBar(wx.ToolBar): |
| 859 | 860 | path = os.path.join(d, "measure_angle.png") |
| 860 | 861 | BMP_ANGLE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) |
| 861 | 862 | |
| 862 | - path = os.path.join(d, "tool_annotation.png") | |
| 863 | - BMP_ANNOTATE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) | |
| 863 | + #path = os.path.join(d, "tool_annotation.png") | |
| 864 | + #BMP_ANNOTATE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) | |
| 864 | 865 | |
| 865 | 866 | # Create tool items based on bitmaps |
| 866 | 867 | self.AddLabelTool(const.STATE_ZOOM, |
| ... | ... | @@ -898,11 +899,11 @@ class ObjectToolBar(wx.ToolBar): |
| 898 | 899 | shortHelp = _("Measure angle"), |
| 899 | 900 | bitmap = BMP_ANGLE, |
| 900 | 901 | kind = wx.ITEM_CHECK) |
| 901 | - self.AddLabelTool(const.STATE_ANNOTATE, | |
| 902 | - "", | |
| 903 | - shortHelp = _("Add annotation"), | |
| 904 | - bitmap = BMP_ANNOTATE, | |
| 905 | - kind = wx.ITEM_CHECK) | |
| 902 | + #self.AddLabelTool(const.STATE_ANNOTATE, | |
| 903 | + # "", | |
| 904 | + # shortHelp = _("Add annotation"), | |
| 905 | + # bitmap = BMP_ANNOTATE, | |
| 906 | + # kind = wx.ITEM_CHECK) | |
| 906 | 907 | |
| 907 | 908 | def _EnableState(self, pubsub_evt): |
| 908 | 909 | """ |
| ... | ... | @@ -924,6 +925,35 @@ class ObjectToolBar(wx.ToolBar): |
| 924 | 925 | if state: |
| 925 | 926 | self.ToggleTool(id, False) |
| 926 | 927 | |
| 928 | + def _ToggleLinearMeasure(self, pubsub_evt): | |
| 929 | + """ | |
| 930 | + Force measure distance tool to be toggled and bind pubsub | |
| 931 | + events to other classes whici are interested on this. | |
| 932 | + """ | |
| 933 | + id = const.STATE_MEASURE_DISTANCE | |
| 934 | + self.ToggleTool(id, True) | |
| 935 | + ps.Publisher().sendMessage('Enable style', id) | |
| 936 | + ps.Publisher().sendMessage('Untoggle slice toolbar items') | |
| 937 | + for item in const.TOOL_STATES: | |
| 938 | + state = self.GetToolState(item) | |
| 939 | + if state and (item != id): | |
| 940 | + self.ToggleTool(item, False) | |
| 941 | + | |
| 942 | + | |
| 943 | + def _ToggleAngularMeasure(self, pubsub_evt): | |
| 944 | + """ | |
| 945 | + Force measure angle tool to be toggled and bind pubsub | |
| 946 | + events to other classes which are interested on this. | |
| 947 | + """ | |
| 948 | + id = const.STATE_MEASURE_ANGLE | |
| 949 | + self.ToggleTool(id, True) | |
| 950 | + ps.Publisher().sendMessage('Enable style', id) | |
| 951 | + ps.Publisher().sendMessage('Untoggle slice toolbar items') | |
| 952 | + for item in const.TOOL_STATES: | |
| 953 | + state = self.GetToolState(item) | |
| 954 | + if state and (item != id): | |
| 955 | + self.ToggleTool(item, False) | |
| 956 | + | |
| 927 | 957 | def OnToggle(self, evt): |
| 928 | 958 | """ |
| 929 | 959 | Update status of other items on toolbar (only one item |
| ... | ... | @@ -931,6 +961,10 @@ class ObjectToolBar(wx.ToolBar): |
| 931 | 961 | """ |
| 932 | 962 | id = evt.GetId() |
| 933 | 963 | state = self.GetToolState(id) |
| 964 | + if state and ((id == const.STATE_MEASURE_DISTANCE) or\ | |
| 965 | + (id == const.STATE_MEASURE_ANGLE)): | |
| 966 | + ps.Publisher().sendMessage('Fold measure task') | |
| 967 | + | |
| 934 | 968 | if state: |
| 935 | 969 | ps.Publisher().sendMessage('Enable style', id) |
| 936 | 970 | ps.Publisher().sendMessage('Untoggle slice toolbar items') |
| ... | ... | @@ -1009,7 +1043,7 @@ class SliceToolBar(wx.ToolBar): |
| 1009 | 1043 | |
| 1010 | 1044 | self.AddCheckTool(const.SLICE_STATE_CROSS, |
| 1011 | 1045 | BMP_CROSS, |
| 1012 | - shortHelp = _("Cross intersection")) | |
| 1046 | + shortHelp = _("Slices' cross intersection")) | |
| 1013 | 1047 | |
| 1014 | 1048 | def __bind_events(self): |
| 1015 | 1049 | """ | ... | ... |