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:
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)

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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()

View File

@ -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)

View File

@ -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)