meerk40t 0.9.2000__py2.py3-none-any.whl → 0.9.3001__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 (187) hide show
  1. meerk40t/balormk/balor_params.py +1 -43
  2. meerk40t/balormk/controller.py +1 -41
  3. meerk40t/balormk/device.py +16 -22
  4. meerk40t/balormk/driver.py +4 -4
  5. meerk40t/balormk/gui/balorconfig.py +2 -2
  6. meerk40t/balormk/gui/balorcontroller.py +13 -5
  7. meerk40t/balormk/gui/baloroperationproperties.py +0 -46
  8. meerk40t/balormk/gui/gui.py +17 -17
  9. meerk40t/camera/gui/camerapanel.py +18 -11
  10. meerk40t/core/cutcode/rastercut.py +3 -1
  11. meerk40t/core/cutplan.py +145 -14
  12. meerk40t/core/elements/clipboard.py +18 -9
  13. meerk40t/core/elements/element_treeops.py +320 -180
  14. meerk40t/core/elements/element_types.py +7 -2
  15. meerk40t/core/elements/elements.py +53 -27
  16. meerk40t/core/elements/geometry.py +8 -0
  17. meerk40t/core/elements/offset_clpr.py +129 -4
  18. meerk40t/core/elements/offset_mk.py +3 -1
  19. meerk40t/core/elements/shapes.py +28 -25
  20. meerk40t/core/laserjob.py +7 -0
  21. meerk40t/core/node/bootstrap.py +4 -0
  22. meerk40t/core/node/effect_hatch.py +85 -96
  23. meerk40t/core/node/effect_wobble.py +309 -0
  24. meerk40t/core/node/elem_image.py +49 -19
  25. meerk40t/core/node/elem_line.py +60 -0
  26. meerk40t/core/node/elem_rect.py +5 -3
  27. meerk40t/core/node/image_processed.py +766 -0
  28. meerk40t/core/node/image_raster.py +113 -0
  29. meerk40t/core/node/node.py +120 -1
  30. meerk40t/core/node/op_cut.py +2 -8
  31. meerk40t/core/node/op_dots.py +0 -8
  32. meerk40t/core/node/op_engrave.py +2 -18
  33. meerk40t/core/node/op_image.py +22 -35
  34. meerk40t/core/node/op_raster.py +0 -9
  35. meerk40t/core/planner.py +32 -2
  36. meerk40t/core/svg_io.py +699 -461
  37. meerk40t/core/treeop.py +191 -0
  38. meerk40t/core/undos.py +15 -1
  39. meerk40t/core/units.py +14 -4
  40. meerk40t/device/dummydevice.py +3 -2
  41. meerk40t/device/gui/defaultactions.py +43 -55
  42. meerk40t/device/gui/formatterpanel.py +58 -49
  43. meerk40t/device/gui/warningpanel.py +12 -12
  44. meerk40t/device/mixins.py +13 -0
  45. meerk40t/dxf/dxf_io.py +9 -5
  46. meerk40t/extra/ezd.py +28 -26
  47. meerk40t/extra/imageactions.py +300 -308
  48. meerk40t/extra/lbrn.py +19 -2
  49. meerk40t/fill/fills.py +6 -6
  50. meerk40t/fill/patternfill.py +1061 -1061
  51. meerk40t/fill/patterns.py +2 -6
  52. meerk40t/grbl/controller.py +168 -52
  53. meerk40t/grbl/device.py +23 -18
  54. meerk40t/grbl/driver.py +39 -0
  55. meerk40t/grbl/emulator.py +79 -19
  56. meerk40t/grbl/gcodejob.py +10 -0
  57. meerk40t/grbl/gui/grblconfiguration.py +2 -2
  58. meerk40t/grbl/gui/grblcontroller.py +24 -8
  59. meerk40t/grbl/gui/grblhardwareconfig.py +153 -0
  60. meerk40t/grbl/gui/gui.py +17 -14
  61. meerk40t/grbl/mock_connection.py +15 -34
  62. meerk40t/grbl/plugin.py +0 -4
  63. meerk40t/grbl/serial_connection.py +2 -1
  64. meerk40t/gui/about.py +8 -5
  65. meerk40t/gui/alignment.py +10 -6
  66. meerk40t/gui/basicops.py +27 -17
  67. meerk40t/gui/bufferview.py +2 -2
  68. meerk40t/gui/choicepropertypanel.py +101 -13
  69. meerk40t/gui/consolepanel.py +12 -9
  70. meerk40t/gui/devicepanel.py +38 -25
  71. meerk40t/gui/executejob.py +6 -4
  72. meerk40t/gui/help_assets/help_assets.py +13 -10
  73. meerk40t/gui/hersheymanager.py +8 -6
  74. meerk40t/gui/icons.py +1951 -3065
  75. meerk40t/gui/imagesplitter.py +14 -7
  76. meerk40t/gui/keymap.py +3 -3
  77. meerk40t/gui/laserpanel.py +151 -84
  78. meerk40t/gui/laserrender.py +61 -70
  79. meerk40t/gui/lasertoolpanel.py +8 -7
  80. meerk40t/gui/materialtest.py +3 -3
  81. meerk40t/gui/mkdebug.py +254 -1
  82. meerk40t/gui/navigationpanels.py +321 -180
  83. meerk40t/gui/notes.py +3 -3
  84. meerk40t/gui/opassignment.py +12 -12
  85. meerk40t/gui/operation_info.py +13 -13
  86. meerk40t/gui/plugin.py +5 -0
  87. meerk40t/gui/position.py +20 -18
  88. meerk40t/gui/preferences.py +21 -6
  89. meerk40t/gui/propertypanels/attributes.py +70 -22
  90. meerk40t/gui/propertypanels/blobproperty.py +2 -2
  91. meerk40t/gui/propertypanels/consoleproperty.py +2 -2
  92. meerk40t/gui/propertypanels/groupproperties.py +3 -3
  93. meerk40t/gui/propertypanels/hatchproperty.py +11 -18
  94. meerk40t/gui/propertypanels/imageproperty.py +4 -3
  95. meerk40t/gui/propertypanels/opbranchproperties.py +1 -1
  96. meerk40t/gui/propertypanels/pathproperty.py +2 -2
  97. meerk40t/gui/propertypanels/pointproperty.py +2 -2
  98. meerk40t/gui/propertypanels/propertywindow.py +4 -4
  99. meerk40t/gui/propertypanels/textproperty.py +3 -3
  100. meerk40t/gui/propertypanels/wobbleproperty.py +204 -0
  101. meerk40t/gui/ribbon.py +367 -259
  102. meerk40t/gui/scene/scene.py +31 -5
  103. meerk40t/gui/scenewidgets/elementswidget.py +12 -4
  104. meerk40t/gui/scenewidgets/gridwidget.py +2 -2
  105. meerk40t/gui/scenewidgets/laserpathwidget.py +7 -2
  106. meerk40t/gui/scenewidgets/machineoriginwidget.py +6 -2
  107. meerk40t/gui/scenewidgets/relocatewidget.py +1 -1
  108. meerk40t/gui/scenewidgets/reticlewidget.py +9 -0
  109. meerk40t/gui/scenewidgets/selectionwidget.py +12 -7
  110. meerk40t/gui/simpleui.py +95 -8
  111. meerk40t/gui/simulation.py +44 -36
  112. meerk40t/gui/spoolerpanel.py +124 -26
  113. meerk40t/gui/statusbarwidgets/defaultoperations.py +18 -6
  114. meerk40t/gui/statusbarwidgets/infowidget.py +2 -2
  115. meerk40t/gui/statusbarwidgets/opassignwidget.py +12 -12
  116. meerk40t/gui/statusbarwidgets/shapepropwidget.py +45 -18
  117. meerk40t/gui/statusbarwidgets/statusbar.py +11 -4
  118. meerk40t/gui/themes.py +78 -0
  119. meerk40t/gui/toolwidgets/toolcircle.py +2 -1
  120. meerk40t/gui/toolwidgets/toolellipse.py +2 -1
  121. meerk40t/gui/toolwidgets/toolimagecut.py +132 -0
  122. meerk40t/gui/toolwidgets/toolline.py +144 -0
  123. meerk40t/gui/toolwidgets/toolnodeedit.py +72 -145
  124. meerk40t/gui/toolwidgets/toolpoint.py +1 -1
  125. meerk40t/gui/toolwidgets/toolpolygon.py +8 -55
  126. meerk40t/gui/toolwidgets/toolrect.py +2 -1
  127. meerk40t/gui/usbconnect.py +2 -2
  128. meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +2 -2
  129. meerk40t/gui/utilitywidgets/harmonograph.py +7 -7
  130. meerk40t/gui/utilitywidgets/scalewidget.py +1 -1
  131. meerk40t/gui/wordlisteditor.py +33 -18
  132. meerk40t/gui/wxmeerk40t.py +166 -66
  133. meerk40t/gui/wxmmain.py +236 -157
  134. meerk40t/gui/wxmribbon.py +49 -25
  135. meerk40t/gui/wxmscene.py +49 -38
  136. meerk40t/gui/wxmtree.py +216 -85
  137. meerk40t/gui/wxutils.py +62 -4
  138. meerk40t/image/imagetools.py +443 -15
  139. meerk40t/internal_plugins.py +2 -10
  140. meerk40t/kernel/kernel.py +12 -4
  141. meerk40t/lihuiyu/controller.py +7 -7
  142. meerk40t/lihuiyu/device.py +3 -1
  143. meerk40t/lihuiyu/driver.py +3 -0
  144. meerk40t/lihuiyu/gui/gui.py +8 -8
  145. meerk40t/lihuiyu/gui/lhyaccelgui.py +2 -2
  146. meerk40t/lihuiyu/gui/lhycontrollergui.py +73 -27
  147. meerk40t/lihuiyu/gui/lhydrivergui.py +2 -2
  148. meerk40t/lihuiyu/gui/tcpcontroller.py +22 -9
  149. meerk40t/main.py +6 -1
  150. meerk40t/moshi/controller.py +5 -5
  151. meerk40t/moshi/device.py +5 -2
  152. meerk40t/moshi/driver.py +4 -0
  153. meerk40t/moshi/gui/gui.py +8 -8
  154. meerk40t/moshi/gui/moshicontrollergui.py +24 -8
  155. meerk40t/moshi/gui/moshidrivergui.py +2 -2
  156. meerk40t/newly/controller.py +2 -0
  157. meerk40t/newly/device.py +9 -2
  158. meerk40t/newly/driver.py +4 -0
  159. meerk40t/newly/gui/gui.py +16 -17
  160. meerk40t/newly/gui/newlyconfig.py +2 -2
  161. meerk40t/newly/gui/newlycontroller.py +13 -5
  162. meerk40t/rotary/gui/gui.py +2 -2
  163. meerk40t/rotary/gui/rotarysettings.py +2 -2
  164. meerk40t/ruida/device.py +3 -0
  165. meerk40t/ruida/driver.py +4 -0
  166. meerk40t/ruida/gui/gui.py +6 -6
  167. meerk40t/ruida/gui/ruidaconfig.py +2 -2
  168. meerk40t/ruida/gui/ruidacontroller.py +13 -5
  169. meerk40t/svgelements.py +9 -9
  170. meerk40t/tools/geomstr.py +849 -153
  171. meerk40t/tools/kerftest.py +8 -4
  172. meerk40t/tools/livinghinges.py +15 -8
  173. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/METADATA +21 -16
  174. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/RECORD +185 -177
  175. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/entry_points.txt +0 -1
  176. test/test_core_elements.py +8 -24
  177. test/test_file_svg.py +88 -0
  178. test/test_fill.py +9 -9
  179. test/test_geomstr.py +258 -8
  180. test/test_kernel.py +4 -0
  181. test/test_tools_rasterplotter.py +29 -0
  182. meerk40t/extra/embroider.py +0 -56
  183. meerk40t/extra/pathoptimize.py +0 -249
  184. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/LICENSE +0 -0
  185. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/WHEEL +0 -0
  186. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/top_level.txt +0 -0
  187. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/zip-safe +0 -0
meerk40t/gui/wxmmain.py CHANGED
@@ -30,53 +30,57 @@ from meerk40t.kernel import lookup_listener, signal_listener
30
30
 
31
31
  from ..core.units import UNITS_PER_INCH, UNITS_PER_PIXEL, Length
32
32
  from ..svgelements import Color, Matrix, Path
33
- from .icons import ( # icons8_replicate_rows_50,
33
+ from .icons import ( # icon_duplicate,
34
34
  STD_ICON_SIZE,
35
- icon_cag_common_50,
36
- icon_cag_subtract_50,
37
- icon_cag_union_50,
38
- icon_cag_xor_50,
35
+ PyEmbeddedImage,
36
+ icon_bmap_text,
37
+ icon_cag_common,
38
+ icon_cag_subtract,
39
+ icon_cag_union,
40
+ icon_cag_xor,
41
+ icon_hatch,
39
42
  icon_meerk40t,
40
- icons8_align_bottom_50,
41
- icons8_align_left_50,
42
- icons8_align_right_50,
43
- icons8_align_top_50,
44
- icons8_centerh_50,
45
- icons8_centerv_50,
46
- icons8_circle_50,
47
- icons8_circled_left_50,
48
- icons8_circled_right_50,
49
- icons8_copy_50,
50
- icons8_curly_brackets_50,
51
- icons8_cursor_50,
52
- icons8_delete_50,
53
- icons8_finger_50,
43
+ icon_mk_align_bottom,
44
+ icon_mk_align_left,
45
+ icon_mk_align_right,
46
+ icon_mk_align_top,
47
+ icon_mk_circle,
48
+ icon_mk_ellipse,
49
+ icon_mk_point,
50
+ icon_mk_polygon,
51
+ icon_mk_polyline,
52
+ icon_mk_rectangular,
53
+ icon_mk_redo,
54
+ icon_mk_undo,
55
+ icon_power_button,
56
+ icons8_centerh,
57
+ icons8_centerv,
58
+ icons8_circled_left,
59
+ icons8_circled_right,
60
+ icons8_copy,
61
+ icons8_curly_brackets,
62
+ icons8_cursor,
63
+ icons8_delete,
64
+ icons8_finger,
65
+ icons8_flip_horizontal,
54
66
  icons8_flip_vertical,
55
- icons8_group_objects_50,
56
- icons8_measure_50,
57
- icons8_mirror_horizontal,
58
- icons8_node_edit_50,
59
- icons8_opened_folder_50,
60
- icons8_oval_50,
61
- icons8_paste_50,
62
- icons8_pencil_drawing_50,
63
- icons8_place_marker_50,
64
- icons8_point_50,
65
- icons8_polygon_50,
66
- icons8_polyline_50,
67
- icons8_rectangular_50,
68
- icons8_redo_50,
69
- icons8_rotate_left_50,
70
- icons8_rotate_right_50,
71
- icons8_save_50,
72
- icons8_scissors_50,
73
- icons8_type_50,
74
- icons8_undo_50,
75
- icons8_ungroup_objects_50,
76
- icons8_user_location_50,
77
- icons8_vector_50,
67
+ icons8_group_objects,
68
+ icons8_measure,
69
+ icons8_node_edit,
70
+ icons8_opened_folder,
71
+ icons8_paste,
72
+ icons8_pencil_drawing,
73
+ icons8_place_marker,
74
+ icons8_rotate_left,
75
+ icons8_rotate_right,
76
+ icons8_save,
77
+ icons8_scissors,
78
+ icons8_ungroup_objects,
79
+ icons8_user_location,
80
+ icons8_vector,
78
81
  icons_evenspace_horiz,
79
82
  icons_evenspace_vert,
83
+ set_default_icon_size,
80
84
  set_icon_appearance,
81
85
  )
82
86
  from .laserrender import (
@@ -120,6 +124,15 @@ class MeerK40t(MWindow):
120
124
  # Not WX 4.1
121
125
  pass
122
126
  # print(self.GetDPIScaleFactor())
127
+ # What is the standardsize of a textbox?
128
+ testbox = wx.TextCtrl(self, wx.ID_ANY)
129
+ tb_size = testbox.Size
130
+ testbox.Destroy()
131
+ factor = 4 * tb_size[1] / 100.0
132
+ # Round to nearest 5...
133
+ def_size = int(round(factor * 50 / 5, 0) * 5)
134
+ set_default_icon_size(def_size)
135
+
123
136
  self.context.gui = self
124
137
  self._usb_running = dict()
125
138
  context = self.context
@@ -154,6 +167,7 @@ class MeerK40t(MWindow):
154
167
 
155
168
  self.edit_menu_choice = None
156
169
  self._setup_edit_menu_choice()
170
+ self.view_menu_choice = None
157
171
 
158
172
  # Menu Bar
159
173
  self.main_menubar = wx.MenuBar()
@@ -378,6 +392,7 @@ class MeerK40t(MWindow):
378
392
  "help": _("Undo last action"),
379
393
  "action": on_click_undo,
380
394
  "id": wx.ID_UNDO,
395
+ "enabled": self.context.elements.undo.has_undo,
381
396
  "level": 1,
382
397
  "segment": "",
383
398
  },
@@ -386,6 +401,7 @@ class MeerK40t(MWindow):
386
401
  "help": _("Revert last undo"),
387
402
  "action": on_click_redo,
388
403
  "id": wx.ID_REDO,
404
+ "enabled": self.context.elements.undo.has_redo,
389
405
  "level": 1,
390
406
  "segment": "",
391
407
  },
@@ -593,7 +609,8 @@ class MeerK40t(MWindow):
593
609
  @signal_listener("emphasized")
594
610
  def on_update_statusbar(self, origin, *args):
595
611
  value = self.context.elements.has_emphasis()
596
- self._update_status_edit_menu()(None)
612
+ self._update_status_menu(self.edit_menu, self.edit_menu_choice)
613
+ self._update_status_menu(self.view_menu, self.view_menu_choice)
597
614
  if not self.widgets_created:
598
615
  return
599
616
 
@@ -660,6 +677,7 @@ class MeerK40t(MWindow):
660
677
  ),
661
678
  "page": "Gui",
662
679
  "section": "Appearance",
680
+ "signals": "restart",
663
681
  },
664
682
  {
665
683
  "attr": "mini_icon",
@@ -914,19 +932,19 @@ class MeerK40t(MWindow):
914
932
  ]
915
933
  context.kernel.register_choices("preferences", choices)
916
934
  choices = [
917
- {
918
- "attr": "use_toolmenu",
919
- "object": context.root,
920
- "default": True,
921
- "type": bool,
922
- "label": _("Use in-scene tool-menu"),
923
- "tip": _(
924
- "The scene-menu will appear if you right-click on the scene-background"
925
- ),
926
- "page": "Gui",
927
- "hidden": True,
928
- "section": "Scene",
929
- },
935
+ # {
936
+ # "attr": "use_toolmenu",
937
+ # "object": context.root,
938
+ # "default": True,
939
+ # "type": bool,
940
+ # "label": _("Use in-scene tool-menu"),
941
+ # "tip": _(
942
+ # "The scene-menu will appear if you right-click on the scene-background"
943
+ # ),
944
+ # "page": "Gui",
945
+ # "hidden": True,
946
+ # "section": "Scene",
947
+ # },
930
948
  {
931
949
  "attr": "button_repeat",
932
950
  "object": self.context.root,
@@ -1011,11 +1029,36 @@ class MeerK40t(MWindow):
1011
1029
  bsize_normal = STD_ICON_SIZE
1012
1030
  # bsize_small = STD_ICON_SIZE / 2
1013
1031
  bsize_small = STD_ICON_SIZE
1032
+
1033
+ def contains_a_param():
1034
+ result = False
1035
+ for e in kernel.elements.elems(emphasized=True):
1036
+ if e.functional_parameter is not None:
1037
+ result = True
1038
+ break
1039
+ return result
1040
+
1041
+ def contains_a_path():
1042
+ result = False
1043
+ for e in kernel.elements.elems(emphasized=True):
1044
+ if e.type in ("elem polyline", "elem path"):
1045
+ result = True
1046
+ break
1047
+ return result
1048
+
1049
+ def contains_an_element():
1050
+ from meerk40t.core.elements.element_types import elem_nodes
1051
+
1052
+ for e in kernel.elements.elems(emphasized=True):
1053
+ if e.type in elem_nodes:
1054
+ return True
1055
+ return False
1056
+
1014
1057
  kernel.register(
1015
1058
  "button/project/Open",
1016
1059
  {
1017
1060
  "label": _("Open"),
1018
- "icon": icons8_opened_folder_50,
1061
+ "icon": icons8_opened_folder,
1019
1062
  "tip": _("Opens new project"),
1020
1063
  "action": lambda e: kernel.console(".dialog_load\n"),
1021
1064
  "priority": -200,
@@ -1026,7 +1069,7 @@ class MeerK40t(MWindow):
1026
1069
  "button/project/Save",
1027
1070
  {
1028
1071
  "label": _("Save"),
1029
- "icon": icons8_save_50,
1072
+ "icon": icons8_save,
1030
1073
  "tip": _("Saves a project to disk"),
1031
1074
  "action": lambda e: kernel.console(".dialog_save\n"),
1032
1075
  "priority": -100,
@@ -1038,10 +1081,10 @@ class MeerK40t(MWindow):
1038
1081
  buttonsize = STD_ICON_SIZE
1039
1082
 
1040
1083
  kernel.register(
1041
- "button/tools/Scene",
1084
+ "button/select/Scene",
1042
1085
  {
1043
1086
  "label": _("Select"),
1044
- "icon": icons8_cursor_50,
1087
+ "icon": icons8_cursor,
1045
1088
  "tip": _("Regular selection tool"),
1046
1089
  "action": lambda v: kernel.elements("tool none\n"),
1047
1090
  "group": "tool",
@@ -1053,7 +1096,7 @@ class MeerK40t(MWindow):
1053
1096
  # "button/tools/Nodeeditor",
1054
1097
  # {
1055
1098
  # "label": _("Node Edit"),
1056
- # "icon": icons8_node_edit_50,
1099
+ # "icon": icons8_node_edit,
1057
1100
  # "tip": _("Edit nodes of a polyline/path-object"),
1058
1101
  # "action": lambda v: kernel.elements("tool nodemove\n"),
1059
1102
  # "group": "tool",
@@ -1062,10 +1105,10 @@ class MeerK40t(MWindow):
1062
1105
  # },
1063
1106
  # )
1064
1107
  kernel.register(
1065
- "button/tools/Parameter",
1108
+ "button/select/Parameter",
1066
1109
  {
1067
1110
  "label": _("Parametric Edit"),
1068
- "icon": icons8_finger_50,
1111
+ "icon": icons8_finger,
1069
1112
  "tip": _("Parametric edit of a shape"),
1070
1113
  "action": lambda v: kernel.elements("tool parameter\n"),
1071
1114
  "group": "tool",
@@ -1075,10 +1118,10 @@ class MeerK40t(MWindow):
1075
1118
  },
1076
1119
  )
1077
1120
  kernel.register(
1078
- "button/tools/Nodeeditor",
1121
+ "button/select/Nodeeditor",
1079
1122
  {
1080
1123
  "label": _("Node Edit"),
1081
- "icon": icons8_node_edit_50,
1124
+ "icon": icons8_node_edit,
1082
1125
  "tip": _("Edit nodes of a polyline/path-object"),
1083
1126
  "action": lambda v: kernel.elements("tool edit\n"),
1084
1127
  "group": "tool",
@@ -1087,12 +1130,24 @@ class MeerK40t(MWindow):
1087
1130
  "rule_enabled": lambda cond: contains_a_path(),
1088
1131
  },
1089
1132
  )
1090
-
1091
1133
  kernel.register(
1092
- "button/tools/Relocate",
1134
+ "button/select/Hatch",
1135
+ {
1136
+ "label": _("Hatch"),
1137
+ "icon": icon_hatch,
1138
+ "tip": _("Wrap the current node in a hatch"),
1139
+ "action": lambda v: kernel.elements("effect-hatch\n"),
1140
+ # "group": "tool",
1141
+ "size": bsize_normal,
1142
+ # "identifier": "edit",
1143
+ "rule_enabled": lambda cond: contains_an_element(),
1144
+ },
1145
+ )
1146
+ kernel.register(
1147
+ "button/lasercontrol/Relocate",
1093
1148
  {
1094
1149
  "label": _("Set Position"),
1095
- "icon": icons8_place_marker_50,
1150
+ "icon": icons8_place_marker,
1096
1151
  "tip": _("Set position to given location"),
1097
1152
  "action": lambda v: kernel.elements("tool relocate\n"),
1098
1153
  "group": "tool",
@@ -1102,10 +1157,10 @@ class MeerK40t(MWindow):
1102
1157
  )
1103
1158
 
1104
1159
  kernel.register(
1105
- "button/tools/Placement",
1160
+ "button/lasercontrol/Placement",
1106
1161
  {
1107
1162
  "label": _("Job Start"),
1108
- "icon": icons8_user_location_50,
1163
+ "icon": icons8_user_location,
1109
1164
  "tip": _("Add a job starting point to the scene"),
1110
1165
  "action": lambda v: kernel.elements("tool placement\n"),
1111
1166
  "group": "tool",
@@ -1115,15 +1170,15 @@ class MeerK40t(MWindow):
1115
1170
  )
1116
1171
 
1117
1172
  kernel.register(
1118
- "button/tools/Draw",
1173
+ "button/tools/circle",
1119
1174
  {
1120
- "label": _("Draw"),
1121
- "icon": icons8_pencil_drawing_50,
1122
- "tip": _("Add a free-drawing element"),
1123
- "action": lambda v: kernel.elements("tool draw\n"),
1175
+ "label": _("Circle"),
1176
+ "icon": icon_mk_circle,
1177
+ "tip": _("Add a circle element"),
1178
+ "action": lambda v: kernel.elements("tool circle\n"),
1124
1179
  "group": "tool",
1125
1180
  "size": bsize_normal,
1126
- "identifier": "draw",
1181
+ "identifier": "circle",
1127
1182
  },
1128
1183
  )
1129
1184
 
@@ -1131,7 +1186,7 @@ class MeerK40t(MWindow):
1131
1186
  "button/tools/ellipse",
1132
1187
  {
1133
1188
  "label": _("Ellipse"),
1134
- "icon": icons8_oval_50,
1189
+ "icon": icon_mk_ellipse,
1135
1190
  "tip": _("Add an ellipse element"),
1136
1191
  "action": lambda v: kernel.elements("tool ellipse\n"),
1137
1192
  "group": "tool",
@@ -1141,15 +1196,15 @@ class MeerK40t(MWindow):
1141
1196
  )
1142
1197
 
1143
1198
  kernel.register(
1144
- "button/tools/circle",
1199
+ "button/tools/Rectangle",
1145
1200
  {
1146
- "label": _("Circle"),
1147
- "icon": icons8_circle_50,
1148
- "tip": _("Add a circle element"),
1149
- "action": lambda v: kernel.elements("tool circle\n"),
1201
+ "label": _("Rectangle"),
1202
+ "icon": icon_mk_rectangular,
1203
+ "tip": _("Add a rectangular element"),
1204
+ "action": lambda v: kernel.elements("tool rect\n"),
1150
1205
  "group": "tool",
1151
1206
  "size": bsize_normal,
1152
- "identifier": "circle",
1207
+ "identifier": "rect",
1153
1208
  },
1154
1209
  )
1155
1210
 
@@ -1157,7 +1212,7 @@ class MeerK40t(MWindow):
1157
1212
  "button/tools/Polygon",
1158
1213
  {
1159
1214
  "label": _("Polygon"),
1160
- "icon": icons8_polygon_50,
1215
+ "icon": icon_mk_polygon,
1161
1216
  "tip": _(
1162
1217
  "Add a polygon element\nLeft click: point/line\nDouble click: complete\nRight click: cancel"
1163
1218
  ),
@@ -1172,7 +1227,7 @@ class MeerK40t(MWindow):
1172
1227
  "button/tools/Polyline",
1173
1228
  {
1174
1229
  "label": _("Polyline"),
1175
- "icon": icons8_polyline_50,
1230
+ "icon": icon_mk_polyline,
1176
1231
  "tip": _(
1177
1232
  "Add a polyline element\nLeft click: point/line\nDouble click: complete\nRight click: cancel"
1178
1233
  ),
@@ -1183,24 +1238,11 @@ class MeerK40t(MWindow):
1183
1238
  },
1184
1239
  )
1185
1240
 
1186
- kernel.register(
1187
- "button/tools/Rectangle",
1188
- {
1189
- "label": _("Rectangle"),
1190
- "icon": icons8_rectangular_50,
1191
- "tip": _("Add a rectangular element"),
1192
- "action": lambda v: kernel.elements("tool rect\n"),
1193
- "group": "tool",
1194
- "size": bsize_normal,
1195
- "identifier": "rect",
1196
- },
1197
- )
1198
-
1199
1241
  kernel.register(
1200
1242
  "button/tools/Point",
1201
1243
  {
1202
1244
  "label": _("Point"),
1203
- "icon": icons8_point_50,
1245
+ "icon": icon_mk_point,
1204
1246
  "tip": _("Add point to the scene"),
1205
1247
  "action": lambda v: kernel.elements("tool point\n"),
1206
1248
  "group": "tool",
@@ -1213,7 +1255,7 @@ class MeerK40t(MWindow):
1213
1255
  "button/tools/Vector",
1214
1256
  {
1215
1257
  "label": _("Vector"),
1216
- "icon": icons8_vector_50,
1258
+ "icon": icons8_vector,
1217
1259
  "tip": _(
1218
1260
  "Add a shape\nLeft click: point/line\nClick and hold: curve\nDouble click: complete\nRight click: end"
1219
1261
  ),
@@ -1223,11 +1265,25 @@ class MeerK40t(MWindow):
1223
1265
  "identifier": "vector",
1224
1266
  },
1225
1267
  )
1268
+
1269
+ kernel.register(
1270
+ "button/tools/Draw",
1271
+ {
1272
+ "label": _("Draw"),
1273
+ "icon": icons8_pencil_drawing,
1274
+ "tip": _("Add a free-drawing element"),
1275
+ "action": lambda v: kernel.elements("tool draw\n"),
1276
+ "group": "tool",
1277
+ "size": bsize_normal,
1278
+ "identifier": "draw",
1279
+ },
1280
+ )
1281
+
1226
1282
  kernel.register(
1227
1283
  "button/tools/Text",
1228
1284
  {
1229
1285
  "label": _("Text"),
1230
- "icon": icons8_type_50,
1286
+ "icon": icon_bmap_text,
1231
1287
  "tip": _("Add a text element"),
1232
1288
  "action": lambda v: kernel.elements("tool text\n"),
1233
1289
  "group": "tool",
@@ -1240,7 +1296,7 @@ class MeerK40t(MWindow):
1240
1296
  "button/basicediting/Delete",
1241
1297
  {
1242
1298
  "label": _("Delete"),
1243
- "icon": icons8_delete_50,
1299
+ "icon": icons8_delete,
1244
1300
  "tip": _("Delete selected items"),
1245
1301
  "action": lambda v: kernel.elements("tree selected delete\n"),
1246
1302
  "size": bsize_normal,
@@ -1251,7 +1307,7 @@ class MeerK40t(MWindow):
1251
1307
  "button/basicediting/Cut",
1252
1308
  {
1253
1309
  "label": _("Cut"),
1254
- "icon": icons8_scissors_50,
1310
+ "icon": icons8_scissors,
1255
1311
  "tip": _("Cut selected elements"),
1256
1312
  "action": lambda v: kernel.elements("clipboard cut\n"),
1257
1313
  "size": bsize_small,
@@ -1266,7 +1322,7 @@ class MeerK40t(MWindow):
1266
1322
  "button/basicediting/Copy",
1267
1323
  {
1268
1324
  "label": _("Copy"),
1269
- "icon": icons8_copy_50,
1325
+ "icon": icons8_copy,
1270
1326
  "tip": _("Copy selected elements to clipboard"),
1271
1327
  "action": lambda v: kernel.elements("clipboard copy\n"),
1272
1328
  "size": bsize_small,
@@ -1292,7 +1348,7 @@ class MeerK40t(MWindow):
1292
1348
  "button/basicediting/Paste",
1293
1349
  {
1294
1350
  "label": _("Paste"),
1295
- "icon": icons8_paste_50,
1351
+ "icon": icons8_paste,
1296
1352
  "tip": _("Paste elements from clipboard"),
1297
1353
  "action": lambda v: kernel.elements(
1298
1354
  "clipboard paste -dx 3mm -dy 3mm\n"
@@ -1306,10 +1362,8 @@ class MeerK40t(MWindow):
1306
1362
  # "button/basicediting/Duplicate",
1307
1363
  # {
1308
1364
  # "label": _("Duplicate"),
1309
- # "icon": icons8_replicate_rows_50,
1310
- # "tip": _(
1311
- # "Duplicate selected elements"
1312
- # ),
1365
+ # "icon": icon_duplicate,
1366
+ # "tip": _("Duplicate selected elements"),
1313
1367
  # "action": lambda v: kernel.elements("element copy --dx=3mm --dy=3mm\n"),
1314
1368
  # "size": bsize_small,
1315
1369
  # "identifier": "editduplicate",
@@ -1323,24 +1377,24 @@ class MeerK40t(MWindow):
1323
1377
  "button/undo/Undo",
1324
1378
  {
1325
1379
  "label": _("Undo"),
1326
- "icon": icons8_undo_50,
1380
+ "icon": icon_mk_undo,
1327
1381
  "tip": _("Undo last operation"),
1328
1382
  "action": lambda v: kernel.elements("undo\n"),
1329
1383
  "size": bsize_small,
1330
1384
  "identifier": "editundo",
1331
- # "rule_enabled": lambda cond: kernel.elements.undo.has_undo,
1385
+ "rule_enabled": lambda cond: kernel.elements.undo.has_undo(),
1332
1386
  },
1333
1387
  )
1334
1388
  kernel.register(
1335
1389
  "button/undo/Redo",
1336
1390
  {
1337
1391
  "label": _("Redo"),
1338
- "icon": icons8_redo_50,
1392
+ "icon": icon_mk_redo,
1339
1393
  "tip": _("Redo last operation"),
1340
1394
  "action": lambda v: kernel.elements("redo\n"),
1341
1395
  "size": bsize_small,
1342
1396
  "identifier": "editredo",
1343
- # "rule_enabled": lambda cond: kernel.elements.undo.has_undo,
1397
+ "rule_enabled": lambda cond: kernel.elements.undo.has_redo(),
1344
1398
  },
1345
1399
  )
1346
1400
 
@@ -1348,7 +1402,7 @@ class MeerK40t(MWindow):
1348
1402
  "button/extended_tools/Measure",
1349
1403
  {
1350
1404
  "label": _("Measure"),
1351
- "icon": icons8_measure_50,
1405
+ "icon": icons8_measure,
1352
1406
  "tip": _(
1353
1407
  "Measure distance / perimeter / area\nLeft click: point/line\nDouble click: complete\nRight click: cancel"
1354
1408
  ),
@@ -1359,22 +1413,6 @@ class MeerK40t(MWindow):
1359
1413
  },
1360
1414
  )
1361
1415
 
1362
- def contains_a_param():
1363
- result = False
1364
- for e in kernel.elements.elems(emphasized=True):
1365
- if e.functional_parameter is not None:
1366
- result = True
1367
- break
1368
- return result
1369
-
1370
- def contains_a_path():
1371
- result = False
1372
- for e in kernel.elements.elems(emphasized=True):
1373
- if e.type in ("elem polyline", "elem path"):
1374
- result = True
1375
- break
1376
- return result
1377
-
1378
1416
  # Default Size for smaller buttons
1379
1417
  buttonsize = STD_ICON_SIZE / 2
1380
1418
 
@@ -1396,7 +1434,7 @@ class MeerK40t(MWindow):
1396
1434
  "button/modify/Mirror",
1397
1435
  {
1398
1436
  "label": _("Mirror Horizontal"),
1399
- "icon": icons8_mirror_horizontal,
1437
+ "icon": icons8_flip_horizontal,
1400
1438
  "tip": _("Mirror the selected element horizontally"),
1401
1439
  "action": lambda v: kernel.elements("scale -1 1\n"),
1402
1440
  "size": bsize_small,
@@ -1410,7 +1448,7 @@ class MeerK40t(MWindow):
1410
1448
  "button/modify/Rotate90CW",
1411
1449
  {
1412
1450
  "label": _("Rotate CW"),
1413
- "icon": icons8_rotate_right_50,
1451
+ "icon": icons8_rotate_right,
1414
1452
  "tip": _("Rotate the selected element clockwise by 90 deg"),
1415
1453
  "action": lambda v: kernel.elements("rotate 90deg\n"),
1416
1454
  "size": bsize_small,
@@ -1424,7 +1462,7 @@ class MeerK40t(MWindow):
1424
1462
  "button/modify/Rotate90CCW",
1425
1463
  {
1426
1464
  "label": _("Rotate CCW"),
1427
- "icon": icons8_rotate_left_50,
1465
+ "icon": icons8_rotate_left,
1428
1466
  "tip": _("Rotate the selected element counterclockwise by 90 deg"),
1429
1467
  "action": lambda v: kernel.elements("rotate -90deg\n"),
1430
1468
  "size": bsize_small,
@@ -1438,7 +1476,7 @@ class MeerK40t(MWindow):
1438
1476
  "button/geometry/Union",
1439
1477
  {
1440
1478
  "label": _("Union"),
1441
- "icon": icon_cag_union_50,
1479
+ "icon": icon_cag_union,
1442
1480
  "tip": _("Create a union of the selected elements"),
1443
1481
  "action": lambda v: kernel.elements("element union\n"),
1444
1482
  "size": bsize_small,
@@ -1452,7 +1490,7 @@ class MeerK40t(MWindow):
1452
1490
  "button/geometry/Difference",
1453
1491
  {
1454
1492
  "label": _("Difference"),
1455
- "icon": icon_cag_subtract_50,
1493
+ "icon": icon_cag_subtract,
1456
1494
  "tip": _("Create a difference of the selected elements"),
1457
1495
  "action": lambda v: kernel.elements("element difference\n"),
1458
1496
  "size": bsize_small,
@@ -1466,7 +1504,7 @@ class MeerK40t(MWindow):
1466
1504
  "button/geometry/Xor",
1467
1505
  {
1468
1506
  "label": _("Xor"),
1469
- "icon": icon_cag_xor_50,
1507
+ "icon": icon_cag_xor,
1470
1508
  "tip": _("Create a xor of the selected elements"),
1471
1509
  "action": lambda v: kernel.elements("element xor\n"),
1472
1510
  "size": bsize_small,
@@ -1480,7 +1518,7 @@ class MeerK40t(MWindow):
1480
1518
  "button/geometry/Intersection",
1481
1519
  {
1482
1520
  "label": _("Intersection"),
1483
- "icon": icon_cag_common_50,
1521
+ "icon": icon_cag_common,
1484
1522
  "tip": _("Create a intersection of the selected elements"),
1485
1523
  "action": lambda v: kernel.elements("element intersection\n"),
1486
1524
  "size": bsize_small,
@@ -1537,7 +1575,7 @@ class MeerK40t(MWindow):
1537
1575
  "button/group/Group",
1538
1576
  {
1539
1577
  "label": _("Group"),
1540
- "icon": icons8_group_objects_50,
1578
+ "icon": icons8_group_objects,
1541
1579
  "tip": _("Group elements together"),
1542
1580
  "action": lambda v: group_selection(),
1543
1581
  "size": bsize_normal,
@@ -1582,7 +1620,7 @@ class MeerK40t(MWindow):
1582
1620
  "button/group/Ungroup",
1583
1621
  {
1584
1622
  "label": _("Ungroup"),
1585
- "icon": icons8_ungroup_objects_50,
1623
+ "icon": icons8_ungroup_objects,
1586
1624
  "tip": _("Ungroup elements"),
1587
1625
  "action": lambda v: ungroup_selection(),
1588
1626
  "size": bsize_normal,
@@ -1594,7 +1632,7 @@ class MeerK40t(MWindow):
1594
1632
  "button/align/AlignLeft",
1595
1633
  {
1596
1634
  "label": _("Left"),
1597
- "icon": icons8_align_left_50,
1635
+ "icon": icon_mk_align_left,
1598
1636
  "tip": _(
1599
1637
  "Align selected elements at the leftmost position (right click: of the bed)"
1600
1638
  ),
@@ -1616,7 +1654,7 @@ class MeerK40t(MWindow):
1616
1654
  "button/preparation/Wordlist",
1617
1655
  {
1618
1656
  "label": _("Wordlist"),
1619
- "icon": icons8_curly_brackets_50,
1657
+ "icon": icons8_curly_brackets,
1620
1658
  "tip": _("Manages Wordlist-Entries")
1621
1659
  + "\n"
1622
1660
  + _(" (right go to next entry)"),
@@ -1627,7 +1665,7 @@ class MeerK40t(MWindow):
1627
1665
  "multi": [
1628
1666
  {
1629
1667
  "identifier": "prep_wordlist_edit",
1630
- "icon": icons8_curly_brackets_50,
1668
+ "icon": icons8_curly_brackets,
1631
1669
  "tip": _("Manages Wordlist-Entries")
1632
1670
  + _(" (right go to next entry)"),
1633
1671
  "label": _("Wordlist Editor"),
@@ -1636,7 +1674,7 @@ class MeerK40t(MWindow):
1636
1674
  },
1637
1675
  {
1638
1676
  "identifier": "prep_wordlist_plus_1",
1639
- "icon": icons8_circled_right_50,
1677
+ "icon": icons8_circled_right,
1640
1678
  "tip": _("Wordlist: go to next entry")
1641
1679
  + _(" (right go to prev entry)"),
1642
1680
  "label": _("Next"),
@@ -1646,7 +1684,7 @@ class MeerK40t(MWindow):
1646
1684
  {
1647
1685
  "identifier": "prep_wordlist_minus_1",
1648
1686
  "label": _("Prev"),
1649
- "icon": icons8_circled_left_50,
1687
+ "icon": icons8_circled_left,
1650
1688
  "tip": _("Wordlist: go to prev entry")
1651
1689
  + _(" (right go to next entry)"),
1652
1690
  "action": lambda v: kernel.elements.wordlist_advance(-1),
@@ -1663,7 +1701,7 @@ class MeerK40t(MWindow):
1663
1701
  "button/align/AlignRight",
1664
1702
  {
1665
1703
  "label": _("Right"),
1666
- "icon": icons8_align_right_50,
1704
+ "icon": icon_mk_align_right,
1667
1705
  "tip": _(
1668
1706
  "Align selected elements at the rightmost position (right click: of the bed)"
1669
1707
  ),
@@ -1680,7 +1718,7 @@ class MeerK40t(MWindow):
1680
1718
  "button/align/AlignTop",
1681
1719
  {
1682
1720
  "label": _("Top"),
1683
- "icon": icons8_align_top_50,
1721
+ "icon": icon_mk_align_top,
1684
1722
  "tip": _(
1685
1723
  "Align selected elements at the topmost position (right click: of the bed)"
1686
1724
  ),
@@ -1697,7 +1735,7 @@ class MeerK40t(MWindow):
1697
1735
  "button/align/AlignBottom",
1698
1736
  {
1699
1737
  "label": _("Bottom"),
1700
- "icon": icons8_align_bottom_50,
1738
+ "icon": icon_mk_align_bottom,
1701
1739
  "tip": _(
1702
1740
  "Align selected elements at the lowest position (right click: of the bed)"
1703
1741
  ),
@@ -1714,7 +1752,7 @@ class MeerK40t(MWindow):
1714
1752
  "button/align/AlignCenterH",
1715
1753
  {
1716
1754
  "label": _("Center X"),
1717
- "icon": icons8_centerh_50,
1755
+ "icon": icons8_centerh,
1718
1756
  "tip": _(
1719
1757
  "Align selected elements at their center horizontally (right click: of the bed)"
1720
1758
  ),
@@ -1731,7 +1769,7 @@ class MeerK40t(MWindow):
1731
1769
  "button/align/AlignCenterV",
1732
1770
  {
1733
1771
  "label": _("Center Y"),
1734
- "icon": icons8_centerv_50,
1772
+ "icon": icons8_centerv,
1735
1773
  "tip": _(
1736
1774
  "Align selected elements at their center vertically (right click: of the bed)"
1737
1775
  ),
@@ -2371,7 +2409,12 @@ class MeerK40t(MWindow):
2371
2409
 
2372
2410
  @property
2373
2411
  def is_dark(self):
2374
- return wx.SystemSettings().GetColour(wx.SYS_COLOUR_WINDOW)[0] < 127
2412
+ # try:
2413
+ # res = wx.SystemSettings().GetAppearance().IsDark()
2414
+ # except AttributeError:
2415
+ # res = wx.SystemSettings().GetColour(wx.SYS_COLOUR_WINDOW)[0] < 127
2416
+ res = wx.SystemSettings().GetColour(wx.SYS_COLOUR_WINDOW)[0] < 127
2417
+ return res
2375
2418
 
2376
2419
  def __kernel_initialize(self):
2377
2420
  context = self.context
@@ -2800,9 +2843,9 @@ class MeerK40t(MWindow):
2800
2843
  self.Bind(wx.EVT_MENU, self.on_click_exit, id=menu_item.GetId())
2801
2844
  self.main_menubar.Append(self.file_menu, _("File"))
2802
2845
 
2803
- def _update_status_edit_menu(self, *args):
2846
+ def _update_status_menu(self, menu, choices, *args):
2804
2847
  def handler(event):
2805
- for entry in self.edit_menu_choice:
2848
+ for entry in local_choices:
2806
2849
  if "label" in entry and "enabled" in entry:
2807
2850
  flag = True
2808
2851
  label = entry["label"]
@@ -2811,13 +2854,15 @@ class MeerK40t(MWindow):
2811
2854
  except AttributeError:
2812
2855
  flag = True
2813
2856
  if label:
2814
- menu_id = self.edit_menu.FindItem(label)
2857
+ menu_id = local_menu.FindItem(label)
2815
2858
  if menu_id != wx.NOT_FOUND:
2816
- menu_item = self.edit_menu.FindItemById(menu_id)
2859
+ menu_item = local_menu.FindItemById(menu_id)
2817
2860
  menu_item.Enable(flag)
2818
2861
  if event:
2819
2862
  event.Skip()
2820
2863
 
2864
+ local_menu = menu
2865
+ local_choices = choices
2821
2866
  return handler
2822
2867
 
2823
2868
  def __set_edit_menu(self):
@@ -2833,7 +2878,10 @@ class MeerK40t(MWindow):
2833
2878
  else:
2834
2879
  self.main_menubar.Append(self.edit_menu, label)
2835
2880
 
2836
- self.edit_menu.Bind(wx.EVT_MENU_OPEN, self._update_status_edit_menu())
2881
+ self.edit_menu.Bind(
2882
+ wx.EVT_MENU_OPEN,
2883
+ self._update_status_menu(self.edit_menu, self.edit_menu_choice),
2884
+ )
2837
2885
 
2838
2886
  def __set_view_menu(self):
2839
2887
  def toggle_draw_mode(bits):
@@ -2874,6 +2922,7 @@ class MeerK40t(MWindow):
2874
2922
  "action": self.on_click_zoom_selected,
2875
2923
  "id": wx.ID_ZOOM_100,
2876
2924
  "level": 1,
2925
+ "enabled": self.context.elements.has_emphasis,
2877
2926
  "segment": "",
2878
2927
  },
2879
2928
  {
@@ -3138,8 +3187,13 @@ class MeerK40t(MWindow):
3138
3187
  ]
3139
3188
 
3140
3189
  self.view_menu = wx.Menu()
3190
+ self.view_menu_choice = choices
3141
3191
  self._create_menu_from_choices(self.view_menu, choices)
3142
3192
  self.main_menubar.Append(self.view_menu, _("View"))
3193
+ self.view_menu.Bind(
3194
+ wx.EVT_MENU_OPEN,
3195
+ self._update_status_menu(self.view_menu, self.view_menu_choice),
3196
+ )
3143
3197
 
3144
3198
  def __set_pane_menu(self):
3145
3199
  # ==========
@@ -3354,6 +3408,7 @@ class MeerK40t(MWindow):
3354
3408
  message="This requires a program restart before the language change will kick in!",
3355
3409
  caption="Language changed",
3356
3410
  )
3411
+ self.context.signal("restart")
3357
3412
 
3358
3413
  return check
3359
3414
 
@@ -3363,6 +3418,19 @@ class MeerK40t(MWindow):
3363
3418
  i += 1
3364
3419
  self.main_menubar.Append(wxglade_tmp_menu, _("Languages"))
3365
3420
 
3421
+ @signal_listener("restart")
3422
+ def on_restart_required(self, *args):
3423
+ self.context.kernel.register(
3424
+ "button/project/Restart",
3425
+ {
3426
+ "label": _("Restart"),
3427
+ "icon": icon_power_button,
3428
+ "tip": _("Restart needed to apply new parameters"),
3429
+ "action": lambda v: self.context("restart\n"),
3430
+ "size": STD_ICON_SIZE,
3431
+ },
3432
+ )
3433
+
3366
3434
  @signal_listener("file;loaded")
3367
3435
  @signal_listener("file;saved")
3368
3436
  @signal_listener("file;cleared")
@@ -3636,9 +3704,15 @@ class MeerK40t(MWindow):
3636
3704
  else:
3637
3705
  label = " - " + label
3638
3706
 
3707
+ try:
3708
+ dev_label = self.context.device.label
3709
+ except AttributeError:
3710
+ # Label cannot be found because device does not exist.
3711
+ dev_label = ""
3712
+
3639
3713
  title = (
3640
3714
  f"{str(self.context.kernel.name)} v{self.context.kernel.version} - "
3641
- f"{self.context.device.label}{label}"
3715
+ f"{dev_label}{label}"
3642
3716
  )
3643
3717
  self.SetTitle(title)
3644
3718
 
@@ -3777,7 +3851,8 @@ class MeerK40t(MWindow):
3777
3851
  self.context(".laserpath_clear\n")
3778
3852
  self.validate_save()
3779
3853
  kernel.busyinfo.end()
3780
- self.context("tool none\n")
3854
+ self.context(".tool none\n")
3855
+ context.elements.undo.mark("blank")
3781
3856
 
3782
3857
  def clear_and_open(self, pathname, preferred_loader=None):
3783
3858
  self.clear_project(ops_too=False)
@@ -3878,9 +3953,11 @@ class MeerK40t(MWindow):
3878
3953
 
3879
3954
  def on_click_open(self, event=None): # wxGlade: MeerK40t.<event_handler>
3880
3955
  self.context(".dialog_load\n")
3956
+ self.context(".tool none\n")
3881
3957
 
3882
3958
  def on_click_import(self, event=None): # wxGlade: MeerK40t.<event_handler>
3883
3959
  self.context(".dialog_import\n")
3960
+ self.context(".tool none\n")
3884
3961
 
3885
3962
  def on_click_stop(self, event=None):
3886
3963
  self.context("estop\n")
@@ -3890,9 +3967,11 @@ class MeerK40t(MWindow):
3890
3967
 
3891
3968
  def on_click_save(self, event):
3892
3969
  self.context(".dialog_save\n")
3970
+ self.context(".tool none\n")
3893
3971
 
3894
3972
  def on_click_save_as(self, event=None):
3895
3973
  self.context(".dialog_save_as\n")
3974
+ self.context(".tool none\n")
3896
3975
 
3897
3976
  def on_click_close(self, event=None):
3898
3977
  try: