From 2e6055574da8906696b52b8abcae7aadaa225705 Mon Sep 17 00:00:00 2001 From: zkk <1007518571@qq.com> Date: Mon, 2 Dec 2024 17:46:16 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E5=A4=84?= =?UTF-8?q?=E5=BC=95=E5=AF=BC=E9=A1=B5=E9=9D=A2=E5=8F=98=E9=87=8F=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ks_includes/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ks_includes/config.py b/ks_includes/config.py index b93065af..b3006911 100644 --- a/ks_includes/config.py +++ b/ks_includes/config.py @@ -319,7 +319,7 @@ class KlipperScreenConfig: {"print_sort_dir": {"section": "main", "type": None, "value": "name_asc"}}, {"print_view": {"section": "main", "type": None, "value": "thumbs"}}, {"language": {"section": "main", "name": _("Language"), "type": None, "value": "system_lang"}}, - {"onboarding": {"section": "main", "type": "binary", "value": "False"}}, + {"onboarding": {"section": "main", "type": None, "value": "False"}}, ] self.configurable_options.extend(panel_options) From 7696b536e2bf1252427cc365d1748c68a88c3a3c Mon Sep 17 00:00:00 2001 From: zkk <1007518571@qq.com> Date: Mon, 2 Dec 2024 17:53:31 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=A1=B5=E9=9D=A2=EF=BC=8C=E5=B9=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=9C=BA=E5=9E=8B=E8=AE=BE=E7=BD=AE=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panels/factory_settings.py | 86 ++++++++++++++++++++++++++++++++++++++ panels/system.py | 60 +------------------------- 2 files changed, 88 insertions(+), 58 deletions(-) create mode 100644 panels/factory_settings.py diff --git a/panels/factory_settings.py b/panels/factory_settings.py new file mode 100644 index 00000000..dc67b129 --- /dev/null +++ b/panels/factory_settings.py @@ -0,0 +1,86 @@ +import logging +import os.path +import pathlib + +import gi + +gi.require_version("Gtk", "3.0") +from gi.repository import GLib, Gtk + +from ks_includes.ModelConfig import ModelConfig +from ks_includes.screen_panel import ScreenPanel + + +class Panel(ScreenPanel): + def __init__(self, screen, title): + title = title or "factory settings" + super().__init__(screen, title) + self.factory_settings_list = [ + { + "Select Model": { + "section": "main", + "name": _("Select Model"), + "type": "button", + "callback": self.show_select_model, + } + } + ] + self.settings = {} + self.select_model = False + self.labels["setting_menu"] = self._gtk.ScrolledWindow() + self.labels["settings"] = Gtk.Grid() + self.labels["setting_menu"].add(self.labels["settings"]) + + for option in self.factory_settings_list: + name = list(option)[0] + self.add_option("settings", self.settings, name, option[name]) + + self.content.add(self.labels["setting_menu"]) + self.content.show_all() + + def back(self): + if self.select_model: + self.hide_select_model() + return True + return False + + def show_select_model(self, widget, option): + self.create_select_model() + for child in self.content.get_children(): + self.content.remove(child) + self.content.add(self.labels["model_menu"]) + self.content.show_all() + self.select_model = True + + def create_select_model(self): + if "model_menu" in self.labels: + return + if not hasattr(self, "model_config") or self.model_config is None: + self.model_config = ModelConfig() + self.labels["model_menu"] = self._gtk.ScrolledWindow() + self.labels["model"] = Gtk.Grid() + self.labels["model_menu"].add(self.labels["model"]) + klipperscreendir = pathlib.Path(__file__).parent.resolve().parent + self.model_list_path = os.path.join(klipperscreendir, "config", "model_menu.conf") + self.model_list = pathlib.Path(self.model_list_path).read_text() + with open(self.model_list_path) as file: + self.models = {} + for line in file: + model_name = line.strip() + self.models[model_name] = { + "name": model_name, + "type": "button", + "callback": self.change_model, + } + self.add_option("model", self.models, model_name, self.models[model_name]) + + def change_model(self, widget, event): + self.model_config.generate_config(event) + + def hide_select_model(self): + for child in self.content.get_children(): + self.content.remove(child) + if "setting_menu" in self.labels: + self.content.add(self.labels["setting_menu"]) + self.content.show_all() + self.select_model = False diff --git a/panels/system.py b/panels/system.py index e0f53e9e..2a3c151b 100644 --- a/panels/system.py +++ b/panels/system.py @@ -1,14 +1,10 @@ import logging import gi import time -import os.path -import pathlib gi.require_version("Gtk", "3.0") from gi.repository import Gtk from ks_includes.screen_panel import ScreenPanel -from ks_includes.ModelConfig import ModelConfig - class Panel(ScreenPanel): def __init__(self, screen, title): @@ -18,10 +14,8 @@ class Panel(ScreenPanel): self.mem_multiplier = None self.model_config = None self.info_panel = None - self.select_model = False self.scales = {} self.labels = {} - self.models = {} self.click_count = 0 self.last_click_time = 0 self.click_threshold = 0.2 @@ -42,14 +36,6 @@ class Panel(ScreenPanel): else: self.content.add(Gtk.Label(label=_("No info available"), vexpand=True)) - def back(self): - if self.select_model: - self.hide_select_model() - return True - if not self.sysinfo: - self._screen.panels_reinit.append("system") - return False - def create_layout(self): self.labels["cpu_usage"] = Gtk.Label(label="", xalign=0) self.grid.attach(self.labels["cpu_usage"], 0, self.current_row, 1, 1) @@ -59,7 +45,6 @@ class Panel(ScreenPanel): self.grid.attach(self.scales["cpu_usage"], 1, self.current_row, 1, 1) self.current_row += 1 - self.labels["memory_usage"] = Gtk.Label(label="", xalign=0) self.grid.attach(self.labels["memory_usage"], 0, self.current_row, 1, 1) self.scales["memory_usage"] = Gtk.ProgressBar( @@ -78,34 +63,6 @@ class Panel(ScreenPanel): scroll.add(self.grid) self.content.add(scroll) return scroll - - def create_select_model(self): - if "model_menu" in self.labels: - return - if self.model_config is None: - self.model_config = ModelConfig() - self.labels["model_menu"] = self._gtk.ScrolledWindow() - self.labels["model"] = Gtk.Grid() - self.labels["model_menu"].add(self.labels["model"]) - klipperscreendir = pathlib.Path(__file__).parent.resolve().parent - self.model_list_path = os.path.join( - klipperscreendir, "config", "model_menu.conf" - ) - self.model_list = pathlib.Path(self.model_list_path).read_text() - with open(self.model_list_path) as file: - for line in file: - model_name = line.strip() - self.models[model_name] = { - "name": model_name, - "type": "button", - "callback": self.change_model, - } - self.add_option( - "model", self.models, model_name, self.models[model_name] - ) - - def change_model(self, widget, event): - self.model_config.generate_config(event) def on_model_click(self, widget, event): current_time = time.time() @@ -115,21 +72,8 @@ class Panel(ScreenPanel): self.click_count = 0 self.last_click_time = current_time if self.click_count >= self.target_clicks: - for child in self.content.get_children(): - self.content.remove(child) self.click_count = 0 - self.create_select_model() - self.content.add(self.labels["model_menu"]) - self.content.show_all() - self.select_model = True - - def hide_select_model(self): - for child in self.content.get_children(): - self.content.remove(child) - if self.info_panel: - self.content.add(self.info_panel) - self.content.show_all() - self.select_model = False + self._screen.show_panel("factory_settings", remove_all=False) def set_mem_multiplier(self, data): memory_units = data.get("memory_units", "kB").lower() @@ -152,7 +96,7 @@ class Panel(ScreenPanel): def machine_info(self): self.add_label_to_grid(self.prettify("device"), 0, bold=True) self.current_row -= 1 - self.add_label_to_grid("Maker: CreatBot", 1) + self.add_label_to_grid("Manufacturer: CreatBot", 1) event_box = Gtk.EventBox() event_box.connect("button-release-event", self.on_model_click) mode = self._screen.connecting_to_printer.split("-")[0] From 526b3d1e0bdd303edc731cd60434c5d7c989595e Mon Sep 17 00:00:00 2001 From: zkk <1007518571@qq.com> Date: Tue, 3 Dec 2024 11:41:24 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=B8=AD=E6=89=93=E5=BC=80=E5=BC=95=E5=AF=BC?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panels/factory_settings.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/panels/factory_settings.py b/panels/factory_settings.py index dc67b129..332d799f 100644 --- a/panels/factory_settings.py +++ b/panels/factory_settings.py @@ -23,7 +23,15 @@ class Panel(ScreenPanel): "type": "button", "callback": self.show_select_model, } - } + }, + { + "Enable Guide": { + "section": "main", + "name": _("Enable The Guide Page"), + "type": "button", + "callback": self.enable_guide, + } + }, ] self.settings = {} self.select_model = False @@ -84,3 +92,8 @@ class Panel(ScreenPanel): self.content.add(self.labels["setting_menu"]) self.content.show_all() self.select_model = False + + def enable_guide(self, widget, option): + self._config.set("main", "onboarding", "True") + self._config.save_user_config_options() + self._screen.show_popup_message("Successfully enabled the guide page", level=1) From 91fd2753274caf5fc2cce5122635c7b2fd760cd8 Mon Sep 17 00:00:00 2001 From: zkk <1007518571@qq.com> Date: Wed, 4 Dec 2024 14:52:01 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=B8=AD=E5=8F=AF=E4=BB=A5=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E8=BD=AF=E4=BB=B6=E7=89=88=E6=9C=AC=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E7=A8=B3=E5=AE=9A=20=E6=B5=8B=E8=AF=95=20=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E4=B8=89=E4=B8=AA=E7=89=88=E6=9C=AC=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ks_includes/config.py | 2 + panels/factory_settings.py | 81 +++++++++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/ks_includes/config.py b/ks_includes/config.py index b3006911..83c8eaed 100644 --- a/ks_includes/config.py +++ b/ks_includes/config.py @@ -166,6 +166,7 @@ class KlipperScreenConfig: strs = ( 'default_printer', 'language', 'print_sort_dir', 'theme', 'screen_blanking_printing', 'font_size', 'print_estimate_method', 'screen_blanking', "screen_on_devices", "screen_off_devices", 'print_view', + 'version_info', ) numbers = ( 'job_complete_timeout', 'job_error_timeout', 'move_speed_xy', 'move_speed_z', @@ -320,6 +321,7 @@ class KlipperScreenConfig: {"print_view": {"section": "main", "type": None, "value": "thumbs"}}, {"language": {"section": "main", "name": _("Language"), "type": None, "value": "system_lang"}}, {"onboarding": {"section": "main", "type": None, "value": "False"}}, + {"version_info": {"section": "main","name": _("Stable"), "type": None, "value": "stable"}}, ] self.configurable_options.extend(panel_options) diff --git a/panels/factory_settings.py b/panels/factory_settings.py index 332d799f..8e8565a0 100644 --- a/panels/factory_settings.py +++ b/panels/factory_settings.py @@ -1,3 +1,4 @@ +import configparser import logging import os.path import pathlib @@ -5,6 +6,8 @@ import pathlib import gi gi.require_version("Gtk", "3.0") +from datetime import datetime + from gi.repository import GLib, Gtk from ks_includes.ModelConfig import ModelConfig @@ -15,6 +18,7 @@ class Panel(ScreenPanel): def __init__(self, screen, title): title = title or "factory settings" super().__init__(screen, title) + self.last_drop_time = datetime.now() self.factory_settings_list = [ { "Select Model": { @@ -32,16 +36,33 @@ class Panel(ScreenPanel): "callback": self.enable_guide, } }, + { + "version_info": { + "section": "main", + "name": _("Version Selection"), + "type": "dropdown", + "value": "stable", + "callback": self.version_selection, + "options": [ + {"name": _("Stable") + " " + _("(default)"), "value": "stable"}, + {"name": _("Beta"), "value": "beta"}, + {"name": _("Dev"), "value": "dev"}, + ], + } + }, ] self.settings = {} self.select_model = False self.labels["setting_menu"] = self._gtk.ScrolledWindow() self.labels["settings"] = Gtk.Grid() self.labels["setting_menu"].add(self.labels["settings"]) - + self.option_res = {} for option in self.factory_settings_list: name = list(option)[0] - self.add_option("settings", self.settings, name, option[name]) + self.option_res.update(self.add_option("settings", self.settings, name, option[name])) + + version_dropdown = self.option_res.get("version_info") + version_dropdown.connect("notify::popup-shown", self.on_popup_shown) self.content.add(self.labels["setting_menu"]) self.content.show_all() @@ -52,6 +73,23 @@ class Panel(ScreenPanel): return True return False + def on_popup_shown(self, combo_box, param): + if combo_box.get_property("popup-shown"): + logging.debug("Dropdown popup show") + self.last_drop_time = datetime.now() + else: + elapsed = (datetime.now() - self.last_drop_time).total_seconds() + if elapsed < 0.2: + logging.debug(f"Dropdown closed too fast ({elapsed}s)") + GLib.timeout_add(50, lambda: self.dropdown_keep_open(combo_box)) + return + logging.debug("Dropdown popup close") + + def dropdown_keep_open(self, combo_box): + if isinstance(combo_box, Gtk.ComboBox): + combo_box.popup() + return False + def show_select_model(self, widget, option): self.create_select_model() for child in self.content.get_children(): @@ -97,3 +135,42 @@ class Panel(ScreenPanel): self._config.set("main", "onboarding", "True") self._config.save_user_config_options() self._screen.show_popup_message("Successfully enabled the guide page", level=1) + + def version_selection(self, val): + config_updater = ConfigMoonrakerUpdateManager() + config_updater.enable_version_selection(val) + if val == "stable": + self._screen._send_action(None, "machine.update.rollback", {"name": "klipper"}) + self._screen._send_action(None, "machine.update.rollback", {"name": "KlipperScreen"}) + self._screen._send_action(None, "machine.update.rollback", {"name": "moonraker"}) + else: + self._screen._send_action(None, "machine.services.restart", {"service": "moonraker"}) + logging.info(f"version selection:{val}") + +class ConfigMoonrakerUpdateManager: + def __init__(self): + self.moonraker_config = configparser.ConfigParser() + self.moonraker_config_path = "/home/klipper/printer_data/config/moonraker.conf" + + def _set_update_manager_channel(self, section, channel="dev"): + if not self.moonraker_config.has_section(section): + self.moonraker_config.add_section(section) + self.moonraker_config.set(section, "channel", channel) + + def enable_version_selection(self, val): + update_managet_list = ["update_manager", "update_manager klipper", "update_manager KlipperScreen"] + try: + self.moonraker_config.read(self.moonraker_config_path) + + if "dev" == val or "beta" == val: + for section in update_managet_list: + self._set_update_manager_channel(section, val) + else: + for section in update_managet_list: + self.moonraker_config.remove_section(section) + + with open(self.moonraker_config_path, "w") as configfile: + self.moonraker_config.write(configfile) + except Exception as e: + msg = f"Error reading or writing config: \n{e}" + logging.exception(msg) From 594fb668fe94fe907c028bf65ecced43ea8660cb Mon Sep 17 00:00:00 2001 From: zkk <1007518571@qq.com> Date: Tue, 10 Dec 2024 14:25:04 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E8=87=AA=E9=80=82?= =?UTF-8?q?=E5=BA=94=E8=B0=83=E5=B9=B3=E9=80=89=E9=A1=B9=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E4=B8=BA=E5=85=B3=E9=97=AD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panels/advanced.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/panels/advanced.py b/panels/advanced.py index 903a9c02..adbe4216 100644 --- a/panels/advanced.py +++ b/panels/advanced.py @@ -15,7 +15,7 @@ class Panel(ScreenPanel): self.advanced_options = [ {"adaptive_leveling": {"section": "main", "name": _("Adaptive Bed Leveling"), "type": "binary", "tooltip": _("Leveling Only in the Actual Print Area"), - "value": "True", "callback": self.set_adaptive_leveling}}, + "value": "False", "callback": self.set_adaptive_leveling}}, {"power_loss_recovery": {"section": "main", "name": _("Power Loss Recovery"), "type": "binary", "tooltip": _("Restores your print job after a power outage"), "value": "True", "callback": self.set_power_loss_recovery}}, @@ -50,5 +50,8 @@ class Panel(ScreenPanel): variables = data['save_variables']['variables'] if 'adaptive_meshing' in variables: self.menu_list['adaptive_leveling'].set_active(variables['adaptive_meshing']) + else: + self.menu_list["adaptive_leveling"].set_active(False) + if 'power_loss_recovery' in variables: self.menu_list['power_loss_recovery'].set_active(variables['power_loss_recovery']) From e3fd413d6256414441e9fe653c1132b1799a5cb2 Mon Sep 17 00:00:00 2001 From: zkk <1007518571@qq.com> Date: Tue, 10 Dec 2024 14:34:13 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=97=B6=E6=B2=A1=E6=9C=89=E4=BF=AE=E6=94=B9z=E5=81=8F?= =?UTF-8?q?=E7=A7=BB=E5=80=BC=20=E4=BB=8D=E6=8F=90=E7=A4=BA=E4=BF=9D?= =?UTF-8?q?=E5=AD=98z=E5=81=8F=E7=A7=BB=E7=9A=84=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panels/job_status.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/panels/job_status.py b/panels/job_status.py index 515afa6a..b325db48 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -739,9 +739,10 @@ class Panel(ScreenPanel): self.enable_button("resume", "cancel") self.can_close = False else: + active_extruder = self._printer.get_stat("toolhead", "extruder") offset = self._printer.get_stat("gcode_move", "homing_origin") self.zoffset = float(offset[2]) if offset else 0 - if self.zoffset != 0: + if self.zoffset != 0 and active_extruder == "extruder": if "Z_OFFSET_APPLY_ENDSTOP" in self._printer.available_commands: self.buttons['button_grid'].attach(self.buttons["save_offset_endstop"], 0, 0, 1, 1) else: From 1a69b5180de733f15550a1294a7221d6070306a0 Mon Sep 17 00:00:00 2001 From: ruipeng <1041589370@qq.com> Date: Wed, 11 Dec 2024 11:44:36 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E6=96=B0=E5=A2=9ED600pro2=E3=80=81D1000?= =?UTF-8?q?=E7=9A=84V0=E7=89=88=E6=9C=BA=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/model_menu.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/model_menu.conf b/config/model_menu.conf index 24fe3bd8..aca36403 100644 --- a/config/model_menu.conf +++ b/config/model_menu.conf @@ -1,4 +1,6 @@ CreatBot_F430NX CreatBot_D600Pro2 +CreatBot_D600Pro2_V0 CreatBot_D1000 +CreatBot_D1000_V0 CreatBot_P800