gtk: change scaling of images

This reduces the amount of magic numbers used, some images will scale to bigger sizes, most of the icons and images in vertical mode will be bigger, thumbnails should be bigger in both modes.
This commit is contained in:
alfrix
2022-10-18 19:47:54 -03:00
parent 62fd6b96f8
commit d3281379ee
7 changed files with 53 additions and 69 deletions

View File

@@ -10,8 +10,6 @@ from gi.repository import Gdk, GdkPixbuf, Gio, Gtk, Pango
class KlippyGtk: class KlippyGtk:
labels = {} labels = {}
width_ratio = 16
height_ratio = 9.375
def __init__(self, screen, width, height, theme, cursor, fontsize_type): def __init__(self, screen, width, height, theme, cursor, fontsize_type):
self.screen = screen self.screen = screen
@@ -28,10 +26,10 @@ class KlippyGtk:
self.font_size = round(self.font_size * 0.91) self.font_size = round(self.font_size * 0.91)
elif fontsize_type == "large": elif fontsize_type == "large":
self.font_size = round(self.font_size * 1.09) 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.titlebar_height = self.font_size * 2
self.img_width = int(round(self.width / self.width_ratio)) self.img_scale = self.font_size * 2.5
self.img_height = int(round(self.height / self.height_ratio)) self.img_width = self.font_size * 3
self.img_height = self.font_size * 3
if self.screen.vertical_mode: if self.screen.vertical_mode:
self.action_bar_width = int(self.width) self.action_bar_width = int(self.width)
self.action_bar_height = int(self.height * .1) self.action_bar_height = int(self.height * .1)
@@ -70,15 +68,6 @@ class KlippyGtk:
def get_titlebar_height(self): def get_titlebar_height(self):
return self.titlebar_height 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): def get_keyboard_height(self):
if (self.height / self.width) >= 3: if (self.height / self.width) >= 3:
# Ultra-tall # Ultra-tall
@@ -119,37 +108,29 @@ class KlippyGtk:
la.get_style_context().add_class(style) la.get_style_context().add_class(style)
return la 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") filename = os.path.join(self.themedir, f"{image_name}.svg")
if os.path.exists(filename): if os.path.exists(filename):
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(filename, int(width), int(height))
int(round(self.img_width * scale)),
int(round(self.img_height * scale)),
True)
return Gtk.Image.new_from_pixbuf(pixbuf) return Gtk.Image.new_from_pixbuf(pixbuf)
else: else:
logging.error(f"Unable to find image {filename}") logging.error(f"Unable to find image {filename}")
return Gtk.Image() return Gtk.Image()
def PixbufFromFile(self, filename, width_scale=1, height_scale=1): @staticmethod
return GdkPixbuf.Pixbuf.new_from_file_at_scale( def PixbufFromFile(filename, width=-1, height=-1):
filename, return GdkPixbuf.Pixbuf.new_from_file_at_size(filename, int(width), int(height))
int(round(self.img_width * width_scale)),
int(round(self.img_height * height_scale)),
True
)
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) response = self.screen.apiclient.get_thumbnail_stream(resource)
if response is False: if response is False:
return None return None
stream = Gio.MemoryInputStream.new_from_data(response, None) stream = Gio.MemoryInputStream.new_from_data(response, None)
return GdkPixbuf.Pixbuf.new_from_stream_at_scale( pixbuf = GdkPixbuf.Pixbuf.new_from_stream_at_scale(stream, int(width), int(height), True)
stream, stream.close_async(2)
int(round(self.img_width * width_scale)), return pixbuf
int(round(self.img_height * height_scale)),
True
)
def Button(self, label=None, style=None): def Button(self, label=None, style=None):
b = Gtk.Button(label=label) b = Gtk.Button(label=label)
@@ -171,7 +152,8 @@ class KlippyGtk:
b.set_vexpand(True) b.set_vexpand(True)
b.set_can_focus(False) b.set_can_focus(False)
if image_name is not None: 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_image_position(position)
b.set_always_show_image(True) b.set_always_show_image(True)
@@ -238,13 +220,13 @@ class KlippyGtk:
logging.info("Removing Dialog") logging.info("Removing Dialog")
self.screen.dialogs.remove(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 = Gtk.ToggleButton(label=label)
b.set_hexpand(True) b.set_hexpand(True)
b.set_vexpand(True) b.set_vexpand(True)
b.set_can_focus(False) 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_image_position(Gtk.PositionType.TOP)
b.set_always_show_image(True) b.set_always_show_image(True)

View File

@@ -51,10 +51,11 @@ class ScreenPanel:
def get_content(self): def get_content(self):
return self.content 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): if not self._files.has_thumbnail(filename):
return None 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) loc = self._files.get_thumbnail_location(filename, small)
if loc is None: if loc is None:
return None return None

View File

@@ -128,27 +128,28 @@ class BasePanel(ScreenPanel):
if not show or self._screen.printer.get_temp_store_devices() is None: if not show or self._screen.printer.get_temp_store_devices() is None:
return return
img_size = self._gtk.img_scale * .5
for device in self._screen.printer.get_temp_store_devices(): for device in self._screen.printer.get_temp_store_devices():
if device.startswith("extruder"): if device.startswith("extruder"):
if self._screen.printer.extrudercount > 1: if self._screen.printer.extrudercount > 1:
if device == "extruder": if device == "extruder":
icon = self._gtk.Image("extruder-0", .5) icon = self._gtk.Image("extruder-0", img_size, img_size)
else: else:
icon = self._gtk.Image(f"extruder-{device[8:]}", .5) icon = self._gtk.Image(f"extruder-{device[8:]}", img_size, img_size)
else: else:
icon = self._gtk.Image("extruder", .5) icon = self._gtk.Image("extruder", img_size, img_size)
elif device.startswith("heater_bed"): elif device.startswith("heater_bed"):
icon = self._gtk.Image("bed", .5) icon = self._gtk.Image("bed", img_size, img_size)
# Extra items # Extra items
elif self.titlebar_name_type is not None: elif self.titlebar_name_type is not None:
# The item has a name, do not use an icon # The item has a name, do not use an icon
icon = None icon = None
elif device.startswith("temperature_fan"): 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"): elif device.startswith("heater_generic"):
icon = self._gtk.Image("heater", .5) icon = self._gtk.Image("heater", img_size, img_size)
else: 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] = Gtk.Label(label="100º")
self.labels[device].set_ellipsize(Pango.EllipsizeMode.START) self.labels[device].set_ellipsize(Pango.EllipsizeMode.START)

View File

@@ -104,9 +104,9 @@ class MacroPanel(ScreenPanel):
def change_sort(self, widget): def change_sort(self, widget):
self.sort_reverse ^= True self.sort_reverse ^= True
if self.sort_reverse: 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: 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() self.sort_btn.show()
GLib.idle_add(self.reload_macros) GLib.idle_add(self.reload_macros)

View File

@@ -119,12 +119,7 @@ class JobStatusPanel(ScreenPanel):
overlay.add(self.labels['darea']) overlay.add(self.labels['darea'])
overlay.add_overlay(box) overlay.add_overlay(box)
self.labels['thumbnail'] = self._gtk.Image("file", 2) self.labels['thumbnail'] = self._gtk.Image("file", self._screen.width / 4, self._screen.height / 4)
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['info_grid'] = Gtk.Grid() self.labels['info_grid'] = Gtk.Grid()
self.labels['info_grid'].attach(self.labels['thumbnail'], 0, 0, 1, 1) self.labels['info_grid'].attach(self.labels['thumbnail'], 0, 0, 1, 1)
if self._screen.printer.get_tools(): if self._screen.printer.get_tools():
@@ -826,7 +821,13 @@ class JobStatusPanel(ScreenPanel):
def show_file_thumbnail(self): def show_file_thumbnail(self):
if self._files.has_thumbnail(self.filename): 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: if pixbuf is not None:
self.labels['thumbnail'].set_from_pixbuf(pixbuf) 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), "limit": (self._screen.width * 24 / 480) // (self._gtk.get_font_size() / 11),
"length": len(self.labels['file'].get_label()) "length": len(self.labels['file'].get_label())
} }
if self.animation_timeout is None and (self.filename_label['length'] - self.filename_label['limit']) > 0: 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.animation_timeout = GLib.timeout_add_seconds(1, self.animate_label)
self.update_percent_complete() self.update_percent_complete()

View File

@@ -45,7 +45,7 @@ class PrintPanel(ScreenPanel):
for i, (name, val) in enumerate(self.sort_items.items(), start=1): 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) s = self._gtk.ButtonImage(None, val, f"color{i % 4}", .5, Gtk.PositionType.RIGHT, 1)
if name == self.sort_current[0]: 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) s.connect("clicked", self.change_sort, name)
self.labels[f'sort_{name}'] = s self.labels[f'sort_{name}'] = s
sbox.add(s) sbox.add(s)
@@ -179,7 +179,7 @@ class PrintPanel(ScreenPanel):
file.set_hexpand(True) file.set_hexpand(True)
file.set_vexpand(False) file.set_vexpand(False)
icon = self._gtk.Image("folder", 1) icon = self._gtk.Image("folder")
file.add(icon) file.add(icon)
file.add(labels) file.add(labels)
@@ -226,12 +226,11 @@ class PrintPanel(ScreenPanel):
file.set_hexpand(True) file.set_hexpand(True)
file.set_vexpand(False) file.set_vexpand(False)
icon = Gtk.Image()
pixbuf = self.get_file_image(filepath, small=True) pixbuf = self.get_file_image(filepath, small=True)
if pixbuf is not None: if pixbuf is not None:
icon.set_from_pixbuf(pixbuf) icon = Gtk.Image.new_from_pixbuf(pixbuf)
else: else:
icon = self._gtk.Image("file", 1.6) icon = self._gtk.Image("file")
img = Gtk.Button() img = Gtk.Button()
img.set_image(icon) img.set_image(icon)
@@ -288,7 +287,8 @@ class PrintPanel(ScreenPanel):
self.labels[f'sort_{oldkey}'].set_image(None) self.labels[f'sort_{oldkey}'].set_image(None)
self.labels[f'sort_{oldkey}'].show_all() self.labels[f'sort_{oldkey}'].show_all()
self.sort_current = [key, 0] 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() self.labels[f'sort_{key}'].show()
GLib.idle_add(self.reload_files) GLib.idle_add(self.reload_files)
@@ -312,16 +312,16 @@ class PrintPanel(ScreenPanel):
label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR)
grid = Gtk.Grid() 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_vexpand(True)
grid.set_halign(Gtk.Align.CENTER) grid.set_halign(Gtk.Align.CENTER)
grid.set_valign(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) self._gtk.Dialog(self._screen, buttons, grid, self.confirm_print_response, filename)

View File

@@ -20,7 +20,7 @@ class SplashScreenPanel(ScreenPanel):
def initialize(self, panel_name): 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'] = Gtk.Label(_("Initializing printer..."))
self.labels['text'].set_line_wrap(True) self.labels['text'].set_line_wrap(True)