0
0
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:
2025-06-04 14:21:05 +02:00
committed by David Perl
parent d626caae3d
commit 7fc85bac7f
6 changed files with 219 additions and 37 deletions

View File

@ -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)

View File

@ -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,
]