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()
|
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
|
||||||
|
@ -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()
|
||||||
|
@ -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):
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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]]):
|
||||||
|
Reference in New Issue
Block a user