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
@@ -7,13 +7,14 @@ from wx import aui
7
7
  from ..kernel import signal_listener
8
8
  from .icons import (
9
9
  STD_ICON_SIZE,
10
- icons8_add_new_25,
11
- icons8_circled_left_50,
12
- icons8_circled_right_50,
13
- icons8_curly_brackets_50,
14
- icons8_edit_25,
15
- icons8_paste_25,
16
- icons8_remove_25,
10
+ get_default_icon_size,
11
+ icon_add_new,
12
+ icon_edit,
13
+ icon_trash,
14
+ icons8_circled_left,
15
+ icons8_circled_right,
16
+ icons8_curly_brackets,
17
+ icons8_paste,
17
18
  )
18
19
  from .mwindow import MWindow
19
20
  from .wxutils import StaticBoxSizer, dip_size
@@ -47,13 +48,13 @@ class WordlistMiniPanel(wx.Panel):
47
48
  main_sizer = wx.BoxSizer(wx.HORIZONTAL)
48
49
  self.button_edit = wx.Button(self, wx.ID_ANY, _("Edit"))
49
50
  self.button_edit.SetBitmap(
50
- icons8_curly_brackets_50.GetBitmap(resize=STD_ICON_SIZE / 2)
51
+ icons8_curly_brackets.GetBitmap(resize=0.5 * get_default_icon_size())
51
52
  )
52
53
  self.button_edit.SetToolTip(_("Manages Wordlist-Entries"))
53
54
 
54
55
  self.button_next = wx.Button(self, wx.ID_ANY, _("Next"))
55
56
  self.button_next.SetBitmap(
56
- icons8_circled_right_50.GetBitmap(resize=STD_ICON_SIZE / 2)
57
+ icons8_circled_right.GetBitmap(resize=0.5 * get_default_icon_size())
57
58
  )
58
59
  self.button_next.SetToolTip(
59
60
  _("Wordlist: go to next page (right-click to next entry)")
@@ -61,7 +62,7 @@ class WordlistMiniPanel(wx.Panel):
61
62
 
62
63
  self.button_prev = wx.Button(self, wx.ID_ANY, _("Prev"))
63
64
  self.button_prev.SetBitmap(
64
- icons8_circled_left_50.GetBitmap(resize=STD_ICON_SIZE / 2)
65
+ icons8_circled_left.GetBitmap(resize=0.5 * get_default_icon_size())
65
66
  )
66
67
  self.button_prev.SetToolTip(
67
68
  _("Wordlist: go to previous page (right-click to previous entry)")
@@ -196,6 +197,8 @@ class WordlistPanel(wx.Panel):
196
197
  sizer_index_left.Add(
197
198
  sizer_edit_wordlist_buttons, 0, wx.ALIGN_CENTER_VERTICAL, 0
198
199
  )
200
+ testsize = dip_size(self, 22, 22)
201
+ icon_size = testsize[0]
199
202
 
200
203
  self.btn_edit_wordlist_del = wx.StaticBitmap(
201
204
  self, wx.ID_ANY, size=dip_size(self, 25, 25)
@@ -215,12 +218,24 @@ class WordlistPanel(wx.Panel):
215
218
  self.btn_edit_content_paste = wx.StaticBitmap(
216
219
  self, wx.ID_ANY, size=dip_size(self, 25, 25)
217
220
  )
218
- self.btn_edit_wordlist_del.SetBitmap(icons8_remove_25.GetBitmap())
219
- self.btn_edit_wordlist_edit.SetBitmap(icons8_edit_25.GetBitmap())
220
- self.btn_edit_content_add.SetBitmap(icons8_add_new_25.GetBitmap())
221
- self.btn_edit_content_del.SetBitmap(icons8_remove_25.GetBitmap())
222
- self.btn_edit_content_edit.SetBitmap(icons8_edit_25.GetBitmap())
223
- self.btn_edit_content_paste.SetBitmap(icons8_paste_25.GetBitmap())
221
+ self.btn_edit_wordlist_del.SetBitmap(
222
+ icon_trash.GetBitmap(resize=icon_size, buffer=1)
223
+ )
224
+ self.btn_edit_wordlist_edit.SetBitmap(
225
+ icon_edit.GetBitmap(resize=icon_size, buffer=1)
226
+ )
227
+ self.btn_edit_content_add.SetBitmap(
228
+ icon_add_new.GetBitmap(resize=icon_size, buffer=1)
229
+ )
230
+ self.btn_edit_content_del.SetBitmap(
231
+ icon_trash.GetBitmap(resize=icon_size, buffer=1)
232
+ )
233
+ self.btn_edit_content_edit.SetBitmap(
234
+ icon_edit.GetBitmap(resize=icon_size, buffer=1)
235
+ )
236
+ self.btn_edit_content_paste.SetBitmap(
237
+ icons8_paste.GetBitmap(resize=icon_size, buffer=1)
238
+ )
224
239
 
225
240
  self.btn_edit_wordlist_del.SetToolTip(_("Delete the current variable"))
226
241
  self.btn_edit_wordlist_edit.SetToolTip(
@@ -854,7 +869,7 @@ class WordlistEditor(MWindow):
854
869
  self.panel_about.set_parent(self)
855
870
 
856
871
  _icon = wx.NullIcon
857
- _icon.CopyFromBitmap(icons8_curly_brackets_50.GetBitmap())
872
+ _icon.CopyFromBitmap(icons8_curly_brackets.GetBitmap())
858
873
  self.SetIcon(_icon)
859
874
  self.notebook_main = wx.aui.AuiNotebook(
860
875
  self,
@@ -892,7 +907,7 @@ class WordlistEditor(MWindow):
892
907
  "button/config/Wordlist",
893
908
  {
894
909
  "label": _("Wordlist Editor"),
895
- "icon": icons8_curly_brackets_50,
910
+ "icon": icons8_curly_brackets,
896
911
  "tip": _("Manages Wordlist-Entries"),
897
912
  "action": lambda v: kernel.console("window toggle Wordlist\n"),
898
913
  },
@@ -20,6 +20,7 @@ from meerk40t.gui.navigationpanels import Navigation
20
20
  from meerk40t.gui.spoolerpanel import JobSpooler
21
21
  from meerk40t.gui.wxmscene import SceneWindow
22
22
  from meerk40t.kernel import CommandSyntaxError, ConsoleFunction, Module, get_safe_path
23
+ from meerk40t.kernel.kernel import Job
23
24
 
24
25
  from ..main import APPLICATION_NAME, APPLICATION_VERSION
25
26
  from ..tools.kerftest import KerfTool
@@ -35,10 +36,11 @@ from .hersheymanager import (
35
36
  register_hershey_stuff,
36
37
  )
37
38
  from .icons import (
38
- icons8_emergency_stop_button_50,
39
- icons8_gas_industry_50,
40
- icons8_home_filled_50,
41
- icons8_pause_50,
39
+ DARKMODE,
40
+ icons8_emergency_stop_button,
41
+ icons8_gas_industry,
42
+ icons8_home_filled,
43
+ icons8_pause,
42
44
  )
43
45
  from .imagesplitter import RenderSplit
44
46
  from .keymap import Keymap
@@ -75,6 +77,7 @@ from .propertypanels.rasterwizardpanels import (
75
77
  )
76
78
  from .propertypanels.textproperty import TextPropertyPanel
77
79
  from .propertypanels.waitproperty import WaitPropertyPanel
80
+ from .propertypanels.wobbleproperty import WobblePropertyPanel
78
81
  from .simpleui import SimpleUI
79
82
  from .simulation import Simulation
80
83
  from .wordlisteditor import WordlistEditor
@@ -95,28 +98,103 @@ The Transformations work in Windows/OSX/Linux for wxPython 4.0+ (and likely befo
95
98
  _ = wx.GetTranslation
96
99
 
97
100
 
98
- class GoPanel(wx.Panel):
99
- def __init__(self, *args, context=None, **kwds):
100
- # begin wxGlade: PassesPanel.__init__
101
+ class ActionPanel(wx.Panel):
102
+ def __init__(
103
+ self,
104
+ *args,
105
+ context=None,
106
+ action=None,
107
+ action_right=None,
108
+ fgcolor=None,
109
+ bgcolor=None,
110
+ icon=None,
111
+ tooltip="",
112
+ **kwds,
113
+ ):
101
114
  kwds["style"] = kwds.get("style", 0)
102
115
  wx.Panel.__init__(self, *args, **kwds)
103
- self.click_time = 0
116
+
104
117
  self.context = context
105
- self.button_go = wx.BitmapButton(self, wx.ID_ANY)
106
- self.button_go.SetBitmap(
107
- icons8_gas_industry_50.GetBitmap(color=wx.WHITE, keepalpha=True)
108
- )
109
- self.button_go.SetBitmapFocus(icons8_gas_industry_50.GetBitmap())
110
- self.was_mouse = False
111
- self.button_go.Bind(wx.EVT_BUTTON, self.on_button_go_click)
112
- self.button_go.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down)
113
- self.button_go.SetBackgroundColour(wx.Colour(0, 127, 0))
114
- self.button_go.SetToolTip(_("One Touch: Send Job To Laser "))
118
+ self.button_go = wx.Button(self, wx.ID_ANY)
119
+ self.icon = icon
120
+ self.fgcolor = fgcolor
121
+ if bgcolor is not None:
122
+ self.button_go.SetBackgroundColour(bgcolor)
123
+ self.button_go.SetToolTip(tooltip)
124
+ # self.button_go.SetBitmapMargins(0, 0)
125
+ self.action = action
126
+ self.action_right = action_right
115
127
 
116
128
  main_sizer = wx.BoxSizer(wx.HORIZONTAL)
117
129
  main_sizer.Add(self.button_go, 1, wx.EXPAND, 0)
118
130
  self.SetSizer(main_sizer)
119
131
  main_sizer.Fit(self)
132
+ self.button_go.Bind(wx.EVT_BUTTON, self.on_button_go_click)
133
+ if self.action_right is not None:
134
+ self.button_go.Bind(wx.EVT_RIGHT_DOWN, self.on_button_go_click_right)
135
+
136
+ self.button_go.Bind(wx.EVT_SIZE, self.on_button_resize)
137
+ # Initial resize
138
+ self.resize_button()
139
+ self.resize_job = Job(
140
+ process=self.resize_button,
141
+ job_name=f"_resize_actionpanel_{self.Id}",
142
+ interval=0.1,
143
+ times=1,
144
+ run_main=True,
145
+ )
146
+
147
+ def on_button_go_click(self, event):
148
+ if self.action is not None:
149
+ self.action()
150
+
151
+ def on_button_go_click_right(self, event):
152
+ if self.action_right is not None:
153
+ self.action_right()
154
+
155
+ def resize_button(self):
156
+ size = self.button_go.Size
157
+ minsize = min(size[0], size[1])
158
+ # Leave some room at the edges,
159
+ # for every 25 pixel 1 pixel at each side
160
+ room = int(minsize / 25) * 2
161
+ best_size = minsize - room
162
+ # At least 20 px high
163
+ best_size = max(best_size, 20)
164
+ border = 2
165
+ bmp = self.icon.GetBitmap(color=self.fgcolor, resize=best_size, buffer=border)
166
+ # s = bmp.Size
167
+ # print(f"Was asking for {best_size}x{best_size}, got {s[0]}x{s[1]}")
168
+ self.button_go.SetBitmap(bmp)
169
+ bmp = self.icon.GetBitmap(resize=best_size, buffer=border)
170
+ self.button_go.SetBitmapFocus(bmp)
171
+
172
+ def on_button_resize(self, event):
173
+ self.context.schedule(self.resize_job)
174
+ event.Skip()
175
+
176
+
177
+ class GoPanel(ActionPanel):
178
+ def __init__(self, *args, context=None, **kwds):
179
+ # begin wxGlade: PassesPanel.__init__
180
+ kwds["style"] = kwds.get("style", 0)
181
+ fgcol = context.themes.get("start_fg")
182
+ bgcol = context.themes.get("start_bg")
183
+ ActionPanel.__init__(
184
+ self,
185
+ context=context,
186
+ action=None,
187
+ fgcolor=fgcol,
188
+ bgcolor=bgcol,
189
+ icon=icons8_gas_industry,
190
+ tooltip=_("One Touch: Send Job To Laser "),
191
+ *args,
192
+ **kwds,
193
+ )
194
+ self.click_time = 0
195
+ self.was_mouse = False
196
+ self.button_go.Bind(wx.EVT_BUTTON, self.on_button_go_click)
197
+ self.button_go.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down)
120
198
 
121
199
  def on_mouse_down(self, event):
122
200
  self.was_mouse = True
@@ -175,19 +253,9 @@ def register_panel_go(window, context):
175
253
 
176
254
  def register_panel_stop(window, context):
177
255
  # Define Stop.
178
- stop = wx.BitmapButton(window, wx.ID_ANY)
179
- window.Bind(
180
- wx.EVT_BUTTON,
181
- ConsoleFunction(context, "estop\n"),
182
- stop,
183
- )
184
- stop.SetBackgroundColour(wx.Colour(127, 0, 0))
185
- stop.SetBitmap(
186
- icons8_emergency_stop_button_50.GetBitmap(color=wx.WHITE, keepalpha=True)
187
- )
188
- stop.SetBitmapFocus(icons8_emergency_stop_button_50.GetBitmap())
189
- stop.SetToolTip(_("Emergency stop/reset the controller."))
190
- stop.SetSize(stop.GetBestSize())
256
+ def action():
257
+ context("estop\n")
258
+
191
259
  pane = (
192
260
  aui.AuiPaneInfo()
193
261
  .Bottom()
@@ -200,17 +268,31 @@ def register_panel_stop(window, context):
200
268
  )
201
269
  pane.submenu = "_10_" + _("Laser")
202
270
  pane.dock_proportion = 98
203
- pane.control = stop
204
-
271
+ fgcol = context.themes.get("stop_fg")
272
+ bgcol = context.themes.get("stop_bg")
273
+ panel = ActionPanel(
274
+ window,
275
+ wx.ID_ANY,
276
+ context=context,
277
+ action=action,
278
+ fgcolor=fgcol,
279
+ bgcolor=bgcol,
280
+ icon=icons8_emergency_stop_button,
281
+ tooltip=_("Emergency stop/reset the controller."),
282
+ )
283
+ pane.control = panel
205
284
  window.on_pane_create(pane)
206
285
  context.register("pane/stop", pane)
207
286
 
208
287
 
209
288
  def register_panel_home(window, context):
210
289
  # Define Home.
211
- home = wx.BitmapButton(window, wx.ID_ANY, icons8_home_filled_50.GetBitmap())
212
- # home.SetBackgroundColour((200, 225, 250))
213
- window.Bind(wx.EVT_BUTTON, lambda e: context("home\n"), home)
290
+ def action():
291
+ context("home\n")
292
+
293
+ def action_right():
294
+ context("physical_home\n")
295
+
214
296
  pane = (
215
297
  aui.AuiPaneInfo()
216
298
  .Bottom()
@@ -223,35 +305,30 @@ def register_panel_home(window, context):
223
305
  )
224
306
  pane.submenu = "_10_" + _("Laser")
225
307
  pane.dock_proportion = 98
226
- pane.control = home
308
+
309
+ fgcol = None
310
+ bgcol = None
311
+ panel = ActionPanel(
312
+ window,
313
+ wx.ID_ANY,
314
+ context=context,
315
+ action=action,
316
+ action_right=action_right,
317
+ fgcolor=fgcol,
318
+ bgcolor=bgcol,
319
+ icon=icons8_home_filled,
320
+ tooltip=_("Send laser to home position"),
321
+ )
322
+ pane.control = panel
227
323
  window.on_pane_create(pane)
228
324
  context.register("pane/home", pane)
229
325
 
230
326
 
231
327
  def register_panel_pause(window, context):
232
328
  # Define Pause.
233
- pause = wx.BitmapButton(
234
- window, wx.ID_ANY, icons8_pause_50.GetBitmap(use_theme=False)
235
- )
236
-
237
- def on_pause_button(event=None):
238
- try:
239
- context("pause\n")
240
- # if self.pipe_state != 3:
241
- # pause.SetBitmap(icons8_play_50.GetBitmap())
242
- # else:
243
- # pause.SetBitmap(icons8_pause_50.GetBitmap(use_theme=False))
244
- except AttributeError:
245
- pass
329
+ def action():
330
+ context("pause\n")
246
331
 
247
- window.Bind(
248
- wx.EVT_BUTTON,
249
- on_pause_button,
250
- pause,
251
- )
252
- pause.SetBackgroundColour(wx.Colour(255, 255, 0))
253
- pause.SetToolTip(_("Pause/Resume the controller"))
254
- pause.SetSize(pause.GetBestSize())
255
332
  pane = (
256
333
  aui.AuiPaneInfo()
257
334
  .Caption(_("Pause"))
@@ -264,8 +341,20 @@ def register_panel_pause(window, context):
264
341
  )
265
342
  pane.submenu = "_10_" + _("Laser")
266
343
  pane.dock_proportion = 98
267
- pane.control = pause
268
344
 
345
+ bgcol = context.themes.get("pause_bg")
346
+ fgcol = None
347
+ panel = ActionPanel(
348
+ window,
349
+ wx.ID_ANY,
350
+ context=context,
351
+ action=action,
352
+ fgcolor=fgcol,
353
+ bgcolor=bgcol,
354
+ icon=icons8_pause,
355
+ tooltip=_("Pause/Resume the controller"),
356
+ )
357
+ pane.control = panel
269
358
  window.on_pane_create(pane)
270
359
  context.register("pane/pause", pane)
271
360
 
@@ -303,10 +392,9 @@ class wxMeerK40t(wx.App, Module):
303
392
  # Is this a Windows machine? If yes:
304
393
  # Turn on high-DPI awareness to make sure rendering is sharp on big
305
394
  # monitors with font scaling enabled.
306
- from platform import system
307
395
 
308
396
  high_dpi = context.setting(bool, "high_dpi", True)
309
- if system() == "Windows" and high_dpi:
397
+ if platform.system() == "Windows" and high_dpi:
310
398
  try:
311
399
  # https://discuss.wxpython.org/t/support-for-high-dpi-on-windows-10/32925
312
400
  from ctypes import OleDLL
@@ -325,8 +413,12 @@ class wxMeerK40t(wx.App, Module):
325
413
  self.Bind(wx.EVT_TIMER, context._kernel.scheduler_main, self.timer)
326
414
  context._kernel.scheduler_handles_main_thread_jobs = False
327
415
  self.timer.Start(50)
328
-
329
- icons.DARKMODE = wx.SystemSettings().GetColour(wx.SYS_COLOUR_WINDOW)[0] < 127
416
+ # try:
417
+ # res = wx.SystemSettings().GetAppearance().IsDark()
418
+ # except AttributeError:
419
+ # res = wx.SystemSettings().GetColour(wx.SYS_COLOUR_WINDOW)[0] < 127
420
+ res = wx.SystemSettings().GetColour(wx.SYS_COLOUR_WINDOW)[0] < 127
421
+ icons.DARKMODE = res
330
422
  icons.icon_r = 230
331
423
  icons.icon_g = 230
332
424
  icons.icon_b = 230
@@ -714,6 +806,7 @@ class wxMeerK40t(wx.App, Module):
714
806
  kernel.register("property/PolylineNode/PathProperty", PathPropertyPanel)
715
807
  kernel.register("property/RectNode/PathProperty", PathPropertyPanel)
716
808
  kernel.register("property/HatchEffectNode/HatchProperty", HatchPropertyPanel)
809
+ kernel.register("property/WobbleEffectNode/WobbleProperty", WobblePropertyPanel)
717
810
  kernel.register("property/PointNode/PointProperty", PointPropertyPanel)
718
811
  kernel.register("property/TextNode/TextProperty", TextPropertyPanel)
719
812
  kernel.register("property/BlobNode/BlobProperty", BlobPropertyPanel)
@@ -810,10 +903,17 @@ class wxMeerK40t(wx.App, Module):
810
903
  context = kernel.root
811
904
 
812
905
  context.setting(bool, "developer_mode", False)
813
- # if context.developer_mode:
814
- # from meerk40t.gui.mkdebug import register_panel_debugger
906
+ context.setting(bool, "debug_mode", False)
907
+ if context.debug_mode:
908
+ from meerk40t.gui.mkdebug import (
909
+ register_panel_color,
910
+ register_panel_debugger,
911
+ register_panel_icon,
912
+ )
815
913
 
816
- # kernel.register("wxpane/debug_tree", register_panel_debugger)
914
+ kernel.register("wxpane/debug_tree", register_panel_debugger)
915
+ kernel.register("wxpane/debug_color", register_panel_color)
916
+ kernel.register("wxpane/debug_icons", register_panel_icon)
817
917
 
818
918
  @context.console_argument("sure", type=str, help="Are you sure? 'yes'?")
819
919
  @context.console_command("nuke_settings", hidden=True)