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.
@@ -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
 
@@ -0,0 +1,2 @@
1
+ class DearpyguiFormsError(Exception):
2
+ pass
@@ -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
- self._ui()
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
- dpg.unstage(self._staging_container_id)
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 = [generate_widget(type_schema, defs) for type_schema in schema.anyOf]
77
- super().__init__(schema, defs, **kwargs)
78
- logger.debug(defs)
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.add_text(self.schema.title)
83
- with dpg.group(indent=10):
84
- dpg.add_combo(label="Type", tag=self._type_switcher_id, items=tuple(x.schema.title or x.schema.type for x in self._widgets), callback=self.switch_value_type)
85
-
86
-
87
- def switch_value_type(self, new_type):
88
- logger.debug(f"Switching to type {dpg.get_value(self._type_switcher_id)}")
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
- return None
125
+ raise DearpyguiFormsError(f"{self.schema.title}: choose value type")
96
126
 
97
127
  def set_value(self, value):
98
- dpg.set_value(self._type_switcher_id, value)
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.add_button(label=self.schema.title, tag=self._external_id, enabled=False)
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
- return None
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
- pass
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
- raise NotImplementedError("MultiTypeWidget is not implemented yet")
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.0
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,,