summaryrefslogtreecommitdiff
path: root/silx/gui/plot3d/tools/toolbars.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/plot3d/tools/toolbars.py')
-rw-r--r--silx/gui/plot3d/tools/toolbars.py111
1 files changed, 72 insertions, 39 deletions
diff --git a/silx/gui/plot3d/tools/toolbars.py b/silx/gui/plot3d/tools/toolbars.py
index c8be226..d4f32db 100644
--- a/silx/gui/plot3d/tools/toolbars.py
+++ b/silx/gui/plot3d/tools/toolbars.py
@@ -1,7 +1,7 @@
# coding: utf-8
# /*##########################################################################
#
-# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
+# Copyright (c) 2016-2018 European Synchrotron Radiation Facility
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -44,40 +44,44 @@ __license__ = "MIT"
__date__ = "06/09/2017"
import logging
+import weakref
from silx.gui import qt
+from .ViewpointTools import ViewpointToolButton
from .. import actions
_logger = logging.getLogger(__name__)
-class InteractiveModeToolBar(qt.QToolBar):
- """Toolbar providing icons to change the interaction mode
+class Plot3DWidgetToolBar(qt.QToolBar):
+ """Base class for toolbar associated to a Plot3DWidget
:param parent: See :class:`QWidget`
:param str title: Title of the toolbar.
"""
- def __init__(self, parent=None, title='Plot3D Interaction'):
- super(InteractiveModeToolBar, self).__init__(title, parent)
+ def __init__(self, parent=None, title=''):
+ super(Plot3DWidgetToolBar, self).__init__(title, parent)
- self._plot3d = None
+ self._plot3DRef = None
- self._rotateAction = actions.mode.RotateArcballAction(parent=self)
- self.addAction(self._rotateAction)
+ def _plot3DWidgetChanged(self, widget):
+ """Handle change of Plot3DWidget and sync actions
- self._panAction = actions.mode.PanAction(parent=self)
- self.addAction(self._panAction)
+ :param Plot3DWidget widget:
+ """
+ for action in self.actions():
+ if isinstance(action, actions.Plot3DAction):
+ action.setPlot3DWidget(widget)
def setPlot3DWidget(self, widget):
"""Set the Plot3DWidget this toolbar is associated with
- :param Plot3DWidget widget: The widget to copy/save/print
+ :param Plot3DWidget widget: The widget to control
"""
- self._plot3d = widget
- self.getRotateAction().setPlot3DWidget(widget)
- self.getPanAction().setPlot3DWidget(widget)
+ self._plot3DRef = None if widget is None else weakref.ref(widget)
+ self._plot3DWidgetChanged(widget)
def getPlot3DWidget(self):
"""Return the Plot3DWidget associated to this toolbar.
@@ -86,7 +90,24 @@ class InteractiveModeToolBar(qt.QToolBar):
:rtype: qt.QWidget
"""
- return self._plot3d
+ return None if self._plot3DRef is None else self._plot3DRef()
+
+
+class InteractiveModeToolBar(Plot3DWidgetToolBar):
+ """Toolbar providing icons to change the interaction mode
+
+ :param parent: See :class:`QWidget`
+ :param str title: Title of the toolbar.
+ """
+
+ def __init__(self, parent=None, title='Plot3D Interaction'):
+ super(InteractiveModeToolBar, self).__init__(parent, title)
+
+ self._rotateAction = actions.mode.RotateArcballAction(parent=self)
+ self.addAction(self._rotateAction)
+
+ self._panAction = actions.mode.PanAction(parent=self)
+ self.addAction(self._panAction)
def getRotateAction(self):
"""Returns the QAction setting rotate interaction of the Plot3DWidget
@@ -103,7 +124,7 @@ class InteractiveModeToolBar(qt.QToolBar):
return self._panAction
-class OutputToolBar(qt.QToolBar):
+class OutputToolBar(Plot3DWidgetToolBar):
"""Toolbar providing icons to copy, save and print the OpenGL scene
:param parent: See :class:`QWidget`
@@ -111,9 +132,7 @@ class OutputToolBar(qt.QToolBar):
"""
def __init__(self, parent=None, title='Plot3D Output'):
- super(OutputToolBar, self).__init__(title, parent)
-
- self._plot3d = None
+ super(OutputToolBar, self).__init__(parent, title)
self._copyAction = actions.io.CopyAction(parent=self)
self.addAction(self._copyAction)
@@ -127,26 +146,6 @@ class OutputToolBar(qt.QToolBar):
self._printAction = actions.io.PrintAction(parent=self)
self.addAction(self._printAction)
- def setPlot3DWidget(self, widget):
- """Set the Plot3DWidget this toolbar is associated with
-
- :param Plot3DWidget widget: The widget to copy/save/print
- """
- self._plot3d = widget
- self.getCopyAction().setPlot3DWidget(widget)
- self.getSaveAction().setPlot3DWidget(widget)
- self.getVideoRecordAction().setPlot3DWidget(widget)
- self.getPrintAction().setPlot3DWidget(widget)
-
- def getPlot3DWidget(self):
- """Return the Plot3DWidget associated to this toolbar.
-
- If no widget is associated, it returns None.
-
- :rtype: qt.QWidget
- """
- return self._plot3d
-
def getCopyAction(self):
"""Returns the QAction performing copy to clipboard of the Plot3DWidget
@@ -174,3 +173,37 @@ class OutputToolBar(qt.QToolBar):
:rtype: qt.QAction
"""
return self._printAction
+
+
+class ViewpointToolBar(Plot3DWidgetToolBar):
+ """A toolbar providing icons to reset the viewpoint.
+
+ :param parent: See :class:`QToolBar`
+ :param str title: Title of the toolbar
+ """
+
+ def __init__(self, parent=None, title='Viewpoint control'):
+ super(ViewpointToolBar, self).__init__(parent, title)
+
+ self._viewpointToolButton = ViewpointToolButton(parent=self)
+ self.addWidget(self._viewpointToolButton)
+ self._rotateViewpointAction = actions.viewpoint.RotateViewpoint(parent=self)
+ self.addAction(self._rotateViewpointAction)
+
+ def _plot3DWidgetChanged(self, widget):
+ self.getViewpointToolButton().setPlot3DWidget(widget)
+ super(ViewpointToolBar, self)._plot3DWidgetChanged(widget)
+
+ def getViewpointToolButton(self):
+ """Returns the ViewpointToolButton to set viewpoint of the Plot3DWidget
+
+ :rtype: ViewpointToolButton
+ """
+ return self._viewpointToolButton
+
+ def getRotateViewpointAction(self):
+ """Returns the QAction to start/stop rotation of the Plot3DWidget
+
+ :rtype: qt.QAction
+ """
+ return self._rotateViewpointAction