mirror of
https://github.com/bec-project/bec_widgets.git
synced 2025-07-13 11:11:49 +02:00
feat: add a widget to edit lists in forms
This commit is contained in:
@ -69,7 +69,7 @@ def test_scan_metadata_for_custom_scan(
|
||||
def do_test():
|
||||
# Set the metadata
|
||||
grid: QGridLayout = scan_control._metadata_form._form_grid.layout()
|
||||
for i in range(grid.rowCount()): # type: ignore
|
||||
for i in range(grid.rowCount() - 1): # type: ignore
|
||||
field_name = grid.itemAtPosition(i, 0).widget().property("_model_field_name")
|
||||
if (value_to_set := md.pop(field_name, None)) is not None:
|
||||
grid.itemAtPosition(i, 1).widget().setValue(value_to_set)
|
||||
|
@ -1,11 +1,12 @@
|
||||
import sys
|
||||
from typing import Literal
|
||||
from typing import Any, Literal
|
||||
|
||||
import pytest
|
||||
from pydantic import ValidationError
|
||||
from pydantic.fields import FieldInfo
|
||||
|
||||
from bec_widgets.utils.forms_from_types.items import FormItemSpec
|
||||
from bec_widgets.utils.forms_from_types.items import FormItemSpec, ListMetadataField
|
||||
from bec_widgets.utils.widget_io import WidgetIO
|
||||
|
||||
|
||||
@pytest.mark.skipif(sys.version_info < (3, 11), reason="Generic types don't support this in 3.10")
|
||||
@ -58,3 +59,58 @@ def test_form_item_spec(input, validity):
|
||||
else:
|
||||
with pytest.raises(ValidationError):
|
||||
FormItemSpec.model_validate(input)
|
||||
|
||||
|
||||
@pytest.fixture(
|
||||
params=[
|
||||
{"type": list[int], "value": [1, 2, 3], "extra": 79},
|
||||
{"type": list[str], "value": ["a", "b", "c"], "extra": "string"},
|
||||
{"type": list[float], "value": [0.1, 0.2, 0.3], "extra": 79.0},
|
||||
]
|
||||
)
|
||||
def list_metadata_field_and_values(request, qtbot):
|
||||
itype, vals, extra = (
|
||||
request.param.get("type"),
|
||||
request.param.get("value"),
|
||||
request.param.get("extra"),
|
||||
)
|
||||
spec = FormItemSpec(item_type=itype, name="test_list", info=FieldInfo(annotation=itype))
|
||||
(widget := ListMetadataField(parent=None, spec=spec)).setValue(vals)
|
||||
qtbot.addWidget(widget)
|
||||
yield widget, vals, extra
|
||||
|
||||
|
||||
def test_list_metadata_field(list_metadata_field_and_values: tuple[ListMetadataField, list, Any]):
|
||||
list_metadata_field, vals, extra = list_metadata_field_and_values
|
||||
assert list_metadata_field.getValue() == vals
|
||||
assert list_metadata_field._main_widget.count() == 3
|
||||
|
||||
list_metadata_field._add_button.click()
|
||||
assert len(list_metadata_field.getValue()) == 4
|
||||
assert list_metadata_field._main_widget.count() == 4
|
||||
|
||||
list_metadata_field._main_widget.setCurrentRow(-1)
|
||||
list_metadata_field._remove_button.click()
|
||||
assert len(list_metadata_field.getValue()) == 4
|
||||
assert list_metadata_field._main_widget.count() == 4
|
||||
|
||||
list_metadata_field._main_widget.setCurrentRow(2)
|
||||
list_metadata_field._remove_button.click()
|
||||
assert list_metadata_field.getValue() == vals[:2] + [list_metadata_field._types.default]
|
||||
assert list_metadata_field._main_widget.count() == 3
|
||||
|
||||
list_metadata_field._main_widget.setCurrentRow(1)
|
||||
WidgetIO.set_value(
|
||||
list_metadata_field._main_widget.itemWidget(list_metadata_field._main_widget.item(1)), extra
|
||||
)
|
||||
assert list_metadata_field._main_widget.count() == 3
|
||||
assert list_metadata_field.getValue() == [vals[0], extra, list_metadata_field._types.default]
|
||||
|
||||
list_metadata_field._add_item(extra)
|
||||
assert list_metadata_field._main_widget.count() == 4
|
||||
assert list_metadata_field.getValue() == [
|
||||
vals[0],
|
||||
extra,
|
||||
list_metadata_field._types.default,
|
||||
extra,
|
||||
]
|
||||
|
Reference in New Issue
Block a user