0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 03:31:50 +02:00

refactor: rename field widgets

This commit is contained in:
2025-06-12 13:49:13 +02:00
committed by David Perl
parent a9613a07b0
commit b0d03c0648
6 changed files with 45 additions and 51 deletions

View File

@ -194,7 +194,7 @@ class DynamicFormItem(QWidget):
self.valueChanged.emit() self.valueChanged.emit()
class StrMetadataField(DynamicFormItem): class StrFormItem(DynamicFormItem):
def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None: def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None:
super().__init__(parent=parent, spec=spec) super().__init__(parent=parent, spec=spec)
self._main_widget.textChanged.connect(self._value_changed) self._main_widget.textChanged.connect(self._value_changed)
@ -223,7 +223,7 @@ class StrMetadataField(DynamicFormItem):
self._main_widget.setText(str(value)) self._main_widget.setText(str(value))
class IntMetadataField(DynamicFormItem): class IntFormItem(DynamicFormItem):
def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None: def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None:
super().__init__(parent=parent, spec=spec) super().__init__(parent=parent, spec=spec)
self._main_widget.textChanged.connect(self._value_changed) self._main_widget.textChanged.connect(self._value_changed)
@ -252,7 +252,7 @@ class IntMetadataField(DynamicFormItem):
self._main_widget.setValue(value) self._main_widget.setValue(value)
class FloatDecimalMetadataField(DynamicFormItem): class FloatDecimalFormItem(DynamicFormItem):
def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None: def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None:
super().__init__(parent=parent, spec=spec) super().__init__(parent=parent, spec=spec)
self._main_widget.textChanged.connect(self._value_changed) self._main_widget.textChanged.connect(self._value_changed)
@ -286,7 +286,7 @@ class FloatDecimalMetadataField(DynamicFormItem):
self._main_widget.setValue(float(value)) self._main_widget.setValue(float(value))
class BoolMetadataField(DynamicFormItem): class BoolFormItem(DynamicFormItem):
def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None: def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None:
super().__init__(parent=parent, spec=spec) super().__init__(parent=parent, spec=spec)
self._main_widget.stateChanged.connect(self._value_changed) self._main_widget.stateChanged.connect(self._value_changed)
@ -307,7 +307,7 @@ class BoolMetadataField(DynamicFormItem):
self._main_widget.setChecked(value) self._main_widget.setChecked(value)
class BoolToggleMetadataField(BoolMetadataField): class BoolToggleFormItem(BoolFormItem):
def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None: def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None:
if spec.info.default is PydanticUndefined: if spec.info.default is PydanticUndefined:
spec.info.default = False spec.info.default = False
@ -321,7 +321,7 @@ class BoolToggleMetadataField(BoolMetadataField):
self._main_widget.setChecked(self._default) self._main_widget.setChecked(self._default)
class DictMetadataField(DynamicFormItem): class DictFormItem(DynamicFormItem):
def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None: def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None:
super().__init__(parent=parent, spec=spec) super().__init__(parent=parent, spec=spec)
self._main_widget.data_changed.connect(self._value_changed) self._main_widget.data_changed.connect(self._value_changed)
@ -351,7 +351,7 @@ class _ItemAndWidgetType(NamedTuple):
default: int | float | str default: int | float | str
class ListMetadataField(DynamicFormItem): class ListFormItem(DynamicFormItem):
def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None: def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None:
super().__init__(parent=parent, spec=spec) super().__init__(parent=parent, spec=spec)
self._main_widget: QListWidget self._main_widget: QListWidget
@ -440,22 +440,22 @@ WidgetTypeRegistry = dict[
] ]
DEFAULT_WIDGET_TYPES: Final[WidgetTypeRegistry] = { DEFAULT_WIDGET_TYPES: Final[WidgetTypeRegistry] = {
"str": (lambda anno: anno in [str, str | None, None], StrMetadataField), "str": (lambda anno: anno in [str, str | None, None], StrFormItem),
"int": (lambda anno: anno in [int, int | None], IntMetadataField), "int": (lambda anno: anno in [int, int | None], IntFormItem),
"float_decimal": ( "float_decimal": (
lambda anno: anno in [float, float | None, Decimal, Decimal | None], lambda anno: anno in [float, float | None, Decimal, Decimal | None],
FloatDecimalMetadataField, FloatDecimalFormItem,
), ),
"bool": (lambda anno: anno in [bool, bool | None], BoolMetadataField), "bool": (lambda anno: anno in [bool, bool | None], BoolFormItem),
"dict": ( "dict": (
lambda anno: anno in [dict, dict | None] lambda anno: anno in [dict, dict | None]
or (isinstance(anno, GenericAlias) and anno.__origin__ is dict), or (isinstance(anno, GenericAlias) and anno.__origin__ is dict),
DictMetadataField, DictFormItem,
), ),
"list": ( "list": (
lambda anno: anno in [list, list | None] lambda anno: anno in [list, list | None]
or (isinstance(anno, GenericAlias) and anno.__origin__ is list), or (isinstance(anno, GenericAlias) and anno.__origin__ is list),
ListMetadataField, ListFormItem,
), ),
} }
@ -468,7 +468,7 @@ def widget_from_type(
if predicate(annotation): if predicate(annotation):
return widget_type return widget_type
logger.warning(f"Type {annotation} is not (yet) supported in metadata form creation.") logger.warning(f"Type {annotation} is not (yet) supported in metadata form creation.")
return StrMetadataField return StrFormItem
if __name__ == "__main__": # pragma: no cover if __name__ == "__main__": # pragma: no cover

View File

@ -11,8 +11,8 @@ from bec_widgets.utils.forms_from_types import styles
from bec_widgets.utils.forms_from_types.forms import PydanticModelForm from bec_widgets.utils.forms_from_types.forms import PydanticModelForm
from bec_widgets.utils.forms_from_types.items import ( from bec_widgets.utils.forms_from_types.items import (
DEFAULT_WIDGET_TYPES, DEFAULT_WIDGET_TYPES,
BoolMetadataField, BoolFormItem,
BoolToggleMetadataField, BoolToggleFormItem,
widget_from_type, widget_from_type,
) )
@ -30,8 +30,8 @@ class DeviceConfigForm(PydanticModelForm):
**kwargs, **kwargs,
) )
self._widget_types = DEFAULT_WIDGET_TYPES.copy() self._widget_types = DEFAULT_WIDGET_TYPES.copy()
self._widget_types["bool"] = (lambda anno: anno is bool, BoolToggleMetadataField) self._widget_types["bool"] = (lambda anno: anno is bool, BoolToggleFormItem)
self._widget_types["optional_bool"] = (lambda anno: anno == bool | None, BoolMetadataField) self._widget_types["optional_bool"] = (lambda anno: anno == bool | None, BoolFormItem)
self._validity.setVisible(False) self._validity.setVisible(False)
self._connect_to_theme_change() self._connect_to_theme_change()
self.populate() self.populate()

View File

@ -4,11 +4,7 @@ import pytest
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from bec_widgets.utils.forms_from_types.forms import PydanticModelForm, TypedForm from bec_widgets.utils.forms_from_types.forms import PydanticModelForm, TypedForm
from bec_widgets.utils.forms_from_types.items import ( from bec_widgets.utils.forms_from_types.items import FloatDecimalFormItem, IntFormItem, StrFormItem
FloatDecimalMetadataField,
IntMetadataField,
StrMetadataField,
)
# pylint: disable=no-member # pylint: disable=no-member
# pylint: disable=missing-function-docstring # pylint: disable=missing-function-docstring
@ -58,9 +54,9 @@ def model_widget(qtbot):
def test_widget_dict(model_widget: PydanticModelForm): def test_widget_dict(model_widget: PydanticModelForm):
assert isinstance(model_widget.widget_dict["str_optional"], StrMetadataField) assert isinstance(model_widget.widget_dict["str_optional"], StrFormItem)
assert isinstance(model_widget.widget_dict["float_nodefault"], FloatDecimalMetadataField) assert isinstance(model_widget.widget_dict["float_nodefault"], FloatDecimalFormItem)
assert isinstance(model_widget.widget_dict["int_default"], IntMetadataField) assert isinstance(model_widget.widget_dict["int_default"], IntFormItem)
def test_widget_set_data(model_widget: PydanticModelForm): def test_widget_set_data(model_widget: PydanticModelForm):

View File

@ -5,7 +5,7 @@ import pytest
from pydantic import ValidationError from pydantic import ValidationError
from pydantic.fields import FieldInfo from pydantic.fields import FieldInfo
from bec_widgets.utils.forms_from_types.items import FormItemSpec, ListMetadataField from bec_widgets.utils.forms_from_types.items import FormItemSpec, ListFormItem
from bec_widgets.utils.widget_io import WidgetIO from bec_widgets.utils.widget_io import WidgetIO
@ -75,12 +75,12 @@ def list_field_and_values(request, qtbot):
request.param.get("extra"), request.param.get("extra"),
) )
spec = FormItemSpec(item_type=itype, name="test_list", info=FieldInfo(annotation=itype)) spec = FormItemSpec(item_type=itype, name="test_list", info=FieldInfo(annotation=itype))
(widget := ListMetadataField(parent=None, spec=spec)).setValue(vals) (widget := ListFormItem(parent=None, spec=spec)).setValue(vals)
qtbot.addWidget(widget) qtbot.addWidget(widget)
yield widget, vals, extra, get_args(itype)[0] yield widget, vals, extra, get_args(itype)[0]
def test_list_metadata_field(list_field_and_values: tuple[ListMetadataField, list, Any, type]): def test_list_metadata_field(list_field_and_values: tuple[ListFormItem, list, Any, type]):
list_field, vals, extra, _ = list_field_and_values list_field, vals, extra, _ = list_field_and_values
assert list_field.getValue() == vals assert list_field.getValue() == vals
assert list_field._main_widget.count() == 3 assert list_field._main_widget.count() == 3
@ -109,9 +109,7 @@ def test_list_metadata_field(list_field_and_values: tuple[ListMetadataField, lis
assert list_field.getValue() == [vals[0], extra, list_field._types.default, extra] assert list_field.getValue() == [vals[0], extra, list_field._types.default, extra]
def test_list_field_value_acceptance( def test_list_field_value_acceptance(list_field_and_values: tuple[ListFormItem, list, Any, type]):
list_field_and_values: tuple[ListMetadataField, list, Any, type],
):
class _WrongType(object): ... class _WrongType(object): ...
list_field, _, _, t = list_field_and_values list_field, _, _, t = list_field_and_values

View File

@ -7,7 +7,7 @@ from bec_lib.endpoints import MessageEndpoints
from bec_lib.messages import AvailableResourceMessage, ScanQueueHistoryMessage, ScanQueueMessage from bec_lib.messages import AvailableResourceMessage, ScanQueueHistoryMessage, ScanQueueMessage
from qtpy.QtCore import QModelIndex, Qt from qtpy.QtCore import QModelIndex, Qt
from bec_widgets.utils.forms_from_types.items import StrMetadataField from bec_widgets.utils.forms_from_types.items import StrFormItem
from bec_widgets.utils.widget_io import WidgetIO from bec_widgets.utils.widget_io import WidgetIO
from bec_widgets.widgets.control.scan_control import ScanControl from bec_widgets.widgets.control.scan_control import ScanControl
@ -570,7 +570,7 @@ def test_scan_metadata_is_connected(scan_control):
scan_control.comboBox_scan_selection.setCurrentText("grid_scan") scan_control.comboBox_scan_selection.setCurrentText("grid_scan")
assert scan_control._metadata_form._scan_name == "grid_scan" assert scan_control._metadata_form._scan_name == "grid_scan"
sample_name = scan_control._metadata_form._form_grid.layout().itemAtPosition(0, 1).widget() sample_name = scan_control._metadata_form._form_grid.layout().itemAtPosition(0, 1).widget()
assert isinstance(sample_name, StrMetadataField) assert isinstance(sample_name, StrFormItem)
sample_name._main_widget.setText("Test Sample") sample_name._main_widget.setText("Test Sample")
scan_control._metadata_form._additional_metadata._table_model._data = TEST_TABLE_ENTRY scan_control._metadata_form._additional_metadata._table_model._data = TEST_TABLE_ENTRY

View File

@ -8,12 +8,12 @@ from pydantic.types import Json
from qtpy.QtCore import QItemSelectionModel, QPoint, Qt from qtpy.QtCore import QItemSelectionModel, QPoint, Qt
from bec_widgets.utils.forms_from_types.items import ( from bec_widgets.utils.forms_from_types.items import (
BoolMetadataField, BoolFormItem,
DictMetadataField, DictFormItem,
DynamicFormItem, DynamicFormItem,
FloatDecimalMetadataField, FloatDecimalFormItem,
IntMetadataField, IntFormItem,
StrMetadataField, StrFormItem,
) )
from bec_widgets.widgets.editors.dict_backed_table import DictBackedTable from bec_widgets.widgets.editors.dict_backed_table import DictBackedTable
from bec_widgets.widgets.editors.scan_metadata.scan_metadata import ScanMetadata from bec_widgets.widgets.editors.scan_metadata.scan_metadata import ScanMetadata
@ -125,18 +125,18 @@ def test_griditems_are_correct_class(
metadata_widget: tuple[ScanMetadata, dict[str, DynamicFormItem]], metadata_widget: tuple[ScanMetadata, dict[str, DynamicFormItem]],
): ):
_, components = metadata_widget _, components = metadata_widget
assert isinstance(components["sample_name"], StrMetadataField) assert isinstance(components["sample_name"], StrFormItem)
assert isinstance(components["str_optional"], StrMetadataField) assert isinstance(components["str_optional"], StrFormItem)
assert isinstance(components["str_required"], StrMetadataField) assert isinstance(components["str_required"], StrFormItem)
assert isinstance(components["bool_optional"], BoolMetadataField) assert isinstance(components["bool_optional"], BoolFormItem)
assert isinstance(components["bool_required_default"], BoolMetadataField) assert isinstance(components["bool_required_default"], BoolFormItem)
assert isinstance(components["bool_required_nodefault"], BoolMetadataField) assert isinstance(components["bool_required_nodefault"], BoolFormItem)
assert isinstance(components["int_default"], IntMetadataField) assert isinstance(components["int_default"], IntFormItem)
assert isinstance(components["int_nodefault_optional"], IntMetadataField) assert isinstance(components["int_nodefault_optional"], IntFormItem)
assert isinstance(components["float_nodefault"], FloatDecimalMetadataField) assert isinstance(components["float_nodefault"], FloatDecimalFormItem)
assert isinstance(components["decimal_dp_limits_nodefault"], FloatDecimalMetadataField) assert isinstance(components["decimal_dp_limits_nodefault"], FloatDecimalFormItem)
assert isinstance(components["dict_default"], DictMetadataField) assert isinstance(components["dict_default"], DictFormItem)
assert isinstance(components["unsupported_class"], StrMetadataField) assert isinstance(components["unsupported_class"], StrFormItem)
def test_grid_to_dict(metadata_widget: tuple[ScanMetadata, dict[str, DynamicFormItem]]): def test_grid_to_dict(metadata_widget: tuple[ScanMetadata, dict[str, DynamicFormItem]]):