macros add parameters

This commit is contained in:
alfrix 2022-12-02 11:07:44 -03:00
parent ab4d4af7f8
commit e658f562be

View File

@ -1,5 +1,5 @@
import logging
import re
import gi
gi.require_version("Gtk", "3.0")
@ -16,16 +16,14 @@ class MacroPanel(ScreenPanel):
def __init__(self, screen, title):
super().__init__(screen, title)
self.sort_reverse = False
self.sort_lbl = _("Name")
self.sort_btn = self._gtk.Button("arrow-up", self.sort_lbl, "color1", self.bts, Gtk.PositionType.RIGHT, 1)
self.sort_btn = self._gtk.Button("arrow-up", _("Name"), "color1", self.bts, Gtk.PositionType.RIGHT, 1)
self.sort_btn.connect("clicked", self.change_sort)
self.sort_btn.set_hexpand(True)
self.allmacros = {}
self.loaded_macros = []
self.options = {}
self.macros = {}
self.menu = ['macros_menu']
adjust = self._gtk.Button("settings", None, "color2", self.bts, Gtk.PositionType.LEFT, 1)
adjust = self._gtk.Button("settings", " " + _("Settings"), "color2", self.bts, Gtk.PositionType.LEFT, 1)
adjust.connect("clicked", self.load_menu, 'options', _("Settings"))
adjust.set_hexpand(False)
@ -65,7 +63,7 @@ class MacroPanel(ScreenPanel):
name.set_halign(Gtk.Align.START)
name.set_valign(Gtk.Align.CENTER)
name.set_line_wrap(True)
name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR)
name.set_line_wrap_mode(Pango.WrapMode.CHAR)
btn = self._gtk.Button("resume", style="color3")
btn.connect("clicked", self.run_gcode_macro, macro)
@ -75,24 +73,44 @@ class MacroPanel(ScreenPanel):
labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
labels.add(name)
dev = Gtk.Box(spacing=5)
dev.get_style_context().add_class("frame-item")
dev.add(labels)
dev.add(btn)
row = Gtk.Box(spacing=5)
row.get_style_context().add_class("frame-item")
row.add(labels)
row.add(btn)
self.macros[macro] = {
"row": dev
"row": row,
"params": {},
}
pattern = r'params\.(?P<param>..*)\|default\((?P<default>..*)\).*'
gcode = self._printer.get_config_section(f"gcode_macro {macro}")["gcode"].split("\n")
i = 0
for line in gcode:
if line.startswith("{") and "params." in line:
result = re.search(pattern, line)
if result:
result = result.groupdict()
default = result["default"] if "default" in result else ""
entry = Gtk.Entry()
entry.set_text(default)
self.macros[macro]["params"].update({result["param"]: entry})
macros = sorted(self.macros, reverse=self.sort_reverse, key=str.casefold)
pos = macros.index(macro)
for param in self.macros[macro]["params"]:
labels.add(Gtk.Label(param))
self.macros[macro]["params"][param].connect("focus-in-event", self._show_keyboard)
self.macros[macro]["params"][param].connect("focus-out-event", self._screen.remove_keyboard)
labels.add(self.macros[macro]["params"][param])
self.loaded_macros.append(macro)
self.labels['macros'].insert_row(pos)
self.labels['macros'].attach(self.macros[macro]['row'], 0, pos, 1, 1)
def _show_keyboard(self, widget=None, event=None):
self._screen.show_keyboard(entry=widget)
def run_gcode_macro(self, widget, macro):
self._screen._ws.klippy.gcode_script(macro)
params = ""
for param in self.macros[macro]["params"]:
value = self.macros[macro]["params"][param].get_text()
if value:
params += f'{param}={value} '
self._screen._ws.klippy.gcode_script(f"{macro} {params}")
def change_sort(self, widget):
self.sort_reverse ^= True
@ -107,40 +125,31 @@ class MacroPanel(ScreenPanel):
def reload_macros(self):
self.labels['macros'].remove_column(0)
self.macros = {}
self.loaded_macros = []
self.allmacros = {}
self.options = {}
self.labels['options'].remove_column(0)
self.load_gcode_macros()
def load_gcode_macros(self):
macros = self._screen.printer.get_gcode_macros()
section_name = f"displayed_macros {self._screen.connected_printer}"
logging.info(f"Macro section name [{section_name}]")
for x in macros:
macro = x[12:].strip()
if macro in self.loaded_macros:
for macro in self._printer.get_gcode_macros():
macro = macro[12:].strip()
if macro.startswith("_"): # Support for hiding macros by name
continue
if (section_name not in self._config.get_config().sections() or
self._config.get_config().getboolean(section_name, macro.lower(), fallback=True)):
self.add_gcode_macro(macro)
for macro in self._printer.get_config_section_list("gcode_macro "):
macro = macro[12:]
# Support for hiding macros by name
if macro.startswith("_"):
continue
self.allmacros[macro] = {
self.options[macro] = {
"name": macro,
"section": f"displayed_macros {self._screen.connected_printer}",
}
for macro in list(self.allmacros):
self.add_option('options', self.allmacros, macro, self.allmacros[macro])
show = self._config.get_config().getboolean(self.options[macro]["section"], macro.lower(), fallback=True)
if macro not in self.macros and show:
self.add_gcode_macro(macro)
self.labels['macros'].show_all()
for macro in list(self.options):
self.add_option('options', self.options, macro, self.options[macro])
macros = sorted(self.macros, reverse=self.sort_reverse, key=str.casefold)
for macro in macros:
pos = macros.index(macro)
self.labels['macros'].insert_row(pos)
self.labels['macros'].attach(self.macros[macro]['row'], 0, pos, 1, 1)
self.labels['macros'].show_all()
def add_option(self, boxname, opt_array, opt_name, option):
name = Gtk.Label()
@ -176,7 +185,7 @@ class MacroPanel(ScreenPanel):
"row": dev
}
opts = sorted(self.allmacros, key=str.casefold)
opts = sorted(self.options, key=str.casefold)
pos = opts.index(opt_name)
self.labels[boxname].insert_row(pos)