mirror of
https://github.com/bec-project/bec_widgets.git
synced 2026-06-05 04:48:40 +02:00
wip form design
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user