From 3af8c253bb31a4caf58a0cdc846b74b229405880 Mon Sep 17 00:00:00 2001 From: zkk <1007518571@qq.com> Date: Tue, 16 Jul 2024 14:07:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E5=AD=97=E9=94=AE?= =?UTF-8?q?=E7=9B=98=E4=B8=BA=E5=8D=95=E7=8B=AC=E4=B8=80=E4=B8=AA=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=EF=BC=8C=E8=A7=A3=E5=86=B3=E6=89=93=E5=8D=B0=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E8=AE=BE=E7=BD=AE=E6=B8=A9=E5=BA=A6=E4=B8=8D=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panels/job_status.py | 6 +-- panels/main_menu.py | 113 ++-------------------------------------- panels/numpad.py | 121 +++++++++++++++++++++++++++++++++++++++++++ screen.py | 6 ++- 4 files changed, 133 insertions(+), 113 deletions(-) create mode 100644 panels/numpad.py diff --git a/panels/job_status.py b/panels/job_status.py index 3faf734e..b990df80 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -151,7 +151,7 @@ class Panel(ScreenPanel): Gtk.PositionType.LEFT, 1) self.buttons['extruder'][extruder].set_label(self.labels[extruder].get_text()) self.buttons['extruder'][extruder].connect("clicked", self.menu_item_clicked, - {"panel": "temperature", + {"panel": "numpad", 'extra': extruder}) self.buttons['extruder'][extruder].set_halign(Gtk.Align.START) @@ -179,7 +179,7 @@ class Panel(ScreenPanel): self.buttons['heater'][dev].set_label(self.labels[dev].get_text()) self.buttons['heater'][dev].connect("clicked", self.menu_item_clicked, - {"panel": "temperature", "extra": dev}) + {"panel": "numpad", "extra": dev}) self.buttons['heater'][dev].set_halign(Gtk.Align.START) self.labels['temp_grid'].attach(self.buttons['heater'][dev], n, 0, 1, 1) n += 1 @@ -203,7 +203,7 @@ class Panel(ScreenPanel): self.labels[device] = Gtk.Label(label="-") self.buttons['heater'][device].set_label(self.labels[device].get_text()) self.buttons['heater'][device].connect("clicked", self.menu_item_clicked, - {"panel": "temperature"}) + {"panel": "numpad"}) self.buttons['heater'][device].set_halign(Gtk.Align.START) self.labels['temp_grid'].attach(self.buttons['heater'][device], n, 0, 1, 1) n += 1 diff --git a/panels/main_menu.py b/panels/main_menu.py index 9a813497..ff4ae789 100644 --- a/panels/main_menu.py +++ b/panels/main_menu.py @@ -27,14 +27,10 @@ class Panel(MenuPanel): temp_Button.set_margin_start(120) temp_Button.set_margin_end(120) temp_Button.get_style_context().add_class('custom-temp-button') - self.temperature = { - "panel": "temperature", - } - temp_Button.connect("clicked", self.menu_item_clicked, self.temperature) + temp_Button.connect('clicked', self.menu_item_clicked, {"panel": "temperature"}) self.labels['menu'].pack_start(temp_Button, True, True, 0) self.labels['da'] = HeaterGraph(self._screen, self._printer, self._gtk.font_size) self.labels['devices'] = self.create_top_panel(self.labels['da']) - self.numpad_visible = False logging.info("### Making MainMenu") @@ -88,8 +84,6 @@ class Panel(MenuPanel): if self.graph_update is not None: GLib.source_remove(self.graph_update) self.graph_update = None - if self.active_heater is not None: - self.back() def add_device(self, device, graph): @@ -148,15 +142,12 @@ class Panel(MenuPanel): vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) name.add(vbox) target = Gtk.Label() - target.set_text("") - vbox.pack_start(target, True, False, 5) icon = self._gtk.Image(image) - vbox.pack_start(icon, True, False, 0) temp = Gtk.Label() - temp.set_text("") - vbox.pack_start(temp, True, False, 0) power = Gtk.Label() - power.set_text("") + vbox.pack_start(target, True, False, 5) + vbox.pack_start(icon, True, False, 0) + vbox.pack_start(temp, True, False, 0) vbox.pack_start(power, True, False, 0) # name.connect("clicked", self.toggle_visibility, device) # name.set_alignment(0, .5) @@ -168,7 +159,7 @@ class Panel(MenuPanel): find_widget(temp, Gtk.Label).set_ellipsize(False) if can_target: - name.connect("clicked", self.show_numpad, device) + name.connect("clicked", self.menu_item_clicked, {"panel": "numpad", 'extra': device}) self.devices[device] = { "class": class_name, @@ -200,44 +191,8 @@ class Panel(MenuPanel): self.update_graph_visibility() - def change_target_temp(self, temp): - name = self.active_heater.split()[1] if len(self.active_heater.split()) > 1 else self.active_heater - temp = self.verify_max_temp(temp) - if temp is False: - return - if self.active_heater.startswith('extruder'): - self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(self.active_heater), temp) - elif self.active_heater == "heater_bed": - self._screen._ws.klippy.set_bed_temp(temp) - elif self.active_heater.startswith('heater_generic '): - self._screen._ws.klippy.set_heater_temp(name, temp) - elif self.active_heater.startswith('temperature_fan '): - self._screen._ws.klippy.set_temp_fan_temp(name, temp) - else: - logging.info(f"Unknown heater: {self.active_heater}") - self._screen.show_popup_message(_("Unknown Heater") + " " + self.active_heater) - self.hide_numpad() - def verify_max_temp(self, temp): - temp = int(temp) - max_temp = int(float(self._printer.get_config_section(self.active_heater)['max_temp'])) - logging.debug(f"{temp}/{max_temp}") - if temp > max_temp: - self._screen.show_popup_message(_("Can't set above the maximum:") + f' {max_temp}') - return False - return max(temp, 0) - def pid_calibrate(self, temp): - if self.verify_max_temp(temp): - script = {"script": f"PID_CALIBRATE HEATER={self.active_heater} TARGET={temp}"} - self._screen._confirm_send_action( - None, - _("Initiate a PID calibration for:") + f" {self.active_heater} @ {temp} ºC" - + "\n\n" + _("It may take more than 5 minutes depending on the heater power."), - "printer.gcode.script", - script - ) - self.back() def create_top_panel(self, graph): @@ -269,27 +224,7 @@ class Panel(MenuPanel): return self.left_panel - def hide_numpad(self, widget=None): - self.devices[self.active_heater]['name'].get_style_context().remove_class("button_active") - self.active_heater = None - if self._screen.vertical_mode: - if not self._gtk.ultra_tall: - self.update_graph_visibility(force_hide=False) - top = self.main_menu.get_child_at(0, 0) - bottom = self.main_menu.get_child_at(0, 2) - self.main_menu.remove(top) - self.main_menu.remove(bottom) - self.main_menu.attach(top, 0, 0, 1, 3) - self.main_menu.attach(self.labels["menu"], 0, 3, 1, 2) - else: - self.main_menu.remove_column(0) - self.main_menu.attach(self.labels['devices'], 0, 0, 2, 1) - self.main_menu.attach(self.labels['menu'], 0, 1, 1, 2) - self.main_menu.attach(self.labels['da'], 1, 1, 1, 2) - self.main_menu.show_all() - self.numpad_visible = False - self._screen.base_panel.set_control_sensitive(False, control='back') def process_update(self, action, data): if action != "notify_status_update": @@ -303,49 +238,11 @@ class Panel(MenuPanel): self._printer.get_stat(x, "power"), ) - def show_numpad(self, widget, device): - if self.active_heater is not None: - self.devices[self.active_heater]['name'].get_style_context().remove_class("button_active") - self.active_heater = device - self.devices[self.active_heater]['name'].get_style_context().add_class("button_active") - if "keypad" not in self.labels: - self.labels["keypad"] = Keypad(self._screen, self.change_target_temp, self.pid_calibrate, self.hide_numpad) - can_pid = self._printer.state not in ("printing", "paused") \ - and self._screen.printer.config[self.active_heater]['control'] == 'pid' - self.labels["keypad"].show_pid(can_pid) - self.labels["keypad"].clear() - if self._screen.vertical_mode: - if not self._gtk.ultra_tall: - self.update_graph_visibility(force_hide=True) - top = self.main_menu.get_child_at(0, 0) - bottom = self.main_menu.get_child_at(0, 3) - self.main_menu.remove(top) - self.main_menu.remove(bottom) - self.main_menu.attach(top, 0, 0, 1, 2) - self.main_menu.attach(self.labels["keypad"], 0, 2, 1, 2) - else: - top = self.main_menu.get_child_at(0, 0) - temperature = self.main_menu.get_child_at(0, 1) - bottom = self.main_menu.get_child_at(1, 1) - self.main_menu.remove(top) - self.main_menu.remove(temperature) - self.main_menu.remove(bottom) - self.labels["keypad"].set_halign(Gtk.Align.CENTER) - self.labels["keypad"].set_size_request(400, -1) - self.main_menu.attach(self.labels["keypad"], 0, 0, 1, 1) - self.main_menu.show_all() - self.numpad_visible = True - self._screen.base_panel.set_control_sensitive(True, control='back') def update_graph(self): self.labels['da'].queue_draw() return True - def back(self): - if self.numpad_visible: - self.hide_numpad() - return True - return False diff --git a/panels/numpad.py b/panels/numpad.py new file mode 100644 index 00000000..2d6c430d --- /dev/null +++ b/panels/numpad.py @@ -0,0 +1,121 @@ +import logging +import gi + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, GLib +from contextlib import suppress +from ks_includes.screen_panel import ScreenPanel +from ks_includes.widgets.keypad import Keypad + + +class Panel(ScreenPanel): + + def __init__(self, screen, title, extra=None): + title = title or _("Numpad") + super().__init__(screen, title) + self.panel = None + self.active_heater = None + self.grid = Gtk.Grid(row_homogeneous=True, column_homogeneous=True) + self.labels["keypad"] = Keypad( + self._screen, self.change_target_temp, self.pid_calibrate, self.hide_numpad + ) + self.content.add(self.grid) + + number_pad = self.create_number_pad_panel(extra) + + if self._screen.vertical_mode: + self.grid.attach(number_pad, 0, 0, 1, 1) + else: + self.grid.attach(number_pad, 0, 0, 1, 1) + + def create_number_pad_panel(self, extra): + + num_panel = Gtk.Grid(row_homogeneous=True, column_homogeneous=True) + if self._screen.vertical_mode: + self.labels["keypad"].set_halign(Gtk.Align.CENTER) + self.labels["keypad"].set_valign(Gtk.Align.CENTER) + self.labels["keypad"].set_size_request( + self._screen.width / 5 * 4, self._screen.height / 5 * 3 + ) + num_panel.attach(self.labels["keypad"], 0, 0, 1, 1) + else: + self.labels["keypad"].set_valign(Gtk.Align.CENTER) + self.labels["keypad"].set_halign(Gtk.Align.CENTER) + self.labels["keypad"].set_size_request( + max(self._screen.width / 5 * 2, 400), + max(self._screen.height / 5 * 4, 420), + ) + num_panel.attach(self.labels["keypad"], 0, 0, 1, 1) + + return num_panel + + def refresh(self, extra): + self.labels["keypad"].clear() + self.active_heater = extra + can_pid = ( + self._printer.state not in ("printing", "paused") + and self._screen.printer.config[self.active_heater]["control"] == "pid" + ) + self.labels["keypad"].show_pid(can_pid) + self.numpad_visible = True + self._screen.base_panel.set_control_sensitive(True, control="back") + + def change_target_temp(self, temp): + name = ( + self.active_heater.split()[1] + if len(self.active_heater.split()) > 1 + else self.active_heater + ) + temp = self.verify_max_temp(temp) + if temp is False: + return + + if self.active_heater.startswith("extruder"): + self._screen._ws.klippy.set_tool_temp( + self._printer.get_tool_number(self.active_heater), temp + ) + elif self.active_heater == "heater_bed": + self._screen._ws.klippy.set_bed_temp(temp) + elif self.active_heater.startswith("heater_generic "): + self._screen._ws.klippy.set_heater_temp(name, temp) + elif self.active_heater.startswith("temperature_fan "): + self._screen._ws.klippy.set_temp_fan_temp(name, temp) + else: + logging.info(f"Unknown heater: {self.active_heater}") + self._screen.show_popup_message( + _("Unknown Heater") + " " + self.active_heater + ) + self.hide_numpad() + + def pid_calibrate(self, temp): + if self.verify_max_temp(temp): + script = { + "script": f"PID_CALIBRATE HEATER={self.active_heater} TARGET={temp}" + } + self._screen._confirm_send_action( + None, + _("Initiate a PID calibration for:") + + f" {self.active_heater} @ {temp} ºC" + + "\n\n" + + _("It may take more than 5 minutes depending on the heater power."), + "printer.gcode.script", + script, + ) + self.hide_numpad() + + def verify_max_temp(self, temp): + temp = int(temp) + max_temp = int( + float(self._printer.get_config_section(self.active_heater)["max_temp"]) + ) + logging.debug(f"{temp}/{max_temp}") + if temp > max_temp: + self._screen.show_popup_message( + _("Can't set above the maximum:") + f" {max_temp}" + ) + return False + return max(temp, 0) + + def hide_numpad(self, widget=None): + self.numpad_visible = False + self._screen._menu_go_back() diff --git a/screen.py b/screen.py index ff5eb335..1f8962cb 100755 --- a/screen.py +++ b/screen.py @@ -334,14 +334,14 @@ class KlipperScreen(Gtk.Window): self._remove_current_panel() del self._cur_panels[-1] self._cur_panels.append(panel_name) - self.attach_panel(panel_name) + self.attach_panel(panel_name, **kwargs) except Exception as e: logging.exception(f"Error attaching panel:\n{e}\n\n{traceback.format_exc()}") def set_panel_title(self, title): self.base_panel.set_title(title) - def attach_panel(self, panel): + def attach_panel(self, panel, **kwargs): if panel in self.panels_reinit: # this happens when the first panel needs a reinit self.reload_panels() @@ -354,6 +354,8 @@ class KlipperScreen(Gtk.Window): self.process_update("notify_status_update", self.printer.data) if hasattr(self.panels[panel], "activate"): self.panels[panel].activate() + if hasattr(self.panels[panel], "refresh"): + self.panels[panel].refresh(**kwargs) self.show_all() def log_notification(self, message, level=0):