Skip to content

Commit 3a15b43

Browse files
committed
Progress on array widget
1 parent b7e254d commit 3a15b43

File tree

5 files changed

+281
-169
lines changed

5 files changed

+281
-169
lines changed

qt_jsonschema_form/form.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@
66

77

88
# TODO
9-
def compute_defaults(schema) -> Optional[dict]:
9+
def compute_defaults(schema):
1010
if "default" in schema:
1111
return schema["default"]
1212

1313
schema_type = schema["type"]
1414

1515
if schema_type == "object":
16-
return {k: compute_defaults(v) for k, v in schema["properties"].items()}
16+
return {k: compute_defaults(s) for k, s in schema["properties"].items()}
1717
elif schema_type == "array":
18-
return None
18+
items_schema = schema['items']
19+
if isinstance(items_schema, dict):
20+
return []
21+
return [compute_defaults(s) for s in schema["items"]]
1922

2023
return None
2124

@@ -86,10 +89,9 @@ def create_widget(self, schema: dict, ui_schema: dict, state=None) -> widgets.Wi
8689
widget_variant = ui_schema.get('ui:widget', default_variant)
8790
widget_cls = self.widget_map[schema_type][widget_variant]
8891

89-
widget = widget_cls(schema, ui_schema, self) # TODO set state
90-
# TODO
91-
# default_state = get_widget_state(schema, state)
92-
# if default_state is not None:
93-
# print("sET", default_state)
94-
# widget.state = default_state
92+
widget = widget_cls(schema, ui_schema, self)
93+
94+
default_state = get_widget_state(schema, state)
95+
if default_state is not None:
96+
widget.state = default_state
9597
return widget

qt_jsonschema_form/signal.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class BoundSignal:
1717
def __init__(self):
1818
self._subscribers = []
1919

20-
def __call__(self, *args):
20+
def emit(self, *args):
2121
for sub in self._subscribers:
2222
sub(*args)
2323

qt_jsonschema_form/utils.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from functools import wraps
2+
from typing import Iterator
3+
4+
from PyQt5 import QtWidgets
5+
6+
7+
class StateProperty(property):
8+
9+
def setter(self, fset):
10+
@wraps(fset)
11+
def _setter(*args):
12+
*head, value = args
13+
if value is not None:
14+
fset(*head, value)
15+
16+
return super().setter(_setter)
17+
18+
19+
state_property = StateProperty
20+
21+
22+
def reject_none(func):
23+
"""Only invoke function if state argument is not None"""
24+
25+
@wraps(func)
26+
def wrapper(self, state):
27+
if state is None:
28+
return
29+
func(self, state)
30+
31+
return wrapper
32+
33+
34+
def is_concrete_schema(schema: dict) -> bool:
35+
return "type" in schema
36+
37+
38+
def iter_layout_items(layout) -> Iterator[QtWidgets.QLayoutItem]:
39+
return (layout.itemAt(i) for i in range(layout.count()))
40+
41+
42+
def iter_layout_widgets(layout: QtWidgets.QLayout) -> Iterator[QtWidgets.QWidget]:
43+
return (i.widget() for i in iter_layout_items(layout))

0 commit comments

Comments
 (0)