From 7eed215fe59573380aec4c396a454fcc58e2aae6 Mon Sep 17 00:00:00 2001 From: Thiago Franco de Moraes Date: Thu, 27 Apr 2017 16:55:36 -0300 Subject: [PATCH] (Un)toggling toolbar buttons when (de)activating the relative style --- invesalius/data/styles.py | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------ invesalius/gui/frame.py | 13 +++++++++++++ invesalius/style.py | 1 - 3 files changed, 123 insertions(+), 25 deletions(-) diff --git a/invesalius/data/styles.py b/invesalius/data/styles.py index a4363a4..fc3b67f 100644 --- a/invesalius/data/styles.py +++ b/invesalius/data/styles.py @@ -132,6 +132,8 @@ class DefaultInteractorStyle(BaseImageInteractorStyle): def __init__(self, viewer): BaseImageInteractorStyle.__init__(self, viewer) + self.state_code = const.STATE_DEFAULT + self.viewer = viewer # Zoom using right button @@ -194,6 +196,8 @@ class CrossInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.SLICE_STATE_CROSS + self.viewer = viewer self.orientation = viewer.orientation self.slice_actor = viewer.slice_data.actor @@ -207,9 +211,13 @@ class CrossInteractorStyle(DefaultInteractorStyle): def SetUp(self): self.viewer._set_cross_visibility(1) + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, True)) def CleanUp(self): self.viewer._set_cross_visibility(0) + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, False)) def OnCrossMouseClick(self, obj, evt): iren = obj.GetInteractor() @@ -259,6 +267,8 @@ class WWWLInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.STATE_WL + self.viewer = viewer self.last_x = 0 @@ -272,11 +282,15 @@ class WWWLInteractorStyle(DefaultInteractorStyle): def SetUp(self): self.viewer.on_wl = True + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, True)) self.viewer.canvas.draw_list.append(self.viewer.wl_text) self.viewer.UpdateCanvas() def CleanUp(self): self.viewer.on_wl = False + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, False)) if self.viewer.wl_text is not None: self.viewer.canvas.draw_list.remove(self.viewer.wl_text) self.viewer.UpdateCanvas() @@ -319,6 +333,8 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.STATE_MEASURE_DISTANCE + self.viewer = viewer self.orientation = viewer.orientation self.slice_data = viewer.slice_data @@ -354,6 +370,16 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): self.AddObserver("MouseMoveEvent", self.OnMoveMeasurePoint) self.AddObserver("LeaveEvent", self.OnLeaveMeasureInteractor) + def SetUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, True)) + + def CleanUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, False)) + self.picker.PickFromListOff() + Publisher.sendMessage("Remove incomplete measurements") + def OnInsertMeasurePoint(self, obj, evt): slice_number = self.slice_data.number x, y, z = self._get_pos_clicked() @@ -442,10 +468,6 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): self.viewer.UpdateCanvas() self.viewer.scroll_enabled = True - def CleanUp(self): - self.picker.PickFromListOff() - Publisher.sendMessage("Remove incomplete measurements") - def _get_pos_clicked(self): iren = self.viewer.interactor mx,my = iren.GetEventPosition() @@ -496,6 +518,8 @@ class AngularMeasureInteractorStyle(LinearMeasureInteractorStyle): LinearMeasureInteractorStyle.__init__(self, viewer) self._type = const.ANGULAR + self.state_code = const.STATE_MEASURE_ANGLE + class PanMoveInteractorStyle(DefaultInteractorStyle): """ @@ -504,11 +528,21 @@ class PanMoveInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.STATE_PAN + self.viewer = viewer self.AddObserver("MouseMoveEvent", self.OnPanMove) self.viewer.interactor.Bind(wx.EVT_LEFT_DCLICK, self.OnUnspan) + def SetUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, True)) + + def CleanUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, False)) + def OnPanMove(self, obj, evt): if self.left_pressed: obj.Pan() @@ -529,11 +563,21 @@ class SpinInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.STATE_SPIN + self.viewer = viewer self.AddObserver("MouseMoveEvent", self.OnSpinMove) self.viewer.interactor.Bind(wx.EVT_LEFT_DCLICK, self.OnUnspin) + def SetUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, True)) + + def CleanUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, False)) + def OnSpinMove(self, obj, evt): iren = obj.GetInteractor() mouse_x, mouse_y = iren.GetLastEventPosition() @@ -563,11 +607,21 @@ class ZoomInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.STATE_ZOOM + self.viewer = viewer self.AddObserver("MouseMoveEvent", self.OnZoomMoveLeft) self.viewer.interactor.Bind(wx.EVT_LEFT_DCLICK, self.OnUnZoom) + def SetUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, True)) + + def CleanUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, False)) + def OnZoomMoveLeft(self, obj, evt): if self.left_pressed: obj.Dolly() @@ -591,6 +645,16 @@ class ZoomSLInteractorStyle(vtk.vtkInteractorStyleRubberBandZoom): self.viewer = viewer self.viewer.interactor.Bind(wx.EVT_LEFT_DCLICK, self.OnUnZoom) + self.state_code = const.STATE_ZOOM_SL + + def SetUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, True)) + + def CleanUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, False)) + def OnUnZoom(self, evt): mouse_x, mouse_y = self.viewer.interactor.GetLastEventPosition() ren = self.viewer.interactor.FindPokedRenderer(mouse_x, mouse_y) @@ -608,11 +672,21 @@ class ChangeSliceInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.SLICE_STATE_SCROLL + self.viewer = viewer self.AddObserver("MouseMoveEvent", self.OnChangeSliceMove) self.AddObserver("LeftButtonPressEvent", self.OnChangeSliceClick) + def SetUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, True)) + + def CleanUp(self): + Publisher.sendMessage('Toggle toolbar item', + (self.state_code, False)) + def OnChangeSliceMove(self, evt, obj): if self.left_pressed: min = 0 @@ -650,6 +724,8 @@ class EditorInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.SLICE_STATE_EDITOR + self.viewer = viewer self.orientation = self.viewer.orientation @@ -935,6 +1011,8 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.SLICE_STATE_WATERSHED + self.viewer = viewer self.orientation = self.viewer.orientation self.matrix = None @@ -1402,6 +1480,8 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.SLICE_STATE_REORIENT + self.viewer = viewer self.line1 = None @@ -1648,6 +1728,8 @@ class FloodFillMaskInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.SLICE_STATE_MASK_FFILL + self.viewer = viewer self.orientation = self.viewer.orientation @@ -1753,20 +1835,22 @@ class FloodFillMaskInteractorStyle(DefaultInteractorStyle): class RemoveMaskPartsInteractorStyle(FloodFillMaskInteractorStyle): - def __init__(self, viewer): - FloodFillMaskInteractorStyle.__init__(self, viewer) - # InVesalius uses the following values to mark selected parts in a - # mask: - # 255 - Threshold - # 254 - Manual edition and floodfill - # 253 - Watershed - self.t0 = 253 - self.t1 = 255 - self.fill_value = 1 - - self._dlg_title = _(u"Remove parts") - self._progr_title = _(u"Remove part") - self._progr_msg = _(u"Removing part ...") + def __init__(self, viewer): + FloodFillMaskInteractorStyle.__init__(self, viewer) + + self.state_code = const.SLICE_STATE_REMOVE_MASK_PARTS + # InVesalius uses the following values to mark selected parts in a + # mask: + # 255 - Threshold + # 254 - Manual edition and floodfill + # 253 - Watershed + self.t0 = 253 + self.t1 = 255 + self.fill_value = 1 + + self._dlg_title = _(u"Remove parts") + self._progr_title = _(u"Remove part") + self._progr_msg = _(u"Removing part ...") class CropMaskConfig(object): __metaclass__= utils.Singleton @@ -1774,17 +1858,18 @@ class CropMaskConfig(object): self.dlg_visible = False class CropMaskInteractorStyle(DefaultInteractorStyle): - def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.SLICE_STATE_CROP_MASK + self.viewer = viewer self.orientation = self.viewer.orientation self.picker = vtk.vtkWorldPointPicker() self.slice_actor = viewer.slice_data.actor self.slice_data = viewer.slice_data self.draw_retangle = None - + self.config = CropMaskConfig() def __evts__(self): @@ -1883,6 +1968,8 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.SLICE_STATE_SELECT_MASK_PARTS + self.viewer = viewer self.orientation = self.viewer.orientation @@ -2003,6 +2090,8 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) + self.state_code = const.SLICE_STATE_FFILL_SEGMENTATION + self.viewer = viewer self.orientation = self.viewer.orientation @@ -2237,9 +2326,6 @@ def get_style(style): const.SLICE_STATE_REMOVE_MASK_PARTS: RemoveMaskPartsInteractorStyle, const.SLICE_STATE_SELECT_MASK_PARTS: SelectMaskPartsInteractorStyle, const.SLICE_STATE_FFILL_SEGMENTATION: FloodFillSegmentInteractorStyle, - const.SLICE_STATE_CROP_MASK:CropMaskInteractorStyle, + const.SLICE_STATE_CROP_MASK: CropMaskInteractorStyle, } return STYLES[style] - - - diff --git a/invesalius/gui/frame.py b/invesalius/gui/frame.py index f591f20..8aff1c1 100644 --- a/invesalius/gui/frame.py +++ b/invesalius/gui/frame.py @@ -1302,6 +1302,7 @@ class ObjectToolBar(AuiToolBar): sub(self._UntoggleAllItems, 'Untoggle object toolbar items') sub(self._ToggleLinearMeasure, "Set tool linear measure") sub(self._ToggleAngularMeasure, "Set tool angular measure") + sub(self.ToggleItem, 'Toggle toolbar item') def __bind_events_wx(self): """ @@ -1487,6 +1488,12 @@ class ObjectToolBar(AuiToolBar): self.ToggleTool(item, False) evt.Skip() + def ToggleItem(self, evt): + _id, value = evt.data + if _id in self.enable_items: + self.ToggleTool(_id, value) + self.Refresh() + def SetStateProjectClose(self): """ Disable menu items (e.g. zoom) when project is closed. @@ -1567,6 +1574,7 @@ class SliceToolBar(AuiToolBar): sub(self._EnableState, "Enable state project") sub(self._UntoggleAllItems, 'Untoggle slice toolbar items') sub(self.OnToggle, 'Toggle Cross') + sub(self.ToggleItem, 'Toggle toolbar item') def __bind_events_wx(self): """ @@ -1632,6 +1640,11 @@ class SliceToolBar(AuiToolBar): ##print ">>>", self.sst.IsToggled() #print ">>>", self.sst.GetState() + def ToggleItem(self, evt): + _id, value = evt.data + if _id in self.enable_items: + self.ToggleTool(_id, value) + self.Refresh() def SetStateProjectClose(self): """ diff --git a/invesalius/style.py b/invesalius/style.py index 1401943..8deb829 100644 --- a/invesalius/style.py +++ b/invesalius/style.py @@ -111,7 +111,6 @@ class StyleStateManager(object): return self.stack[max_level] def GetActualState(self): - print self.stack.keys() max_level = max(self.stack.keys()) state = self.stack[max_level] return state -- libgit2 0.21.2