dearpygui-forms 0.2.1__py3-none-any.whl → 0.3.0__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/models.py CHANGED
@@ -9,6 +9,7 @@ class PropertySchema:
9
9
  self.anyOf: list[dict[str, Any]] = schema.get("anyOf", [])
10
10
  self.properties: dict[str, dict[str, Any]] = schema.get("properties", {})
11
11
  self.default = schema.get("default", None)
12
+ self.items = schema.get("items", None)
12
13
 
13
14
  def __repr__(self) -> str:
14
15
  return f"PropertySchema(title={self.title}, type={self.type}, anyOf={self.anyOf}, properties={self.properties}, default={self.default})"
@@ -62,6 +62,9 @@ class Widget:
62
62
  def get_value(self) -> Any:
63
63
  pass
64
64
 
65
+ def __del__(self):
66
+ dpg.delete_item(self._root_item)
67
+
65
68
 
66
69
  class ObjectWidget(Widget):
67
70
  def __init__(self, schema, defs, **kwargs):
@@ -72,6 +75,7 @@ class ObjectWidget(Widget):
72
75
  for property_name, property in self.schema.properties.items():
73
76
  property_widget = generate_widget(property, self._defs, generate_object=False)
74
77
  property_widget.add()
78
+ dpg.add_spacer(height=10)
75
79
  self._properties[property_name] = property_widget
76
80
 
77
81
  def get_value(self) -> dict[str, Any]:
@@ -82,9 +86,69 @@ class ObjectWidget(Widget):
82
86
  property_widget.set_value(value.get(property_name))
83
87
 
84
88
 
89
+ class ExternalWidget(Widget):
90
+ def __init__(self, schema, defs, **kwargs):
91
+ self._external_id = dpg.generate_uuid()
92
+ self._widget: Widget | None = None
93
+ super().__init__(schema, defs, **kwargs)
94
+
95
+ def _ui(self):
96
+ if self.schema.title:
97
+ dpg.add_text(self.schema.title)
98
+ with dpg.group(indent=25) as self._form:
99
+ self._edit_button = dpg.add_button(label=f"Edit", callback=self.show_object_form)
100
+
101
+ def show_object_form(self):
102
+ if self._widget is None:
103
+ dpg.delete_item(self._edit_button)
104
+ self._widget = ObjectWidget(self.schema, self._defs)
105
+ self._widget.add(parent=self._form)
106
+
107
+ def get_value(self):
108
+ if self._widget is None:
109
+ raise DearpyguiFormsError(f"{self.schema.title}: set up object.")
110
+ return self._widget.get_value()
111
+
112
+ def set_value(self, value):
113
+ self.show_object_form()
114
+ self._widget.set_value(value)
115
+
116
+
117
+
85
118
  class ArrayWidget(Widget):
86
119
  def __init__(self, schema, defs, **kwargs):
87
120
  super().__init__(schema, defs, **kwargs)
121
+ self.widgets: list[Widget] = []
122
+
123
+ def _ui(self):
124
+ with dpg.group(horizontal=True):
125
+ dpg.add_text(f"{self.schema.title}")
126
+ dpg.add_button(label="Add", callback=self.add_item)
127
+ dpg.add_button(label="Remove", callback=self.remove_item)
128
+ with dpg.group(indent=25) as self._form:
129
+ pass
130
+
131
+ def add_item(self):
132
+ widget = generate_widget(self.schema.items, self._defs)
133
+ self.widgets.append(widget)
134
+ widget.add(parent=self._form)
135
+
136
+ def remove_item(self):
137
+ if self.widgets:
138
+ widget = self.widgets.pop()
139
+ dpg.delete_item(widget._root_item)
140
+
141
+ def get_value(self):
142
+ return [widget.get_value() for widget in self.widgets]
143
+
144
+ def set_value(self, value):
145
+ self.widgets = []
146
+ for item in value:
147
+ widget = generate_widget(self.schema.items, self._defs)
148
+ self.widgets.append(widget)
149
+ widget.set_value(item)
150
+ widget.add(parent=self._form)
151
+
88
152
 
89
153
 
90
154
  class MultiTypeWidget(Widget):
@@ -94,25 +158,26 @@ class MultiTypeWidget(Widget):
94
158
  self._widgets: dict[str, Widget] = {}
95
159
  for type_schema in schema.anyOf:
96
160
  widget = generate_widget(type_schema, defs, generate_object=False)
97
- self._widgets[widget.schema.type] = widget
161
+ self._widgets[widget.schema.title or widget.schema.type] = widget
98
162
 
99
163
  super().__init__(schema, defs, **kwargs)
100
164
 
101
165
  def _ui(self):
102
166
  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:
167
+ if self.schema.title:
168
+ dpg.add_text(self.schema.title)
169
+ items = list(self._widgets.keys())
170
+ for i in items:
171
+ dpg.add_button(label=i,
172
+ user_data=i,
173
+ callback=lambda sender, app_data, user_data: self.switch_value_type(user_data),
174
+ small=True
175
+ )
176
+ with dpg.group() as self._form:
111
177
  for widget in self._widgets.values():
112
178
  widget.add(hidden=True)
113
179
 
114
- def switch_value_type(self):
115
- new_type = dpg.get_value(self._type_switcher_id)
180
+ def switch_value_type(self, new_type):
116
181
  if self._widget is not None:
117
182
  self._widget.hide()
118
183
  self._widget = self._widgets[new_type]
@@ -135,7 +200,9 @@ class StringWidget(Widget):
135
200
  super().__init__(schema, defs, **kwargs)
136
201
 
137
202
  def _ui(self):
138
- dpg.add_input_text(label=self.schema.title, tag=self._input_id)
203
+ if self.schema.title:
204
+ dpg.add_text(self.schema.title)
205
+ dpg.add_input_text(tag=self._input_id)
139
206
 
140
207
  def get_value(self):
141
208
  return dpg.get_value(self._input_id)
@@ -150,7 +217,9 @@ class IntegerWidget(Widget):
150
217
  super().__init__(schema, defs, **kwargs)
151
218
 
152
219
  def _ui(self):
153
- dpg.add_input_int(label=self.schema.title, tag=self._input_id)
220
+ if self.schema.title:
221
+ dpg.add_text(self.schema.title)
222
+ dpg.add_input_int(tag=self._input_id)
154
223
 
155
224
  def get_value(self):
156
225
  return dpg.get_value(self._input_id)
@@ -165,7 +234,9 @@ class NumberWidget(Widget):
165
234
  super().__init__(schema, defs, **kwargs)
166
235
 
167
236
  def _ui(self):
168
- dpg.add_input_float(label=self.schema.title, tag=self._input_id)
237
+ if self.schema.title:
238
+ dpg.add_text(self.schema.title)
239
+ dpg.add_input_float(tag=self._input_id)
169
240
 
170
241
  def get_value(self):
171
242
  return dpg.get_value(self._input_id)
@@ -180,7 +251,9 @@ class BooleanWidget(Widget):
180
251
  super().__init__(schema, defs, **kwargs)
181
252
 
182
253
  def _ui(self):
183
- dpg.add_checkbox(label=self.schema.title, tag=self._checkbox_id)
254
+ if self.schema.title:
255
+ dpg.add_text(self.schema.title)
256
+ dpg.add_checkbox(tag=self._checkbox_id)
184
257
 
185
258
  def get_value(self):
186
259
  return dpg.get_value(self._checkbox_id)
@@ -194,7 +267,9 @@ class NoneWidget(Widget):
194
267
  super().__init__(schema, defs, **kwargs)
195
268
 
196
269
  def _ui(self):
197
- dpg.add_input_text(default_value='<None>', label=self.schema.title, tag=self._none_id, enabled=False)
270
+ if self.schema.title:
271
+ dpg.add_text(self.schema.title)
272
+ dpg.add_text("<None>", color=(128, 128, 128))
198
273
 
199
274
  def get_value(self):
200
275
  return None
@@ -203,32 +278,6 @@ class NoneWidget(Widget):
203
278
  pass
204
279
 
205
280
 
206
- class ExternalWidget(Widget):
207
- def __init__(self, schema, defs, **kwargs):
208
- self._external_id = dpg.generate_uuid()
209
- self._widget: Widget | None = None
210
- super().__init__(schema, defs, **kwargs)
211
-
212
- def _ui(self):
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)
221
-
222
- def get_value(self):
223
- if self._widget is None:
224
- raise DearpyguiFormsError(f"{self.schema.title}: set up object.")
225
- return self._widget.get_value()
226
-
227
- def set_value(self, value):
228
- self.show_object_form()
229
- self._widget.set_value(value)
230
-
231
-
232
281
  def generate_widget(json_schema: dict[str, Any], defs: dict[str, Any], generate_object: bool = True, **kwargs) -> Widget:
233
282
  schema = PropertySchema(dereference_property(json_schema, defs))
234
283
  match schema:
@@ -238,7 +287,6 @@ def generate_widget(json_schema: dict[str, Any], defs: dict[str, Any], generate
238
287
  else:
239
288
  return ExternalWidget(schema, defs, **kwargs)
240
289
  case PropertySchema(type='array'):
241
- raise NotImplementedError("ArrayWidget is not implemented yet")
242
290
  return ArrayWidget(schema, defs, **kwargs)
243
291
  case PropertySchema(type='string'):
244
292
  return StringWidget(schema, defs, **kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dearpygui-forms
3
- Version: 0.2.1
3
+ Version: 0.3.0
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>
@@ -21,6 +21,8 @@ Generate GUI forms for your Pydantic models.
21
21
 
22
22
 
23
23
  Currently supported Pydantic fields:
24
+ - nested entities
25
+ - arrays
24
26
  - str
25
27
  - int
26
28
  - float
@@ -28,6 +30,8 @@ Currently supported Pydantic fields:
28
30
  - datetime
29
31
  - date
30
32
  - time
33
+ - anyOf sequences
34
+
31
35
 
32
36
  ## Example:
33
37
  ```python
@@ -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=4AisK4HjX1ksZDxiwpZ5PKnFTbIg3Z7gyhFM2OCGfUA,683
5
+ dearpygui_forms/widgets.py,sha256=ShkQ622lQYjZQzxq3gBXnHuWxpL5m77A9Nq4DX4dwhE,9640
6
+ dearpygui_forms-0.3.0.dist-info/METADATA,sha256=zVFXnVE7AG1kSNZ8izM3vpXl4nGlYOIGjeROsdRK7W0,1503
7
+ dearpygui_forms-0.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
8
+ dearpygui_forms-0.3.0.dist-info/RECORD,,
@@ -1,8 +0,0 @@
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,,