diff --git a/ks_includes/KlippyGtk.py b/ks_includes/KlippyGtk.py index 1efada9e..c3d3d50b 100644 --- a/ks_includes/KlippyGtk.py +++ b/ks_includes/KlippyGtk.py @@ -10,8 +10,6 @@ from gi.repository import Gdk, GdkPixbuf, Gio, Gtk, Pango class KlippyGtk: labels = {} - width_ratio = 16 - height_ratio = 9.375 def __init__(self, screen, width, height, theme, cursor, fontsize_type): self.screen = screen @@ -28,10 +26,10 @@ class KlippyGtk: self.font_size = round(self.font_size * 0.91) elif fontsize_type == "large": self.font_size = round(self.font_size * 1.09) - self.header_size = int(round((self.width / self.width_ratio) / 1.33)) self.titlebar_height = self.font_size * 2 - self.img_width = int(round(self.width / self.width_ratio)) - self.img_height = int(round(self.height / self.height_ratio)) + self.img_scale = self.font_size * 2.5 + self.img_width = self.font_size * 3 + self.img_height = self.font_size * 3 if self.screen.vertical_mode: self.action_bar_width = int(self.width) self.action_bar_height = int(self.height * .1) @@ -70,15 +68,6 @@ class KlippyGtk: def get_titlebar_height(self): return self.titlebar_height - def get_header_size(self): - return self.header_size - - def get_image_width(self): - return self.img_width - - def get_image_height(self): - return self.img_height - def get_keyboard_height(self): if (self.height / self.width) >= 3: # Ultra-tall @@ -119,37 +108,29 @@ class KlippyGtk: la.get_style_context().add_class(style) return la - def Image(self, image_name, scale=1.0): + def Image(self, image_name, width=None, height=None): + width = width if width is not None else self.img_width + height = height if height is not None else self.img_height filename = os.path.join(self.themedir, f"{image_name}.svg") if os.path.exists(filename): - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, - int(round(self.img_width * scale)), - int(round(self.img_height * scale)), - True) + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(filename, int(width), int(height)) return Gtk.Image.new_from_pixbuf(pixbuf) else: logging.error(f"Unable to find image {filename}") return Gtk.Image() - def PixbufFromFile(self, filename, width_scale=1, height_scale=1): - return GdkPixbuf.Pixbuf.new_from_file_at_scale( - filename, - int(round(self.img_width * width_scale)), - int(round(self.img_height * height_scale)), - True - ) + @staticmethod + def PixbufFromFile(filename, width=-1, height=-1): + return GdkPixbuf.Pixbuf.new_from_file_at_size(filename, int(width), int(height)) - def PixbufFromHttp(self, resource, width_scale=1, height_scale=1): + def PixbufFromHttp(self, resource, width=-1, height=-1): response = self.screen.apiclient.get_thumbnail_stream(resource) if response is False: return None stream = Gio.MemoryInputStream.new_from_data(response, None) - return GdkPixbuf.Pixbuf.new_from_stream_at_scale( - stream, - int(round(self.img_width * width_scale)), - int(round(self.img_height * height_scale)), - True - ) + pixbuf = GdkPixbuf.Pixbuf.new_from_stream_at_scale(stream, int(width), int(height), True) + stream.close_async(2) + return pixbuf def Button(self, label=None, style=None): b = Gtk.Button(label=label) @@ -171,7 +152,8 @@ class KlippyGtk: b.set_vexpand(True) b.set_can_focus(False) if image_name is not None: - b.set_image(self.Image(image_name, scale)) + width = height = self.img_scale * scale + b.set_image(self.Image(image_name, width, height)) b.set_image_position(position) b.set_always_show_image(True) @@ -238,13 +220,13 @@ class KlippyGtk: logging.info("Removing Dialog") self.screen.dialogs.remove(dialog) - def ToggleButtonImage(self, image_name, label, style=None, scale=1.38): + def ToggleButtonImage(self, image_name, label, style=None, width=None, height=None): b = Gtk.ToggleButton(label=label) b.set_hexpand(True) b.set_vexpand(True) b.set_can_focus(False) - b.set_image(self.Image(image_name, scale)) + b.set_image(self.Image(image_name, width, height)) b.set_image_position(Gtk.PositionType.TOP) b.set_always_show_image(True) diff --git a/ks_includes/screen_panel.py b/ks_includes/screen_panel.py index a5958589..c2f7afdd 100644 --- a/ks_includes/screen_panel.py +++ b/ks_includes/screen_panel.py @@ -51,10 +51,11 @@ class ScreenPanel: def get_content(self): return self.content - def get_file_image(self, filename, width=1, height=1, small=False): + def get_file_image(self, filename, width=None, height=None, small=False): if not self._files.has_thumbnail(filename): return None - + width = width if width is not None else self._gtk.img_width + height = height if height is not None else self._gtk.img_height loc = self._files.get_thumbnail_location(filename, small) if loc is None: return None diff --git a/panels/base_panel.py b/panels/base_panel.py index 571f2029..6af89e04 100644 --- a/panels/base_panel.py +++ b/panels/base_panel.py @@ -128,27 +128,28 @@ class BasePanel(ScreenPanel): if not show or self._screen.printer.get_temp_store_devices() is None: return + img_size = self._gtk.img_scale * .5 for device in self._screen.printer.get_temp_store_devices(): if device.startswith("extruder"): if self._screen.printer.extrudercount > 1: if device == "extruder": - icon = self._gtk.Image("extruder-0", .5) + icon = self._gtk.Image("extruder-0", img_size, img_size) else: - icon = self._gtk.Image(f"extruder-{device[8:]}", .5) + icon = self._gtk.Image(f"extruder-{device[8:]}", img_size, img_size) else: - icon = self._gtk.Image("extruder", .5) + icon = self._gtk.Image("extruder", img_size, img_size) elif device.startswith("heater_bed"): - icon = self._gtk.Image("bed", .5) + icon = self._gtk.Image("bed", img_size, img_size) # Extra items elif self.titlebar_name_type is not None: # The item has a name, do not use an icon icon = None elif device.startswith("temperature_fan"): - icon = self._gtk.Image("fan", .5) + icon = self._gtk.Image("fan", img_size, img_size) elif device.startswith("heater_generic"): - icon = self._gtk.Image("heater", .5) + icon = self._gtk.Image("heater", img_size, img_size) else: - icon = self._gtk.Image("heat-up", .5) + icon = self._gtk.Image("heat-up", img_size, img_size) self.labels[device] = Gtk.Label(label="100ยบ") self.labels[device].set_ellipsize(Pango.EllipsizeMode.START) diff --git a/panels/gcode_macros.py b/panels/gcode_macros.py index 8a064326..f20aa777 100644 --- a/panels/gcode_macros.py +++ b/panels/gcode_macros.py @@ -104,9 +104,9 @@ class MacroPanel(ScreenPanel): def change_sort(self, widget): self.sort_reverse ^= True if self.sort_reverse: - self.sort_btn.set_image(self._gtk.Image("arrow-down", .5)) + self.sort_btn.set_image(self._gtk.Image("arrow-down", self._gtk.img_scale * .5)) else: - self.sort_btn.set_image(self._gtk.Image("arrow-up", .5)) + self.sort_btn.set_image(self._gtk.Image("arrow-up", self._gtk.img_scale * .5)) self.sort_btn.show() GLib.idle_add(self.reload_macros) diff --git a/panels/job_status.py b/panels/job_status.py index 6de5d421..c4c86651 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -119,12 +119,7 @@ class JobStatusPanel(ScreenPanel): overlay.add(self.labels['darea']) overlay.add_overlay(box) - self.labels['thumbnail'] = self._gtk.Image("file", 2) - if self._screen.vertical_mode: - self.labels['thumbnail'].set_size_request(0, self._screen.height / 4) - else: - self.labels['thumbnail'].set_size_request(self._screen.width / 3, 0) - + self.labels['thumbnail'] = self._gtk.Image("file", self._screen.width / 4, self._screen.height / 4) self.labels['info_grid'] = Gtk.Grid() self.labels['info_grid'].attach(self.labels['thumbnail'], 0, 0, 1, 1) if self._screen.printer.get_tools(): @@ -826,7 +821,13 @@ class JobStatusPanel(ScreenPanel): def show_file_thumbnail(self): if self._files.has_thumbnail(self.filename): - pixbuf = self.get_file_image(self.filename, 5, 4) + if self._screen.vertical_mode: + width = -1 + height = self._screen.height / 4 + else: + width = self._screen.width / 3 + height = -1 + pixbuf = self.get_file_image(self.filename, width, height) if pixbuf is not None: self.labels['thumbnail'].set_from_pixbuf(pixbuf) @@ -840,7 +841,6 @@ class JobStatusPanel(ScreenPanel): "limit": (self._screen.width * 24 / 480) // (self._gtk.get_font_size() / 11), "length": len(self.labels['file'].get_label()) } - if self.animation_timeout is None and (self.filename_label['length'] - self.filename_label['limit']) > 0: self.animation_timeout = GLib.timeout_add_seconds(1, self.animate_label) self.update_percent_complete() diff --git a/panels/print.py b/panels/print.py index 2458ff3b..8ee41110 100644 --- a/panels/print.py +++ b/panels/print.py @@ -45,7 +45,7 @@ class PrintPanel(ScreenPanel): for i, (name, val) in enumerate(self.sort_items.items(), start=1): s = self._gtk.ButtonImage(None, val, f"color{i % 4}", .5, Gtk.PositionType.RIGHT, 1) if name == self.sort_current[0]: - s.set_image(self._gtk.Image(self.sort_icon[self.sort_current[1]], .5)) + s.set_image(self._gtk.Image(self.sort_icon[self.sort_current[1]], self._gtk.img_scale * .5)) s.connect("clicked", self.change_sort, name) self.labels[f'sort_{name}'] = s sbox.add(s) @@ -179,7 +179,7 @@ class PrintPanel(ScreenPanel): file.set_hexpand(True) file.set_vexpand(False) - icon = self._gtk.Image("folder", 1) + icon = self._gtk.Image("folder") file.add(icon) file.add(labels) @@ -226,12 +226,11 @@ class PrintPanel(ScreenPanel): file.set_hexpand(True) file.set_vexpand(False) - icon = Gtk.Image() pixbuf = self.get_file_image(filepath, small=True) if pixbuf is not None: - icon.set_from_pixbuf(pixbuf) + icon = Gtk.Image.new_from_pixbuf(pixbuf) else: - icon = self._gtk.Image("file", 1.6) + icon = self._gtk.Image("file") img = Gtk.Button() img.set_image(icon) @@ -288,7 +287,8 @@ class PrintPanel(ScreenPanel): self.labels[f'sort_{oldkey}'].set_image(None) self.labels[f'sort_{oldkey}'].show_all() self.sort_current = [key, 0] - self.labels[f'sort_{key}'].set_image(self._gtk.Image(self.sort_icon[self.sort_current[1]], .5)) + self.labels[f'sort_{key}'].set_image(self._gtk.Image(self.sort_icon[self.sort_current[1]], + self._gtk.img_scale * .5)) self.labels[f'sort_{key}'].show() GLib.idle_add(self.reload_files) @@ -312,16 +312,16 @@ class PrintPanel(ScreenPanel): label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) grid = Gtk.Grid() - grid.add(label) - - pixbuf = self.get_file_image(filename, 8, 3.2) - if pixbuf is not None: - image = Gtk.Image.new_from_pixbuf(pixbuf) - grid.attach_next_to(image, label, Gtk.PositionType.BOTTOM, 1, 3) - grid.set_vexpand(True) grid.set_halign(Gtk.Align.CENTER) grid.set_valign(Gtk.Align.CENTER) + grid.add(label) + + pixbuf = self.get_file_image(filename, self._screen.width * .9, self._screen.height * .6) + if pixbuf is not None: + image = Gtk.Image.new_from_pixbuf(pixbuf) + image.set_vexpand(False) + grid.attach_next_to(image, label, Gtk.PositionType.BOTTOM, 1, 1) self._gtk.Dialog(self._screen, buttons, grid, self.confirm_print_response, filename) diff --git a/panels/splash_screen.py b/panels/splash_screen.py index 413b3f4a..1a222fdb 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -20,7 +20,7 @@ class SplashScreenPanel(ScreenPanel): def initialize(self, panel_name): - image = self._gtk.Image("klipper", 3.2) + image = self._gtk.Image("klipper", self._screen.width / 5, -1) self.labels['text'] = Gtk.Label(_("Initializing printer...")) self.labels['text'].set_line_wrap(True)