From 51714180acabf1c7d8fb85988f5008270002744d Mon Sep 17 00:00:00 2001 From: Jordan <31575189+jordanruthe@users.noreply.github.com> Date: Fri, 18 Dec 2020 15:22:16 -0500 Subject: [PATCH] gcode_macros: add a panel for gcode macros --- ks_includes/KlipperScreen.conf | 6 +++ ks_includes/printer.py | 8 +++- panels/gcode_macros.py | 87 ++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 panels/gcode_macros.py diff --git a/ks_includes/KlipperScreen.conf b/ks_includes/KlipperScreen.conf index 414016dc..f14b8281 100644 --- a/ks_includes/KlipperScreen.conf +++ b/ks_includes/KlipperScreen.conf @@ -85,6 +85,12 @@ name: Temperature icon: heat-up panel: temperature +[menu __main actions macros] +name: Macros +icon: custom-script +panel: gcode_macros +enable: {{ printer.gcode_macros.count > 0 }} + [menu __main actions power] name: Power icon: shutdown diff --git a/ks_includes/printer.py b/ks_includes/printer.py index 2bc61792..9f9cdb6a 100644 --- a/ks_includes/printer.py +++ b/ks_includes/printer.py @@ -116,9 +116,15 @@ class Printer: def get_data(self): return self.data + def get_gcode_macros(self): + return self.get_config_section_list("gcode_macro ") + def get_printer_status_data(self): data = { "printer": { + "gcode_macros": { + "count": len(self.get_gcode_macros()) + }, "idle_timeout": self.get_stat("idle_timeout").copy(), "pause_resume": self.get_stat("pause_resume").copy(), "power_devices": { @@ -131,7 +137,7 @@ class Printer: for section in sections: if self.config_section_exists(section): data["printer"][section] = self.get_config_section(section).copy() - + return data def get_klipper_version(self): diff --git a/panels/gcode_macros.py b/panels/gcode_macros.py new file mode 100644 index 00000000..dc819740 --- /dev/null +++ b/panels/gcode_macros.py @@ -0,0 +1,87 @@ +import gi +import logging + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GLib, Pango + +from ks_includes.KlippyGcodes import KlippyGcodes +from ks_includes.screen_panel import ScreenPanel + +logger = logging.getLogger("KlipperScreen.Macro") + +def create_panel(*args): + return MacroPanel(*args) + +class MacroPanel(ScreenPanel): + def initialize(self, panel_name): + _ = self.lang.gettext + self.macros = {} + + # Create a scroll window for the macros + scroll = Gtk.ScrolledWindow() + scroll.set_property("overlay-scrolling", False) + scroll.set_vexpand(True) + + # Create a grid for all macros + self.labels['macros'] = Gtk.Grid() + scroll.add(self.labels['macros']) + + # Create a box to contain all of the above + box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) + box.set_vexpand(True) + box.pack_start(scroll, True, True, 0) + + self.load_gcode_macros() + + self.content.add(box) + + def add_gcode_macro(self, macro): + + frame = Gtk.Frame() + frame.set_property("shadow-type",Gtk.ShadowType.NONE) + + name = Gtk.Label() + name.set_markup("%s" % (macro)) + name.set_hexpand(True) + name.set_halign(Gtk.Align.START) + name.set_line_wrap(True) + name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) + + open = self._gtk.ButtonImage("open",None,"color3") + open.connect("clicked", self.run_gcode_macro, macro) + open.set_hexpand(False) + open.set_halign(Gtk.Align.END) + + labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + labels.add(name) + + dev = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + dev.set_margin_top(10) + dev.set_margin_end(15) + dev.set_margin_start(15) + dev.set_margin_bottom(10) + dev.set_hexpand(True) + dev.set_vexpand(False) + + dev.add(labels) + dev.add(open) + frame.add(dev) + + self.macros[macro] = { + "row": frame + } + + macros = sorted(self.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 load_gcode_macros(self): + macros = self._screen.printer.get_gcode_macros() + for x in macros: + self.add_gcode_macro(x[12:]) + + def run_gcode_macro(self, widget, macro): + self._screen._ws.klippy.gcode_script(macro)