wip form design

This commit is contained in:
2026-05-29 16:32:35 +02:00
parent 227b49e752
commit eed259b93b
2 changed files with 48 additions and 48 deletions
@@ -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()
+4 -1
View File
@@ -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: