diff --git a/panels/system.py b/panels/system.py index ae301b19..b3a393e4 100644 --- a/panels/system.py +++ b/panels/system.py @@ -1,10 +1,13 @@ 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): @@ -13,30 +16,20 @@ class Panel(ScreenPanel): super().__init__(screen, title) self.current_row = 0 self.mem_multiplier = None + self.model_config = None self.scales = {} self.labels = {} + self.models = {} + self.click_count = 0 + self.last_click_time = 0 + self.click_threshold = 0.2 + self.target_clicks = 10 self.grid = Gtk.Grid(column_spacing=10, row_spacing=5) - self.sysinfo = screen.printer.system_info - if not self.sysinfo: - logging.debug("Asking for info") - self.sysinfo = screen.apiclient.send_request("machine/system_info") - if 'system_info' in self.sysinfo: - screen.printer.system_info = self.sysinfo['system_info'] - self.sysinfo = self.sysinfo['system_info'] - logging.debug(self.sysinfo) - if self.sysinfo: - self.content.add(self.create_layout()) - else: - self.content.add(Gtk.Label(label=_("No info available"), vexpand=True)) + sysinfo = screen.printer.system_info + logging.info(sysinfo) - def back(self): - if not self.sysinfo: - self._screen.panels_reinit.append("system") - return False - - def create_layout(self): - self.cpu_count = int(self.sysinfo["cpu_info"]["cpu_count"]) + self.cpu_count = int(sysinfo["cpu_info"]["cpu_count"]) self.labels["cpu_usage"] = Gtk.Label(label="", xalign=0) self.grid.attach(self.labels["cpu_usage"], 0, self.current_row, 1, 1) self.scales["cpu_usage"] = Gtk.ProgressBar( @@ -45,14 +38,6 @@ class Panel(ScreenPanel): self.grid.attach(self.scales["cpu_usage"], 1, self.current_row, 1, 1) self.current_row += 1 - for i in range(self.cpu_count): - self.labels[f"cpu_usage_{i}"] = Gtk.Label(label="", xalign=0) - self.grid.attach(self.labels[f"cpu_usage_{i}"], 0, self.current_row, 1, 1) - self.scales[f"cpu_usage_{i}"] = Gtk.ProgressBar( - hexpand=True, show_text=False, fraction=0 - ) - self.grid.attach(self.scales[f"cpu_usage_{i}"], 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) @@ -64,11 +49,46 @@ class Panel(ScreenPanel): self.grid.attach(Gtk.Separator(), 0, self.current_row, 2, 1) self.current_row += 1 - self.populate_info() + self.machine_info(sysinfo) + self.current_row += 1 + self.populate_info(sysinfo) scroll = self._gtk.ScrolledWindow() scroll.add(self.grid) - return scroll + self.content.add(scroll) + 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() + if (current_time - self.last_click_time) <= self.click_threshold: + self.click_count += 1 + else: + self.click_count = 0 + self.last_click_time = current_time + if self.click_count == self.target_clicks: + self.click_count = 0 + self.load_menu("system", _("model")) def set_mem_multiplier(self, data): memory_units = data.get("memory_units", "kB").lower() @@ -87,9 +107,21 @@ class Panel(ScreenPanel): label = Gtk.Label(label=text, use_markup=True, xalign=0, wrap=True) self.grid.attach(label, column, self.current_row, 1, 1) self.current_row += 1 + def machine_info(self, sysinfo): + self.add_label_to_grid(self.prettify("device"), 0, bold=True) + self.current_row -= 1 + self.add_label_to_grid("Maker: CreatBot", 1) + event_box = Gtk.EventBox() + event_box.connect("button-press-event", self.on_model_click) + mode = self._screen.connecting_to_printer.split("-")[0] + label = Gtk.Label(label=f"Model: {mode}", use_markup=True, xalign=0, wrap=True) + self.grid.attach(event_box, 1, self.current_row, 1, 1) + self.current_row += 1 + event_box.add(label) + self.add_label_to_grid(f"Name: {self._screen.connecting_to_printer}", 1) - def populate_info(self): - for category, data in self.sysinfo.items(): + def populate_info(self, sysinfo): + for category, data in sysinfo.items(): if category == "python": self.add_label_to_grid(self.prettify(category), 0, bold=True) self.current_row -= 1 @@ -107,7 +139,7 @@ class Panel(ScreenPanel): "service_state", "instance_ids", ) - or not self.sysinfo[category] + or not sysinfo[category] ): continue @@ -143,8 +175,6 @@ class Panel(ScreenPanel): self.add_label_to_grid(f"{self.prettify(key)}: {value}", 1) def process_update(self, action, data): - if not self.sysinfo: - return if action == "notify_proc_stat_update": self.labels["cpu_usage"].set_label( f'CPU: {data["system_cpu_usage"]["cpu"]:.0f}%' @@ -152,13 +182,6 @@ class Panel(ScreenPanel): self.scales["cpu_usage"].set_fraction( float(data["system_cpu_usage"]["cpu"]) / 100 ) - for i in range(self.cpu_count): - self.labels[f"cpu_usage_{i}"].set_label( - f'CPU {i}: {data["system_cpu_usage"][f"cpu{i}"]:.0f}%' - ) - self.scales[f"cpu_usage_{i}"].set_fraction( - float(data["system_cpu_usage"][f"cpu{i}"]) / 100 - ) self.labels["memory_usage"].set_label( _("Memory")