From 2bacac7efba7b2a2896a0233f61c10c3db1e27f6 Mon Sep 17 00:00:00 2001 From: alfrix Date: Wed, 30 Nov 2022 08:01:49 -0300 Subject: [PATCH] job_status: info refactor switching info is much faster, buttons keep their label --- panels/job_status.py | 173 +++++++++++++++++++------------------------ styles/base.css | 2 +- 2 files changed, 79 insertions(+), 96 deletions(-) diff --git a/panels/job_status.py b/panels/job_status.py index e591547d..5d79dec7 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -2,7 +2,6 @@ import logging import os import contextlib - import gi gi.require_version("Gtk", "3.0") @@ -31,7 +30,6 @@ class JobStatusPanel(ScreenPanel): self.oheight = 0 self.current_extruder = None self.fila_section = 0 - self.buttons = {} self.filename_label = self.filename = self.prev_pos = self.prev_gpos = None self.can_close = False self.flow_timeout = self.animation_timeout = None @@ -39,16 +37,16 @@ class JobStatusPanel(ScreenPanel): self.state = "standby" self.timeleft_type = "auto" self.progress = self.zoffset = self.flowrate = self.vel = 0 - self.main_status_displayed = True self.flowstore = [] self.mm = _("mm") self.mms = _("mm/s") self.mms2 = _("mm/s²") self.mms3 = _("mm³/s") + self.status_grid = self.move_grid = self.time_grid = self.extrusion_grid = None data = ['pos_x', 'pos_y', 'pos_z', 'time_left', 'duration', 'slicer_time', 'file_time', 'filament_time', 'est_time', 'speed_factor', 'req_speed', 'max_accel', 'extrude_factor', 'zoffset', - 'zoffset', 'filament_used', 'filament_total', 'advance', 'fan', 'layer', 'total_layers', 'height', + 'zoffset', 'filament_used', 'filament_total', 'advance', 'layer', 'total_layers', 'height', 'flowrate'] for item in data: @@ -88,10 +86,6 @@ class JobStatusPanel(ScreenPanel): "speed": "-" } - self.create_buttons() - self.buttons['button_grid'] = self._gtk.HomogeneousGrid() - self.buttons['button_grid'].set_vexpand(False) - self.labels['file'] = Gtk.Label("Filename") self.labels['file'].get_style_context().add_class("printing-filename") self.labels['file'].set_hexpand(True) @@ -108,6 +102,7 @@ class JobStatusPanel(ScreenPanel): fi_box.add(self.labels['file']) fi_box.add(self.labels['status']) fi_box.add(self.labels['lcdmessage']) + self.grid.attach(fi_box, 1, 0, 3, 1) self.labels['darea'] = Gtk.DrawingArea() self.labels['darea'].connect("draw", self.on_draw) @@ -122,6 +117,7 @@ class JobStatusPanel(ScreenPanel): overlay.set_hexpand(True) overlay.add(self.labels['darea']) overlay.add_overlay(box) + self.grid.attach(overlay, 0, 0, 1, 1) self.labels['thumbnail'] = self._gtk.Image("file", self._screen.width / 4, self._screen.height / 4) self.labels['info_grid'] = Gtk.Grid() @@ -131,15 +127,33 @@ class JobStatusPanel(ScreenPanel): diameter = float(self._printer.get_config_section(self.current_extruder)['filament_diameter']) self.fila_section = pi * ((diameter / 2) ** 2) - self.grid.attach(overlay, 0, 0, 1, 1) - self.grid.attach(fi_box, 1, 0, 3, 1) - self.grid.attach(self.labels['info_grid'], 0, 1, 4, 2) + self.buttons = {} + self.create_buttons() + self.buttons['button_grid'] = self._gtk.HomogeneousGrid() + self.buttons['button_grid'].set_vexpand(False) self.grid.attach(self.buttons['button_grid'], 0, 3, 4, 1) + self.create_status_grid() + self.create_extrusion_grid() + self.create_time_grid() + self.create_move_grid() + self.grid.attach(self.labels['info_grid'], 0, 1, 4, 2) + self.switch_info(info=self.status_grid) self.content.add(self.grid) def create_status_grid(self, widget=None): - self.main_status_displayed = True + buttons = { + 'speed': self._gtk.Button("speed+", "-", None, self.bts, Gtk.PositionType.LEFT, 1), + 'z': self._gtk.Button("home-z", "-", None, self.bts, Gtk.PositionType.LEFT, 1), + 'extrusion': self._gtk.Button("extrude", "-", None, self.bts, Gtk.PositionType.LEFT, 1), + 'fan': self._gtk.Button("fan", "-", None, self.bts, Gtk.PositionType.LEFT, 1), + 'elapsed': self._gtk.Button("clock", "-", None, self.bts, Gtk.PositionType.LEFT, 1), + 'left': self._gtk.Button("hourglass", "-", None, self.bts, Gtk.PositionType.LEFT, 1), + } + for button in buttons: + buttons[button].set_halign(Gtk.Align.START) + buttons['fan'].connect("clicked", self.menu_item_clicked, "fan", {"panel": "fan", "name": _("Fan")}) + self.buttons.update(buttons) self.labels['temp_grid'] = Gtk.Grid() nlimit = 2 if self._screen.width <= 480 else 3 @@ -149,7 +163,7 @@ class JobStatusPanel(ScreenPanel): for i, extruder in enumerate(self._printer.get_tools()): self.labels[extruder] = Gtk.Label("-") self.buttons['extruder'][extruder] = self._gtk.Button(f"extruder-{i}", "", None, self.bts, - Gtk.PositionType.LEFT) + 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, "temperature", {"panel": "temperature", "name": _("Temperature")}) @@ -161,7 +175,7 @@ class JobStatusPanel(ScreenPanel): self.current_extruder = None self.buttons['heater'] = {} if self._printer.has_heated_bed(): - self.buttons['heater']['heater_bed'] = self._gtk.Button("bed", "", None, self.bts, Gtk.PositionType.LEFT) + self.buttons['heater']['heater_bed'] = self._gtk.Button("bed", "", None, self.bts, Gtk.PositionType.LEFT, 1) self.labels['heater_bed'] = Gtk.Label("-") self.buttons['heater']['heater_bed'].set_label(self.labels['heater_bed'].get_text()) self.buttons['heater']['heater_bed'].connect("clicked", self.menu_item_clicked, "temperature", @@ -209,36 +223,6 @@ class JobStatusPanel(ScreenPanel): n += 1 break - self.buttons['z'] = self._gtk.Button("home-z", "", None, self.bts, Gtk.PositionType.LEFT, 1) - self.buttons['z'].set_label(self.labels['pos_z'].get_text()) - self.buttons['z'].connect("clicked", self.create_move_grid) - self.buttons['z'].set_halign(Gtk.Align.START) - - self.buttons['speed'] = self._gtk.Button("speed+", "", None, self.bts, Gtk.PositionType.LEFT, 1) - self.buttons['speed'].set_label(self.labels['speed_factor'].get_text()) - self.buttons['speed'].connect("clicked", self.create_move_grid) - self.buttons['speed'].set_halign(Gtk.Align.START) - - self.buttons['extrusion'] = self._gtk.Button("extrude", "", None, self.bts, Gtk.PositionType.LEFT, 1) - self.buttons['extrusion'].set_label(self.labels['extrude_factor'].get_text()) - self.buttons['extrusion'].connect("clicked", self.create_extrusion_grid) - self.buttons['extrusion'].set_halign(Gtk.Align.START) - - self.buttons['fan'] = self._gtk.Button("fan", "", None, self.bts, Gtk.PositionType.LEFT, 1) - self.buttons['fan'].set_label(self.labels['fan'].get_text()) - self.buttons['fan'].connect("clicked", self.menu_item_clicked, "fan", {"panel": "fan", "name": _("Fan")}) - self.buttons['fan'].set_halign(Gtk.Align.START) - - elapsed_label = self.labels['elapsed'].get_text() + " " + self.labels['duration'].get_text() - self.buttons['elapsed'] = self._gtk.Button("clock", elapsed_label, None, self.bts, Gtk.PositionType.LEFT, 1) - self.buttons['elapsed'].connect("clicked", self.create_time_grid) - self.buttons['elapsed'].set_halign(Gtk.Align.START) - - remaining_label = self.labels['left'].get_text() + " " + self.labels['time_left'].get_text() - self.buttons['left'] = self._gtk.Button("hourglass", remaining_label, None, self.bts, Gtk.PositionType.LEFT, 1) - self.buttons['left'].connect("clicked", self.create_time_grid) - self.buttons['left'].set_halign(Gtk.Align.START) - szfe = Gtk.Grid() szfe.set_column_homogeneous(True) szfe.attach(self.buttons['speed'], 0, 0, 3, 1) @@ -248,18 +232,18 @@ class JobStatusPanel(ScreenPanel): if self._screen.printer.get_fans(): szfe.attach(self.buttons['fan'], 2, 1, 2, 1) - info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + info = Gtk.Grid() + info.set_row_homogeneous(True) info.get_style_context().add_class("printing-info") - info.add(self.labels['temp_grid']) - info.add(szfe) - info.add(self.buttons['elapsed']) - info.add(self.buttons['left']) - self.switch_info(info) + info.attach(self.labels['temp_grid'], 0, 0, 1, 1) + info.attach(szfe, 0, 1, 1, 2) + info.attach(self.buttons['elapsed'], 0, 3, 1, 1) + info.attach(self.buttons['left'], 0, 4, 1, 1) + self.status_grid = info def create_extrusion_grid(self, widget=None): - self.main_status_displayed = False goback = self._gtk.Button("back", None, "color1", self.bts, Gtk.PositionType.TOP, False) - goback.connect("clicked", self.create_status_grid) + goback.connect("clicked", self.switch_info, self.status_grid) goback.set_hexpand(False) goback.get_style_context().add_class("printing-info") @@ -279,12 +263,12 @@ class JobStatusPanel(ScreenPanel): info.attach(self.labels['filament_used'], 2, 3, 1, 1) info.attach(self.labels['fila_total_lbl'], 1, 4, 1, 1) info.attach(self.labels['filament_total'], 2, 4, 1, 1) - self.switch_info(info) + self.extrusion_grid = info + self.buttons['extrusion'].connect("clicked", self.switch_info, self.extrusion_grid) def create_move_grid(self, widget=None): - self.main_status_displayed = False goback = self._gtk.Button("back", None, "color2", self.bts, Gtk.PositionType.TOP, False) - goback.connect("clicked", self.create_status_grid) + goback.connect("clicked", self.switch_info, self.status_grid) goback.set_hexpand(False) goback.get_style_context().add_class("printing-info") @@ -310,12 +294,13 @@ class JobStatusPanel(ScreenPanel): info.attach(self.labels['height'], 2, 4, 1, 1) info.attach(self.labels['layer_lbl'], 1, 5, 1, 1) info.attach(self.labels['layer'], 2, 5, 1, 1) - self.switch_info(info) + self.move_grid = info + self.buttons['z'].connect("clicked", self.switch_info, self.move_grid) + self.buttons['speed'].connect("clicked", self.switch_info, self.move_grid) def create_time_grid(self, widget=None): - self.main_status_displayed = False goback = self._gtk.Button("back", None, "color3", self.bts, Gtk.PositionType.TOP, False) - goback.connect("clicked", self.create_status_grid) + goback.connect("clicked", self.switch_info, self.status_grid) goback.set_hexpand(False) info = Gtk.Grid() @@ -333,9 +318,14 @@ class JobStatusPanel(ScreenPanel): info.attach(self.labels['file_time'], 2, 4, 1, 1) info.attach(self.labels['fila_tlbl'], 1, 5, 1, 1) info.attach(self.labels['filament_time'], 2, 5, 1, 1) - self.switch_info(info) + self.time_grid = info + self.buttons['elapsed'].connect("clicked", self.switch_info, self.time_grid) + self.buttons['left'].connect("clicked", self.switch_info, self.time_grid) - def switch_info(self, info): + def switch_info(self, widget=None, info=None): + if not info: + logging.debug("No info to attach") + return if self._screen.vertical_mode: self.labels['info_grid'].remove_row(1) self.labels['info_grid'].attach(info, 0, 1, 1, 1) @@ -512,25 +502,24 @@ class JobStatusPanel(ScreenPanel): elif action != "notify_status_update": return - if self.main_status_displayed: - for x in self._printer.get_tools(): - if x in self.buttons['extruder']: - self.update_temp( - x, - self._printer.get_dev_stat(x, "temperature"), - self._printer.get_dev_stat(x, "target"), - self._printer.get_dev_stat(x, "power"), - ) - self.buttons['extruder'][x].set_label(self.labels[x].get_text()) - for x in self._printer.get_heaters(): - if x in self.buttons['heater']: - self.update_temp( - x, - self._printer.get_dev_stat(x, "temperature"), - self._printer.get_dev_stat(x, "target"), - self._printer.get_dev_stat(x, "power"), - ) - self.buttons['heater'][x].set_label(self.labels[x].get_text()) + for x in self._printer.get_tools(): + if x in self.buttons['extruder']: + self.update_temp( + x, + self._printer.get_dev_stat(x, "temperature"), + self._printer.get_dev_stat(x, "target"), + self._printer.get_dev_stat(x, "power"), + ) + self.buttons['extruder'][x].set_label(self.labels[x].get_text()) + for x in self._printer.get_heaters(): + if x in self.buttons['heater']: + self.update_temp( + x, + self._printer.get_dev_stat(x, "temperature"), + self._printer.get_dev_stat(x, "target"), + self._printer.get_dev_stat(x, "power"), + ) + self.buttons['heater'][x].set_label(self.labels[x].get_text()) self.update_message() @@ -548,9 +537,8 @@ class JobStatusPanel(ScreenPanel): if "gcode_move" in data: with contextlib.suppress(KeyError): - if self.main_status_displayed: - self.pos_z = round(float(data['gcode_move']['gcode_position'][2]), 2) - self.buttons['z'].set_label(f"Z: {self.pos_z:6.2f}{f'/{self.oheight}' if self.oheight > 0 else ''}") + self.pos_z = round(float(data['gcode_move']['gcode_position'][2]), 2) + self.buttons['z'].set_label(f"Z: {self.pos_z:6.2f}{f'/{self.oheight}' if self.oheight > 0 else ''}") with contextlib.suppress(KeyError): self.extrusion = round(float(data["gcode_move"]["extrude_factor"]) * 100) self.labels['extrude_factor'].set_label(f"{self.extrusion:3}%") @@ -564,8 +552,7 @@ class JobStatusPanel(ScreenPanel): f"{self.speed}% {self.vel:3.0f}/{self.req_speed:3.0f} " f"{f'{self.mms}' if self.vel < 1000 and self.req_speed < 1000 and self._screen.width > 480 else ''}" ) - if self.main_status_displayed: - self.buttons['speed'].set_label(self.labels['req_speed'].get_label()) + self.buttons['speed'].set_label(self.labels['req_speed'].get_label()) with contextlib.suppress(KeyError): self.zoffset = data["gcode_move"]["homing_origin"][2] self.labels['zoffset'].set_label(f"{self.zoffset:.2f} {self.mm}") @@ -588,8 +575,7 @@ class JobStatusPanel(ScreenPanel): f"{self.speed}% {self.vel:3.0f}/{self.req_speed:3.0f} " f"{f'{self.mms}' if self.vel < 1000 and self.req_speed < 1000 and self._screen.width > 480 else ''}" ) - if self.main_status_displayed: - self.buttons['speed'].set_label(self.labels['req_speed'].get_label()) + self.buttons['speed'].set_label(self.labels['req_speed'].get_label()) with contextlib.suppress(KeyError): self.flowstore.append(self.fila_section * float(data["motion_report"]["live_extruder_velocity"])) fan_label = "" @@ -598,7 +584,7 @@ class JobStatusPanel(ScreenPanel): self.fans[fan]['speed'] = f"{self._screen.printer.get_fan_speed(fan) * 100:3.0f}%" fan_label += f" {self.fans[fan]['name']}{self.fans[fan]['speed']}" if fan_label: - self.labels['fan'].set_label(fan_label[:12]) + self.buttons['fan'].set_label(fan_label[:12]) self.state_check() if self.state not in ["printing", "paused"]: @@ -627,12 +613,10 @@ class JobStatusPanel(ScreenPanel): else: self.update_time_left(total_duration, print_duration) - if self.main_status_displayed: - self.buttons['fan'].set_label(self.labels['fan'].get_text()) - elapsed_label = f"{self.labels['elapsed'].get_text()} {self.labels['duration'].get_text()}" - self.buttons['elapsed'].set_label(elapsed_label) - remaining_label = f"{self.labels['left'].get_text()} {self.labels['time_left'].get_text()}" - self.buttons['left'].set_label(remaining_label) + elapsed_label = f"{self.labels['elapsed'].get_text()} {self.labels['duration'].get_text()}" + self.buttons['elapsed'].set_label(elapsed_label) + remaining_label = f"{self.labels['left'].get_text()} {self.labels['time_left'].get_text()}" + self.buttons['left'].set_label(remaining_label) def update_flow(self): if not self.flowstore: @@ -640,8 +624,7 @@ class JobStatusPanel(ScreenPanel): self.flowrate = median(self.flowstore) self.flowstore = [] self.labels['flowrate'].set_label(f"{self.flowrate:.1f} {self.mms3}") - if self.main_status_displayed: - self.buttons['extrusion'].set_label(f"{self.extrusion:3}% {self.flowrate:5.1f} {self.mms3}") + self.buttons['extrusion'].set_label(f"{self.extrusion:3}% {self.flowrate:5.1f} {self.mms3}") return True def update_time_left(self, total_duration, print_duration, fila_used=0): diff --git a/styles/base.css b/styles/base.css index 045ba29d..fa1cd505 100644 --- a/styles/base.css +++ b/styles/base.css @@ -377,7 +377,7 @@ trough { margin-right: .25em; } .printing-info button { - margin: .1em; + margin: 0 .1em; background-color: rgba(0, 0, 0, 0.1); border-radius: .5em; }