dearpygui-forms 0.2.0__py3-none-any.whl → 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dearpygui_forms/dpg_form.py +4 -0
- dearpygui_forms/exceptions.py +2 -0
- dearpygui_forms/widgets.py +64 -24
- {dearpygui_forms-0.2.0.dist-info → dearpygui_forms-0.2.1.dist-info}/METADATA +1 -1
- dearpygui_forms-0.2.1.dist-info/RECORD +8 -0
- dearpygui_forms-0.2.0.dist-info/RECORD +0 -7
- {dearpygui_forms-0.2.0.dist-info → dearpygui_forms-0.2.1.dist-info}/WHEEL +0 -0
dearpygui_forms/dpg_form.py
CHANGED
@@ -9,6 +9,7 @@ from loguru import logger
|
|
9
9
|
|
10
10
|
from .models import PropertySchema
|
11
11
|
from .widgets import *
|
12
|
+
from . import exceptions
|
12
13
|
|
13
14
|
|
14
15
|
def extract_defs(schema: dict[str, Any]) -> tuple[dict[str, Any], dict[str, Any]]:
|
@@ -46,6 +47,9 @@ class DPGForm:
|
|
46
47
|
except pydantic.ValidationError as e:
|
47
48
|
with dpg.window(modal=True, label="Validation Error"):
|
48
49
|
dpg.add_text(f"Validation error: {e}")
|
50
|
+
except exceptions.DearpyguiFormsError as e:
|
51
|
+
with dpg.window(modal=True, label="Form Error"):
|
52
|
+
dpg.add_text(f"Form error: {e}")
|
49
53
|
else:
|
50
54
|
self._callback(data)
|
51
55
|
|
dearpygui_forms/widgets.py
CHANGED
@@ -6,6 +6,7 @@ from loguru import logger
|
|
6
6
|
|
7
7
|
|
8
8
|
from .models import PropertySchema
|
9
|
+
from .exceptions import DearpyguiFormsError
|
9
10
|
|
10
11
|
|
11
12
|
@logger.catch
|
@@ -26,7 +27,8 @@ class Widget:
|
|
26
27
|
self._defs = defs
|
27
28
|
self._kwargs = kwargs
|
28
29
|
with dpg.stage() as self._staging_container_id:
|
29
|
-
|
30
|
+
with dpg.group() as self._root_item:
|
31
|
+
self._ui()
|
30
32
|
|
31
33
|
if schema.default:
|
32
34
|
self.set_value(schema.default)
|
@@ -34,8 +36,25 @@ class Widget:
|
|
34
36
|
def _ui(self):
|
35
37
|
dpg.add_text(f"Property {self.schema.title}, type: {self.schema.type}")
|
36
38
|
|
37
|
-
def add(self):
|
38
|
-
|
39
|
+
def add(self, parent=None, hidden=False):
|
40
|
+
"""
|
41
|
+
Add widget as dpg ui item.
|
42
|
+
"""
|
43
|
+
if parent is not None:
|
44
|
+
dpg.push_container_stack(parent)
|
45
|
+
dpg.unstage(self._staging_container_id)
|
46
|
+
dpg.pop_container_stack()
|
47
|
+
else:
|
48
|
+
dpg.unstage(self._staging_container_id)
|
49
|
+
|
50
|
+
if hidden:
|
51
|
+
self.hide()
|
52
|
+
|
53
|
+
def hide(self):
|
54
|
+
dpg.hide_item(self._root_item)
|
55
|
+
|
56
|
+
def show(self):
|
57
|
+
dpg.show_item(self._root_item)
|
39
58
|
|
40
59
|
def set_value(self, value: Any):
|
41
60
|
pass
|
@@ -44,10 +63,9 @@ class Widget:
|
|
44
63
|
pass
|
45
64
|
|
46
65
|
|
47
|
-
|
48
66
|
class ObjectWidget(Widget):
|
49
67
|
def __init__(self, schema, defs, **kwargs):
|
50
|
-
self._properties = {}
|
68
|
+
self._properties: dict[str, Widget] = {}
|
51
69
|
super().__init__(schema, defs, **kwargs)
|
52
70
|
|
53
71
|
def _ui(self):
|
@@ -73,29 +91,42 @@ class MultiTypeWidget(Widget):
|
|
73
91
|
def __init__(self, schema, defs, **kwargs):
|
74
92
|
self._type_switcher_id = dpg.generate_uuid()
|
75
93
|
self._widget: Widget | None = None
|
76
|
-
self._widgets
|
77
|
-
|
78
|
-
|
94
|
+
self._widgets: dict[str, Widget] = {}
|
95
|
+
for type_schema in schema.anyOf:
|
96
|
+
widget = generate_widget(type_schema, defs, generate_object=False)
|
97
|
+
self._widgets[widget.schema.type] = widget
|
79
98
|
|
99
|
+
super().__init__(schema, defs, **kwargs)
|
80
100
|
|
81
101
|
def _ui(self):
|
82
|
-
dpg.
|
83
|
-
|
84
|
-
dpg.add_combo(label="Type",
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
102
|
+
with dpg.group(horizontal=True):
|
103
|
+
dpg.add_text(self.schema.title)
|
104
|
+
dpg.add_combo(label="Type",
|
105
|
+
tag=self._type_switcher_id,
|
106
|
+
items=list(self._widgets.keys()),
|
107
|
+
callback=self.switch_value_type,
|
108
|
+
no_preview=True
|
109
|
+
)
|
110
|
+
with dpg.group(indent=25) as self._form:
|
111
|
+
for widget in self._widgets.values():
|
112
|
+
widget.add(hidden=True)
|
113
|
+
|
114
|
+
def switch_value_type(self):
|
115
|
+
new_type = dpg.get_value(self._type_switcher_id)
|
116
|
+
if self._widget is not None:
|
117
|
+
self._widget.hide()
|
118
|
+
self._widget = self._widgets[new_type]
|
119
|
+
self._widget.show()
|
90
120
|
|
91
121
|
def get_value(self):
|
92
122
|
if self._widget:
|
93
123
|
return self._widget.get_value()
|
94
124
|
else:
|
95
|
-
|
125
|
+
raise DearpyguiFormsError(f"{self.schema.title}: choose value type")
|
96
126
|
|
97
127
|
def set_value(self, value):
|
98
|
-
|
128
|
+
pass
|
129
|
+
# dpg.set_value(self._type_switcher_id, value)
|
99
130
|
|
100
131
|
|
101
132
|
class StringWidget(Widget):
|
@@ -175,16 +206,27 @@ class NoneWidget(Widget):
|
|
175
206
|
class ExternalWidget(Widget):
|
176
207
|
def __init__(self, schema, defs, **kwargs):
|
177
208
|
self._external_id = dpg.generate_uuid()
|
209
|
+
self._widget: Widget | None = None
|
178
210
|
super().__init__(schema, defs, **kwargs)
|
179
211
|
|
180
212
|
def _ui(self):
|
181
|
-
dpg.
|
213
|
+
with dpg.tree_node(label=self.schema.title) as self._form:
|
214
|
+
self._edit_button = dpg.add_button(label=f"Edit", callback=self.show_object_form)
|
215
|
+
|
216
|
+
def show_object_form(self):
|
217
|
+
if self._widget is None:
|
218
|
+
dpg.delete_item(self._edit_button)
|
219
|
+
self._widget = ObjectWidget(self.schema, self._defs)
|
220
|
+
self._widget.add(parent=self._form)
|
182
221
|
|
183
222
|
def get_value(self):
|
184
|
-
|
223
|
+
if self._widget is None:
|
224
|
+
raise DearpyguiFormsError(f"{self.schema.title}: set up object.")
|
225
|
+
return self._widget.get_value()
|
185
226
|
|
186
227
|
def set_value(self, value):
|
187
|
-
|
228
|
+
self.show_object_form()
|
229
|
+
self._widget.set_value(value)
|
188
230
|
|
189
231
|
|
190
232
|
def generate_widget(json_schema: dict[str, Any], defs: dict[str, Any], generate_object: bool = True, **kwargs) -> Widget:
|
@@ -194,7 +236,6 @@ def generate_widget(json_schema: dict[str, Any], defs: dict[str, Any], generate
|
|
194
236
|
if generate_object:
|
195
237
|
return ObjectWidget(schema, defs, **kwargs)
|
196
238
|
else:
|
197
|
-
raise NotImplementedError("ExternalWidget is not implemented yet")
|
198
239
|
return ExternalWidget(schema, defs, **kwargs)
|
199
240
|
case PropertySchema(type='array'):
|
200
241
|
raise NotImplementedError("ArrayWidget is not implemented yet")
|
@@ -210,7 +251,6 @@ def generate_widget(json_schema: dict[str, Any], defs: dict[str, Any], generate
|
|
210
251
|
case PropertySchema(type='null'):
|
211
252
|
return NoneWidget(schema, defs, **kwargs)
|
212
253
|
case PropertySchema(anyOf=types) if len(types) > 0:
|
213
|
-
|
214
|
-
# return MultiTypeWidget(schema, defs, **kwargs)
|
254
|
+
return MultiTypeWidget(schema, defs, **kwargs)
|
215
255
|
case _:
|
216
256
|
raise ValueError(f"Unsupported schema: {schema}")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: dearpygui-forms
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.1
|
4
4
|
Summary: Dearpygui extention for autogeneration forms powered by pydantic.
|
5
5
|
Project-URL: homepage, https://github.com/vlewicki/dearpygui-forms
|
6
6
|
Author-email: Valentin Lewicki <vlewicki@vlewicki.ru>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
dearpygui_forms/__init__.py,sha256=G_SP5hMol1eeOBLl0Lsphe1yyQ800aaCzI0gp03UagE,104
|
2
|
+
dearpygui_forms/dpg_form.py,sha256=ShdPOPKSjOFS2jC2aG1f_8-c3V3Vhc2JJLrPxqBjvJc,1778
|
3
|
+
dearpygui_forms/exceptions.py,sha256=3ZEGpeCdkIIpH92yoNu6pVcF6HxyFSuWdjAOwfIdVuU,47
|
4
|
+
dearpygui_forms/models.py,sha256=74CL8WvfY5Qrh-Fx1uSmRU-TY33r_LtFtS1unYqWI5M,636
|
5
|
+
dearpygui_forms/widgets.py,sha256=shzIP0P4rSM5OJC_LnjtSO-Y50rOH2wMgQNUZ8Te4W0,8254
|
6
|
+
dearpygui_forms-0.2.1.dist-info/METADATA,sha256=p9k_2L1e2UAuL5mtQvNj5Hu3laHZA2Iz1VB7x22qgnw,1457
|
7
|
+
dearpygui_forms-0.2.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
8
|
+
dearpygui_forms-0.2.1.dist-info/RECORD,,
|
@@ -1,7 +0,0 @@
|
|
1
|
-
dearpygui_forms/__init__.py,sha256=G_SP5hMol1eeOBLl0Lsphe1yyQ800aaCzI0gp03UagE,104
|
2
|
-
dearpygui_forms/dpg_form.py,sha256=hFSWL3BSc0sxVbA2b-_GLGUPIld1VXkGwImQVs8j3nE,1591
|
3
|
-
dearpygui_forms/models.py,sha256=74CL8WvfY5Qrh-Fx1uSmRU-TY33r_LtFtS1unYqWI5M,636
|
4
|
-
dearpygui_forms/widgets.py,sha256=hZsepjOtJtMloNeOaNVgAzNaTeZoznfPNwS7gnstLyw,6851
|
5
|
-
dearpygui_forms-0.2.0.dist-info/METADATA,sha256=MDdweUUm5niI4vdOvI5b7YRSpB_ss4VS7C1a9Ls01MA,1457
|
6
|
-
dearpygui_forms-0.2.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
7
|
-
dearpygui_forms-0.2.0.dist-info/RECORD,,
|
File without changes
|