diff options
Diffstat (limited to 'silx/gui/plot/PlotToolButtons.py')
-rw-r--r-- | silx/gui/plot/PlotToolButtons.py | 104 |
1 files changed, 88 insertions, 16 deletions
diff --git a/silx/gui/plot/PlotToolButtons.py b/silx/gui/plot/PlotToolButtons.py index bf6b8ce..cd1a43f 100644 --- a/silx/gui/plot/PlotToolButtons.py +++ b/silx/gui/plot/PlotToolButtons.py @@ -47,7 +47,7 @@ from .. import icons from .. import qt from ... import config -from .items import SymbolMixIn +from .items import SymbolMixIn, Scatter _logger = logging.getLogger(__name__) @@ -352,23 +352,22 @@ class ProfileToolButton(PlotToolButton): self._profileDimensionChanged(2) -class SymbolToolButton(PlotToolButton): - """A tool button with a drop-down menu to control symbol size and marker. + +class _SymbolToolButtonBase(PlotToolButton): + """Base class for PlotToolButton setting marker and size. :param parent: See QWidget :param plot: The `~silx.gui.plot.PlotWidget` to control """ def __init__(self, parent=None, plot=None): - super(SymbolToolButton, self).__init__(parent=parent, plot=plot) + super(_SymbolToolButtonBase, self).__init__(parent=parent, plot=plot) - self.setToolTip('Set symbol size and marker') - self.setIcon(icons.getQIcon('plot-symbols')) - - menu = qt.QMenu(self) - - # Size slider + def _addSizeSliderToMenu(self, menu): + """Add a slider to set size to the given menu + :param QMenu menu: + """ slider = qt.QSlider(qt.Qt.Horizontal) slider.setRange(1, 20) slider.setValue(config.DEFAULT_PLOT_SYMBOL_SIZE) @@ -378,10 +377,11 @@ class SymbolToolButton(PlotToolButton): widgetAction.setDefaultWidget(slider) menu.addAction(widgetAction) - menu.addSeparator() - - # Marker actions + def _addSymbolsToMenu(self, menu): + """Add symbols to the given menu + :param QMenu menu: + """ for marker, name in zip(SymbolMixIn.getSupportedSymbols(), SymbolMixIn.getSupportedSymbolNames()): action = qt.QAction(name, menu) @@ -390,9 +390,6 @@ class SymbolToolButton(PlotToolButton): functools.partial(self._markerChanged, marker)) menu.addAction(action) - self.setMenu(menu) - self.setPopupMode(qt.QToolButton.InstantPopup) - def _sizeChanged(self, value): """Manage slider value changed @@ -418,3 +415,78 @@ class SymbolToolButton(PlotToolButton): for item in plot._getItems(withhidden=True): if isinstance(item, SymbolMixIn): item.setSymbol(marker) + + +class SymbolToolButton(_SymbolToolButtonBase): + """A tool button with a drop-down menu to control symbol size and marker. + + :param parent: See QWidget + :param plot: The `~silx.gui.plot.PlotWidget` to control + """ + + def __init__(self, parent=None, plot=None): + super(SymbolToolButton, self).__init__(parent=parent, plot=plot) + + self.setToolTip('Set symbol size and marker') + self.setIcon(icons.getQIcon('plot-symbols')) + + menu = qt.QMenu(self) + self._addSizeSliderToMenu(menu) + menu.addSeparator() + self._addSymbolsToMenu(menu) + + self.setMenu(menu) + self.setPopupMode(qt.QToolButton.InstantPopup) + + +class ScatterVisualizationToolButton(_SymbolToolButtonBase): + """QToolButton to select the visualization mode of scatter plot + + :param parent: See QWidget + :param plot: The `~silx.gui.plot.PlotWidget` to control + """ + + def __init__(self, parent=None, plot=None): + super(ScatterVisualizationToolButton, self).__init__( + parent=parent, plot=plot) + + self.setToolTip( + 'Set scatter visualization mode, symbol marker and size') + self.setIcon(icons.getQIcon('eye')) + + menu = qt.QMenu(self) + + # Add visualization modes + + for mode in Scatter.supportedVisualizations(): + name = mode.value.capitalize() + action = qt.QAction(name, menu) + action.setCheckable(False) + action.triggered.connect( + functools.partial(self._visualizationChanged, mode)) + menu.addAction(action) + + menu.addSeparator() + + submenu = menu.addMenu(icons.getQIcon('plot-symbols'), "Symbol") + self._addSymbolsToMenu(submenu) + + submenu = menu.addMenu(icons.getQIcon('plot-symbols'), "Symbol Size") + self._addSizeSliderToMenu(submenu) + + self.setMenu(menu) + self.setPopupMode(qt.QToolButton.InstantPopup) + + def _visualizationChanged(self, mode): + """Handle change of visualization mode. + + :param ScatterVisualizationMixIn.Visualization mode: + The visualization mode to use for scatter + """ + plot = self.plot() + if plot is None: + return + + for item in plot._getItems(withhidden=True): + if isinstance(item, Scatter): + item.setVisualization(mode) |