diff --git a/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_setting.py b/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_setting.py index 563563d5..4337e07d 100644 --- a/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_setting.py +++ b/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_setting.py @@ -7,6 +7,7 @@ from qtpy.QtWidgets import ( QGroupBox, QHBoxLayout, QLabel, + QLineEdit, QSizePolicy, QVBoxLayout, QWidget, @@ -53,6 +54,9 @@ class CurveSetting(SettingWidget): self.device_x_label = QLabel("Device") self.device_x = DeviceLineEdit() + self.signal_x_label = QLabel("Signal") + self.signal_x = QLineEdit() + self._get_x_mode_from_waveform() self.switch_x_device_selection() @@ -63,6 +67,8 @@ class CurveSetting(SettingWidget): self.x_axis_box.layout.addWidget(self.spacer) self.x_axis_box.layout.addWidget(self.device_x_label) self.x_axis_box.layout.addWidget(self.device_x) + self.x_axis_box.layout.addWidget(self.signal_x_label) + self.x_axis_box.layout.addWidget(self.signal_x) self.x_axis_box.setFixedHeight(80) self.layout.addWidget(self.x_axis_box) @@ -77,6 +83,7 @@ class CurveSetting(SettingWidget): if self.mode_combo.currentText() == "device": self.device_x.setEnabled(True) self.device_x.setText(self.target_widget.x_axis_mode["name"]) + self.signal_x.setText(self.target_widget.x_axis_mode["entry"]) else: self.device_x.setEnabled(False) @@ -98,6 +105,9 @@ class CurveSetting(SettingWidget): """ if self.mode_combo.currentText() == "device": self.target_widget.x_mode = self.device_x.text() + signal_x = self.signal_x.text() + if signal_x != "": + self.target_widget.x_entry = signal_x else: self.target_widget.x_mode = self.mode_combo.currentText() self.curve_manager.send_curve_json() diff --git a/bec_widgets/widgets/plots/waveform/waveform.py b/bec_widgets/widgets/plots/waveform/waveform.py index 058e3839..c9970eb8 100644 --- a/bec_widgets/widgets/plots/waveform/waveform.py +++ b/bec_widgets/widgets/plots/waveform/waveform.py @@ -454,12 +454,41 @@ class Waveform(PlotBase): @x_mode.setter def x_mode(self, value: str): self.x_axis_mode["name"] = value + if value not in ["timestamp", "index", "auto"]: + self.x_axis_mode["entry"] = self.entry_validator.validate_signal(value, None) self._switch_x_axis_item(mode=value) self.async_signal_update.emit() self.sync_signal_update.emit() self.plot_item.enableAutoRange(x=True) self.round_plot_widget.apply_plot_widget_style() # To keep the correct theme + @SafeProperty(str) + def x_entry(self) -> str | None: + """ + The x signal name. + """ + return self.x_axis_mode["entry"] + + @x_entry.setter + def x_entry(self, value: str | None): + """ + Set the x signal name. + + Args: + value(str|None): The x signal name to set. + """ + if value is None: + return + if self.x_axis_mode["name"] in ["auto", "index", "timestamp"]: + logger.warning("Cannot set x_entry when x_mode is not 'device'.") + return + self.x_axis_mode["entry"] = self.entry_validator.validate_signal(self.x_mode, value) + self._switch_x_axis_item(mode="device") + self.async_signal_update.emit() + self.sync_signal_update.emit() + self.plot_item.enableAutoRange(x=True) + self.round_plot_widget.apply_plot_widget_style() + @SafeProperty(str) def color_palette(self) -> str: """ @@ -1492,9 +1521,6 @@ class Waveform(PlotBase): default_axis = pg.AxisItem(orientation="bottom") self.plot_item.setAxisItems({"bottom": default_axis}) - if mode not in ["timestamp", "index", "auto"]: - self.x_axis_mode["entry"] = self.entry_validator.validate_signal(mode, None) - self.set_x_label_suffix(self.x_axis_mode["label_suffix"]) def _categorise_device_curves(self) -> str: diff --git a/tests/unit_tests/test_curve_settings.py b/tests/unit_tests/test_curve_settings.py index c3b11ebb..ad239790 100644 --- a/tests/unit_tests/test_curve_settings.py +++ b/tests/unit_tests/test_curve_settings.py @@ -119,6 +119,20 @@ def test_curve_setting_refresh(curve_setting_fixture, qtbot): assert curve_setting.mode_combo.currentText() == "timestamp" +def test_change_device_from_target_widget(curve_setting_fixture, qtbot): + curve_setting, wf = curve_setting_fixture + + wf.x_mode = "samx" + + # Call refresh + curve_setting.refresh() + + assert curve_setting.mode_combo.currentText() == "device" + assert curve_setting.device_x.isEnabled() + assert curve_setting.device_x.text() == wf.x_axis_mode["name"] + assert curve_setting.signal_x.text() == wf.x_axis_mode["entry"] + + ################################################## # CurveTree ##################################################