diff --git a/bec_widgets/utils/crosshair.py b/bec_widgets/utils/crosshair.py index f706c63a..a42768bf 100644 --- a/bec_widgets/utils/crosshair.py +++ b/bec_widgets/utils/crosshair.py @@ -9,6 +9,8 @@ from qtpy.QtCore import Signal as pyqtSignal class Crosshair(QObject): + positionChanged = pyqtSignal(tuple) + positionClicked = pyqtSignal(tuple) # Signal for 1D plot coordinatesChanged1D = pyqtSignal(tuple) coordinatesClicked1D = pyqtSignal(tuple) @@ -164,6 +166,7 @@ class Crosshair(QObject): """ pos = event[0] self.update_markers() + self.positionChanged.emit((pos.x(), pos.y())) if self.plot_item.vb.sceneBoundingRect().contains(pos): mouse_point = self.plot_item.vb.mapSceneToView(pos) self.v_line.setPos(mouse_point.x()) @@ -217,6 +220,7 @@ class Crosshair(QObject): if self.plot_item.vb.sceneBoundingRect().contains(event._scenePos): mouse_point = self.plot_item.vb.mapSceneToView(event._scenePos) x, y = mouse_point.x(), mouse_point.y() + self.positionClicked.emit((x, y)) if self.is_log_x: x = 10**x diff --git a/bec_widgets/widgets/figure/plots/plot_base.py b/bec_widgets/widgets/figure/plots/plot_base.py index b51d176b..6038b3fb 100644 --- a/bec_widgets/widgets/figure/plots/plot_base.py +++ b/bec_widgets/widgets/figure/plots/plot_base.py @@ -56,6 +56,8 @@ class BECViewBox(pg.ViewBox): class BECPlotBase(BECConnector, pg.GraphicsLayout): + crosshair_position_changed = Signal(tuple) + crosshair_position_clicked = Signal(tuple) crosshair_coordinates_changed = Signal(tuple) crosshair_coordinates_clicked = Signal(tuple) USER_ACCESS = [ @@ -328,6 +330,8 @@ class BECPlotBase(BECConnector, pg.GraphicsLayout): """Hook the crosshair to all plots.""" if self.crosshair is None: self.crosshair = Crosshair(self.plot_item, precision=3) + self.crosshair.positionChanged.connect(self.crosshair_position_changed) + self.crosshair.positionClicked.connect(self.crosshair_position_clicked) self.crosshair.coordinatesChanged1D.connect(self.crosshair_coordinates_changed) self.crosshair.coordinatesClicked1D.connect(self.crosshair_coordinates_clicked) self.crosshair.coordinatesChanged2D.connect(self.crosshair_coordinates_changed) @@ -336,6 +340,8 @@ class BECPlotBase(BECConnector, pg.GraphicsLayout): def unhook_crosshair(self) -> None: """Unhook the crosshair from all plots.""" if self.crosshair is not None: + self.crosshair.positionChanged.disconnect(self.crosshair_position_changed) + self.crosshair.positionClicked.disconnect(self.crosshair_position_clicked) self.crosshair.coordinatesChanged1D.disconnect(self.crosshair_coordinates_changed) self.crosshair.coordinatesClicked1D.disconnect(self.crosshair_coordinates_clicked) self.crosshair.coordinatesChanged2D.disconnect(self.crosshair_coordinates_changed) diff --git a/bec_widgets/widgets/waveform/waveform_widget.py b/bec_widgets/widgets/waveform/waveform_widget.py index 3d82933a..65c8a39f 100644 --- a/bec_widgets/widgets/waveform/waveform_widget.py +++ b/bec_widgets/widgets/waveform/waveform_widget.py @@ -58,8 +58,14 @@ class BECWaveformWidget(BECWidget, QWidget): dap_summary_update = Signal(dict) autorange_signal = Signal() new_scan = Signal() + crosshair_position_changed = Signal(tuple) + crosshair_position_changed_string = Signal(str) + crosshair_position_clicked = Signal(tuple) + crosshair_position_clicked_string = Signal(str) crosshair_coordinates_changed = Signal(tuple) + crosshair_coordinates_changed_string = Signal(str) crosshair_coordinates_clicked = Signal(tuple) + crosshair_coordinates_clicked_string = Signal(str) def __init__( self, @@ -136,6 +142,20 @@ class BECWaveformWidget(BECWidget, QWidget): self.waveform.new_scan.connect(self.new_scan) self.waveform.crosshair_coordinates_changed.connect(self.crosshair_coordinates_changed) self.waveform.crosshair_coordinates_clicked.connect(self.crosshair_coordinates_clicked) + self.waveform.crosshair_coordinates_changed.connect( + self._emit_crosshair_coordinates_changed_string + ) + self.waveform.crosshair_coordinates_clicked.connect( + self._emit_crosshair_coordinates_clicked_string + ) + self.waveform.crosshair_position_changed.connect(self.crosshair_position_changed) + self.waveform.crosshair_position_clicked.connect(self.crosshair_position_clicked) + self.waveform.crosshair_position_changed.connect( + self._emit_crosshair_position_changed_string + ) + self.waveform.crosshair_position_clicked.connect( + self._emit_crosshair_position_clicked_string + ) def _hook_actions(self): self.toolbar.widgets["save"].action.triggered.connect(self.export) @@ -156,6 +176,22 @@ class BECWaveformWidget(BECWidget, QWidget): # lambda: self.save_config(path=None, gui=True) # ) + @SafeSlot(tuple) + def _emit_crosshair_coordinates_changed_string(self, coordinates): + self.crosshair_coordinates_changed_string.emit(str(coordinates)) + + @SafeSlot(tuple) + def _emit_crosshair_coordinates_clicked_string(self, coordinates): + self.crosshair_coordinates_clicked_string.emit(str(coordinates)) + + @SafeSlot(tuple) + def _emit_crosshair_position_changed_string(self, position): + self.crosshair_position_changed_string.emit(str(position)) + + @SafeSlot(tuple) + def _emit_crosshair_position_clicked_string(self, position): + self.crosshair_position_clicked_string.emit(str(position)) + ################################### # Dialog Windows ###################################