Commit 7eed215fe59573380aec4c396a454fcc58e2aae6

Authored by Thiago Franco de Moraes
1 parent 07680389

(Un)toggling toolbar buttons when (de)activating the relative style

invesalius/data/styles.py
... ... @@ -132,6 +132,8 @@ class DefaultInteractorStyle(BaseImageInteractorStyle):
132 132 def __init__(self, viewer):
133 133 BaseImageInteractorStyle.__init__(self, viewer)
134 134  
  135 + self.state_code = const.STATE_DEFAULT
  136 +
135 137 self.viewer = viewer
136 138  
137 139 # Zoom using right button
... ... @@ -194,6 +196,8 @@ class CrossInteractorStyle(DefaultInteractorStyle):
194 196 def __init__(self, viewer):
195 197 DefaultInteractorStyle.__init__(self, viewer)
196 198  
  199 + self.state_code = const.SLICE_STATE_CROSS
  200 +
197 201 self.viewer = viewer
198 202 self.orientation = viewer.orientation
199 203 self.slice_actor = viewer.slice_data.actor
... ... @@ -207,9 +211,13 @@ class CrossInteractorStyle(DefaultInteractorStyle):
207 211  
208 212 def SetUp(self):
209 213 self.viewer._set_cross_visibility(1)
  214 + Publisher.sendMessage('Toggle toolbar item',
  215 + (self.state_code, True))
210 216  
211 217 def CleanUp(self):
212 218 self.viewer._set_cross_visibility(0)
  219 + Publisher.sendMessage('Toggle toolbar item',
  220 + (self.state_code, False))
213 221  
214 222 def OnCrossMouseClick(self, obj, evt):
215 223 iren = obj.GetInteractor()
... ... @@ -259,6 +267,8 @@ class WWWLInteractorStyle(DefaultInteractorStyle):
259 267 def __init__(self, viewer):
260 268 DefaultInteractorStyle.__init__(self, viewer)
261 269  
  270 + self.state_code = const.STATE_WL
  271 +
262 272 self.viewer = viewer
263 273  
264 274 self.last_x = 0
... ... @@ -272,11 +282,15 @@ class WWWLInteractorStyle(DefaultInteractorStyle):
272 282  
273 283 def SetUp(self):
274 284 self.viewer.on_wl = True
  285 + Publisher.sendMessage('Toggle toolbar item',
  286 + (self.state_code, True))
275 287 self.viewer.canvas.draw_list.append(self.viewer.wl_text)
276 288 self.viewer.UpdateCanvas()
277 289  
278 290 def CleanUp(self):
279 291 self.viewer.on_wl = False
  292 + Publisher.sendMessage('Toggle toolbar item',
  293 + (self.state_code, False))
280 294 if self.viewer.wl_text is not None:
281 295 self.viewer.canvas.draw_list.remove(self.viewer.wl_text)
282 296 self.viewer.UpdateCanvas()
... ... @@ -319,6 +333,8 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
319 333 def __init__(self, viewer):
320 334 DefaultInteractorStyle.__init__(self, viewer)
321 335  
  336 + self.state_code = const.STATE_MEASURE_DISTANCE
  337 +
322 338 self.viewer = viewer
323 339 self.orientation = viewer.orientation
324 340 self.slice_data = viewer.slice_data
... ... @@ -354,6 +370,16 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
354 370 self.AddObserver("MouseMoveEvent", self.OnMoveMeasurePoint)
355 371 self.AddObserver("LeaveEvent", self.OnLeaveMeasureInteractor)
356 372  
  373 + def SetUp(self):
  374 + Publisher.sendMessage('Toggle toolbar item',
  375 + (self.state_code, True))
  376 +
  377 + def CleanUp(self):
  378 + Publisher.sendMessage('Toggle toolbar item',
  379 + (self.state_code, False))
  380 + self.picker.PickFromListOff()
  381 + Publisher.sendMessage("Remove incomplete measurements")
  382 +
357 383 def OnInsertMeasurePoint(self, obj, evt):
358 384 slice_number = self.slice_data.number
359 385 x, y, z = self._get_pos_clicked()
... ... @@ -442,10 +468,6 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
442 468 self.viewer.UpdateCanvas()
443 469 self.viewer.scroll_enabled = True
444 470  
445   - def CleanUp(self):
446   - self.picker.PickFromListOff()
447   - Publisher.sendMessage("Remove incomplete measurements")
448   -
449 471 def _get_pos_clicked(self):
450 472 iren = self.viewer.interactor
451 473 mx,my = iren.GetEventPosition()
... ... @@ -496,6 +518,8 @@ class AngularMeasureInteractorStyle(LinearMeasureInteractorStyle):
496 518 LinearMeasureInteractorStyle.__init__(self, viewer)
497 519 self._type = const.ANGULAR
498 520  
  521 + self.state_code = const.STATE_MEASURE_ANGLE
  522 +
499 523  
500 524 class PanMoveInteractorStyle(DefaultInteractorStyle):
501 525 """
... ... @@ -504,11 +528,21 @@ class PanMoveInteractorStyle(DefaultInteractorStyle):
504 528 def __init__(self, viewer):
505 529 DefaultInteractorStyle.__init__(self, viewer)
506 530  
  531 + self.state_code = const.STATE_PAN
  532 +
507 533 self.viewer = viewer
508 534  
509 535 self.AddObserver("MouseMoveEvent", self.OnPanMove)
510 536 self.viewer.interactor.Bind(wx.EVT_LEFT_DCLICK, self.OnUnspan)
511 537  
  538 + def SetUp(self):
  539 + Publisher.sendMessage('Toggle toolbar item',
  540 + (self.state_code, True))
  541 +
  542 + def CleanUp(self):
  543 + Publisher.sendMessage('Toggle toolbar item',
  544 + (self.state_code, False))
  545 +
512 546 def OnPanMove(self, obj, evt):
513 547 if self.left_pressed:
514 548 obj.Pan()
... ... @@ -529,11 +563,21 @@ class SpinInteractorStyle(DefaultInteractorStyle):
529 563 def __init__(self, viewer):
530 564 DefaultInteractorStyle.__init__(self, viewer)
531 565  
  566 + self.state_code = const.STATE_SPIN
  567 +
532 568 self.viewer = viewer
533 569  
534 570 self.AddObserver("MouseMoveEvent", self.OnSpinMove)
535 571 self.viewer.interactor.Bind(wx.EVT_LEFT_DCLICK, self.OnUnspin)
536 572  
  573 + def SetUp(self):
  574 + Publisher.sendMessage('Toggle toolbar item',
  575 + (self.state_code, True))
  576 +
  577 + def CleanUp(self):
  578 + Publisher.sendMessage('Toggle toolbar item',
  579 + (self.state_code, False))
  580 +
537 581 def OnSpinMove(self, obj, evt):
538 582 iren = obj.GetInteractor()
539 583 mouse_x, mouse_y = iren.GetLastEventPosition()
... ... @@ -563,11 +607,21 @@ class ZoomInteractorStyle(DefaultInteractorStyle):
563 607 def __init__(self, viewer):
564 608 DefaultInteractorStyle.__init__(self, viewer)
565 609  
  610 + self.state_code = const.STATE_ZOOM
  611 +
566 612 self.viewer = viewer
567 613  
568 614 self.AddObserver("MouseMoveEvent", self.OnZoomMoveLeft)
569 615 self.viewer.interactor.Bind(wx.EVT_LEFT_DCLICK, self.OnUnZoom)
570 616  
  617 + def SetUp(self):
  618 + Publisher.sendMessage('Toggle toolbar item',
  619 + (self.state_code, True))
  620 +
  621 + def CleanUp(self):
  622 + Publisher.sendMessage('Toggle toolbar item',
  623 + (self.state_code, False))
  624 +
571 625 def OnZoomMoveLeft(self, obj, evt):
572 626 if self.left_pressed:
573 627 obj.Dolly()
... ... @@ -591,6 +645,16 @@ class ZoomSLInteractorStyle(vtk.vtkInteractorStyleRubberBandZoom):
591 645 self.viewer = viewer
592 646 self.viewer.interactor.Bind(wx.EVT_LEFT_DCLICK, self.OnUnZoom)
593 647  
  648 + self.state_code = const.STATE_ZOOM_SL
  649 +
  650 + def SetUp(self):
  651 + Publisher.sendMessage('Toggle toolbar item',
  652 + (self.state_code, True))
  653 +
  654 + def CleanUp(self):
  655 + Publisher.sendMessage('Toggle toolbar item',
  656 + (self.state_code, False))
  657 +
594 658 def OnUnZoom(self, evt):
595 659 mouse_x, mouse_y = self.viewer.interactor.GetLastEventPosition()
596 660 ren = self.viewer.interactor.FindPokedRenderer(mouse_x, mouse_y)
... ... @@ -608,11 +672,21 @@ class ChangeSliceInteractorStyle(DefaultInteractorStyle):
608 672 def __init__(self, viewer):
609 673 DefaultInteractorStyle.__init__(self, viewer)
610 674  
  675 + self.state_code = const.SLICE_STATE_SCROLL
  676 +
611 677 self.viewer = viewer
612 678  
613 679 self.AddObserver("MouseMoveEvent", self.OnChangeSliceMove)
614 680 self.AddObserver("LeftButtonPressEvent", self.OnChangeSliceClick)
615 681  
  682 + def SetUp(self):
  683 + Publisher.sendMessage('Toggle toolbar item',
  684 + (self.state_code, True))
  685 +
  686 + def CleanUp(self):
  687 + Publisher.sendMessage('Toggle toolbar item',
  688 + (self.state_code, False))
  689 +
616 690 def OnChangeSliceMove(self, evt, obj):
617 691 if self.left_pressed:
618 692 min = 0
... ... @@ -650,6 +724,8 @@ class EditorInteractorStyle(DefaultInteractorStyle):
650 724 def __init__(self, viewer):
651 725 DefaultInteractorStyle.__init__(self, viewer)
652 726  
  727 + self.state_code = const.SLICE_STATE_EDITOR
  728 +
653 729 self.viewer = viewer
654 730 self.orientation = self.viewer.orientation
655 731  
... ... @@ -935,6 +1011,8 @@ class WaterShedInteractorStyle(DefaultInteractorStyle):
935 1011 def __init__(self, viewer):
936 1012 DefaultInteractorStyle.__init__(self, viewer)
937 1013  
  1014 + self.state_code = const.SLICE_STATE_WATERSHED
  1015 +
938 1016 self.viewer = viewer
939 1017 self.orientation = self.viewer.orientation
940 1018 self.matrix = None
... ... @@ -1402,6 +1480,8 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle):
1402 1480 def __init__(self, viewer):
1403 1481 DefaultInteractorStyle.__init__(self, viewer)
1404 1482  
  1483 + self.state_code = const.SLICE_STATE_REORIENT
  1484 +
1405 1485 self.viewer = viewer
1406 1486  
1407 1487 self.line1 = None
... ... @@ -1648,6 +1728,8 @@ class FloodFillMaskInteractorStyle(DefaultInteractorStyle):
1648 1728 def __init__(self, viewer):
1649 1729 DefaultInteractorStyle.__init__(self, viewer)
1650 1730  
  1731 + self.state_code = const.SLICE_STATE_MASK_FFILL
  1732 +
1651 1733 self.viewer = viewer
1652 1734 self.orientation = self.viewer.orientation
1653 1735  
... ... @@ -1753,20 +1835,22 @@ class FloodFillMaskInteractorStyle(DefaultInteractorStyle):
1753 1835  
1754 1836  
1755 1837 class RemoveMaskPartsInteractorStyle(FloodFillMaskInteractorStyle):
1756   - def __init__(self, viewer):
1757   - FloodFillMaskInteractorStyle.__init__(self, viewer)
1758   - # InVesalius uses the following values to mark selected parts in a
1759   - # mask:
1760   - # 255 - Threshold
1761   - # 254 - Manual edition and floodfill
1762   - # 253 - Watershed
1763   - self.t0 = 253
1764   - self.t1 = 255
1765   - self.fill_value = 1
1766   -
1767   - self._dlg_title = _(u"Remove parts")
1768   - self._progr_title = _(u"Remove part")
1769   - self._progr_msg = _(u"Removing part ...")
  1838 + def __init__(self, viewer):
  1839 + FloodFillMaskInteractorStyle.__init__(self, viewer)
  1840 +
  1841 + self.state_code = const.SLICE_STATE_REMOVE_MASK_PARTS
  1842 + # InVesalius uses the following values to mark selected parts in a
  1843 + # mask:
  1844 + # 255 - Threshold
  1845 + # 254 - Manual edition and floodfill
  1846 + # 253 - Watershed
  1847 + self.t0 = 253
  1848 + self.t1 = 255
  1849 + self.fill_value = 1
  1850 +
  1851 + self._dlg_title = _(u"Remove parts")
  1852 + self._progr_title = _(u"Remove part")
  1853 + self._progr_msg = _(u"Removing part ...")
1770 1854  
1771 1855 class CropMaskConfig(object):
1772 1856 __metaclass__= utils.Singleton
... ... @@ -1774,17 +1858,18 @@ class CropMaskConfig(object):
1774 1858 self.dlg_visible = False
1775 1859  
1776 1860 class CropMaskInteractorStyle(DefaultInteractorStyle):
1777   -
1778 1861 def __init__(self, viewer):
1779 1862 DefaultInteractorStyle.__init__(self, viewer)
1780 1863  
  1864 + self.state_code = const.SLICE_STATE_CROP_MASK
  1865 +
1781 1866 self.viewer = viewer
1782 1867 self.orientation = self.viewer.orientation
1783 1868 self.picker = vtk.vtkWorldPointPicker()
1784 1869 self.slice_actor = viewer.slice_data.actor
1785 1870 self.slice_data = viewer.slice_data
1786 1871 self.draw_retangle = None
1787   -
  1872 +
1788 1873 self.config = CropMaskConfig()
1789 1874  
1790 1875 def __evts__(self):
... ... @@ -1883,6 +1968,8 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle):
1883 1968 def __init__(self, viewer):
1884 1969 DefaultInteractorStyle.__init__(self, viewer)
1885 1970  
  1971 + self.state_code = const.SLICE_STATE_SELECT_MASK_PARTS
  1972 +
1886 1973 self.viewer = viewer
1887 1974 self.orientation = self.viewer.orientation
1888 1975  
... ... @@ -2003,6 +2090,8 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle):
2003 2090 def __init__(self, viewer):
2004 2091 DefaultInteractorStyle.__init__(self, viewer)
2005 2092  
  2093 + self.state_code = const.SLICE_STATE_FFILL_SEGMENTATION
  2094 +
2006 2095 self.viewer = viewer
2007 2096 self.orientation = self.viewer.orientation
2008 2097  
... ... @@ -2237,9 +2326,6 @@ def get_style(style):
2237 2326 const.SLICE_STATE_REMOVE_MASK_PARTS: RemoveMaskPartsInteractorStyle,
2238 2327 const.SLICE_STATE_SELECT_MASK_PARTS: SelectMaskPartsInteractorStyle,
2239 2328 const.SLICE_STATE_FFILL_SEGMENTATION: FloodFillSegmentInteractorStyle,
2240   - const.SLICE_STATE_CROP_MASK:CropMaskInteractorStyle,
  2329 + const.SLICE_STATE_CROP_MASK: CropMaskInteractorStyle,
2241 2330 }
2242 2331 return STYLES[style]
2243   -
2244   -
2245   -
... ...
invesalius/gui/frame.py
... ... @@ -1302,6 +1302,7 @@ class ObjectToolBar(AuiToolBar):
1302 1302 sub(self._UntoggleAllItems, 'Untoggle object toolbar items')
1303 1303 sub(self._ToggleLinearMeasure, "Set tool linear measure")
1304 1304 sub(self._ToggleAngularMeasure, "Set tool angular measure")
  1305 + sub(self.ToggleItem, 'Toggle toolbar item')
1305 1306  
1306 1307 def __bind_events_wx(self):
1307 1308 """
... ... @@ -1487,6 +1488,12 @@ class ObjectToolBar(AuiToolBar):
1487 1488 self.ToggleTool(item, False)
1488 1489 evt.Skip()
1489 1490  
  1491 + def ToggleItem(self, evt):
  1492 + _id, value = evt.data
  1493 + if _id in self.enable_items:
  1494 + self.ToggleTool(_id, value)
  1495 + self.Refresh()
  1496 +
1490 1497 def SetStateProjectClose(self):
1491 1498 """
1492 1499 Disable menu items (e.g. zoom) when project is closed.
... ... @@ -1567,6 +1574,7 @@ class SliceToolBar(AuiToolBar):
1567 1574 sub(self._EnableState, "Enable state project")
1568 1575 sub(self._UntoggleAllItems, 'Untoggle slice toolbar items')
1569 1576 sub(self.OnToggle, 'Toggle Cross')
  1577 + sub(self.ToggleItem, 'Toggle toolbar item')
1570 1578  
1571 1579 def __bind_events_wx(self):
1572 1580 """
... ... @@ -1632,6 +1640,11 @@ class SliceToolBar(AuiToolBar):
1632 1640 ##print ">>>", self.sst.IsToggled()
1633 1641 #print ">>>", self.sst.GetState()
1634 1642  
  1643 + def ToggleItem(self, evt):
  1644 + _id, value = evt.data
  1645 + if _id in self.enable_items:
  1646 + self.ToggleTool(_id, value)
  1647 + self.Refresh()
1635 1648  
1636 1649 def SetStateProjectClose(self):
1637 1650 """
... ...
invesalius/style.py
... ... @@ -111,7 +111,6 @@ class StyleStateManager(object):
111 111 return self.stack[max_level]
112 112  
113 113 def GetActualState(self):
114   - print self.stack.keys()
115 114 max_level = max(self.stack.keys())
116 115 state = self.stack[max_level]
117 116 return state
... ...