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:
@ -194,7 +194,7 @@ class DynamicFormItem(QWidget):
|
||||
self.valueChanged.emit()
|
||||
|
||||
|
||||
class StrMetadataField(DynamicFormItem):
|
||||
class StrFormItem(DynamicFormItem):
|
||||
def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None:
|
||||
super().__init__(parent=parent, spec=spec)
|
||||
self._main_widget.textChanged.connect(self._value_changed)
|
||||
@ -223,7 +223,7 @@ class StrMetadataField(DynamicFormItem):
|
||||
self._main_widget.setText(str(value))
|
||||
|
||||
|
||||
class IntMetadataField(DynamicFormItem):
|
||||
class IntFormItem(DynamicFormItem):
|
||||
def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None:
|
||||
super().__init__(parent=parent, spec=spec)
|
||||
self._main_widget.textChanged.connect(self._value_changed)
|
||||
@ -252,7 +252,7 @@ class IntMetadataField(DynamicFormItem):
|
||||
self._main_widget.setValue(value)
|
||||
|
||||
|
||||
class FloatDecimalMetadataField(DynamicFormItem):
|
||||
class FloatDecimalFormItem(DynamicFormItem):
|
||||
def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None:
|
||||
super().__init__(parent=parent, spec=spec)
|
||||
self._main_widget.textChanged.connect(self._value_changed)
|
||||
@ -286,7 +286,7 @@ class FloatDecimalMetadataField(DynamicFormItem):
|
||||
self._main_widget.setValue(float(value))
|
||||
|
||||
|
||||
class BoolMetadataField(DynamicFormItem):
|
||||
class BoolFormItem(DynamicFormItem):
|
||||
def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None:
|
||||
super().__init__(parent=parent, spec=spec)
|
||||
self._main_widget.stateChanged.connect(self._value_changed)
|
||||
@ -307,7 +307,7 @@ class BoolMetadataField(DynamicFormItem):
|
||||
self._main_widget.setChecked(value)
|
||||
|
||||
|
||||
class BoolToggleMetadataField(BoolMetadataField):
|
||||
class BoolToggleFormItem(BoolFormItem):
|
||||
def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None:
|
||||
if spec.info.default is PydanticUndefined:
|
||||
spec.info.default = False
|
||||
@ -321,7 +321,7 @@ class BoolToggleMetadataField(BoolMetadataField):
|
||||
self._main_widget.setChecked(self._default)
|
||||
|
||||
|
||||
class DictMetadataField(DynamicFormItem):
|
||||
class DictFormItem(DynamicFormItem):
|
||||
def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None:
|
||||
super().__init__(parent=parent, spec=spec)
|
||||
self._main_widget.data_changed.connect(self._value_changed)
|
||||
@ -351,7 +351,7 @@ class _ItemAndWidgetType(NamedTuple):
|
||||
default: int | float | str
|
||||
|
||||
|
||||
class ListMetadataField(DynamicFormItem):
|
||||
class ListFormItem(DynamicFormItem):
|
||||
def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None:
|
||||
super().__init__(parent=parent, spec=spec)
|
||||
self._main_widget: QListWidget
|
||||
@ -440,22 +440,22 @@ WidgetTypeRegistry = dict[
|
||||
]
|
||||
|
||||
DEFAULT_WIDGET_TYPES: Final[WidgetTypeRegistry] = {
|
||||
"str": (lambda anno: anno in [str, str | None, None], StrMetadataField),
|
||||
"int": (lambda anno: anno in [int, int | None], IntMetadataField),
|
||||
"str": (lambda anno: anno in [str, str | None, None], StrFormItem),
|
||||
"int": (lambda anno: anno in [int, int | None], IntFormItem),
|
||||
"float_decimal": (
|
||||
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": (
|
||||
lambda anno: anno in [dict, dict | None]
|
||||
or (isinstance(anno, GenericAlias) and anno.__origin__ is dict),
|
||||
DictMetadataField,
|
||||
DictFormItem,
|
||||
),
|
||||
"list": (
|
||||
lambda anno: anno in [list, list | None]
|
||||
or (isinstance(anno, GenericAlias) and anno.__origin__ is list),
|
||||
ListMetadataField,
|
||||
ListFormItem,
|
||||
),
|
||||
}
|
||||
|
||||
@ -468,7 +468,7 @@ def widget_from_type(
|
||||
if predicate(annotation):
|
||||
return widget_type
|
||||
logger.warning(f"Type {annotation} is not (yet) supported in metadata form creation.")
|
||||
return StrMetadataField
|
||||
return StrFormItem
|
||||
|
||||
|
||||
if __name__ == "__main__": # pragma: no cover
|
||||
|
@ -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.items import (
|
||||
DEFAULT_WIDGET_TYPES,
|
||||
BoolMetadataField,
|
||||
BoolToggleMetadataField,
|
||||
BoolFormItem,
|
||||
BoolToggleFormItem,
|
||||
widget_from_type,
|
||||
)
|
||||
|
||||
@ -30,8 +30,8 @@ class DeviceConfigForm(PydanticModelForm):
|
||||
**kwargs,
|
||||
)
|
||||
self._widget_types = DEFAULT_WIDGET_TYPES.copy()
|
||||
self._widget_types["bool"] = (lambda anno: anno is bool, BoolToggleMetadataField)
|
||||
self._widget_types["optional_bool"] = (lambda anno: anno == bool | None, BoolMetadataField)
|
||||
self._widget_types["bool"] = (lambda anno: anno is bool, BoolToggleFormItem)
|
||||
self._widget_types["optional_bool"] = (lambda anno: anno == bool | None, BoolFormItem)
|
||||
self._validity.setVisible(False)
|
||||
self._connect_to_theme_change()
|
||||
self.populate()
|
||||
|
@ -4,11 +4,7 @@ import pytest
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from bec_widgets.utils.forms_from_types.forms import PydanticModelForm, TypedForm
|
||||
from bec_widgets.utils.forms_from_types.items import (
|
||||
FloatDecimalMetadataField,
|
||||
IntMetadataField,
|
||||
StrMetadataField,
|
||||
)
|
||||
from bec_widgets.utils.forms_from_types.items import FloatDecimalFormItem, IntFormItem, StrFormItem
|
||||
|
||||
# pylint: disable=no-member
|
||||
# pylint: disable=missing-function-docstring
|
||||
@ -58,9 +54,9 @@ def model_widget(qtbot):
|
||||
|
||||
|
||||
def test_widget_dict(model_widget: PydanticModelForm):
|
||||
assert isinstance(model_widget.widget_dict["str_optional"], StrMetadataField)
|
||||
assert isinstance(model_widget.widget_dict["float_nodefault"], FloatDecimalMetadataField)
|
||||
assert isinstance(model_widget.widget_dict["int_default"], IntMetadataField)
|
||||
assert isinstance(model_widget.widget_dict["str_optional"], StrFormItem)
|
||||
assert isinstance(model_widget.widget_dict["float_nodefault"], FloatDecimalFormItem)
|
||||
assert isinstance(model_widget.widget_dict["int_default"], IntFormItem)
|
||||
|
||||
|
||||
def test_widget_set_data(model_widget: PydanticModelForm):
|
||||
|
@ -5,7 +5,7 @@ import pytest
|
||||
from pydantic import ValidationError
|
||||
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
|
||||
|
||||
|
||||
@ -75,12 +75,12 @@ def list_field_and_values(request, qtbot):
|
||||
request.param.get("extra"),
|
||||
)
|
||||
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)
|
||||
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
|
||||
assert list_field.getValue() == vals
|
||||
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]
|
||||
|
||||
|
||||
def test_list_field_value_acceptance(
|
||||
list_field_and_values: tuple[ListMetadataField, list, Any, type],
|
||||
):
|
||||
def test_list_field_value_acceptance(list_field_and_values: tuple[ListFormItem, list, Any, type]):
|
||||
class _WrongType(object): ...
|
||||
|
||||
list_field, _, _, t = list_field_and_values
|
||||
|
@ -7,7 +7,7 @@ from bec_lib.endpoints import MessageEndpoints
|
||||
from bec_lib.messages import AvailableResourceMessage, ScanQueueHistoryMessage, ScanQueueMessage
|
||||
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.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")
|
||||
assert scan_control._metadata_form._scan_name == "grid_scan"
|
||||
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")
|
||||
|
||||
scan_control._metadata_form._additional_metadata._table_model._data = TEST_TABLE_ENTRY
|
||||
|
@ -8,12 +8,12 @@ from pydantic.types import Json
|
||||
from qtpy.QtCore import QItemSelectionModel, QPoint, Qt
|
||||
|
||||
from bec_widgets.utils.forms_from_types.items import (
|
||||
BoolMetadataField,
|
||||
DictMetadataField,
|
||||
BoolFormItem,
|
||||
DictFormItem,
|
||||
DynamicFormItem,
|
||||
FloatDecimalMetadataField,
|
||||
IntMetadataField,
|
||||
StrMetadataField,
|
||||
FloatDecimalFormItem,
|
||||
IntFormItem,
|
||||
StrFormItem,
|
||||
)
|
||||
from bec_widgets.widgets.editors.dict_backed_table import DictBackedTable
|
||||
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]],
|
||||
):
|
||||
_, components = metadata_widget
|
||||
assert isinstance(components["sample_name"], StrMetadataField)
|
||||
assert isinstance(components["str_optional"], StrMetadataField)
|
||||
assert isinstance(components["str_required"], StrMetadataField)
|
||||
assert isinstance(components["bool_optional"], BoolMetadataField)
|
||||
assert isinstance(components["bool_required_default"], BoolMetadataField)
|
||||
assert isinstance(components["bool_required_nodefault"], BoolMetadataField)
|
||||
assert isinstance(components["int_default"], IntMetadataField)
|
||||
assert isinstance(components["int_nodefault_optional"], IntMetadataField)
|
||||
assert isinstance(components["float_nodefault"], FloatDecimalMetadataField)
|
||||
assert isinstance(components["decimal_dp_limits_nodefault"], FloatDecimalMetadataField)
|
||||
assert isinstance(components["dict_default"], DictMetadataField)
|
||||
assert isinstance(components["unsupported_class"], StrMetadataField)
|
||||
assert isinstance(components["sample_name"], StrFormItem)
|
||||
assert isinstance(components["str_optional"], StrFormItem)
|
||||
assert isinstance(components["str_required"], StrFormItem)
|
||||
assert isinstance(components["bool_optional"], BoolFormItem)
|
||||
assert isinstance(components["bool_required_default"], BoolFormItem)
|
||||
assert isinstance(components["bool_required_nodefault"], BoolFormItem)
|
||||
assert isinstance(components["int_default"], IntFormItem)
|
||||
assert isinstance(components["int_nodefault_optional"], IntFormItem)
|
||||
assert isinstance(components["float_nodefault"], FloatDecimalFormItem)
|
||||
assert isinstance(components["decimal_dp_limits_nodefault"], FloatDecimalFormItem)
|
||||
assert isinstance(components["dict_default"], DictFormItem)
|
||||
assert isinstance(components["unsupported_class"], StrFormItem)
|
||||
|
||||
|
||||
def test_grid_to_dict(metadata_widget: tuple[ScanMetadata, dict[str, DynamicFormItem]]):
|
||||
|
Reference in New Issue
Block a user