From 2be009c6477ba26c5cfb4d827534c5d5eb428999 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Wed, 17 Jul 2024 23:14:24 +0200 Subject: [PATCH] feat(waveform_widget): switch between drag and rectangle mode --- .../assets/toolbar_icons/drag_pan_mode.svg | 3 +++ .../assets/toolbar_icons/rectangle_mode.svg | 3 +++ .../widgets/figure/plots/waveform/waveform.py | 1 - .../waveform_toolbar/waveform_toolbar.py | 24 +++++++++++++++++++ .../widgets/waveform/waveform_widget.py | 23 ++++++++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 bec_widgets/assets/toolbar_icons/drag_pan_mode.svg create mode 100644 bec_widgets/assets/toolbar_icons/rectangle_mode.svg diff --git a/bec_widgets/assets/toolbar_icons/drag_pan_mode.svg b/bec_widgets/assets/toolbar_icons/drag_pan_mode.svg new file mode 100644 index 00000000..06205000 --- /dev/null +++ b/bec_widgets/assets/toolbar_icons/drag_pan_mode.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/bec_widgets/assets/toolbar_icons/rectangle_mode.svg b/bec_widgets/assets/toolbar_icons/rectangle_mode.svg new file mode 100644 index 00000000..d47bbb2e --- /dev/null +++ b/bec_widgets/assets/toolbar_icons/rectangle_mode.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/bec_widgets/widgets/figure/plots/waveform/waveform.py b/bec_widgets/widgets/figure/plots/waveform/waveform.py index be900ae9..127c941d 100644 --- a/bec_widgets/widgets/figure/plots/waveform/waveform.py +++ b/bec_widgets/widgets/figure/plots/waveform/waveform.py @@ -390,7 +390,6 @@ class BECWaveform(BECPlotBase): self.async_signal_update.emit() self.scan_signal_update.emit() - # self.autorange_timer.start(200) @pyqtSlot() def auto_range(self): diff --git a/bec_widgets/widgets/waveform/waveform_toolbar/waveform_toolbar.py b/bec_widgets/widgets/waveform/waveform_toolbar/waveform_toolbar.py index 6189c1cd..e4d31152 100644 --- a/bec_widgets/widgets/waveform/waveform_toolbar/waveform_toolbar.py +++ b/bec_widgets/widgets/waveform/waveform_toolbar/waveform_toolbar.py @@ -30,6 +30,30 @@ class MatplotlibAction(ToolBarAction): toolbar.addAction(self.action) +class DragModeAction(ToolBarAction): + def add_to_toolbar(self, toolbar, target): + icon = QIcon() + icon.addFile( + os.path.join(MODULE_PATH, "assets", "toolbar_icons", "drag_pan_mode.svg"), + size=QSize(20, 20), + ) + self.action = QAction(icon, "Drag Mouse Mode", target) + self.action.setCheckable(True) + toolbar.addAction(self.action) + + +class RectangeModeAction(ToolBarAction): + def add_to_toolbar(self, toolbar, target): + icon = QIcon() + icon.addFile( + os.path.join(MODULE_PATH, "assets", "toolbar_icons", "rectangle_mode.svg"), + size=QSize(20, 20), + ) + self.action = QAction(icon, "Rectangle Zoom Mode", target) + self.action.setCheckable(True) + toolbar.addAction(self.action) + + class AutoRangeAction(ToolBarAction): def add_to_toolbar(self, toolbar, target): icon = QIcon() diff --git a/bec_widgets/widgets/waveform/waveform_widget.py b/bec_widgets/widgets/waveform/waveform_widget.py index 927e75e1..c5795913 100644 --- a/bec_widgets/widgets/waveform/waveform_widget.py +++ b/bec_widgets/widgets/waveform/waveform_widget.py @@ -4,6 +4,8 @@ import sys from typing import Literal import numpy as np +import pyqtgraph as pg +from qtpy.QtCore import Slot from qtpy.QtWidgets import QVBoxLayout, QWidget from bec_widgets.qt_utils.error_popups import SafeSlot, WarningPopupUtility @@ -75,6 +77,8 @@ class BECWaveformWidget(BECConnector, QWidget): "save": SaveAction(), "matplotlib": MatplotlibAction(), "separator_1": SeparatorAction(), + "drag_mode": DragModeAction(), + "rectangle_mode": RectangeModeAction(), "auto_range": AutoRangeAction(), "separator_2": SeparatorAction(), "curves": CurveAction(), @@ -107,6 +111,10 @@ class BECWaveformWidget(BECConnector, QWidget): def _hook_actions(self): self.toolbar.widgets["save"].action.triggered.connect(self.export) self.toolbar.widgets["matplotlib"].action.triggered.connect(self.export_to_matplotlib) + self.toolbar.widgets["drag_mode"].action.triggered.connect(self.enable_mouse_pan_mode) + self.toolbar.widgets["rectangle_mode"].action.triggered.connect( + self.enable_mouse_rectangle_mode + ) self.toolbar.widgets["auto_range"].action.triggered.connect(self._auto_range_from_toolbar) self.toolbar.widgets["curves"].action.triggered.connect(self.show_curve_settings) self.toolbar.widgets["fit_params"].action.triggered.connect(self.show_fit_summary_dialog) @@ -118,6 +126,9 @@ class BECWaveformWidget(BECConnector, QWidget): # lambda: self.save_config(path=None, gui=True) # ) + ################################### + # Dialog Windows + ################################### def show_axis_settings(self): dialog = SettingsDialog( self, @@ -508,6 +519,18 @@ class BECWaveformWidget(BECConnector, QWidget): """ self.waveform.lock_aspect_ratio(lock) + @Slot() + def enable_mouse_rectangle_mode(self): + self.toolbar.widgets["rectangle_mode"].action.setChecked(True) + self.toolbar.widgets["drag_mode"].action.setChecked(False) + self.waveform.plot_item.getViewBox().setMouseMode(pg.ViewBox.RectMode) + + @Slot() + def enable_mouse_pan_mode(self): + self.toolbar.widgets["drag_mode"].action.setChecked(True) + self.toolbar.widgets["rectangle_mode"].action.setChecked(False) + self.waveform.plot_item.getViewBox().setMouseMode(pg.ViewBox.PanMode) + def export(self): """ Show the export dialog for the plot widget.