Commit 74219c06df213d0d52d82bd8b791866bfcc4bf93
1 parent
9f741be9
Exists in
master
and in
6 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 | """ | ... | ... |