diff --git a/bec_widgets/widgets/plots/waveform/utils/alignment_controller.py b/bec_widgets/widgets/plots/waveform/utils/alignment_controller.py index ad201efc..4f34a790 100644 --- a/bec_widgets/widgets/plots/waveform/utils/alignment_controller.py +++ b/bec_widgets/widgets/plots/waveform/utils/alignment_controller.py @@ -38,6 +38,7 @@ class WaveformAlignmentController(QObject): """Own the alignment plot overlays and synchronize them with the alignment panel.""" move_absolute_requested = Signal(float) + autoscale_requested = Signal() def __init__(self, plot_item: pg.PlotItem, panel: WaveformAlignmentPanel, parent=None): super().__init__(parent=parent) @@ -129,6 +130,7 @@ class WaveformAlignmentController(QObject): self._marker_line.label.setText( f"{self._positioner_name}: {self._readback:.{self._precision}f}" ) + self.autoscale_requested.emit() @SafeSlot(dict, dict) def update_dap_summary(self, data: dict, metadata: dict): @@ -219,7 +221,6 @@ class WaveformAlignmentController(QObject): label="", labelOpts={"position": 0.95, "color": warning}, ) - self._marker_line.skip_auto_range = True self._apply_marker_style() self._plot_item.addItem(self._marker_line) @@ -254,6 +255,7 @@ class WaveformAlignmentController(QObject): value = min(max(value, self._limits[0]), self._limits[1]) self._target_line.setValue(value) self._on_target_line_changed() + self.autoscale_requested.emit() def _refresh_target_line_metadata(self): if self._target_line is None or self._positioner_name is None: @@ -326,6 +328,7 @@ class WaveformAlignmentController(QObject): return self._panel.set_target_value(float(self._target_line.value()), precision=self._precision) self._refresh_target_controls() + self.autoscale_requested.emit() @SafeSlot() def _on_target_move_requested(self): diff --git a/bec_widgets/widgets/plots/waveform/waveform.py b/bec_widgets/widgets/plots/waveform/waveform.py index 62f9edce..95a96fb4 100644 --- a/bec_widgets/widgets/plots/waveform/waveform.py +++ b/bec_widgets/widgets/plots/waveform/waveform.py @@ -292,6 +292,7 @@ class Waveform(PlotBase): widget=self._alignment_panel ) self._alignment_controller.move_absolute_requested.connect(self._move_alignment_positioner) + self._alignment_controller.autoscale_requested.connect(self._autoscale_alignment_indicators) self.dap_summary_update.connect(self._alignment_controller.update_dap_summary) self.toolbar.components.get_action("alignment_mode").action.toggled.connect( self.toggle_alignment_mode @@ -400,6 +401,11 @@ class Waveform(PlotBase): return self.dev[self._alignment_positioner_name].move(float(value), relative=False) + @SafeSlot() + def _autoscale_alignment_indicators(self): + """Autoscale the waveform view after alignment indicator updates.""" + self._reset_view() + def _add_waveform_specific_popup(self): """ Add popups to the Waveform widget. diff --git a/tests/unit_tests/test_alignment_controller.py b/tests/unit_tests/test_alignment_controller.py index c46d0f6a..ad3ebcdb 100644 --- a/tests/unit_tests/test_alignment_controller.py +++ b/tests/unit_tests/test_alignment_controller.py @@ -107,6 +107,20 @@ def test_alignment_controller_emits_move_request_for_fit_center(qtbot, mocked_cl move_callback.assert_called_once_with(2.5) +def test_alignment_controller_requests_autoscale_for_marker_and_target(qtbot, mocked_client): + _, panel, controller = create_alignment_controller(qtbot, mocked_client) + + autoscale_callback = MagicMock() + controller.autoscale_requested.connect(autoscale_callback) + + controller.update_context( + AlignmentContext(visible=True, positioner_name="samx", precision=3, readback=1.0) + ) + panel.target_toggle.setChecked(True) + + assert autoscale_callback.call_count >= 2 + + def test_alignment_controller_emits_move_request_for_target(qtbot, mocked_client): _, panel, controller = create_alignment_controller(qtbot, mocked_client)