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.
Files changed (77) hide show
  1. meerk40t/balormk/galvo_commands.py +1 -2
  2. meerk40t/core/cutcode/cutcode.py +1 -1
  3. meerk40t/core/cutplan.py +70 -2
  4. meerk40t/core/elements/branches.py +18 -4
  5. meerk40t/core/elements/element_treeops.py +43 -7
  6. meerk40t/core/elements/elements.py +49 -63
  7. meerk40t/core/elements/grid.py +8 -1
  8. meerk40t/core/elements/offset_clpr.py +4 -3
  9. meerk40t/core/elements/offset_mk.py +2 -1
  10. meerk40t/core/elements/shapes.py +379 -260
  11. meerk40t/core/elements/testcases.py +105 -0
  12. meerk40t/core/node/node.py +6 -3
  13. meerk40t/core/node/op_cut.py +9 -8
  14. meerk40t/core/node/op_dots.py +8 -8
  15. meerk40t/core/node/op_engrave.py +7 -7
  16. meerk40t/core/node/op_raster.py +8 -8
  17. meerk40t/core/planner.py +23 -0
  18. meerk40t/core/undos.py +1 -1
  19. meerk40t/core/wordlist.py +1 -0
  20. meerk40t/dxf/dxf_io.py +6 -0
  21. meerk40t/extra/encode_detect.py +8 -2
  22. meerk40t/extra/hershey.py +2 -3
  23. meerk40t/extra/inkscape.py +3 -5
  24. meerk40t/extra/mk_potrace.py +1959 -0
  25. meerk40t/extra/outerworld.py +2 -3
  26. meerk40t/extra/param_functions.py +2 -2
  27. meerk40t/extra/potrace.py +14 -10
  28. meerk40t/grbl/device.py +4 -1
  29. meerk40t/grbl/gui/grblcontroller.py +2 -2
  30. meerk40t/grbl/interpreter.py +1 -1
  31. meerk40t/gui/about.py +3 -5
  32. meerk40t/gui/basicops.py +3 -3
  33. meerk40t/gui/busy.py +75 -13
  34. meerk40t/gui/choicepropertypanel.py +365 -379
  35. meerk40t/gui/consolepanel.py +3 -3
  36. meerk40t/gui/gui_mixins.py +4 -1
  37. meerk40t/gui/hersheymanager.py +13 -3
  38. meerk40t/gui/laserpanel.py +12 -7
  39. meerk40t/gui/materialmanager.py +33 -6
  40. meerk40t/gui/plugin.py +9 -3
  41. meerk40t/gui/propertypanels/operationpropertymain.py +1 -1
  42. meerk40t/gui/ribbon.py +4 -1
  43. meerk40t/gui/scene/widget.py +1 -1
  44. meerk40t/gui/scenewidgets/rectselectwidget.py +19 -16
  45. meerk40t/gui/scenewidgets/selectionwidget.py +26 -20
  46. meerk40t/gui/simpleui.py +13 -8
  47. meerk40t/gui/simulation.py +22 -2
  48. meerk40t/gui/spoolerpanel.py +8 -11
  49. meerk40t/gui/themes.py +7 -1
  50. meerk40t/gui/tips.py +2 -3
  51. meerk40t/gui/toolwidgets/toolmeasure.py +4 -1
  52. meerk40t/gui/wxmeerk40t.py +32 -3
  53. meerk40t/gui/wxmmain.py +72 -6
  54. meerk40t/gui/wxmscene.py +95 -6
  55. meerk40t/gui/wxmtree.py +17 -11
  56. meerk40t/gui/wxutils.py +1 -1
  57. meerk40t/image/imagetools.py +21 -6
  58. meerk40t/kernel/kernel.py +31 -6
  59. meerk40t/kernel/settings.py +2 -0
  60. meerk40t/lihuiyu/device.py +9 -3
  61. meerk40t/main.py +22 -5
  62. meerk40t/network/console_server.py +52 -14
  63. meerk40t/network/web_server.py +15 -1
  64. meerk40t/ruida/device.py +5 -1
  65. meerk40t/ruida/gui/gui.py +6 -6
  66. meerk40t/ruida/gui/ruidaoperationproperties.py +1 -10
  67. meerk40t/ruida/rdjob.py +3 -3
  68. meerk40t/tools/geomstr.py +88 -0
  69. meerk40t/tools/polybool.py +2 -1
  70. meerk40t/tools/shxparser.py +92 -34
  71. {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/METADATA +1 -1
  72. {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/RECORD +77 -75
  73. {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/WHEEL +1 -1
  74. {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/LICENSE +0 -0
  75. {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/entry_points.txt +0 -0
  76. {meerk40t-0.9.7010.dist-info → meerk40t-0.9.7030.dist-info}/top_level.txt +0 -0
  77. {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=wx.CB_DROPDOWN | wx.CB_READONLY,
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
- on_checkbox_check(
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))