From eed259b93b35c77c8e4a13e3043e131d2bcb24db Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Fri, 29 May 2026 16:32:35 +0200 Subject: [PATCH] wip form design --- .../beamline_states/beamline_state_pill.py | 91 +++++++++---------- tests/unit_tests/test_beamline_state_pill.py | 5 +- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/bec_widgets/widgets/services/beamline_states/beamline_state_pill.py b/bec_widgets/widgets/services/beamline_states/beamline_state_pill.py index 9b6e9c4a..76744d36 100644 --- a/bec_widgets/widgets/services/beamline_states/beamline_state_pill.py +++ b/bec_widgets/widgets/services/beamline_states/beamline_state_pill.py @@ -16,7 +16,6 @@ from qtpy.QtWidgets import ( QDialog, QDialogButtonBox, QFormLayout, - QGridLayout, QGroupBox, QHBoxLayout, QLabel, @@ -68,6 +67,7 @@ class BeamlineStatePill(BECWidget, QWidget): "warning": "warning", "unknown": "help", } + _SETTINGS_FIELD_WIDTH = 280 def __init__( self, @@ -157,19 +157,13 @@ class BeamlineStatePill(BECWidget, QWidget): self._low_limit_enabled.toggled.connect(self._low_limit.setEnabled) self._high_limit_enabled.toggled.connect(self._high_limit.setEnabled) - self._type_label = self._create_settings_label("Type") - self._name_settings_label = self._create_settings_label("Name") - self._title_label = self._create_settings_label("Title") - self._device_label = self._create_settings_label("Device") - self._signal_label = self._create_settings_label("Signal") - self._low_limit_label = self._create_settings_label("Low limit") - self._high_limit_label = self._create_settings_label("High limit") - self._tolerance_label = self._create_settings_label("Tolerance") + for field in self._settings_input_fields(): + field.setMinimumWidth(self._SETTINGS_FIELD_WIDTH) + field.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) button_layout = QHBoxLayout() button_layout.setContentsMargins(0, 0, 0, 0) button_layout.setSpacing(8) - button_layout.addStretch(1) self._update_button = QPushButton("Update", self._settings) self._update_button.setIcon(material_icon("save", convert_to_pixmap=False)) self._remove_button = QPushButton("Remove", self._settings) @@ -179,44 +173,36 @@ class BeamlineStatePill(BECWidget, QWidget): self._remove_button.clicked.connect(self._emit_remove_requested) button_layout.addWidget(self._update_button) button_layout.addWidget(self._remove_button) + button_layout.addStretch(1) - self._settings_grid = QGridLayout() - self._settings_grid.setContentsMargins(12, 8, 12, 8) - self._settings_grid.setHorizontalSpacing(10) - self._settings_grid.setVerticalSpacing(8) - self._settings_grid.addWidget(self._type_label, 0, 0) - self._settings_grid.addWidget(self._state_type_value, 0, 1) - self._settings_grid.addWidget(self._name_settings_label, 0, 2) - self._settings_grid.addWidget(self._name_value, 0, 3) - self._settings_grid.addWidget(self._title_label, 1, 0) - self._settings_grid.addWidget(self._title_edit, 1, 1, 1, 3) - self._settings_grid.addWidget(self._device_label, 2, 0) - self._settings_grid.addWidget(self._device_edit, 2, 1) - self._settings_grid.addWidget(self._signal_label, 2, 2) - self._settings_grid.addWidget(self._signal_edit, 2, 3) - self._settings_grid.addWidget(self._low_limit_label, 3, 0) - self._settings_grid.addWidget(self._low_limit.parentWidget(), 3, 1) - self._settings_grid.addWidget(self._high_limit_label, 3, 2) - self._settings_grid.addWidget(self._high_limit.parentWidget(), 3, 3) - self._settings_grid.addWidget(self._tolerance_label, 4, 0) - self._settings_grid.addWidget(self._tolerance, 4, 1) - self._settings_grid.addLayout(button_layout, 4, 2, 1, 2) - self._settings_grid.setColumnStretch(1, 1) - self._settings_grid.setColumnStretch(3, 1) + self._settings_form = QFormLayout() + self._settings_form.setContentsMargins(12, 8, 12, 8) + self._settings_form.setHorizontalSpacing(10) + self._settings_form.setVerticalSpacing(8) + self._settings_form.setFieldGrowthPolicy( + QFormLayout.FieldGrowthPolicy.AllNonFixedFieldsGrow + ) + self._settings_form.setLabelAlignment(Qt.AlignmentFlag.AlignRight) + self._settings_form.addRow("Type", self._state_type_value) + self._settings_form.addRow("Name", self._name_value) + self._settings_form.addRow("Title", self._title_edit) + self._settings_form.addRow("Device", self._device_edit) + self._settings_form.addRow("Signal", self._signal_edit) + self._settings_form.addRow("Low limit", self._low_limit.parentWidget()) + self._settings_form.addRow("High limit", self._high_limit.parentWidget()) + self._settings_form.addRow("Tolerance", self._tolerance) + self._settings_form.addRow(button_layout) self._limit_widgets = ( - self._low_limit_label, self._low_limit.parentWidget(), - self._high_limit_label, self._high_limit.parentWidget(), - self._tolerance_label, self._tolerance, ) settings_layout = QVBoxLayout(self._settings) settings_layout.setContentsMargins(0, 0, 0, 0) settings_layout.setSpacing(0) - settings_layout.addLayout(self._settings_grid) + settings_layout.addLayout(self._settings_form) layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) @@ -414,7 +400,7 @@ class BeamlineStatePill(BECWidget, QWidget): self._state_field(key) is not None for key in ("low_limit", "high_limit", "tolerance") ) for widget in self._limit_widgets: - widget.setVisible(show_limits) + self._set_form_row_visible(widget, show_limits) if not show_limits: return @@ -519,27 +505,20 @@ class BeamlineStatePill(BECWidget, QWidget): def _configure_settings_spinbox(spin_box: BECSpinBox) -> None: spin_box.setRange(-1_000_000_000, 1_000_000_000) spin_box.setDecimals(6) - spin_box.setFixedWidth(140) def _create_optional_limit_row(self) -> tuple[QCheckBox, BECSpinBox]: container = QWidget(self) checkbox = QCheckBox("Enabled", container) spin_box = BECSpinBox(container) self._configure_settings_spinbox(spin_box) + spin_box.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) layout = QHBoxLayout(container) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(8) layout.addWidget(checkbox) - layout.addWidget(spin_box) - layout.addStretch(1) + layout.addWidget(spin_box, 1) return checkbox, spin_box - def _create_settings_label(self, text: str) -> QLabel: - label = QLabel(text, self._settings) - label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) - label.setTextFormat(Qt.TextFormat.PlainText) - return label - @staticmethod def _set_optional_limit(checkbox: QCheckBox, spin_box: BECSpinBox, value: Any) -> None: enabled = value is not None @@ -548,6 +527,24 @@ class BeamlineStatePill(BECWidget, QWidget): if enabled: spin_box.setValue(float(value)) + def _settings_input_fields(self) -> tuple[QWidget, ...]: + return ( + self._state_type_value, + self._name_value, + self._title_edit, + self._device_edit, + self._signal_edit, + self._low_limit.parentWidget(), + self._high_limit.parentWidget(), + self._tolerance, + ) + + def _set_form_row_visible(self, widget: QWidget, visible: bool) -> None: + widget.setVisible(visible) + label = self._settings_form.labelForField(widget) + if label is not None: + label.setVisible(visible) + def _clear_state_flash(self) -> None: self._flash_active = False self._apply_visual_state() diff --git a/tests/unit_tests/test_beamline_state_pill.py b/tests/unit_tests/test_beamline_state_pill.py index 2a709baa..6f9073da 100644 --- a/tests/unit_tests/test_beamline_state_pill.py +++ b/tests/unit_tests/test_beamline_state_pill.py @@ -1,7 +1,7 @@ import shiboken6 from bec_lib import messages from qtpy.QtCore import QCoreApplication, QEvent, Qt -from qtpy.QtWidgets import QMessageBox +from qtpy.QtWidgets import QMessageBox, QSizePolicy from bec_widgets.utils.toolbars.toolbar import ModularToolBar from bec_widgets.widgets.services.beamline_states.beamline_state_pill import ( @@ -74,6 +74,9 @@ def test_beamline_state_pill_expands_and_emits_updated_limits(qtbot, mocked_clie assert isinstance(widget._device_edit, DeviceComboBox) assert isinstance(widget._signal_edit, SignalComboBox) assert widget._device_edit.currentText() == "samx" + for field in widget._settings_input_fields(): + assert field.minimumWidth() == widget._SETTINGS_FIELD_WIDTH + assert field.sizePolicy().horizontalPolicy() == QSizePolicy.Policy.Expanding assert widget.edited_parameters()["high_limit"] == 20.0 with qtbot.waitSignal(widget.update_requested) as signal: