meerk40t 0.9.7010__py2.py3-none-any.whl → 0.9.7030__py2.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.
- meerk40t/balormk/galvo_commands.py +1 -2
- meerk40t/core/cutcode/cutcode.py +1 -1
- meerk40t/core/cutplan.py +70 -2
- meerk40t/core/elements/branches.py +18 -4
- meerk40t/core/elements/element_treeops.py +43 -7
- meerk40t/core/elements/elements.py +49 -63
- meerk40t/core/elements/grid.py +8 -1
- meerk40t/core/elements/offset_clpr.py +4 -3
- meerk40t/core/elements/offset_mk.py +2 -1
- meerk40t/core/elements/shapes.py +379 -260
- meerk40t/core/elements/testcases.py +105 -0
- meerk40t/core/node/node.py +6 -3
- meerk40t/core/node/op_cut.py +9 -8
- meerk40t/core/node/op_dots.py +8 -8
- meerk40t/core/node/op_engrave.py +7 -7
- meerk40t/core/node/op_raster.py +8 -8
- meerk40t/core/planner.py +23 -0
- meerk40t/core/undos.py +1 -1
- meerk40t/core/wordlist.py +1 -0
- meerk40t/dxf/dxf_io.py +6 -0
- meerk40t/extra/encode_detect.py +8 -2
- meerk40t/extra/hershey.py +2 -3
- meerk40t/extra/inkscape.py +3 -5
- meerk40t/extra/mk_potrace.py +1959 -0
- meerk40t/extra/outerworld.py +2 -3
- meerk40t/extra/param_functions.py +2 -2
- meerk40t/extra/potrace.py +14 -10
- meerk40t/grbl/device.py +4 -1
- meerk40t/grbl/gui/grblcontroller.py +2 -2
- meerk40t/grbl/interpreter.py +1 -1
- meerk40t/gui/about.py +3 -5
- meerk40t/gui/basicops.py +3 -3
- meerk40t/gui/busy.py +75 -13
- meerk40t/gui/choicepropertypanel.py +365 -379
- meerk40t/gui/consolepanel.py +3 -3
- meerk40t/gui/gui_mixins.py +4 -1
- meerk40t/gui/hersheymanager.py +13 -3
- meerk40t/gui/laserpanel.py +12 -7
- meerk40t/gui/materialmanager.py +33 -6
- meerk40t/gui/plugin.py +9 -3
- meerk40t/gui/propertypanels/operationpropertymain.py +1 -1
- meerk40t/gui/ribbon.py +4 -1
- meerk40t/gui/scene/widget.py +1 -1
- meerk40t/gui/scenewidgets/rectselectwidget.py +19 -16
- meerk40t/gui/scenewidgets/selectionwidget.py +26 -20
- meerk40t/gui/simpleui.py +13 -8
- meerk40t/gui/simulation.py +22 -2
- meerk40t/gui/spoolerpanel.py +8 -11
- meerk40t/gui/themes.py +7 -1
- meerk40t/gui/tips.py +2 -3
- meerk40t/gui/toolwidgets/toolmeasure.py +4 -1
- meerk40t/gui/wxmeerk40t.py +32 -3
- meerk40t/gui/wxmmain.py +72 -6
- meerk40t/gui/wxmscene.py +95 -6
- meerk40t/gui/wxmtree.py +17 -11
- meerk40t/gui/wxutils.py +1 -1
- meerk40t/image/imagetools.py +21 -6
- meerk40t/kernel/kernel.py +31 -6
- meerk40t/kernel/settings.py +2 -0
- meerk40t/lihuiyu/device.py +9 -3
- meerk40t/main.py +22 -5
- meerk40t/network/console_server.py +52 -14
- meerk40t/network/web_server.py +15 -1
- meerk40t/ruida/device.py +5 -1
- meerk40t/ruida/gui/gui.py +6 -6
- meerk40t/ruida/gui/ruidaoperationproperties.py +1 -10
- meerk40t/ruida/rdjob.py +3 -3
- meerk40t/tools/geomstr.py +88 -0
- meerk40t/tools/polybool.py +2 -1
- meerk40t/tools/shxparser.py +92 -34
- {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/METADATA +1 -1
- {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/RECORD +77 -75
- {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/LICENSE +0 -0
- {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/entry_points.txt +0 -0
- {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/top_level.txt +0 -0
- {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/zip-safe +0 -0
@@ -139,6 +139,366 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
139
139
|
# we need to create an independent copy of the lookup, otherwise
|
140
140
|
# any amendments to choices like injector will affect the original
|
141
141
|
standardhelp = ""
|
142
|
+
|
143
|
+
def on_combo_text(param, ctrl, obj, dtype, addsig):
|
144
|
+
def select(event=None):
|
145
|
+
v = dtype(ctrl.GetValue())
|
146
|
+
current_value = getattr(obj, param)
|
147
|
+
if current_value != v:
|
148
|
+
setattr(obj, param, v)
|
149
|
+
self.context.signal(param, v, obj)
|
150
|
+
for _sig in addsig:
|
151
|
+
self.context.signal(_sig)
|
152
|
+
|
153
|
+
return select
|
154
|
+
|
155
|
+
def on_button(param, obj, addsig):
|
156
|
+
def check(event=None):
|
157
|
+
# We just set it to True to kick it off
|
158
|
+
setattr(obj, param, True)
|
159
|
+
# We don't signal ourselves...
|
160
|
+
self.context.signal(param, True, obj)
|
161
|
+
for _sig in addsig:
|
162
|
+
self.context.signal(_sig)
|
163
|
+
|
164
|
+
return check
|
165
|
+
|
166
|
+
def on_checkbox_check(param, ctrl, obj, addsig):
|
167
|
+
def check(event=None):
|
168
|
+
v = ctrl.GetValue()
|
169
|
+
current_value = getattr(obj, param)
|
170
|
+
if current_value != bool(v):
|
171
|
+
setattr(obj, param, bool(v))
|
172
|
+
self.context.signal(param, v, obj)
|
173
|
+
for _sig in addsig:
|
174
|
+
self.context.signal(_sig)
|
175
|
+
|
176
|
+
return check
|
177
|
+
|
178
|
+
def on_checkbox_bitcheck(param, ctrl, obj, bit, addsig, enable_ctrl=None):
|
179
|
+
def check(event=None):
|
180
|
+
v = ctrl.GetValue()
|
181
|
+
if enable_ctrl is not None:
|
182
|
+
enable_ctrl.Enable(v)
|
183
|
+
current = getattr(obj, param)
|
184
|
+
if v:
|
185
|
+
current |= 1 << bit
|
186
|
+
else:
|
187
|
+
current = ~((~current) | (1 << bit))
|
188
|
+
current_value = getattr(obj, param)
|
189
|
+
if current_value != current:
|
190
|
+
setattr(obj, param, current)
|
191
|
+
self.context.signal(param, v, obj)
|
192
|
+
for _sig in addsig:
|
193
|
+
self.context.signal(_sig)
|
194
|
+
|
195
|
+
return check
|
196
|
+
|
197
|
+
def on_generic_multi(param, ctrl, obj, dtype, addsig):
|
198
|
+
def text():
|
199
|
+
v = ctrl.GetValue()
|
200
|
+
try:
|
201
|
+
dtype_v = dtype(v)
|
202
|
+
current_value = getattr(obj, param)
|
203
|
+
if current_value != dtype_v:
|
204
|
+
setattr(obj, param, dtype_v)
|
205
|
+
self.context.signal(param, dtype_v, obj)
|
206
|
+
for _sig in addsig:
|
207
|
+
self.context.signal(_sig)
|
208
|
+
except ValueError:
|
209
|
+
# cannot cast to data_type, pass
|
210
|
+
pass
|
211
|
+
|
212
|
+
return text
|
213
|
+
|
214
|
+
def on_button_filename(param, ctrl, obj, wildcard, addsig):
|
215
|
+
def click(event=None):
|
216
|
+
with wx.FileDialog(
|
217
|
+
self,
|
218
|
+
label,
|
219
|
+
wildcard=wildcard if wildcard else "*",
|
220
|
+
style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_PREVIEW,
|
221
|
+
) as fileDialog:
|
222
|
+
if fileDialog.ShowModal() == wx.ID_CANCEL:
|
223
|
+
return # the user changed their mind
|
224
|
+
pathname = str(fileDialog.GetPath())
|
225
|
+
ctrl.SetValue(pathname)
|
226
|
+
self.Layout()
|
227
|
+
current_value = getattr(obj, param)
|
228
|
+
if current_value != pathname:
|
229
|
+
try:
|
230
|
+
setattr(obj, param, pathname)
|
231
|
+
self.context.signal(param, pathname, obj)
|
232
|
+
for _sig in addsig:
|
233
|
+
self.context.signal(_sig)
|
234
|
+
except ValueError:
|
235
|
+
# cannot cast to data_type, pass
|
236
|
+
pass
|
237
|
+
|
238
|
+
return click
|
239
|
+
|
240
|
+
def on_file_text(param, ctrl, obj, dtype, addsig):
|
241
|
+
def filetext():
|
242
|
+
v = ctrl.GetValue()
|
243
|
+
try:
|
244
|
+
dtype_v = dtype(v)
|
245
|
+
current_value = getattr(obj, param)
|
246
|
+
if current_value != dtype_v:
|
247
|
+
setattr(obj, param, dtype_v)
|
248
|
+
self.context.signal(param, dtype_v, obj)
|
249
|
+
for _sig in addsig:
|
250
|
+
self.context.signal(_sig)
|
251
|
+
except ValueError:
|
252
|
+
# cannot cast to data_type, pass
|
253
|
+
pass
|
254
|
+
|
255
|
+
return filetext
|
256
|
+
|
257
|
+
def on_slider(param, ctrl, obj, dtype, addsig):
|
258
|
+
def select(event=None):
|
259
|
+
v = dtype(ctrl.GetValue())
|
260
|
+
current_value = getattr(obj, param)
|
261
|
+
if current_value != v:
|
262
|
+
setattr(obj, param, v)
|
263
|
+
self.context.signal(param, v, obj)
|
264
|
+
for _sig in addsig:
|
265
|
+
self.context.signal(_sig)
|
266
|
+
|
267
|
+
return select
|
268
|
+
|
269
|
+
def on_radio_select(param, ctrl, obj, dtype, addsig):
|
270
|
+
def select(event=None):
|
271
|
+
if dtype == int:
|
272
|
+
v = dtype(ctrl.GetSelection())
|
273
|
+
else:
|
274
|
+
v = dtype(ctrl.GetLabel())
|
275
|
+
current_value = getattr(obj, param)
|
276
|
+
if current_value != v:
|
277
|
+
setattr(obj, param, v)
|
278
|
+
self.context.signal(param, v, obj)
|
279
|
+
for _sig in addsig:
|
280
|
+
self.context.signal(_sig)
|
281
|
+
|
282
|
+
return select
|
283
|
+
|
284
|
+
def on_combosmall_option(param, ctrl, obj, dtype, addsig, choice_list):
|
285
|
+
def select(event=None):
|
286
|
+
cl = choice_list[ctrl.GetSelection()]
|
287
|
+
v = dtype(cl)
|
288
|
+
current_value = getattr(obj, param)
|
289
|
+
if current_value != v:
|
290
|
+
setattr(obj, param, v)
|
291
|
+
self.context.signal(param, v, obj)
|
292
|
+
for _sig in addsig:
|
293
|
+
self.context.signal(_sig)
|
294
|
+
|
295
|
+
return select
|
296
|
+
|
297
|
+
def on_combosmall_text(param, ctrl, obj, dtype, addsig):
|
298
|
+
def select(event=None):
|
299
|
+
v = dtype(ctrl.GetValue())
|
300
|
+
current_value = getattr(obj, param)
|
301
|
+
if current_value != v:
|
302
|
+
# print (f"Setting it to {v}")
|
303
|
+
setattr(obj, param, v)
|
304
|
+
self.context.signal(param, v, obj)
|
305
|
+
for _sig in addsig:
|
306
|
+
self.context.signal(_sig)
|
307
|
+
|
308
|
+
return select
|
309
|
+
|
310
|
+
def on_button_color(param, ctrl, obj, addsig):
|
311
|
+
def click(event=None):
|
312
|
+
color_data = wx.ColourData()
|
313
|
+
color_data.SetColour(wx.Colour(swizzlecolor(ctrl.color)))
|
314
|
+
dlg = wx.ColourDialog(self, color_data)
|
315
|
+
if dlg.ShowModal() == wx.ID_OK:
|
316
|
+
color_data = dlg.GetColourData()
|
317
|
+
data = Color(
|
318
|
+
swizzlecolor(color_data.GetColour().GetRGB()), 1.0
|
319
|
+
)
|
320
|
+
set_color(ctrl, data)
|
321
|
+
try:
|
322
|
+
data_v = data.hexa
|
323
|
+
current_value = getattr(obj, param)
|
324
|
+
if current_value != data_v:
|
325
|
+
setattr(obj, param, data_v)
|
326
|
+
self.context.signal(param, data_v, obj)
|
327
|
+
for _sig in addsig:
|
328
|
+
self.context.signal(_sig)
|
329
|
+
except ValueError:
|
330
|
+
# cannot cast to data_type, pass
|
331
|
+
pass
|
332
|
+
|
333
|
+
return click
|
334
|
+
|
335
|
+
def on_angle_text(param, ctrl, obj, dtype, addsig):
|
336
|
+
def text():
|
337
|
+
try:
|
338
|
+
v = Angle(ctrl.GetValue(), digits=5)
|
339
|
+
data_v = str(v)
|
340
|
+
current_value = str(getattr(obj, param))
|
341
|
+
if current_value != data_v:
|
342
|
+
setattr(obj, param, data_v)
|
343
|
+
self.context.signal(param, data_v, obj)
|
344
|
+
for _sig in addsig:
|
345
|
+
self.context.signal(_sig)
|
346
|
+
except ValueError:
|
347
|
+
# cannot cast to data_type, pass
|
348
|
+
pass
|
349
|
+
|
350
|
+
return text
|
351
|
+
|
352
|
+
def on_chart_start(columns, param, ctrl, local_obj):
|
353
|
+
def chart_start(event=None):
|
354
|
+
for column in columns:
|
355
|
+
if column.get("editable", False):
|
356
|
+
event.Allow()
|
357
|
+
else:
|
358
|
+
event.Veto()
|
359
|
+
|
360
|
+
return chart_start
|
361
|
+
|
362
|
+
def on_chart_stop(columns, param, ctrl, local_obj):
|
363
|
+
def chart_stop(event=None):
|
364
|
+
row_id = event.GetIndex() # Get the current row
|
365
|
+
col_id = event.GetColumn() # Get the current column
|
366
|
+
new_data = event.GetLabel() # Get the changed data
|
367
|
+
ctrl.SetItem(row_id, col_id, new_data)
|
368
|
+
column = columns[col_id]
|
369
|
+
c_attr = column.get("attr")
|
370
|
+
c_type = column.get("type")
|
371
|
+
values = getattr(local_obj, param)
|
372
|
+
if isinstance(values[row_id], dict):
|
373
|
+
values[row_id][c_attr] = c_type(new_data)
|
374
|
+
self.context.signal(param, values, row_id, param)
|
375
|
+
elif isinstance(values[row_id], str):
|
376
|
+
values[row_id] = c_type(new_data)
|
377
|
+
self.context.signal(param, values, row_id)
|
378
|
+
else:
|
379
|
+
values[row_id][col_id] = c_type(new_data)
|
380
|
+
self.context.signal(param, values, row_id)
|
381
|
+
|
382
|
+
return chart_stop
|
383
|
+
|
384
|
+
def on_chart_contextmenu(
|
385
|
+
columns, param, ctrl, local_obj, allow_del, allow_dup, default
|
386
|
+
):
|
387
|
+
def chart_menu(event=None):
|
388
|
+
# row_id = event.GetIndex() # Get the current row
|
389
|
+
|
390
|
+
x, y = event.GetPosition()
|
391
|
+
row_id, flags = ctrl.HitTest((x, y))
|
392
|
+
if row_id < 0:
|
393
|
+
l_allow_del = False
|
394
|
+
l_allow_dup = False
|
395
|
+
else:
|
396
|
+
l_allow_del = allow_del
|
397
|
+
l_allow_dup = allow_dup
|
398
|
+
menu = wx.Menu()
|
399
|
+
if l_allow_del:
|
400
|
+
|
401
|
+
def on_delete(event):
|
402
|
+
values = getattr(local_obj, param)
|
403
|
+
# try:
|
404
|
+
values.pop(row_id)
|
405
|
+
self.context.signal(param, values, 0, param)
|
406
|
+
fill_ctrl(ctrl, local_obj, param, columns)
|
407
|
+
# except IndexError:
|
408
|
+
# pass
|
409
|
+
|
410
|
+
menuitem = menu.Append(
|
411
|
+
wx.ID_ANY, _("Delete this entry"), ""
|
412
|
+
)
|
413
|
+
self.Bind(
|
414
|
+
wx.EVT_MENU,
|
415
|
+
on_delete,
|
416
|
+
id=menuitem.GetId(),
|
417
|
+
)
|
418
|
+
if l_allow_dup:
|
419
|
+
|
420
|
+
def on_duplicate(event):
|
421
|
+
values = getattr(local_obj, param)
|
422
|
+
if isinstance(values[row_id], dict):
|
423
|
+
newentry = dict()
|
424
|
+
for key, content in values[row_id].items():
|
425
|
+
newentry[key] = content
|
426
|
+
else:
|
427
|
+
newentry = copy(values[row_id])
|
428
|
+
values.append(newentry)
|
429
|
+
self.context.signal(param, values, 0, param)
|
430
|
+
# except IndexError:
|
431
|
+
# pass
|
432
|
+
fill_ctrl(ctrl, local_obj, param, columns)
|
433
|
+
|
434
|
+
menuitem = menu.Append(
|
435
|
+
wx.ID_ANY, _("Duplicate this entry"), ""
|
436
|
+
)
|
437
|
+
self.Bind(
|
438
|
+
wx.EVT_MENU,
|
439
|
+
on_duplicate,
|
440
|
+
id=menuitem.GetId(),
|
441
|
+
)
|
442
|
+
|
443
|
+
def on_default(event):
|
444
|
+
values = getattr(local_obj, param)
|
445
|
+
values.clear()
|
446
|
+
for e in default:
|
447
|
+
values.append(e)
|
448
|
+
|
449
|
+
self.context.signal(param, values, 0, param)
|
450
|
+
fill_ctrl(ctrl, local_obj, param, columns)
|
451
|
+
# except IndexError:
|
452
|
+
# pass
|
453
|
+
|
454
|
+
menuitem = menu.Append(wx.ID_ANY, _("Restore defaults"), "")
|
455
|
+
self.Bind(
|
456
|
+
wx.EVT_MENU,
|
457
|
+
on_default,
|
458
|
+
id=menuitem.GetId(),
|
459
|
+
)
|
460
|
+
|
461
|
+
if menu.MenuItemCount != 0:
|
462
|
+
self.PopupMenu(menu)
|
463
|
+
menu.Destroy()
|
464
|
+
|
465
|
+
return chart_menu
|
466
|
+
|
467
|
+
def on_generic_text(param, ctrl, obj, dtype, addsig):
|
468
|
+
def text():
|
469
|
+
v = ctrl.GetValue()
|
470
|
+
try:
|
471
|
+
dtype_v = dtype(v)
|
472
|
+
current_value = getattr(obj, param)
|
473
|
+
if current_value != dtype_v:
|
474
|
+
setattr(obj, param, dtype_v)
|
475
|
+
self.context.signal(param, dtype_v, obj)
|
476
|
+
for _sig in addsig:
|
477
|
+
self.context.signal(_sig)
|
478
|
+
except ValueError:
|
479
|
+
# cannot cast to data_type, pass
|
480
|
+
pass
|
481
|
+
|
482
|
+
return text
|
483
|
+
|
484
|
+
def on_length_text(param, ctrl, obj, dtype, addsig):
|
485
|
+
def text():
|
486
|
+
try:
|
487
|
+
v = Length(ctrl.GetValue())
|
488
|
+
data_v = v.preferred_length
|
489
|
+
current_value = getattr(obj, param)
|
490
|
+
if str(current_value) != str(data_v):
|
491
|
+
setattr(obj, param, data_v)
|
492
|
+
self.context.signal(param, data_v, obj)
|
493
|
+
for _sig in addsig:
|
494
|
+
self.context.signal(_sig)
|
495
|
+
except ValueError:
|
496
|
+
# cannot cast to data_type, pass
|
497
|
+
pass
|
498
|
+
|
499
|
+
return text
|
500
|
+
|
501
|
+
|
142
502
|
for choice in choices:
|
143
503
|
if isinstance(choice, dict):
|
144
504
|
if "help" not in choice:
|
@@ -425,16 +785,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
425
785
|
wants_listener = False
|
426
786
|
control = wxButton(self, label=label)
|
427
787
|
|
428
|
-
def on_button(param, obj, addsig):
|
429
|
-
def check(event=None):
|
430
|
-
# We just set it to True to kick it off
|
431
|
-
setattr(obj, param, True)
|
432
|
-
# We don't signal ourselves...
|
433
|
-
self.context.signal(param, True, obj)
|
434
|
-
for _sig in addsig:
|
435
|
-
self.context.signal(_sig)
|
436
|
-
|
437
|
-
return check
|
438
788
|
|
439
789
|
control.Bind(
|
440
790
|
wx.EVT_BUTTON,
|
@@ -449,17 +799,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
449
799
|
control.SetValue(data)
|
450
800
|
control.SetMinSize(dip_size(self, -1, 23))
|
451
801
|
|
452
|
-
def on_checkbox_check(param, ctrl, obj, addsig):
|
453
|
-
def check(event=None):
|
454
|
-
v = ctrl.GetValue()
|
455
|
-
current_value = getattr(obj, param)
|
456
|
-
if current_value != bool(v):
|
457
|
-
setattr(obj, param, bool(v))
|
458
|
-
self.context.signal(param, v, obj)
|
459
|
-
for _sig in addsig:
|
460
|
-
self.context.signal(_sig)
|
461
|
-
|
462
|
-
return check
|
463
802
|
|
464
803
|
control.Bind(
|
465
804
|
wx.EVT_CHECKBOX,
|
@@ -485,22 +824,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
485
824
|
control_sizer.Add(control, 1, wx.EXPAND, 0)
|
486
825
|
current_sizer.Add(control_sizer, expansion_flag * weight, wx.EXPAND, 0)
|
487
826
|
|
488
|
-
def on_generic_multi(param, ctrl, obj, dtype, addsig):
|
489
|
-
def text():
|
490
|
-
v = ctrl.GetValue()
|
491
|
-
try:
|
492
|
-
dtype_v = dtype(v)
|
493
|
-
current_value = getattr(obj, param)
|
494
|
-
if current_value != dtype_v:
|
495
|
-
setattr(obj, param, dtype_v)
|
496
|
-
self.context.signal(param, dtype_v, obj)
|
497
|
-
for _sig in addsig:
|
498
|
-
self.context.signal(_sig)
|
499
|
-
except ValueError:
|
500
|
-
# cannot cast to data_type, pass
|
501
|
-
pass
|
502
|
-
|
503
|
-
return text
|
504
827
|
|
505
828
|
control.SetActionRoutine(
|
506
829
|
on_generic_multi(attr, control, obj, data_type, additional_signal)
|
@@ -520,48 +843,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
520
843
|
# filename = _("No File")
|
521
844
|
control.SetValue(filename)
|
522
845
|
|
523
|
-
def on_button_filename(param, ctrl, obj, wildcard, addsig):
|
524
|
-
def click(event=None):
|
525
|
-
with wx.FileDialog(
|
526
|
-
self,
|
527
|
-
label,
|
528
|
-
wildcard=wildcard if wildcard else "*",
|
529
|
-
style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_PREVIEW,
|
530
|
-
) as fileDialog:
|
531
|
-
if fileDialog.ShowModal() == wx.ID_CANCEL:
|
532
|
-
return # the user changed their mind
|
533
|
-
pathname = str(fileDialog.GetPath())
|
534
|
-
ctrl.SetValue(pathname)
|
535
|
-
self.Layout()
|
536
|
-
current_value = getattr(obj, param)
|
537
|
-
if current_value != pathname:
|
538
|
-
try:
|
539
|
-
setattr(obj, param, pathname)
|
540
|
-
self.context.signal(param, pathname, obj)
|
541
|
-
for _sig in addsig:
|
542
|
-
self.context.signal(_sig)
|
543
|
-
except ValueError:
|
544
|
-
# cannot cast to data_type, pass
|
545
|
-
pass
|
546
|
-
|
547
|
-
return click
|
548
|
-
|
549
|
-
def on_file_text(param, ctrl, obj, dtype, addsig):
|
550
|
-
def filetext():
|
551
|
-
v = ctrl.GetValue()
|
552
|
-
try:
|
553
|
-
dtype_v = dtype(v)
|
554
|
-
current_value = getattr(obj, param)
|
555
|
-
if current_value != dtype_v:
|
556
|
-
setattr(obj, param, dtype_v)
|
557
|
-
self.context.signal(param, dtype_v, obj)
|
558
|
-
for _sig in addsig:
|
559
|
-
self.context.signal(_sig)
|
560
|
-
except ValueError:
|
561
|
-
# cannot cast to data_type, pass
|
562
|
-
pass
|
563
|
-
|
564
|
-
return filetext
|
565
846
|
|
566
847
|
control.SetActionRoutine(
|
567
848
|
on_file_text(attr, control, obj, data_type, additional_signal)
|
@@ -608,17 +889,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
608
889
|
style=wx.SL_HORIZONTAL | wx.SL_VALUE_LABEL,
|
609
890
|
)
|
610
891
|
|
611
|
-
def on_slider(param, ctrl, obj, dtype, addsig):
|
612
|
-
def select(event=None):
|
613
|
-
v = dtype(ctrl.GetValue())
|
614
|
-
current_value = getattr(obj, param)
|
615
|
-
if current_value != v:
|
616
|
-
setattr(obj, param, v)
|
617
|
-
self.context.signal(param, v, obj)
|
618
|
-
for _sig in addsig:
|
619
|
-
self.context.signal(_sig)
|
620
|
-
|
621
|
-
return select
|
622
892
|
|
623
893
|
if ctrl_width > 0:
|
624
894
|
control.SetMaxSize(dip_size(self, ctrl_width, -1))
|
@@ -658,17 +928,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
658
928
|
if least is not None:
|
659
929
|
control.SetValue(least)
|
660
930
|
|
661
|
-
def on_combo_text(param, ctrl, obj, dtype, addsig):
|
662
|
-
def select(event=None):
|
663
|
-
v = dtype(ctrl.GetValue())
|
664
|
-
current_value = getattr(obj, param)
|
665
|
-
if current_value != v:
|
666
|
-
setattr(obj, param, v)
|
667
|
-
self.context.signal(param, v, obj)
|
668
|
-
for _sig in addsig:
|
669
|
-
self.context.signal(_sig)
|
670
|
-
|
671
|
-
return select
|
672
931
|
|
673
932
|
if ctrl_width > 0:
|
674
933
|
control.SetMaxSize(dip_size(self, ctrl_width, -1))
|
@@ -698,20 +957,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
698
957
|
else:
|
699
958
|
control.SetSelection(int(data))
|
700
959
|
|
701
|
-
def on_radio_select(param, ctrl, obj, dtype, addsig):
|
702
|
-
def select(event=None):
|
703
|
-
if dtype == int:
|
704
|
-
v = dtype(ctrl.GetSelection())
|
705
|
-
else:
|
706
|
-
v = dtype(ctrl.GetLabel())
|
707
|
-
current_value = getattr(obj, param)
|
708
|
-
if current_value != v:
|
709
|
-
setattr(obj, param, v)
|
710
|
-
self.context.signal(param, v, obj)
|
711
|
-
for _sig in addsig:
|
712
|
-
self.context.signal(_sig)
|
713
|
-
|
714
|
-
return select
|
715
960
|
|
716
961
|
if ctrl_width > 0:
|
717
962
|
control.SetMaxSize(dip_size(self, ctrl_width, -1))
|
@@ -734,11 +979,12 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
734
979
|
data = c.get("default")
|
735
980
|
display_list.insert(0, str(data))
|
736
981
|
choice_list.insert(0, str(data))
|
982
|
+
cb_style = wx.CB_DROPDOWN | wx.CB_READONLY
|
737
983
|
control = wxComboBox(
|
738
984
|
self,
|
739
985
|
wx.ID_ANY,
|
740
986
|
choices=display_list,
|
741
|
-
style=
|
987
|
+
style=cb_style,
|
742
988
|
)
|
743
989
|
control.SetSelection(index)
|
744
990
|
|
@@ -749,18 +995,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
749
995
|
# print ("Choices: %s" % choice_list)
|
750
996
|
# print ("To set: %s" % str(data))
|
751
997
|
|
752
|
-
def on_combosmall_option(param, ctrl, obj, dtype, addsig, choice_list):
|
753
|
-
def select(event=None):
|
754
|
-
cl = choice_list[ctrl.GetSelection()]
|
755
|
-
v = dtype(cl)
|
756
|
-
current_value = getattr(obj, param)
|
757
|
-
if current_value != v:
|
758
|
-
setattr(obj, param, v)
|
759
|
-
self.context.signal(param, v, obj)
|
760
|
-
for _sig in addsig:
|
761
|
-
self.context.signal(_sig)
|
762
|
-
|
763
|
-
return select
|
764
998
|
|
765
999
|
if label != "":
|
766
1000
|
# Try to center it vertically to the controls extent
|
@@ -779,9 +1013,7 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
779
1013
|
elif data_type in (str, int, float) and data_style == "combosmall":
|
780
1014
|
control_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
781
1015
|
exclusive = c.get("exclusive", True)
|
782
|
-
cb_style = wx.CB_DROPDOWN
|
783
|
-
if exclusive:
|
784
|
-
cb_style = cb_style | wx.CB_READONLY
|
1016
|
+
cb_style = wx.CB_DROPDOWN | wx.CB_READONLY if exclusive else wx.CB_DROPDOWN
|
785
1017
|
|
786
1018
|
choice_list = list(map(str, c.get("choices", [c.get("default")])))
|
787
1019
|
control = wxComboBox(
|
@@ -811,18 +1043,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
811
1043
|
if least is not None:
|
812
1044
|
control.SetValue(least)
|
813
1045
|
|
814
|
-
def on_combosmall_text(param, ctrl, obj, dtype, addsig):
|
815
|
-
def select(event=None):
|
816
|
-
v = dtype(ctrl.GetValue())
|
817
|
-
current_value = getattr(obj, param)
|
818
|
-
if current_value != v:
|
819
|
-
# print (f"Setting it to {v}")
|
820
|
-
setattr(obj, param, v)
|
821
|
-
self.context.signal(param, v, obj)
|
822
|
-
for _sig in addsig:
|
823
|
-
self.context.signal(_sig)
|
824
|
-
|
825
|
-
return select
|
826
1046
|
|
827
1047
|
if label != "":
|
828
1048
|
# Try to center it vertically to the controls extent
|
@@ -863,24 +1083,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
863
1083
|
else:
|
864
1084
|
control_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
865
1085
|
|
866
|
-
def on_checkbox_check(param, ctrl, obj, bit, addsig, enable_ctrl=None):
|
867
|
-
def check(event=None):
|
868
|
-
v = ctrl.GetValue()
|
869
|
-
if enable_ctrl is not None:
|
870
|
-
enable_ctrl.Enable(v)
|
871
|
-
current = getattr(obj, param)
|
872
|
-
if v:
|
873
|
-
current |= 1 << bit
|
874
|
-
else:
|
875
|
-
current = ~((~current) | (1 << bit))
|
876
|
-
current_value = getattr(obj, param)
|
877
|
-
if current_value != current:
|
878
|
-
setattr(obj, param, current)
|
879
|
-
self.context.signal(param, v, obj)
|
880
|
-
for _sig in addsig:
|
881
|
-
self.context.signal(_sig)
|
882
|
-
|
883
|
-
return check
|
884
1086
|
|
885
1087
|
bit_sizer = wx.BoxSizer(wx.VERTICAL)
|
886
1088
|
label_text = wxStaticText(
|
@@ -915,10 +1117,7 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
915
1117
|
control.SetValue(bool((data >> b) & 1))
|
916
1118
|
if mask:
|
917
1119
|
control.Enable(bool((mask_bits >> b) & 1))
|
918
|
-
control.Bind(
|
919
|
-
wx.EVT_CHECKBOX,
|
920
|
-
on_checkbox_check(attr, control, obj, b, additional_signal),
|
921
|
-
)
|
1120
|
+
control.Bind(wx.EVT_CHECKBOX, on_checkbox_bitcheck(attr, control, obj, b, additional_signal), )
|
922
1121
|
|
923
1122
|
# mask bit
|
924
1123
|
if mask:
|
@@ -926,7 +1125,7 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
926
1125
|
mask_ctrl.SetValue(bool((mask_bits >> b) & 1))
|
927
1126
|
mask_ctrl.Bind(
|
928
1127
|
wx.EVT_CHECKBOX,
|
929
|
-
|
1128
|
+
on_checkbox_bitcheck(
|
930
1129
|
mask,
|
931
1130
|
mask_ctrl,
|
932
1131
|
obj,
|
@@ -957,31 +1156,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
957
1156
|
ctrl.SetForegroundColour(wx.WHITE)
|
958
1157
|
ctrl.color = color
|
959
1158
|
|
960
|
-
def on_button_color(param, ctrl, obj, addsig):
|
961
|
-
def click(event=None):
|
962
|
-
color_data = wx.ColourData()
|
963
|
-
color_data.SetColour(wx.Colour(swizzlecolor(ctrl.color)))
|
964
|
-
dlg = wx.ColourDialog(self, color_data)
|
965
|
-
if dlg.ShowModal() == wx.ID_OK:
|
966
|
-
color_data = dlg.GetColourData()
|
967
|
-
data = Color(
|
968
|
-
swizzlecolor(color_data.GetColour().GetRGB()), 1.0
|
969
|
-
)
|
970
|
-
set_color(ctrl, data)
|
971
|
-
try:
|
972
|
-
data_v = data.hexa
|
973
|
-
current_value = getattr(obj, param)
|
974
|
-
if current_value != data_v:
|
975
|
-
setattr(obj, param, data_v)
|
976
|
-
self.context.signal(param, data_v, obj)
|
977
|
-
for _sig in addsig:
|
978
|
-
self.context.signal(_sig)
|
979
|
-
except ValueError:
|
980
|
-
# cannot cast to data_type, pass
|
981
|
-
pass
|
982
|
-
|
983
|
-
return click
|
984
|
-
|
985
1159
|
datastr = data
|
986
1160
|
data = Color(datastr)
|
987
1161
|
set_color(control, data)
|
@@ -1050,42 +1224,12 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
1050
1224
|
|
1051
1225
|
fill_ctrl(chart, obj, attr, l_columns)
|
1052
1226
|
|
1053
|
-
def on_chart_start(columns, param, ctrl, local_obj):
|
1054
|
-
def chart_start(event=None):
|
1055
|
-
for column in columns:
|
1056
|
-
if column.get("editable", False):
|
1057
|
-
event.Allow()
|
1058
|
-
else:
|
1059
|
-
event.Veto()
|
1060
|
-
|
1061
|
-
return chart_start
|
1062
1227
|
|
1063
1228
|
chart.Bind(
|
1064
1229
|
wx.EVT_LIST_BEGIN_LABEL_EDIT,
|
1065
1230
|
on_chart_start(l_columns, attr, chart, obj),
|
1066
1231
|
)
|
1067
1232
|
|
1068
|
-
def on_chart_stop(columns, param, ctrl, local_obj):
|
1069
|
-
def chart_stop(event=None):
|
1070
|
-
row_id = event.GetIndex() # Get the current row
|
1071
|
-
col_id = event.GetColumn() # Get the current column
|
1072
|
-
new_data = event.GetLabel() # Get the changed data
|
1073
|
-
ctrl.SetItem(row_id, col_id, new_data)
|
1074
|
-
column = columns[col_id]
|
1075
|
-
c_attr = column.get("attr")
|
1076
|
-
c_type = column.get("type")
|
1077
|
-
values = getattr(local_obj, param)
|
1078
|
-
if isinstance(values[row_id], dict):
|
1079
|
-
values[row_id][c_attr] = c_type(new_data)
|
1080
|
-
self.context.signal(param, values, row_id, param)
|
1081
|
-
elif isinstance(values[row_id], str):
|
1082
|
-
values[row_id] = c_type(new_data)
|
1083
|
-
self.context.signal(param, values, row_id)
|
1084
|
-
else:
|
1085
|
-
values[row_id][col_id] = c_type(new_data)
|
1086
|
-
self.context.signal(param, values, row_id)
|
1087
|
-
|
1088
|
-
return chart_stop
|
1089
1233
|
|
1090
1234
|
chart.Bind(
|
1091
1235
|
wx.EVT_LIST_END_LABEL_EDIT,
|
@@ -1095,89 +1239,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
1095
1239
|
allow_deletion = c.get("allow_deletion", False)
|
1096
1240
|
allow_duplication = c.get("allow_duplication", False)
|
1097
1241
|
|
1098
|
-
def on_chart_contextmenu(
|
1099
|
-
columns, param, ctrl, local_obj, allow_del, allow_dup, default
|
1100
|
-
):
|
1101
|
-
def chart_menu(event=None):
|
1102
|
-
# row_id = event.GetIndex() # Get the current row
|
1103
|
-
|
1104
|
-
x, y = event.GetPosition()
|
1105
|
-
row_id, flags = ctrl.HitTest((x, y))
|
1106
|
-
if row_id < 0:
|
1107
|
-
l_allow_del = False
|
1108
|
-
l_allow_dup = False
|
1109
|
-
else:
|
1110
|
-
l_allow_del = allow_del
|
1111
|
-
l_allow_dup = allow_dup
|
1112
|
-
menu = wx.Menu()
|
1113
|
-
if l_allow_del:
|
1114
|
-
|
1115
|
-
def on_delete(event):
|
1116
|
-
values = getattr(local_obj, param)
|
1117
|
-
# try:
|
1118
|
-
values.pop(row_id)
|
1119
|
-
self.context.signal(param, values, 0, param)
|
1120
|
-
fill_ctrl(ctrl, local_obj, param, columns)
|
1121
|
-
# except IndexError:
|
1122
|
-
# pass
|
1123
|
-
|
1124
|
-
menuitem = menu.Append(
|
1125
|
-
wx.ID_ANY, _("Delete this entry"), ""
|
1126
|
-
)
|
1127
|
-
self.Bind(
|
1128
|
-
wx.EVT_MENU,
|
1129
|
-
on_delete,
|
1130
|
-
id=menuitem.GetId(),
|
1131
|
-
)
|
1132
|
-
if l_allow_dup:
|
1133
|
-
|
1134
|
-
def on_duplicate(event):
|
1135
|
-
values = getattr(local_obj, param)
|
1136
|
-
if isinstance(values[row_id], dict):
|
1137
|
-
newentry = dict()
|
1138
|
-
for key, content in values[row_id].items():
|
1139
|
-
newentry[key] = content
|
1140
|
-
else:
|
1141
|
-
newentry = copy(values[row_id])
|
1142
|
-
values.append(newentry)
|
1143
|
-
self.context.signal(param, values, 0, param)
|
1144
|
-
# except IndexError:
|
1145
|
-
# pass
|
1146
|
-
fill_ctrl(ctrl, local_obj, param, columns)
|
1147
|
-
|
1148
|
-
menuitem = menu.Append(
|
1149
|
-
wx.ID_ANY, _("Duplicate this entry"), ""
|
1150
|
-
)
|
1151
|
-
self.Bind(
|
1152
|
-
wx.EVT_MENU,
|
1153
|
-
on_duplicate,
|
1154
|
-
id=menuitem.GetId(),
|
1155
|
-
)
|
1156
|
-
|
1157
|
-
def on_default(event):
|
1158
|
-
values = getattr(local_obj, param)
|
1159
|
-
values.clear()
|
1160
|
-
for e in default:
|
1161
|
-
values.append(e)
|
1162
|
-
|
1163
|
-
self.context.signal(param, values, 0, param)
|
1164
|
-
fill_ctrl(ctrl, obj, param, columns)
|
1165
|
-
# except IndexError:
|
1166
|
-
# pass
|
1167
|
-
|
1168
|
-
menuitem = menu.Append(wx.ID_ANY, _("Restore defaults"), "")
|
1169
|
-
self.Bind(
|
1170
|
-
wx.EVT_MENU,
|
1171
|
-
on_default,
|
1172
|
-
id=menuitem.GetId(),
|
1173
|
-
)
|
1174
|
-
|
1175
|
-
if menu.MenuItemCount != 0:
|
1176
|
-
self.PopupMenu(menu)
|
1177
|
-
menu.Destroy()
|
1178
|
-
|
1179
|
-
return chart_menu
|
1180
|
-
|
1181
1242
|
default = c.get("default", [])
|
1182
1243
|
# chart.Bind(
|
1183
1244
|
# wx.EVT_LIST_ITEM_RIGHT_CLICK,
|
@@ -1265,22 +1326,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
1265
1326
|
control.SetMaxSize(dip_size(self, ctrl_width, -1))
|
1266
1327
|
control_sizer.Add(control, 1, wx.EXPAND, 0)
|
1267
1328
|
|
1268
|
-
def on_generic_text(param, ctrl, obj, dtype, addsig):
|
1269
|
-
def text():
|
1270
|
-
v = ctrl.GetValue()
|
1271
|
-
try:
|
1272
|
-
dtype_v = dtype(v)
|
1273
|
-
current_value = getattr(obj, param)
|
1274
|
-
if current_value != dtype_v:
|
1275
|
-
setattr(obj, param, dtype_v)
|
1276
|
-
self.context.signal(param, dtype_v, obj)
|
1277
|
-
for _sig in addsig:
|
1278
|
-
self.context.signal(_sig)
|
1279
|
-
except ValueError:
|
1280
|
-
# cannot cast to data_type, pass
|
1281
|
-
pass
|
1282
|
-
|
1283
|
-
return text
|
1284
1329
|
|
1285
1330
|
control.SetActionRoutine(
|
1286
1331
|
on_generic_text(attr, control, obj, data_type, additional_signal)
|
@@ -1319,23 +1364,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
1319
1364
|
control.SetMaxSize(dip_size(self, ctrl_width, -1))
|
1320
1365
|
control_sizer.Add(control, 1, wx.EXPAND, 0)
|
1321
1366
|
|
1322
|
-
def on_length_text(param, ctrl, obj, dtype, addsig):
|
1323
|
-
def text():
|
1324
|
-
try:
|
1325
|
-
v = Length(ctrl.GetValue())
|
1326
|
-
data_v = v.preferred_length
|
1327
|
-
current_value = getattr(obj, param)
|
1328
|
-
if str(current_value) != str(data_v):
|
1329
|
-
setattr(obj, param, data_v)
|
1330
|
-
self.context.signal(param, data_v, obj)
|
1331
|
-
for _sig in addsig:
|
1332
|
-
self.context.signal(_sig)
|
1333
|
-
except ValueError:
|
1334
|
-
# cannot cast to data_type, pass
|
1335
|
-
pass
|
1336
|
-
|
1337
|
-
return text
|
1338
|
-
|
1339
1367
|
control.SetActionRoutine(
|
1340
1368
|
on_length_text(attr, control, obj, data_type, additional_signal)
|
1341
1369
|
)
|
@@ -1360,23 +1388,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
1360
1388
|
control.SetMaxSize(dip_size(self, ctrl_width, -1))
|
1361
1389
|
control_sizer.Add(control, 1, wx.EXPAND, 0)
|
1362
1390
|
|
1363
|
-
def on_angle_text(param, ctrl, obj, dtype, addsig):
|
1364
|
-
def text():
|
1365
|
-
try:
|
1366
|
-
v = Angle(ctrl.GetValue(), digits=5)
|
1367
|
-
data_v = str(v)
|
1368
|
-
current_value = str(getattr(obj, param))
|
1369
|
-
if current_value != data_v:
|
1370
|
-
setattr(obj, param, data_v)
|
1371
|
-
self.context.signal(param, data_v, obj)
|
1372
|
-
for _sig in addsig:
|
1373
|
-
self.context.signal(_sig)
|
1374
|
-
except ValueError:
|
1375
|
-
# cannot cast to data_type, pass
|
1376
|
-
pass
|
1377
|
-
|
1378
|
-
return text
|
1379
|
-
|
1380
1391
|
control.SetActionRoutine(
|
1381
1392
|
on_angle_text(attr, control, obj, data_type, additional_signal)
|
1382
1393
|
)
|
@@ -1402,31 +1413,6 @@ class ChoicePropertyPanel(ScrolledPanel):
|
|
1402
1413
|
ctrl.SetForegroundColour(wx.WHITE)
|
1403
1414
|
ctrl.color = color
|
1404
1415
|
|
1405
|
-
def on_button_color(param, ctrl, obj, addsig):
|
1406
|
-
def click(event=None):
|
1407
|
-
color_data = wx.ColourData()
|
1408
|
-
color_data.SetColour(wx.Colour(swizzlecolor(ctrl.color)))
|
1409
|
-
dlg = wx.ColourDialog(self, color_data)
|
1410
|
-
if dlg.ShowModal() == wx.ID_OK:
|
1411
|
-
color_data = dlg.GetColourData()
|
1412
|
-
data = Color(
|
1413
|
-
swizzlecolor(color_data.GetColour().GetRGB()), 1.0
|
1414
|
-
)
|
1415
|
-
set_color(ctrl, data)
|
1416
|
-
try:
|
1417
|
-
data_v = data_type(data)
|
1418
|
-
current_value = getattr(obj, param)
|
1419
|
-
if current_value != data_v:
|
1420
|
-
setattr(obj, param, data_v)
|
1421
|
-
self.context.signal(param, data_v, obj)
|
1422
|
-
for _sig in addsig:
|
1423
|
-
self.context.signal(_sig)
|
1424
|
-
except ValueError:
|
1425
|
-
# cannot cast to data_type, pass
|
1426
|
-
pass
|
1427
|
-
|
1428
|
-
return click
|
1429
|
-
|
1430
1416
|
set_color(control, data)
|
1431
1417
|
if ctrl_width > 0:
|
1432
1418
|
control.SetMaxSize(dip_size(self, ctrl_width, -1))
|