0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-13 19:21:50 +02:00

feat(waveform): move x axis selection to a combobox

This commit is contained in:
2025-06-25 17:17:31 +02:00
committed by Klaus Wakonig
parent 6b248e93f5
commit d10328cb5c
2 changed files with 52 additions and 15 deletions

View File

@ -2,13 +2,12 @@ from __future__ import annotations
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from qtpy.QtCore import QSize from qtpy.QtCore import QSize, Qt
from qtpy.QtWidgets import ( from qtpy.QtWidgets import (
QComboBox, QComboBox,
QGroupBox, QGroupBox,
QHBoxLayout, QHBoxLayout,
QLabel, QLabel,
QLineEdit,
QSizePolicy, QSizePolicy,
QVBoxLayout, QVBoxLayout,
QWidget, QWidget,
@ -16,9 +15,8 @@ from qtpy.QtWidgets import (
from bec_widgets.utils.error_popups import SafeSlot from bec_widgets.utils.error_popups import SafeSlot
from bec_widgets.utils.settings_dialog import SettingWidget from bec_widgets.utils.settings_dialog import SettingWidget
from bec_widgets.widgets.control.device_input.device_line_edit.device_line_edit import ( from bec_widgets.widgets.control.device_input.device_combobox.device_combobox import DeviceComboBox
DeviceLineEdit, from bec_widgets.widgets.control.device_input.signal_combobox.signal_combobox import SignalComboBox
)
from bec_widgets.widgets.plots.waveform.settings.curve_settings.curve_tree import CurveTree from bec_widgets.widgets.plots.waveform.settings.curve_settings.curve_tree import CurveTree
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
@ -30,6 +28,7 @@ class CurveSetting(SettingWidget):
super().__init__(parent=parent, *args, **kwargs) super().__init__(parent=parent, *args, **kwargs)
self.setProperty("skip_settings", True) self.setProperty("skip_settings", True)
self.target_widget = target_widget self.target_widget = target_widget
self._x_settings_connected = False
self.layout = QVBoxLayout(self) self.layout = QVBoxLayout(self)
@ -56,10 +55,15 @@ class CurveSetting(SettingWidget):
self.spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.device_x_label = QLabel("Device") self.device_x_label = QLabel("Device")
self.device_x = DeviceLineEdit(parent=self) self.device_x = DeviceComboBox(parent=self)
self.device_x.insertItem(0, "")
self.device_x.setEditable(True)
self.signal_x_label = QLabel("Signal") self.signal_x_label = QLabel("Signal")
self.signal_x = QLineEdit() self.signal_x = SignalComboBox(parent=self)
self.signal_x.include_config_signals = False
self.signal_x.insertItem(0, "")
self.signal_x.setEditable(True)
self._get_x_mode_from_waveform() self._get_x_mode_from_waveform()
self.switch_x_device_selection() self.switch_x_device_selection()
@ -85,11 +89,41 @@ class CurveSetting(SettingWidget):
def switch_x_device_selection(self): def switch_x_device_selection(self):
if self.mode_combo.currentText() == "device": if self.mode_combo.currentText() == "device":
self._x_settings_connected = True
self.device_x.currentTextChanged.connect(self.signal_x.set_device)
self.device_x.device_reset.connect(self.signal_x.reset_selection)
self.device_x.setEnabled(True) self.device_x.setEnabled(True)
self.device_x.setText(self.target_widget.x_axis_mode["name"]) self.signal_x.setEnabled(True)
self.signal_x.setText(self.target_widget.x_axis_mode["entry"]) item = self.device_x.findText(self.target_widget.x_axis_mode["name"])
self.device_x.setCurrentIndex(item if item != -1 else 0)
signal_x = self.target_widget.x_axis_mode.get("entry", "")
if signal_x:
for i in range(self.signal_x.count()):
signal_data = self.signal_x.itemData(i)
if signal_data and signal_data.get("obj_name") == signal_x:
self.signal_x.setCurrentIndex(i)
break
else:
# If no match is found, set to the first enabled item
for i in range(self.signal_x.count()):
model = self.signal_x.model()
if model.flags(model.index(i, 0)) & Qt.ItemIsEnabled:
self.signal_x.setCurrentIndex(i)
break
else:
# If no enabled item is found, set to the first item
self.signal_x.setCurrentIndex(0)
else: else:
self.device_x.setEnabled(False) self.device_x.setEnabled(False)
self.signal_x.setEnabled(False)
self.device_x.setCurrentIndex(0)
self.signal_x.setCurrentIndex(0)
if self._x_settings_connected:
self._x_settings_connected = False
self.device_x.currentTextChanged.disconnect(self.signal_x.set_device)
self.device_x.device_reset.disconnect(self.signal_x.reset_selection)
def _init_y_box(self): def _init_y_box(self):
self.y_axis_box = QGroupBox("Y Axis") self.y_axis_box = QGroupBox("Y Axis")
@ -108,10 +142,11 @@ class CurveSetting(SettingWidget):
Accepts the changes made in the settings widget and applies them to the target widget. Accepts the changes made in the settings widget and applies them to the target widget.
""" """
if self.mode_combo.currentText() == "device": if self.mode_combo.currentText() == "device":
self.target_widget.x_mode = self.device_x.text() self.target_widget.x_mode = self.device_x.currentText()
signal_x = self.signal_x.text() signal_x = self.signal_x.currentText()
signal_data = self.signal_x.itemData(self.signal_x.currentIndex())
if signal_x != "": if signal_x != "":
self.target_widget.x_entry = signal_x self.target_widget.x_entry = signal_data.get("obj_name", signal_x)
else: else:
self.target_widget.x_mode = self.mode_combo.currentText() self.target_widget.x_mode = self.mode_combo.currentText()
self.curve_manager.send_curve_json() self.curve_manager.send_curve_json()
@ -126,5 +161,7 @@ class CurveSetting(SettingWidget):
"""Cleanup the widget.""" """Cleanup the widget."""
self.device_x.close() self.device_x.close()
self.device_x.deleteLater() self.device_x.deleteLater()
self.signal_x.close()
self.signal_x.deleteLater()
self.curve_manager.close() self.curve_manager.close()
self.curve_manager.deleteLater() self.curve_manager.deleteLater()

View File

@ -93,7 +93,7 @@ def test_curve_setting_switch_device_mode(curve_setting_fixture, qtbot):
assert curve_setting.device_x.isEnabled() assert curve_setting.device_x.isEnabled()
# This line edit should reflect the waveform.x_axis_mode["name"], or be blank if none # This line edit should reflect the waveform.x_axis_mode["name"], or be blank if none
assert curve_setting.device_x.text() == wf.x_axis_mode["name"] assert curve_setting.device_x.currentText() == ""
def test_curve_setting_refresh(curve_setting_fixture, qtbot): def test_curve_setting_refresh(curve_setting_fixture, qtbot):
@ -127,8 +127,8 @@ def test_change_device_from_target_widget(curve_setting_fixture, qtbot):
assert curve_setting.mode_combo.currentText() == "device" assert curve_setting.mode_combo.currentText() == "device"
assert curve_setting.device_x.isEnabled() assert curve_setting.device_x.isEnabled()
assert curve_setting.device_x.text() == wf.x_axis_mode["name"] assert curve_setting.device_x.currentText() == wf.x_axis_mode["name"]
assert curve_setting.signal_x.text() == wf.x_axis_mode["entry"] assert curve_setting.signal_x.currentText() == f"{wf.x_axis_mode['entry']} (readback)"
################################################## ##################################################