diff --git a/KlippyGtk.py b/KlippyGtk.py index 5e3abfc8..bbb65036 100644 --- a/KlippyGtk.py +++ b/KlippyGtk.py @@ -1,204 +1,204 @@ -# -*- coding: utf-8 -*- -import gi - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GdkPixbuf, GLib -import os -klipperscreendir = os.getcwd() - -class KlippyGtk: - labels = {} - - @staticmethod - def Label(label, style): - l = Gtk.Label(label) - if style != False: - l.get_style_context().add_class(style) - return l - - @staticmethod - def ImageLabel(image_name, text, size=20, style=False): - box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=15) - image = Gtk.Image() - #TODO: update file reference - image.set_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg") - - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg", 20, 20, True) - image.set_from_pixbuf(pixbuf) - - label = Gtk.Label() - label.set_text(text) - box1.add(image) #, size, size) - box1.add(label) - - if style != False: - ctx = box1.get_style_context() - ctx.add_class(style) - - return {"l": label, "b": box1} - - @staticmethod - def Image(image_name, style=False, width=None, height=None): - pixbuf = GdkPixbuf.Pixbuf.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg") - - if height != None and width != None: - pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR) - - return Gtk.Image.new_from_pixbuf(pixbuf) - - @staticmethod - def ImageFromFile(filename, style=False, width=None, height=None): - if height != -1 or width != -1: - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, width, height, True) - else: - pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename) - - return Gtk.Image.new_from_pixbuf(pixbuf) - - @staticmethod - def PixbufFromFile(filename, style=False, width=None, height=None): - if height != -1 or width != -1: - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, width, height, True) - else: - pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename) - - return pixbuf - - @staticmethod - def ProgressBar(style=False): - bar = Gtk.ProgressBar() - - if style != False: - ctx = bar.get_style_context() - ctx.add_class(style) - - return bar - - @staticmethod - def Button(label=None, style=None): - b = Gtk.Button(label=label) - b.set_hexpand(True) - b.set_vexpand(True) - b.set_can_focus(False) - b.props.relief = Gtk.ReliefStyle.NONE - - if style != None: - b.get_style_context().add_class(style) - - return b - - @staticmethod - def ButtonImage(image_name, label=None, style=None, height=None, width=None): - pixbuf = GdkPixbuf.Pixbuf.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg") - - if height != None and width != None: - pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR) - - - img = Gtk.Image.new_from_pixbuf(pixbuf) - - b = Gtk.Button(label=label) - b.set_image(img) - b.set_hexpand(True) - b.set_vexpand(True) - b.set_can_focus(False) - b.set_image_position(Gtk.PositionType.TOP) - b.set_always_show_image(True) - b.props.relief = Gtk.ReliefStyle.NONE - - if style != None: - b.get_style_context().add_class(style) - - return b - - @staticmethod - def Dialog(screen, buttons, content, callback=None, *args): - dialog = Gtk.Dialog() - dialog.set_default_size(screen.width - 15, screen.height - 15) - dialog.set_resizable(False) - dialog.set_transient_for(screen) - dialog.set_modal(True) - - for button in buttons: - dialog.add_button(button_text=button['name'], response_id=button['response']) - - dialog.connect("response", callback, *args) - dialog.get_style_context().add_class("dialog") - - grid = Gtk.Grid() - grid.set_size_request(screen.width - 60, -1) - grid.set_vexpand(True) - grid.set_halign(Gtk.Align.CENTER) - grid.set_valign(Gtk.Align.CENTER) - grid.add(content) - - content_area = dialog.get_content_area() - content_area.set_margin_start(15) - content_area.set_margin_end(15) - content_area.set_margin_top(15) - content_area.set_margin_bottom(15) - content_area.add(grid) - - dialog.show_all() - - return dialog, grid - - - @staticmethod - def ToggleButtonImage(image_name, label, style=False): - img = Gtk.Image.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg") - - b = Gtk.ToggleButton(label=label) - #b.props.relief = Gtk.RELIEF_NONE - b.set_image(img) - b.set_hexpand(True) - b.set_vexpand(True) - b.set_can_focus(False) - b.set_image_position(Gtk.PositionType.TOP) - b.set_always_show_image(True) - b.props.relief = Gtk.ReliefStyle.NONE - - if style != False: - ctx = b.get_style_context() - ctx.add_class(style) - - return b - - @staticmethod - def HomogeneousGrid(): - g = Gtk.Grid() - g.set_row_homogeneous(True) - g.set_column_homogeneous(True) - return g - - @staticmethod - def ToggleButton(text): - b = Gtk.ToggleButton(text) - b.props.relief = Gtk.ReliefStyle.NONE - b.set_hexpand(True) - b.set_vexpand(True) - return b - - @staticmethod - def formatFileName(name): - name = name.split('/')[-1] if "/" in name else name - name = name.split('.gcod')[0] if ".gcode" in name else name - if len(name) > 25: - return name[0:25] + "\n" + name[25:50] - return name - - - @staticmethod - def formatTimeString(seconds): - time = int(seconds) - text = "" - if int(time/3600) !=0: - text += str(int(time/3600))+"h " - text += str(int(time/60)%60)+"m "+str(time%60)+"s" - return text - - @staticmethod - def formatTemperatureString(temp, target): - if (target > temp-2 and target < temp+2) or round(target,0) == 0: - return str(round(temp,2)) + "°C" #°C →" - return str(round(temp)) + " → " + str(round(target)) + "°C" +# -*- coding: utf-8 -*- +import gi + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GdkPixbuf, GLib +import os +klipperscreendir = os.getcwd() + +class KlippyGtk: + labels = {} + + @staticmethod + def Label(label, style): + l = Gtk.Label(label) + if style != False: + l.get_style_context().add_class(style) + return l + + @staticmethod + def ImageLabel(image_name, text, size=20, style=False): + box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=15) + image = Gtk.Image() + #TODO: update file reference + image.set_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg") + + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg", 20, 20, True) + image.set_from_pixbuf(pixbuf) + + label = Gtk.Label() + label.set_text(text) + box1.add(image) + box1.add(label) + + if style != False: + ctx = box1.get_style_context() + ctx.add_class(style) + + return {"l": label, "b": box1} + + @staticmethod + def Image(image_name, style=False, width=None, height=None): + pixbuf = GdkPixbuf.Pixbuf.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg") + + if height != None and width != None: + pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR) + + return Gtk.Image.new_from_pixbuf(pixbuf) + + @staticmethod + def ImageFromFile(filename, style=False, width=None, height=None): + if height != -1 or width != -1: + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, width, height, True) + else: + pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename) + + return Gtk.Image.new_from_pixbuf(pixbuf) + + @staticmethod + def PixbufFromFile(filename, style=False, width=None, height=None): + if height != -1 or width != -1: + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, width, height, True) + else: + pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename) + + return pixbuf + + @staticmethod + def ProgressBar(style=False): + bar = Gtk.ProgressBar() + + if style != False: + ctx = bar.get_style_context() + ctx.add_class(style) + + return bar + + @staticmethod + def Button(label=None, style=None): + b = Gtk.Button(label=label) + b.set_hexpand(True) + b.set_vexpand(True) + b.set_can_focus(False) + b.props.relief = Gtk.ReliefStyle.NONE + + if style != None: + b.get_style_context().add_class(style) + + return b + + @staticmethod + def ButtonImage(image_name, label=None, style=None, height=None, width=None): + pixbuf = GdkPixbuf.Pixbuf.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg") + + if height != None and width != None: + pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR) + + + img = Gtk.Image.new_from_pixbuf(pixbuf) + + b = Gtk.Button(label=label) + b.set_image(img) + b.set_hexpand(True) + b.set_vexpand(True) + b.set_can_focus(False) + b.set_image_position(Gtk.PositionType.TOP) + b.set_always_show_image(True) + b.props.relief = Gtk.ReliefStyle.NONE + + if style != None: + b.get_style_context().add_class(style) + + return b + + @staticmethod + def Dialog(screen, buttons, content, callback=None, *args): + dialog = Gtk.Dialog() + dialog.set_default_size(screen.width - 15, screen.height - 15) + dialog.set_resizable(False) + dialog.set_transient_for(screen) + dialog.set_modal(True) + + for button in buttons: + dialog.add_button(button_text=button['name'], response_id=button['response']) + + dialog.connect("response", callback, *args) + dialog.get_style_context().add_class("dialog") + + grid = Gtk.Grid() + grid.set_size_request(screen.width - 60, -1) + grid.set_vexpand(True) + grid.set_halign(Gtk.Align.CENTER) + grid.set_valign(Gtk.Align.CENTER) + grid.add(content) + + content_area = dialog.get_content_area() + content_area.set_margin_start(15) + content_area.set_margin_end(15) + content_area.set_margin_top(15) + content_area.set_margin_bottom(15) + content_area.add(grid) + + dialog.show_all() + + return dialog, grid + + + @staticmethod + def ToggleButtonImage(image_name, label, style=False): + img = Gtk.Image.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg") + + b = Gtk.ToggleButton(label=label) + #b.props.relief = Gtk.RELIEF_NONE + b.set_image(img) + b.set_hexpand(True) + b.set_vexpand(True) + b.set_can_focus(False) + b.set_image_position(Gtk.PositionType.TOP) + b.set_always_show_image(True) + b.props.relief = Gtk.ReliefStyle.NONE + + if style != False: + ctx = b.get_style_context() + ctx.add_class(style) + + return b + + @staticmethod + def HomogeneousGrid(): + g = Gtk.Grid() + g.set_row_homogeneous(True) + g.set_column_homogeneous(True) + return g + + @staticmethod + def ToggleButton(text): + b = Gtk.ToggleButton(text) + b.props.relief = Gtk.ReliefStyle.NONE + b.set_hexpand(True) + b.set_vexpand(True) + return b + + @staticmethod + def formatFileName(name): + name = name.split('/')[-1] if "/" in name else name + name = name.split('.gcod')[0] if ".gcode" in name else name + if len(name) > 25: + return name[0:25] + "\n" + name[25:50] + return name + + + @staticmethod + def formatTimeString(seconds): + time = int(seconds) + text = "" + if int(time/3600) !=0: + text += str(int(time/3600))+"h " + text += str(int(time/60)%60)+"m "+str(time%60)+"s" + return text + + @staticmethod + def formatTemperatureString(temp, target): + if (target > temp-2 and target < temp+2) or round(target,0) == 0: + return str(round(temp,2)) + "°C" #°C →" + return str(round(temp)) + " → " + str(round(target)) + "°C" diff --git a/panels/example.py b/panels/example.py index cd1922ed..d78285d7 100644 --- a/panels/example.py +++ b/panels/example.py @@ -1,14 +1,14 @@ -import gi - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib - -from KlippyGtk import KlippyGtk -from KlippyGcodes import KlippyGcodes -from panels.screen_panel import ScreenPanel - -class ExamplePanel(ScreenPanel): - def initialize(self, panel_name): - _ = self.lang.gettext - # Create gtk items here - return +import gi + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GLib + +from KlippyGtk import KlippyGtk +from KlippyGcodes import KlippyGcodes +from panels.screen_panel import ScreenPanel + +class ExamplePanel(ScreenPanel): + def initialize(self, panel_name): + _ = self.lang.gettext + # Create gtk items here + return diff --git a/panels/job_status.py b/panels/job_status.py index d055937a..bb51871c 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -1,204 +1,204 @@ -import gi -import logging - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib - -from KlippyGtk import KlippyGtk -from panels.screen_panel import ScreenPanel - -logger = logging.getLogger("KlipperScreen.JobStatusPanel") - -class JobStatusPanel(ScreenPanel): - is_paused = False - filename = None - - def initialize(self, panel_name): - _ = self.lang.gettext - grid = KlippyGtk.HomogeneousGrid() - - self.labels['progress'] = KlippyGtk.ProgressBar("printing-progress-bar") - #self.labels['progress'].set_vexpand(True) - #self.labels['progress'].set_valign(Gtk.Align.CENTER) - self.labels['progress'].set_show_text(False) - #self.labels['progress'].set_margin_top(10) - self.labels['progress'].set_margin_end(20) - self.labels['progress_text'] = Gtk.Label() - self.labels['progress_text'].get_style_context().add_class("printing-progress-text") - overlay = Gtk.Overlay() - overlay.add(self.labels['progress']) - overlay.add_overlay(self.labels['progress_text']) - - self.labels['file'] = KlippyGtk.ImageLabel("file","",20,"printing-status-label") - self.labels['time_label'] = KlippyGtk.ImageLabel("speed-step",_("Time Elapsed"),20,"printing-status-label") - self.labels['time'] = KlippyGtk.Label(_("Time Elapsed"),"printing-status-label") - self.labels['time_left_label'] = KlippyGtk.ImageLabel("speed-step",_("Time Left"),20,"printing-status-label") - self.labels['time_left'] = KlippyGtk.Label(_("Time Left"),"printing-status-label") - timegrid = Gtk.Grid() - timegrid.attach(self.labels['time_label']['b'], 0, 0, 1, 1) - timegrid.attach(self.labels['time'], 0, 1, 1, 1) - timegrid.attach(self.labels['time_left_label']['b'], 1, 0, 1, 1) - timegrid.attach(self.labels['time_left'], 1, 1, 1, 1) - info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - info.props.valign = Gtk.Align.CENTER - info.set_hexpand(True) - info.set_vexpand(True) - #info.add(self.labels['file']['b']) - #info.add(self.labels['time']['b']) - #info.add(self.labels['time_left']['b']) - - #grid.attach(info,2,0,2,1) - - pbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - pbox.pack_start(self.labels['file']['b'], False, True, 0) - pbox.pack_end(timegrid, False, False, 0) - #pbox.pack_end(self.labels['progress'], False, False, 0) - pbox.pack_end(overlay, False, False, 0) - - grid.attach(pbox, 1, 0, 3, 2) - - self.labels['extruder'] = KlippyGtk.ButtonImage("extruder-1", KlippyGtk.formatTemperatureString(0, 0)) - self.labels['extruder'].set_sensitive(False) - grid.attach(self.labels['extruder'], 0, 0, 1, 1) - - self.labels['heater_bed'] = KlippyGtk.ButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0)) - self.labels['heater_bed'].set_sensitive(False) - grid.attach(self.labels['heater_bed'], 0, 1, 1, 1) - - self.labels['resume'] = KlippyGtk.ButtonImage("resume",_("Resume"),"color1") - self.labels['resume'].connect("clicked",self.resume) - self.labels['pause'] = KlippyGtk.ButtonImage("pause",_("Pause"),"color1" ) - self.labels['pause'].connect("clicked",self.pause) - - if self._printer.get_stat('pause_resume','is_paused') == True: - self.is_paused = True - grid.attach(self.labels['resume'], 0, 2, 1, 1) - else: - grid.attach(self.labels['pause'], 0, 2, 1, 1) - - self.labels['cancel'] = KlippyGtk.ButtonImage("stop",_("Cancel"),"color2") - self.labels['cancel'].connect("clicked", self.cancel) - grid.attach(self.labels['cancel'], 1, 2, 1, 1) - self.labels['estop'] = KlippyGtk.ButtonImage("decrease",_("Emergency Stop"),"color4") - self.labels['estop'].connect("clicked", self.emergency_stop) - grid.attach(self.labels['estop'], 2, 2, 1, 1) - self.labels['control'] = KlippyGtk.ButtonImage("control",_("Control"),"color3") - self.labels['control'].connect("clicked", self._screen._go_to_submenu, "") - grid.attach(self.labels['control'], 3, 2, 1, 1) - - self.panel = grid - - self._screen.add_subscription(panel_name) - - def resume(self, widget): - self.disable_button("pause","cancel") - self._screen._ws.klippy.print_resume(self._response_callback, "enable_button", "pause", "cancel") - self._screen.show_all() - - def pause(self, widget): - self.disable_button("resume","cancel") - self._screen._ws.klippy.print_pause(self._response_callback, "enable_button", "resume", "cancel") - self._screen.show_all() - - def cancel(self, widget): - _ = self.lang.gettext - - dialog = KlippyGtk.ConfirmDialog( - self._screen, - _("Are you sure you wish to cancel this print?"), - [ - { - "name": _("Cancel Print"), - "response": Gtk.ResponseType.OK - }, - { - "name": _("Go Back"), - "response": Gtk.ResponseType.CANCEL - } - ], - self.cancel_confirm - ) - self.disable_button("pause","cancel") - - def cancel_confirm(self, widget, response_id): - widget.destroy() - - if response_id == Gtk.ResponseType.CANCEL: - self.enable_button("pause","cancel") - return - - self._screen._ws.klippy.print_cancel(self._response_callback, "enable_button", "pause", "cancel") - - def _response_callback(self, response, method, params, func, *args): - if func == "enable_button": - self.enable_button(*args) - - def enable_button(self, *args): - for arg in args: - self.labels[arg].set_sensitive(True) - - def disable_button(self, *args): - for arg in args: - self.labels[arg].set_sensitive(False) - - - def process_update(self, data): - self.update_temp("heater_bed", - self._printer.get_dev_stat("heater_bed","temperature"), - self._printer.get_dev_stat("heater_bed","target") - ) - for x in self._printer.get_tools(): - self.update_temp(x, - self._printer.get_dev_stat(x,"temperature"), - self._printer.get_dev_stat(x,"target") - ) - - vsd = self._printer.get_stat("print_stats") - if "filename" in vsd and self.filename != vsd['filename']: - if vsd['filename'] != "": - self.filename = KlippyGtk.formatFileName(vsd['filename']) - self.update_image_text("file", self.filename) - else: - file = "Unknown" - self.update_image_text("file", "Unknown") - - - progress = 0 if self._printer.get_stat('virtual_sdcard','progress') == 0 else (vsd['print_duration'] / - self._printer.get_stat('virtual_sdcard','progress') - vsd['print_duration']) - - self.update_text("time", str(KlippyGtk.formatTimeString(vsd['print_duration']))) - self.update_text("time_left", str(KlippyGtk.formatTimeString( - progress - ))) - - self.update_progress(self._printer.get_stat('virtual_sdcard','progress')) - - if "pause_resume" in data: - if self.is_paused == True and data['pause_resume']['is_paused'] == False: - self.is_paused = False - self.panel.attach(self.labels['pause'], 0, 2, 1, 1) - self.panel.remove(self.labels['resume']) - self.panel.show_all() - if self.is_paused == False and data['pause_resume']['is_paused'] == True: - self.is_paused = True - self.panel.attach(self.labels['resume'], 0, 2, 1, 1) - self.panel.remove(self.labels['pause']) - self.panel.show_all() - - - - def update_image_text(self, label, text): - if label in self.labels and 'l' in self.labels[label]: - self.labels[label]['l'].set_text(text) - - def update_text(self, label, text): - if label in self.labels: - self.labels[label].set_text(text) - - def update_progress (self, progress): - self.labels['progress'].set_fraction(progress) - self.labels['progress_text'].set_text("%s%%" % (str(int(progress*100)))) - - def update_temp(self, dev, temp, target): - if dev in self.labels: - self.labels[dev].set_label(KlippyGtk.formatTemperatureString(temp, target)) +import gi +import logging + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GLib + +from KlippyGtk import KlippyGtk +from panels.screen_panel import ScreenPanel + +logger = logging.getLogger("KlipperScreen.JobStatusPanel") + +class JobStatusPanel(ScreenPanel): + is_paused = False + filename = None + + def initialize(self, panel_name): + _ = self.lang.gettext + grid = KlippyGtk.HomogeneousGrid() + + self.labels['progress'] = KlippyGtk.ProgressBar("printing-progress-bar") + #self.labels['progress'].set_vexpand(True) + #self.labels['progress'].set_valign(Gtk.Align.CENTER) + self.labels['progress'].set_show_text(False) + #self.labels['progress'].set_margin_top(10) + self.labels['progress'].set_margin_end(20) + self.labels['progress_text'] = Gtk.Label() + self.labels['progress_text'].get_style_context().add_class("printing-progress-text") + overlay = Gtk.Overlay() + overlay.add(self.labels['progress']) + overlay.add_overlay(self.labels['progress_text']) + + self.labels['file'] = KlippyGtk.ImageLabel("file","",20,"printing-status-label") + self.labels['time_label'] = KlippyGtk.ImageLabel("speed-step",_("Time Elapsed"),20,"printing-status-label") + self.labels['time'] = KlippyGtk.Label(_("Time Elapsed"),"printing-status-label") + self.labels['time_left_label'] = KlippyGtk.ImageLabel("speed-step",_("Time Left"),20,"printing-status-label") + self.labels['time_left'] = KlippyGtk.Label(_("Time Left"),"printing-status-label") + timegrid = Gtk.Grid() + timegrid.attach(self.labels['time_label']['b'], 0, 0, 1, 1) + timegrid.attach(self.labels['time'], 0, 1, 1, 1) + timegrid.attach(self.labels['time_left_label']['b'], 1, 0, 1, 1) + timegrid.attach(self.labels['time_left'], 1, 1, 1, 1) + info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + info.props.valign = Gtk.Align.CENTER + info.set_hexpand(True) + info.set_vexpand(True) + #info.add(self.labels['file']['b']) + #info.add(self.labels['time']['b']) + #info.add(self.labels['time_left']['b']) + + #grid.attach(info,2,0,2,1) + + pbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + pbox.pack_start(self.labels['file']['b'], False, True, 0) + pbox.pack_end(timegrid, False, False, 0) + #pbox.pack_end(self.labels['progress'], False, False, 0) + pbox.pack_end(overlay, False, False, 0) + + grid.attach(pbox, 1, 0, 3, 2) + + self.labels['extruder'] = KlippyGtk.ButtonImage("extruder-1", KlippyGtk.formatTemperatureString(0, 0)) + self.labels['extruder'].set_sensitive(False) + grid.attach(self.labels['extruder'], 0, 0, 1, 1) + + self.labels['heater_bed'] = KlippyGtk.ButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0)) + self.labels['heater_bed'].set_sensitive(False) + grid.attach(self.labels['heater_bed'], 0, 1, 1, 1) + + self.labels['resume'] = KlippyGtk.ButtonImage("resume",_("Resume"),"color1") + self.labels['resume'].connect("clicked",self.resume) + self.labels['pause'] = KlippyGtk.ButtonImage("pause",_("Pause"),"color1" ) + self.labels['pause'].connect("clicked",self.pause) + + if self._printer.get_stat('pause_resume','is_paused') == True: + self.is_paused = True + grid.attach(self.labels['resume'], 0, 2, 1, 1) + else: + grid.attach(self.labels['pause'], 0, 2, 1, 1) + + self.labels['cancel'] = KlippyGtk.ButtonImage("stop",_("Cancel"),"color2") + self.labels['cancel'].connect("clicked", self.cancel) + grid.attach(self.labels['cancel'], 1, 2, 1, 1) + self.labels['estop'] = KlippyGtk.ButtonImage("decrease",_("Emergency Stop"),"color4") + self.labels['estop'].connect("clicked", self.emergency_stop) + grid.attach(self.labels['estop'], 2, 2, 1, 1) + self.labels['control'] = KlippyGtk.ButtonImage("control",_("Control"),"color3") + self.labels['control'].connect("clicked", self._screen._go_to_submenu, "") + grid.attach(self.labels['control'], 3, 2, 1, 1) + + self.panel = grid + + self._screen.add_subscription(panel_name) + + def resume(self, widget): + self.disable_button("pause","cancel") + self._screen._ws.klippy.print_resume(self._response_callback, "enable_button", "pause", "cancel") + self._screen.show_all() + + def pause(self, widget): + self.disable_button("resume","cancel") + self._screen._ws.klippy.print_pause(self._response_callback, "enable_button", "resume", "cancel") + self._screen.show_all() + + def cancel(self, widget): + _ = self.lang.gettext + + dialog = KlippyGtk.ConfirmDialog( + self._screen, + _("Are you sure you wish to cancel this print?"), + [ + { + "name": _("Cancel Print"), + "response": Gtk.ResponseType.OK + }, + { + "name": _("Go Back"), + "response": Gtk.ResponseType.CANCEL + } + ], + self.cancel_confirm + ) + self.disable_button("pause","cancel") + + def cancel_confirm(self, widget, response_id): + widget.destroy() + + if response_id == Gtk.ResponseType.CANCEL: + self.enable_button("pause","cancel") + return + + self._screen._ws.klippy.print_cancel(self._response_callback, "enable_button", "pause", "cancel") + + def _response_callback(self, response, method, params, func, *args): + if func == "enable_button": + self.enable_button(*args) + + def enable_button(self, *args): + for arg in args: + self.labels[arg].set_sensitive(True) + + def disable_button(self, *args): + for arg in args: + self.labels[arg].set_sensitive(False) + + + def process_update(self, data): + self.update_temp("heater_bed", + self._printer.get_dev_stat("heater_bed","temperature"), + self._printer.get_dev_stat("heater_bed","target") + ) + for x in self._printer.get_tools(): + self.update_temp(x, + self._printer.get_dev_stat(x,"temperature"), + self._printer.get_dev_stat(x,"target") + ) + + vsd = self._printer.get_stat("print_stats") + if "filename" in vsd and self.filename != vsd['filename']: + if vsd['filename'] != "": + self.filename = KlippyGtk.formatFileName(vsd['filename']) + self.update_image_text("file", self.filename) + else: + file = "Unknown" + self.update_image_text("file", "Unknown") + + + progress = 0 if self._printer.get_stat('virtual_sdcard','progress') == 0 else (vsd['print_duration'] / + self._printer.get_stat('virtual_sdcard','progress') - vsd['print_duration']) + + self.update_text("time", str(KlippyGtk.formatTimeString(vsd['print_duration']))) + self.update_text("time_left", str(KlippyGtk.formatTimeString( + progress + ))) + + self.update_progress(self._printer.get_stat('virtual_sdcard','progress')) + + if "pause_resume" in data: + if self.is_paused == True and data['pause_resume']['is_paused'] == False: + self.is_paused = False + self.panel.attach(self.labels['pause'], 0, 2, 1, 1) + self.panel.remove(self.labels['resume']) + self.panel.show_all() + if self.is_paused == False and data['pause_resume']['is_paused'] == True: + self.is_paused = True + self.panel.attach(self.labels['resume'], 0, 2, 1, 1) + self.panel.remove(self.labels['pause']) + self.panel.show_all() + + + + def update_image_text(self, label, text): + if label in self.labels and 'l' in self.labels[label]: + self.labels[label]['l'].set_text(text) + + def update_text(self, label, text): + if label in self.labels: + self.labels[label].set_text(text) + + def update_progress (self, progress): + self.labels['progress'].set_fraction(progress) + self.labels['progress_text'].set_text("%s%%" % (str(int(progress*100)))) + + def update_temp(self, dev, temp, target): + if dev in self.labels: + self.labels[dev].set_label(KlippyGtk.formatTemperatureString(temp, target)) diff --git a/panels/main_menu.py b/panels/main_menu.py index 332e2f25..b901780a 100644 --- a/panels/main_menu.py +++ b/panels/main_menu.py @@ -1,63 +1,63 @@ -import gi -import logging - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib - -from KlippyGtk import KlippyGtk -from panels.menu import MenuPanel - -logger = logging.getLogger("KlipperScreen.MainMenu") - -class MainPanel(MenuPanel): - - def initialize(self, panel_name, items, extrudercount): - print("### Making MainMenu") - grid = KlippyGtk.HomogeneousGrid() - - # Create Extruders and bed icons - eq_grid = KlippyGtk.HomogeneousGrid() - - - i = 0 - for x in self._printer.get_tools(): - if i > 3: - break - self.labels[x] = KlippyGtk.ButtonImage("extruder-"+str(i+1), KlippyGtk.formatTemperatureString(0, 0)) - eq_grid.attach(self.labels[x], i%2, i/2, 1, 1) - i += 1 - - self.labels['heater_bed'] = KlippyGtk.ButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0)) - - width = 2 if i > 1 else 1 - eq_grid.attach(self.labels['heater_bed'], 0, i/2+1, width, 1) - - grid.attach(eq_grid, 0, 0, 1, 1) - grid.attach(self.arrangeMenuItems(items, 2, True), 1, 0, 1, 1) - self.grid = grid - - self.target_temps = { - "heater_bed": 0, - "extruder": 0 - } - - self._screen.add_subscription(panel_name) - - def get(self): - return self.grid - - def update_temp(self, dev, temp, target): - if dev in self.labels: - self.labels[dev].set_label(KlippyGtk.formatTemperatureString(temp, target)) - - def process_update(self, data): - self.update_temp("heater_bed", - self._printer.get_dev_stat("heater_bed","temperature"), - self._printer.get_dev_stat("heater_bed","target") - ) - for x in self._printer.get_tools(): - self.update_temp(x, - self._printer.get_dev_stat(x,"temperature"), - self._printer.get_dev_stat(x,"target") - ) - return +import gi +import logging + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GLib + +from KlippyGtk import KlippyGtk +from panels.menu import MenuPanel + +logger = logging.getLogger("KlipperScreen.MainMenu") + +class MainPanel(MenuPanel): + + def initialize(self, panel_name, items, extrudercount): + print("### Making MainMenu") + grid = KlippyGtk.HomogeneousGrid() + + # Create Extruders and bed icons + eq_grid = KlippyGtk.HomogeneousGrid() + + + i = 0 + for x in self._printer.get_tools(): + if i > 3: + break + self.labels[x] = KlippyGtk.ButtonImage("extruder-"+str(i+1), KlippyGtk.formatTemperatureString(0, 0)) + eq_grid.attach(self.labels[x], i%2, i/2, 1, 1) + i += 1 + + self.labels['heater_bed'] = KlippyGtk.ButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0)) + + width = 2 if i > 1 else 1 + eq_grid.attach(self.labels['heater_bed'], 0, i/2+1, width, 1) + + grid.attach(eq_grid, 0, 0, 1, 1) + grid.attach(self.arrangeMenuItems(items, 2, True), 1, 0, 1, 1) + self.grid = grid + + self.target_temps = { + "heater_bed": 0, + "extruder": 0 + } + + self._screen.add_subscription(panel_name) + + def get(self): + return self.grid + + def update_temp(self, dev, temp, target): + if dev in self.labels: + self.labels[dev].set_label(KlippyGtk.formatTemperatureString(temp, target)) + + def process_update(self, data): + self.update_temp("heater_bed", + self._printer.get_dev_stat("heater_bed","temperature"), + self._printer.get_dev_stat("heater_bed","target") + ) + for x in self._printer.get_tools(): + self.update_temp(x, + self._printer.get_dev_stat(x,"temperature"), + self._printer.get_dev_stat(x,"target") + ) + return diff --git a/panels/menu.py b/panels/menu.py index 73c68475..1bb5a0a6 100644 --- a/panels/menu.py +++ b/panels/menu.py @@ -1,61 +1,61 @@ -import gi -import logging - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib - -from KlippyGtk import KlippyGtk -from panels.screen_panel import ScreenPanel - -logger = logging.getLogger("KlipperScreen.MenuPanel") - -class MenuPanel(ScreenPanel): - def initialize(self, panel_name, items): - _ = self.lang.gettext - - grid = self.arrangeMenuItems(items, 4) - - b = KlippyGtk.ButtonImage('back', _('Back')) - b.connect("clicked", self._screen._menu_go_back) - grid.attach(b, 3, 1, 1, 1) - - self.panel = grid - - def arrangeMenuItems (self, items, columns, expandLast=False): - grid = Gtk.Grid() - grid.set_row_homogeneous(True) - grid.set_column_homogeneous(True) - - l = len(items) - i = 0 - for i in range(l): - col = i % columns - row = int(i/columns) - width = 1 - - if expandLast == True and i+1 == l and l%2 == 1: - width = 2 - - key = list(items[i])[0] - logger.debug("Key: %s" % key) - item = items[i][key] - b = KlippyGtk.ButtonImage( - item['icon'], item['name'], "color"+str((i%4)+1) - ) - logger.debug("Item: %s" % item) - if item['panel'] != False: - b.connect("clicked", self.menu_item_clicked, item['panel'], item) - elif item['method'] != False: - params = item['params'] if item['params'] != False else {} - if item['confirm'] != False: - b.connect("clicked", self._screen._confirm_send_action, item['confirm'], item['method'], params) - else: - b.connect("clicked", self._screen._send_action, item['method'], params) - else: - b.connect("clicked", self._screen._go_to_submenu, key) - - grid.attach(b, col, row, width, 1) - - i += 1 - - return grid +import gi +import logging + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GLib + +from KlippyGtk import KlippyGtk +from panels.screen_panel import ScreenPanel + +logger = logging.getLogger("KlipperScreen.MenuPanel") + +class MenuPanel(ScreenPanel): + def initialize(self, panel_name, items): + _ = self.lang.gettext + + grid = self.arrangeMenuItems(items, 4) + + b = KlippyGtk.ButtonImage('back', _('Back')) + b.connect("clicked", self._screen._menu_go_back) + grid.attach(b, 3, 1, 1, 1) + + self.panel = grid + + def arrangeMenuItems (self, items, columns, expandLast=False): + grid = Gtk.Grid() + grid.set_row_homogeneous(True) + grid.set_column_homogeneous(True) + + l = len(items) + i = 0 + for i in range(l): + col = i % columns + row = int(i/columns) + width = 1 + + if expandLast == True and i+1 == l and l%2 == 1: + width = 2 + + key = list(items[i])[0] + logger.debug("Key: %s" % key) + item = items[i][key] + b = KlippyGtk.ButtonImage( + item['icon'], item['name'], "color"+str((i%4)+1) + ) + logger.debug("Item: %s" % item) + if item['panel'] != False: + b.connect("clicked", self.menu_item_clicked, item['panel'], item) + elif item['method'] != False: + params = item['params'] if item['params'] != False else {} + if item['confirm'] != False: + b.connect("clicked", self._screen._confirm_send_action, item['confirm'], item['method'], params) + else: + b.connect("clicked", self._screen._send_action, item['method'], params) + else: + b.connect("clicked", self._screen._go_to_submenu, key) + + grid.attach(b, col, row, width, 1) + + i += 1 + + return grid diff --git a/panels/move.py b/panels/move.py index baddd585..73aff2b1 100644 --- a/panels/move.py +++ b/panels/move.py @@ -1,132 +1,132 @@ -import gi -import logging - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib - -from KlippyGtk import KlippyGtk -from KlippyGcodes import KlippyGcodes -from panels.screen_panel import ScreenPanel - -logger = logging.getLogger("KlipperScreen.MovePanel") - -class MovePanel(ScreenPanel): - distance = 1 - distances = ['.1','.5','1','5','10','25'] - - - def initialize(self, panel_name): - _ = self.lang.gettext - - grid = KlippyGtk.HomogeneousGrid() - - self.labels['x+'] = KlippyGtk.ButtonImage("move-x+", _("X+"), "color1") - self.labels['x+'].connect("clicked", self.move, "X", "+") - self.labels['x-'] = KlippyGtk.ButtonImage("move-x-", _("X-"), "color1") - self.labels['x-'].connect("clicked", self.move, "X", "-") - - self.labels['y+'] = KlippyGtk.ButtonImage("move-y+", _("Y+"), "color2") - self.labels['y+'].connect("clicked", self.move, "Y", "+") - self.labels['y-'] = KlippyGtk.ButtonImage("move-y-", _("Y-"), "color2") - self.labels['y-'].connect("clicked", self.move, "Y", "-") - - self.labels['z+'] = KlippyGtk.ButtonImage("move-z-", _("Z+"), "color3") - self.labels['z+'].connect("clicked", self.move, "Z", "+") - self.labels['z-'] = KlippyGtk.ButtonImage("move-z+", _("Z-"), "color3") - self.labels['z-'].connect("clicked", self.move, "Z", "-") - - self.labels['home'] = KlippyGtk.ButtonImage("home", _("Home All")) - self.labels['home'].connect("clicked", self.home) - - - grid.attach(self.labels['x+'], 2, 1, 1, 1) - grid.attach(self.labels['x-'], 0, 1, 1, 1) - grid.attach(self.labels['y+'], 1, 0, 1, 1) - grid.attach(self.labels['y-'], 1, 1, 1, 1) - grid.attach(self.labels['z+'], 3, 0, 1, 1) - grid.attach(self.labels['z-'], 3, 1, 1, 1) - - grid.attach(self.labels['home'], 0, 0, 1, 1) - - distgrid = Gtk.Grid() - j = 0; - for i in self.distances: - self.labels[i] = KlippyGtk.ToggleButton(i) - self.labels[i].connect("clicked", self.change_distance, i) - ctx = self.labels[i].get_style_context() - if j == 0: - ctx.add_class("distbutton_top") - elif j == len(self.distances)-1: - ctx.add_class("distbutton_bottom") - else: - ctx.add_class("distbutton") - if i == "1": - ctx.add_class("distbutton_active") - distgrid.attach(self.labels[i], j, 0, 1, 1) - j += 1 - - self.labels["1"].set_active(True) - - #space_grid = KlippyGtk.HomogeneousGrid() - #space_grid.attach(Gtk.Label("Distance (mm):"),0,0,1,1) - #space_grid.attach(distgrid,0,1,1,1) - #space_grid.attach(Gtk.Label(" "),0,2,1,1) - box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - - bottomgrid = KlippyGtk.HomogeneousGrid() - self.labels['pos_x'] = Gtk.Label("X: 0") - self.labels['pos_y'] = Gtk.Label("Y: 0") - self.labels['pos_z'] = Gtk.Label("Z: 0") - self.labels['pos_x'].get_style_context().add_class("text") - self.labels['pos_y'].get_style_context().add_class("text") - self.labels['pos_z'].get_style_context().add_class("text") - bottomgrid.attach(self.labels['pos_x'], 0, 0, 1, 1) - bottomgrid.attach(self.labels['pos_y'], 1, 0, 1, 1) - bottomgrid.attach(self.labels['pos_z'], 2, 0, 1, 1) - box.pack_start(bottomgrid, True, True, 0) - self.labels['move_dist'] = Gtk.Label(_("Move Distance (mm)")) - self.labels['move_dist'].get_style_context().add_class("text") - box.pack_start(self.labels['move_dist'], True, True, 0) - box.pack_start(distgrid, True, True, 0) - - grid.attach(box, 0, 2, 3, 1) - - - - b = KlippyGtk.ButtonImage('back', _('Back')) - b.connect("clicked", self._screen._menu_go_back) - grid.attach(b, 3, 2, 1, 1) - - self.panel = grid - self._screen.add_subscription(panel_name) - - def process_update(self, data): - if "toolhead" in data and "position" in data["toolhead"]: - self.labels['pos_x'].set_text("X: %.2f" % (data["toolhead"]["position"][0])) - self.labels['pos_y'].set_text("Y: %.2f" % (data["toolhead"]["position"][1])) - self.labels['pos_z'].set_text("Z: %.2f" % (data["toolhead"]["position"][2])) - - def change_distance(self, widget, distance): - if self.distance == distance: - return - logging.info("### Distance " + str(distance)) - - ctx = self.labels[str(self.distance)].get_style_context() - ctx.remove_class("distbutton_active") - - self.distance = distance - ctx = self.labels[self.distance].get_style_context() - ctx.add_class("distbutton_active") - for i in self.distances: - if i == self.distance: - continue - self.labels[str(i)].set_active(False) - - def move(self, widget, axis, dir): - dist = str(self.distance) if dir == "+" else "-" + str(self.distance) - logging.info("# Moving " + axis + " " + dist + "mm") - - print("%s\n%s %s%s" % (KlippyGcodes.MOVE_RELATIVE, KlippyGcodes.MOVE, axis, dist)) - self._screen._ws.klippy.gcode_script( - "%s\n%s %s%s" % (KlippyGcodes.MOVE_RELATIVE, KlippyGcodes.MOVE, axis, dist) - ) +import gi +import logging + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GLib + +from KlippyGtk import KlippyGtk +from KlippyGcodes import KlippyGcodes +from panels.screen_panel import ScreenPanel + +logger = logging.getLogger("KlipperScreen.MovePanel") + +class MovePanel(ScreenPanel): + distance = 1 + distances = ['.1','.5','1','5','10','25'] + + + def initialize(self, panel_name): + _ = self.lang.gettext + + grid = KlippyGtk.HomogeneousGrid() + + self.labels['x+'] = KlippyGtk.ButtonImage("move-x+", _("X+"), "color1") + self.labels['x+'].connect("clicked", self.move, "X", "+") + self.labels['x-'] = KlippyGtk.ButtonImage("move-x-", _("X-"), "color1") + self.labels['x-'].connect("clicked", self.move, "X", "-") + + self.labels['y+'] = KlippyGtk.ButtonImage("move-y+", _("Y+"), "color2") + self.labels['y+'].connect("clicked", self.move, "Y", "+") + self.labels['y-'] = KlippyGtk.ButtonImage("move-y-", _("Y-"), "color2") + self.labels['y-'].connect("clicked", self.move, "Y", "-") + + self.labels['z+'] = KlippyGtk.ButtonImage("move-z-", _("Z+"), "color3") + self.labels['z+'].connect("clicked", self.move, "Z", "+") + self.labels['z-'] = KlippyGtk.ButtonImage("move-z+", _("Z-"), "color3") + self.labels['z-'].connect("clicked", self.move, "Z", "-") + + self.labels['home'] = KlippyGtk.ButtonImage("home", _("Home All")) + self.labels['home'].connect("clicked", self.home) + + + grid.attach(self.labels['x+'], 2, 1, 1, 1) + grid.attach(self.labels['x-'], 0, 1, 1, 1) + grid.attach(self.labels['y+'], 1, 0, 1, 1) + grid.attach(self.labels['y-'], 1, 1, 1, 1) + grid.attach(self.labels['z+'], 3, 0, 1, 1) + grid.attach(self.labels['z-'], 3, 1, 1, 1) + + grid.attach(self.labels['home'], 0, 0, 1, 1) + + distgrid = Gtk.Grid() + j = 0; + for i in self.distances: + self.labels[i] = KlippyGtk.ToggleButton(i) + self.labels[i].connect("clicked", self.change_distance, i) + ctx = self.labels[i].get_style_context() + if j == 0: + ctx.add_class("distbutton_top") + elif j == len(self.distances)-1: + ctx.add_class("distbutton_bottom") + else: + ctx.add_class("distbutton") + if i == "1": + ctx.add_class("distbutton_active") + distgrid.attach(self.labels[i], j, 0, 1, 1) + j += 1 + + self.labels["1"].set_active(True) + + #space_grid = KlippyGtk.HomogeneousGrid() + #space_grid.attach(Gtk.Label("Distance (mm):"),0,0,1,1) + #space_grid.attach(distgrid,0,1,1,1) + #space_grid.attach(Gtk.Label(" "),0,2,1,1) + box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + + bottomgrid = KlippyGtk.HomogeneousGrid() + self.labels['pos_x'] = Gtk.Label("X: 0") + self.labels['pos_y'] = Gtk.Label("Y: 0") + self.labels['pos_z'] = Gtk.Label("Z: 0") + self.labels['pos_x'].get_style_context().add_class("text") + self.labels['pos_y'].get_style_context().add_class("text") + self.labels['pos_z'].get_style_context().add_class("text") + bottomgrid.attach(self.labels['pos_x'], 0, 0, 1, 1) + bottomgrid.attach(self.labels['pos_y'], 1, 0, 1, 1) + bottomgrid.attach(self.labels['pos_z'], 2, 0, 1, 1) + box.pack_start(bottomgrid, True, True, 0) + self.labels['move_dist'] = Gtk.Label(_("Move Distance (mm)")) + self.labels['move_dist'].get_style_context().add_class("text") + box.pack_start(self.labels['move_dist'], True, True, 0) + box.pack_start(distgrid, True, True, 0) + + grid.attach(box, 0, 2, 3, 1) + + + + b = KlippyGtk.ButtonImage('back', _('Back')) + b.connect("clicked", self._screen._menu_go_back) + grid.attach(b, 3, 2, 1, 1) + + self.panel = grid + self._screen.add_subscription(panel_name) + + def process_update(self, data): + if "toolhead" in data and "position" in data["toolhead"]: + self.labels['pos_x'].set_text("X: %.2f" % (data["toolhead"]["position"][0])) + self.labels['pos_y'].set_text("Y: %.2f" % (data["toolhead"]["position"][1])) + self.labels['pos_z'].set_text("Z: %.2f" % (data["toolhead"]["position"][2])) + + def change_distance(self, widget, distance): + if self.distance == distance: + return + logging.info("### Distance " + str(distance)) + + ctx = self.labels[str(self.distance)].get_style_context() + ctx.remove_class("distbutton_active") + + self.distance = distance + ctx = self.labels[self.distance].get_style_context() + ctx.add_class("distbutton_active") + for i in self.distances: + if i == self.distance: + continue + self.labels[str(i)].set_active(False) + + def move(self, widget, axis, dir): + dist = str(self.distance) if dir == "+" else "-" + str(self.distance) + logging.info("# Moving " + axis + " " + dist + "mm") + + print("%s\n%s %s%s" % (KlippyGcodes.MOVE_RELATIVE, KlippyGcodes.MOVE, axis, dist)) + self._screen._ws.klippy.gcode_script( + "%s\n%s %s%s" % (KlippyGcodes.MOVE_RELATIVE, KlippyGcodes.MOVE, axis, dist) + ) diff --git a/panels/splash_screen.py b/panels/splash_screen.py index 43470873..a84d4aaa 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -1,71 +1,71 @@ -import gi -import logging -import os - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib - -from KlippyGtk import KlippyGtk -from panels.screen_panel import ScreenPanel - -logger = logging.getLogger("KlipperScreen.SplashScreenPanel") - -class SplashScreenPanel(ScreenPanel): - box = None - - def initialize(self, panel_name): - _ = self.lang.gettext - - image = Gtk.Image() - #TODO: update file reference - image.set_from_file(os.getcwd() + "/styles/z-bolt/images/klipper.png") - - self.labels['text'] = Gtk.Label(_("Initializing printer...")) - self.labels['text'].get_style_context().add_class("text") - - - self.labels['actions'] = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) - self.labels['actions'].set_hexpand(True) - self.labels['actions'].set_vexpand(False) - self.labels['actions'].set_halign(Gtk.Align.END) - self.labels['actions'].set_margin_end(20) - - - main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15) - main.pack_start(image, True, True, 10) - main.pack_end(self.labels['actions'], False, False, 10) - main.pack_end(self.labels['text'], True, True, 10) - - - box = Gtk.VBox() - box.add(main) - - self.panel = box - - def update_text(self, text): - self.labels['text'].set_text(text) - self.clear_action_bar() - - def clear_action_bar(self): - for child in self.labels['actions'].get_children(): - self.labels['actions'].remove(child) - - def show_restart_buttons(self): - _ = self.lang.gettext - - if "firmware_restart" not in self.labels: - self.labels['restart'] = KlippyGtk.ButtonImage("reboot",_("Restart"),"color1") - self.labels['restart'].connect("clicked", self.restart) - self.labels['firmware_restart'] = KlippyGtk.ButtonImage("restart",_("Firmware Restart"),"color2") - self.labels['firmware_restart'].connect("clicked", self.firmware_restart) - - self.clear_action_bar() - - self.labels['actions'].add(self.labels['restart']) - self.labels['actions'].add(self.labels['firmware_restart']) - - def firmware_restart(self, widget): - self._screen._ws.klippy.restart_firmware() - - def restart(self, widget): - self._screen._ws.klippy.restart() +import gi +import logging +import os + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GLib + +from KlippyGtk import KlippyGtk +from panels.screen_panel import ScreenPanel + +logger = logging.getLogger("KlipperScreen.SplashScreenPanel") + +class SplashScreenPanel(ScreenPanel): + box = None + + def initialize(self, panel_name): + _ = self.lang.gettext + + image = Gtk.Image() + #TODO: update file reference + image.set_from_file(os.getcwd() + "/styles/z-bolt/images/klipper.png") + + self.labels['text'] = Gtk.Label(_("Initializing printer...")) + self.labels['text'].get_style_context().add_class("text") + + + self.labels['actions'] = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) + self.labels['actions'].set_hexpand(True) + self.labels['actions'].set_vexpand(False) + self.labels['actions'].set_halign(Gtk.Align.END) + self.labels['actions'].set_margin_end(20) + + + main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15) + main.pack_start(image, True, True, 10) + main.pack_end(self.labels['actions'], False, False, 10) + main.pack_end(self.labels['text'], True, True, 10) + + + box = Gtk.VBox() + box.add(main) + + self.panel = box + + def update_text(self, text): + self.labels['text'].set_text(text) + self.clear_action_bar() + + def clear_action_bar(self): + for child in self.labels['actions'].get_children(): + self.labels['actions'].remove(child) + + def show_restart_buttons(self): + _ = self.lang.gettext + + if "firmware_restart" not in self.labels: + self.labels['restart'] = KlippyGtk.ButtonImage("reboot",_("Restart"),"color1") + self.labels['restart'].connect("clicked", self.restart) + self.labels['firmware_restart'] = KlippyGtk.ButtonImage("restart",_("Firmware Restart"),"color2") + self.labels['firmware_restart'].connect("clicked", self.firmware_restart) + + self.clear_action_bar() + + self.labels['actions'].add(self.labels['restart']) + self.labels['actions'].add(self.labels['firmware_restart']) + + def firmware_restart(self, widget): + self._screen._ws.klippy.restart_firmware() + + def restart(self, widget): + self._screen._ws.klippy.restart() diff --git a/panels/temperature.py b/panels/temperature.py index 78efe89f..1f813b68 100644 --- a/panels/temperature.py +++ b/panels/temperature.py @@ -1,240 +1,240 @@ -import gi -import logging - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib - -from KlippyGtk import KlippyGtk -from KlippyGcodes import KlippyGcodes -from panels.screen_panel import ScreenPanel - -logger = logging.getLogger("KlipperScreen.TemperaturePanel") - -class TemperaturePanel(ScreenPanel): - active_heater = "extruder" - tempdeltas = ["1","5","10","25"] - tempdelta = "10" - - def initialize(self, panel_name): - _ = self.lang.gettext - - grid = KlippyGtk.HomogeneousGrid() - - eq_grid = KlippyGtk.HomogeneousGrid() - i = 0 - for x in self._printer.get_tools(): - if i > 3: - break - elif i == 0: - primary_tool = x - self.labels[x] = KlippyGtk.ToggleButtonImage("extruder-"+str(i+1), KlippyGtk.formatTemperatureString(0, 0)) - self.labels[x].connect('clicked', self.select_heater, x) - if i == 0: - self.labels[x].set_active(True) - eq_grid.attach(self.labels[x], i%2, i/2, 1, 1) - i += 1 - - print ("Primary tool: " + primary_tool) - self.labels[primary_tool].get_style_context().add_class('button_active') - - self.labels["heater_bed"] = KlippyGtk.ToggleButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0)) - self.labels["heater_bed"].connect('clicked', self.select_heater, "heater_bed") - width = 2 if i > 1 else 1 - eq_grid.attach(self.labels["heater_bed"], 0, i/2+1, width, 1) - - self.labels["control_grid"] = KlippyGtk.HomogeneousGrid() - - self.labels["increase"] = KlippyGtk.ButtonImage("increase", _("Increase"), "color1") - self.labels["increase"].connect("clicked",self.change_target_temp, "+") - self.labels["decrease"] = KlippyGtk.ButtonImage("decrease", _("Decrease"), "color3") - self.labels["decrease"].connect("clicked",self.change_target_temp, "-") - self.labels["npad"] = KlippyGtk.ButtonImage("settings", _("Number Pad"), "color2") - self.labels["npad"].connect("clicked", self.show_numpad) - - tempgrid = Gtk.Grid() - j = 0; - for i in self.tempdeltas: - self.labels['deg'+ i] = KlippyGtk.ToggleButton(i) - self.labels['deg'+ i].connect("clicked", self.change_temp_delta, i) - ctx = self.labels['deg'+ i].get_style_context() - if j == 0: - ctx.add_class("tempbutton_top") - elif j == len(self.tempdeltas)-1: - ctx.add_class("tempbutton_bottom") - else: - ctx.add_class("tempbutton") - if i == "10": - ctx.add_class("distbutton_active") - tempgrid.attach(self.labels['deg'+ i], 0, j, 1, 1) - j += 1 - - self.labels["deg" + self.tempdelta].set_active(True) - - self.labels["control_grid"].attach(tempgrid, 2, 0, 1, 2) - self.labels["control_grid"].attach(self.labels["increase"], 3, 0, 1, 1) - self.labels["control_grid"].attach(self.labels["decrease"], 3, 1, 1, 1) - self.labels["control_grid"].attach(self.labels["npad"], 2, 2, 1, 1) - - b = KlippyGtk.ButtonImage('back', _('Back')) - b.connect("clicked", self._screen._menu_go_back) - self.labels["control_grid"].attach(b, 3, 2, 1, 1) - - - grid.attach(eq_grid, 0, 0, 1, 1) - grid.attach(self.labels["control_grid"], 1, 0, 1, 1) - - self.panel = grid - - self._screen.add_subscription(panel_name) - - self.update_temp("heater_bed",35,40) - - def change_temp_delta(self, widget, tempdelta): - if self.tempdelta == tempdelta: - return - logging.info("### tempdelta " + str(tempdelta)) - - ctx = self.labels["deg" + str(self.tempdelta)].get_style_context() - ctx.remove_class("distbutton_active") - - self.tempdelta = tempdelta - ctx = self.labels["deg" + self.tempdelta].get_style_context() - ctx.add_class("distbutton_active") - for i in self.tempdeltas: - if i == self.tempdeltas: - continue - self.labels["deg" + str(i)].set_active(False) - - def show_numpad(self, widget): - _ = self.lang.gettext - - numpad = KlippyGtk.HomogeneousGrid() - - keys = [ - ['1','numpad_tleft'], - ['2','numpad_top'], - ['3','numpad_tright'], - ['4','numpad_left'], - ['5','numpad_button'], - ['6','numpad_right'], - ['7','numpad_left'], - ['8','numpad_button'], - ['9','numpad_right'], - ['B','numpad_bleft'], - ['0','numpad_bottom'], - ['E','numpad_bright'] - ] - for i in range(len(keys)): - id = 'button_' + str(keys[i][0]) - if keys[i][0] == "B": - self.labels[id] = KlippyGtk.ButtonImage("backspace") - elif keys[i][0] == "E": - self.labels[id] = KlippyGtk.ButtonImage("complete", None, None, 40, 40) - else: - self.labels[id] = Gtk.Button(keys[i][0]) - self.labels[id].connect('clicked', self.update_entry, keys[i][0]) - ctx=self.labels[id].get_style_context() - ctx.add_class(keys[i][1]) - numpad.attach(self.labels[id], i%3, i/3, 1, 1) - - self.labels["keypad"] = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=3) - self.labels['entry'] = Gtk.Entry() - self.labels['entry'].props.xalign = 0.5 - ctx = self.labels['entry'].get_style_context() - ctx.add_class('temperature_entry') - - b = KlippyGtk.ButtonImage('back', _('Close')) - b.connect("clicked", self.hide_numpad) - - #numpad.attach(b, 0, 5, 3, 1) - #numpad.attach(self.labels['entry'], 0, 0, 3, 1) - box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - box.add(self.labels['entry']) - box.add(numpad) - box.add(b) - - self.labels["keypad"] = numpad - - self.panel.remove_column(1) - #self.panel.attach(self.labels["keypad"], 1, 0, 1, 1) - self.panel.attach(box, 1, 0, 1, 1) - self.panel.show_all() - - def hide_numpad(self, widget): - self.panel.remove_column(1) - self.panel.attach(self.labels["control_grid"], 1, 0, 1, 1) - self.panel.show_all() - - - def select_heater (self, widget, heater): - if self.active_heater == heater: - return - - - self.labels[self.active_heater].get_style_context().remove_class('button_active') - self.active_heater = heater - self.labels[heater].get_style_context().add_class("button_active") - - if "entry" in self.labels: - self.labels['entry'].set_text("") - logging.info("### Active heater " + self.active_heater) - - def process_update(self, data): - self.update_temp("heater_bed", - self._printer.get_dev_stat("heater_bed","temperature"), - self._printer.get_dev_stat("heater_bed","target") - ) - for x in self._printer.get_tools(): - self.update_temp(x, - self._printer.get_dev_stat(x,"temperature"), - self._printer.get_dev_stat(x,"target") - ) - return - - def change_target_temp(self, widget, dir): - target = self._printer.get_dev_stat(self.active_heater, "target") - if dir == "+": - target += int(self.tempdelta) - if target > KlippyGcodes.MAX_EXT_TEMP: - target = KlippyGcodes.MAX_EXT_TEMP - else: - target -= int(self.tempdelta) - if target < 0: - target = 0 - - self._printer.set_dev_stat(self.active_heater, "target", target) - - if self.active_heater == "heater_bed": - self._screen._ws.klippy.gcode_script( KlippyGcodes.set_bed_temp( - target - )) - else: - self._screen._ws.klippy.gcode_script( KlippyGcodes.set_ext_temp( - target, - self._printer.get_tool_number(self.active_heater) - )) - - def update_entry(self, widget, digit): - text = self.labels['entry'].get_text() - if digit == 'B': - if len(text) < 1: - return - self.labels['entry'].set_text(text[0:-1]) - elif digit == 'E': - if self.active_heater == "heater_bed": - temp = int(text) - temp = 0 if temp < 0 or temp > KlippyGcodes.MAX_BED_TEMP else temp - self._screen._ws.klippy.gcode_script(KlippyGcodes.set_bed_temp(temp)) - else: - temp = int(text) - temp = 0 if temp < 0 or temp > KlippyGcodes.MAX_EXT_TEMP else temp - self._screen._ws.klippy.gcode_script( KlippyGcodes.set_ext_temp( - temp, - self._printer.get_tool_number(self.active_heater) - )) - self._printer.set_dev_stat(self.active_heater, "target", temp) - self.labels['entry'].set_text("") - else: - if len(text) >= 3: - return - self.labels['entry'].set_text(text + digit) +import gi +import logging + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GLib + +from KlippyGtk import KlippyGtk +from KlippyGcodes import KlippyGcodes +from panels.screen_panel import ScreenPanel + +logger = logging.getLogger("KlipperScreen.TemperaturePanel") + +class TemperaturePanel(ScreenPanel): + active_heater = "extruder" + tempdeltas = ["1","5","10","25"] + tempdelta = "10" + + def initialize(self, panel_name): + _ = self.lang.gettext + + grid = KlippyGtk.HomogeneousGrid() + + eq_grid = KlippyGtk.HomogeneousGrid() + i = 0 + for x in self._printer.get_tools(): + if i > 3: + break + elif i == 0: + primary_tool = x + self.labels[x] = KlippyGtk.ToggleButtonImage("extruder-"+str(i+1), KlippyGtk.formatTemperatureString(0, 0)) + self.labels[x].connect('clicked', self.select_heater, x) + if i == 0: + self.labels[x].set_active(True) + eq_grid.attach(self.labels[x], i%2, i/2, 1, 1) + i += 1 + + print ("Primary tool: " + primary_tool) + self.labels[primary_tool].get_style_context().add_class('button_active') + + self.labels["heater_bed"] = KlippyGtk.ToggleButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0)) + self.labels["heater_bed"].connect('clicked', self.select_heater, "heater_bed") + width = 2 if i > 1 else 1 + eq_grid.attach(self.labels["heater_bed"], 0, i/2+1, width, 1) + + self.labels["control_grid"] = KlippyGtk.HomogeneousGrid() + + self.labels["increase"] = KlippyGtk.ButtonImage("increase", _("Increase"), "color1") + self.labels["increase"].connect("clicked",self.change_target_temp, "+") + self.labels["decrease"] = KlippyGtk.ButtonImage("decrease", _("Decrease"), "color3") + self.labels["decrease"].connect("clicked",self.change_target_temp, "-") + self.labels["npad"] = KlippyGtk.ButtonImage("settings", _("Number Pad"), "color2") + self.labels["npad"].connect("clicked", self.show_numpad) + + tempgrid = Gtk.Grid() + j = 0; + for i in self.tempdeltas: + self.labels['deg'+ i] = KlippyGtk.ToggleButton(i) + self.labels['deg'+ i].connect("clicked", self.change_temp_delta, i) + ctx = self.labels['deg'+ i].get_style_context() + if j == 0: + ctx.add_class("tempbutton_top") + elif j == len(self.tempdeltas)-1: + ctx.add_class("tempbutton_bottom") + else: + ctx.add_class("tempbutton") + if i == "10": + ctx.add_class("distbutton_active") + tempgrid.attach(self.labels['deg'+ i], 0, j, 1, 1) + j += 1 + + self.labels["deg" + self.tempdelta].set_active(True) + + self.labels["control_grid"].attach(tempgrid, 2, 0, 1, 2) + self.labels["control_grid"].attach(self.labels["increase"], 3, 0, 1, 1) + self.labels["control_grid"].attach(self.labels["decrease"], 3, 1, 1, 1) + self.labels["control_grid"].attach(self.labels["npad"], 2, 2, 1, 1) + + b = KlippyGtk.ButtonImage('back', _('Back')) + b.connect("clicked", self._screen._menu_go_back) + self.labels["control_grid"].attach(b, 3, 2, 1, 1) + + + grid.attach(eq_grid, 0, 0, 1, 1) + grid.attach(self.labels["control_grid"], 1, 0, 1, 1) + + self.panel = grid + + self._screen.add_subscription(panel_name) + + self.update_temp("heater_bed",35,40) + + def change_temp_delta(self, widget, tempdelta): + if self.tempdelta == tempdelta: + return + logging.info("### tempdelta " + str(tempdelta)) + + ctx = self.labels["deg" + str(self.tempdelta)].get_style_context() + ctx.remove_class("distbutton_active") + + self.tempdelta = tempdelta + ctx = self.labels["deg" + self.tempdelta].get_style_context() + ctx.add_class("distbutton_active") + for i in self.tempdeltas: + if i == self.tempdeltas: + continue + self.labels["deg" + str(i)].set_active(False) + + def show_numpad(self, widget): + _ = self.lang.gettext + + numpad = KlippyGtk.HomogeneousGrid() + + keys = [ + ['1','numpad_tleft'], + ['2','numpad_top'], + ['3','numpad_tright'], + ['4','numpad_left'], + ['5','numpad_button'], + ['6','numpad_right'], + ['7','numpad_left'], + ['8','numpad_button'], + ['9','numpad_right'], + ['B','numpad_bleft'], + ['0','numpad_bottom'], + ['E','numpad_bright'] + ] + for i in range(len(keys)): + id = 'button_' + str(keys[i][0]) + if keys[i][0] == "B": + self.labels[id] = KlippyGtk.ButtonImage("backspace") + elif keys[i][0] == "E": + self.labels[id] = KlippyGtk.ButtonImage("complete", None, None, 40, 40) + else: + self.labels[id] = Gtk.Button(keys[i][0]) + self.labels[id].connect('clicked', self.update_entry, keys[i][0]) + ctx=self.labels[id].get_style_context() + ctx.add_class(keys[i][1]) + numpad.attach(self.labels[id], i%3, i/3, 1, 1) + + self.labels["keypad"] = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=3) + self.labels['entry'] = Gtk.Entry() + self.labels['entry'].props.xalign = 0.5 + ctx = self.labels['entry'].get_style_context() + ctx.add_class('temperature_entry') + + b = KlippyGtk.ButtonImage('back', _('Close')) + b.connect("clicked", self.hide_numpad) + + #numpad.attach(b, 0, 5, 3, 1) + #numpad.attach(self.labels['entry'], 0, 0, 3, 1) + box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + box.add(self.labels['entry']) + box.add(numpad) + box.add(b) + + self.labels["keypad"] = numpad + + self.panel.remove_column(1) + #self.panel.attach(self.labels["keypad"], 1, 0, 1, 1) + self.panel.attach(box, 1, 0, 1, 1) + self.panel.show_all() + + def hide_numpad(self, widget): + self.panel.remove_column(1) + self.panel.attach(self.labels["control_grid"], 1, 0, 1, 1) + self.panel.show_all() + + + def select_heater (self, widget, heater): + if self.active_heater == heater: + return + + + self.labels[self.active_heater].get_style_context().remove_class('button_active') + self.active_heater = heater + self.labels[heater].get_style_context().add_class("button_active") + + if "entry" in self.labels: + self.labels['entry'].set_text("") + logging.info("### Active heater " + self.active_heater) + + def process_update(self, data): + self.update_temp("heater_bed", + self._printer.get_dev_stat("heater_bed","temperature"), + self._printer.get_dev_stat("heater_bed","target") + ) + for x in self._printer.get_tools(): + self.update_temp(x, + self._printer.get_dev_stat(x,"temperature"), + self._printer.get_dev_stat(x,"target") + ) + return + + def change_target_temp(self, widget, dir): + target = self._printer.get_dev_stat(self.active_heater, "target") + if dir == "+": + target += int(self.tempdelta) + if target > KlippyGcodes.MAX_EXT_TEMP: + target = KlippyGcodes.MAX_EXT_TEMP + else: + target -= int(self.tempdelta) + if target < 0: + target = 0 + + self._printer.set_dev_stat(self.active_heater, "target", target) + + if self.active_heater == "heater_bed": + self._screen._ws.klippy.gcode_script( KlippyGcodes.set_bed_temp( + target + )) + else: + self._screen._ws.klippy.gcode_script( KlippyGcodes.set_ext_temp( + target, + self._printer.get_tool_number(self.active_heater) + )) + + def update_entry(self, widget, digit): + text = self.labels['entry'].get_text() + if digit == 'B': + if len(text) < 1: + return + self.labels['entry'].set_text(text[0:-1]) + elif digit == 'E': + if self.active_heater == "heater_bed": + temp = int(text) + temp = 0 if temp < 0 or temp > KlippyGcodes.MAX_BED_TEMP else temp + self._screen._ws.klippy.gcode_script(KlippyGcodes.set_bed_temp(temp)) + else: + temp = int(text) + temp = 0 if temp < 0 or temp > KlippyGcodes.MAX_EXT_TEMP else temp + self._screen._ws.klippy.gcode_script( KlippyGcodes.set_ext_temp( + temp, + self._printer.get_tool_number(self.active_heater) + )) + self._printer.set_dev_stat(self.active_heater, "target", temp) + self.labels['entry'].set_text("") + else: + if len(text) >= 3: + return + self.labels['entry'].set_text(text + digit) diff --git a/scripts/extract_prusa_thumbnails.py b/scripts/extract_prusa_thumbnails.py index 59e9c20b..262f4352 100644 --- a/scripts/extract_prusa_thumbnails.py +++ b/scripts/extract_prusa_thumbnails.py @@ -1,47 +1,47 @@ - -# -import re -import base64 - -dir = "/home/pi/sdcard/" -file = "square_tower_0.2mm_PLA_ENDER3_46m.gcode" -#f = f.open(file, 'r') - -thumbnails = [] -cur_thumbnail = {} -state = 0 -with open(dir + file, 'r') as f: - for line in f: - if state == 0: - match = re.match(r'^; thumbnail begin ([0-9]+)x([0-9]+) ([0-9]+)', line) - if match: - cur_thumbnail = { - "width": match.group(1), - "height": match.group(2), - "size": match.group(3), - "data": "" - } - state = 1 - continue - elif state == 1: - if re.match (r'^; thumbnail end', line): - state = 0 - thumbnails.append(cur_thumbnail) - continue - match = re.match(r'^; (\S+)$', line) - if match: - cur_thumbnail['data'] += match.group(1) - -if len(thumbnails) > 0: - biggest = 0 - for i in range(len(thumbnails)): - if i == 0: - continue - if thumbnails[i]['width'] > thumbnails[biggest]['width']: - biggest = i - - image = base64.decodestring(thumbnails[biggest]['data']) - name = file.split('.gcod')[0] + ".png" - f = open(dir + name, 'wb') - f.write(image) - f.close() + +# +import re +import base64 + +dir = "/home/pi/sdcard/" +file = "square_tower_0.2mm_PLA_ENDER3_46m.gcode" +#f = f.open(file, 'r') + +thumbnails = [] +cur_thumbnail = {} +state = 0 +with open(dir + file, 'r') as f: + for line in f: + if state == 0: + match = re.match(r'^; thumbnail begin ([0-9]+)x([0-9]+) ([0-9]+)', line) + if match: + cur_thumbnail = { + "width": match.group(1), + "height": match.group(2), + "size": match.group(3), + "data": "" + } + state = 1 + continue + elif state == 1: + if re.match (r'^; thumbnail end', line): + state = 0 + thumbnails.append(cur_thumbnail) + continue + match = re.match(r'^; (\S+)$', line) + if match: + cur_thumbnail['data'] += match.group(1) + +if len(thumbnails) > 0: + biggest = 0 + for i in range(len(thumbnails)): + if i == 0: + continue + if thumbnails[i]['width'] > thumbnails[biggest]['width']: + biggest = i + + image = base64.decodestring(thumbnails[biggest]['data']) + name = file.split('.gcod')[0] + ".png" + f = open(dir + name, 'wb') + f.write(image) + f.close()