Commit 7eed215fe59573380aec4c396a454fcc58e2aae6
1 parent
07680389
Exists in
master
and in
6 other branches
(Un)toggling toolbar buttons when (de)activating the relative style
Showing
3 changed files
with
123 additions
and
25 deletions
Show diff stats
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