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