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 logging
import re
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
@ -16,16 +16,14 @@ class MacroPanel(ScreenPanel):
def __init__(self, screen, title): def __init__(self, screen, title):
super().__init__(screen, title) super().__init__(screen, title)
self.sort_reverse = False self.sort_reverse = False
self.sort_lbl = _("Name") self.sort_btn = self._gtk.Button("arrow-up", _("Name"), "color1", self.bts, Gtk.PositionType.RIGHT, 1)
self.sort_btn = self._gtk.Button("arrow-up", self.sort_lbl, "color1", self.bts, Gtk.PositionType.RIGHT, 1)
self.sort_btn.connect("clicked", self.change_sort) self.sort_btn.connect("clicked", self.change_sort)
self.sort_btn.set_hexpand(True) self.sort_btn.set_hexpand(True)
self.allmacros = {} self.options = {}
self.loaded_macros = []
self.macros = {} self.macros = {}
self.menu = ['macros_menu'] 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.connect("clicked", self.load_menu, 'options', _("Settings"))
adjust.set_hexpand(False) adjust.set_hexpand(False)
@ -65,7 +63,7 @@ class MacroPanel(ScreenPanel):
name.set_halign(Gtk.Align.START) name.set_halign(Gtk.Align.START)
name.set_valign(Gtk.Align.CENTER) name.set_valign(Gtk.Align.CENTER)
name.set_line_wrap(True) 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 = self._gtk.Button("resume", style="color3")
btn.connect("clicked", self.run_gcode_macro, macro) btn.connect("clicked", self.run_gcode_macro, macro)
@ -75,24 +73,44 @@ class MacroPanel(ScreenPanel):
labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
labels.add(name) labels.add(name)
dev = Gtk.Box(spacing=5) row = Gtk.Box(spacing=5)
dev.get_style_context().add_class("frame-item") row.get_style_context().add_class("frame-item")
dev.add(labels) row.add(labels)
dev.add(btn) row.add(btn)
self.macros[macro] = { 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) for param in self.macros[macro]["params"]:
pos = macros.index(macro) 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) def _show_keyboard(self, widget=None, event=None):
self.labels['macros'].insert_row(pos) self._screen.show_keyboard(entry=widget)
self.labels['macros'].attach(self.macros[macro]['row'], 0, pos, 1, 1)
def run_gcode_macro(self, widget, macro): 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): def change_sort(self, widget):
self.sort_reverse ^= True self.sort_reverse ^= True
@ -107,40 +125,31 @@ class MacroPanel(ScreenPanel):
def reload_macros(self): def reload_macros(self):
self.labels['macros'].remove_column(0) self.labels['macros'].remove_column(0)
self.macros = {} self.macros = {}
self.loaded_macros = [] self.options = {}
self.allmacros = {}
self.labels['options'].remove_column(0) self.labels['options'].remove_column(0)
self.load_gcode_macros() self.load_gcode_macros()
def load_gcode_macros(self): def load_gcode_macros(self):
macros = self._screen.printer.get_gcode_macros() for macro in self._printer.get_gcode_macros():
section_name = f"displayed_macros {self._screen.connected_printer}" macro = macro[12:].strip()
logging.info(f"Macro section name [{section_name}]") if macro.startswith("_"): # Support for hiding macros by name
for x in macros:
macro = x[12:].strip()
if macro in self.loaded_macros:
continue continue
self.options[macro] = {
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] = {
"name": macro, "name": macro,
"section": f"displayed_macros {self._screen.connected_printer}", "section": f"displayed_macros {self._screen.connected_printer}",
} }
for macro in list(self.allmacros): show = self._config.get_config().getboolean(self.options[macro]["section"], macro.lower(), fallback=True)
self.add_option('options', self.allmacros, macro, self.allmacros[macro]) 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): def add_option(self, boxname, opt_array, opt_name, option):
name = Gtk.Label() name = Gtk.Label()
@ -176,7 +185,7 @@ class MacroPanel(ScreenPanel):
"row": dev "row": dev
} }
opts = sorted(self.allmacros, key=str.casefold) opts = sorted(self.options, key=str.casefold)
pos = opts.index(opt_name) pos = opts.index(opt_name)
self.labels[boxname].insert_row(pos) self.labels[boxname].insert_row(pos)