gtk: cleanup andoptimize image handling, incomplete themes should now work

This commit is contained in:
alfrix 2022-04-01 20:24:02 -03:00
parent c81836542a
commit c33659c6f7
12 changed files with 71 additions and 139 deletions

View File

@ -7,8 +7,6 @@ import pathlib
gi.require_version("Gtk", "3.0")
from gi.repository import Gdk, GdkPixbuf, Gio, Gtk, Pango
klipperscreendir = pathlib.Path(__file__).parent.resolve().parent
class KlippyGtk:
labels = {}
keyboard_ratio = .22
@ -19,7 +17,8 @@ class KlippyGtk:
self.screen = screen
self.width = width
self.height = height
self.theme = theme
self.themedir = os.path.join(pathlib.Path(__file__).parent.resolve().parent, "styles", theme, "images")
if self.screen.vertical_mode:
self.font_ratio = [33, 49]
else:
@ -114,61 +113,23 @@ class KlippyGtk:
la.get_style_context().add_class(style)
return la
def ImageLabel(self, image_name, text, size=20, style=False, width_scale=.32, height_scale=.32):
box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=15)
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
os.path.join(klipperscreendir, "styles", self.theme, "images", str(image_name) + ".svg"),
int(round(self.img_width * width_scale)), int(round(self.img_height * height_scale)), True)
image = Gtk.Image.new_from_pixbuf(pixbuf)
label = Gtk.Label()
label.set_markup(text)
box1.add(image)
box1.add(label)
if style is not False:
ctx = box1.get_style_context()
ctx.add_class(style)
return {"l": label, "b": box1}
def ImageMenuButton(self, image_name, text, size=20, style=False, width_scale=.32, height_scale=.32, popover=False):
box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=15)
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
os.path.join(klipperscreendir, "styles", self.theme, "images", str(image_name) + ".svg"),
int(round(self.img_width * width_scale)), int(round(self.img_height * height_scale)), True)
image = Gtk.Image.new_from_pixbuf(pixbuf)
mb = Gtk.MenuButton(label="", popover=popover)
label = mb.get_label()
box1.add(image)
box1.add(mb)
if style is not False:
ctx = box1.get_style_context()
ctx.add_class(style)
return {"l": label, "mb": mb, "b": box1}
def Image(self, image_name, style=False, width_scale=1, height_scale=1):
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
os.path.join(klipperscreendir, "styles", self.theme, "images", str(image_name)),
int(round(self.img_width * width_scale)), int(round(self.img_height * height_scale)), True)
return Gtk.Image.new_from_pixbuf(pixbuf)
def ImageFromFile(self, filename, style=False, width_scale=1, height_scale=1):
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
filename, int(round(self.img_width * width_scale)), int(round(self.img_height * height_scale)), True)
return Gtk.Image.new_from_pixbuf(pixbuf)
def Image(self, image_name, scale=1):
filename = os.path.join(self.themedir, str(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)
return Gtk.Image.new_from_pixbuf(pixbuf)
else:
logging.error("Unable to find image %s", filename)
return Gtk.Image()
def PixbufFromFile(self, filename, style=False, width_scale=1, height_scale=1):
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
filename, int(round(self.img_width * width_scale)), int(round(self.img_height * height_scale)), True)
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename,
int(round(self.img_width * width_scale)),
int(round(self.img_height * height_scale)),
True)
return pixbuf
def PixbufFromHttp(self, resource, style=False, width_scale=1, height_scale=1):
@ -176,9 +137,10 @@ class KlippyGtk:
if response is False:
return None
stream = Gio.MemoryInputStream.new_from_data(response, None)
pixbuf = 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(round(self.img_width * width_scale)),
int(round(self.img_height * height_scale)),
True)
return pixbuf
def ProgressBar(self, style=False):
@ -202,31 +164,16 @@ class KlippyGtk:
b.connect("clicked", self.screen.reset_screensaver_timeout)
return b
def ButtonImage(self, image_name, label=None, style=None, width_scale=1.38, height_scale=1.38,
def ButtonImage(self, image_name, label=None, style=None, scale=1.38,
position=Gtk.PositionType.TOP, word_wrap=True):
filename = os.path.join(klipperscreendir, "styles", self.theme, "images", str(image_name) + ".svg")
if not os.path.exists(filename):
logging.error("Unable to find button image (theme, image): (%s, %s)" % (self.theme, str(image_name)))
filename = os.path.join(klipperscreendir, "styles", self.theme, "images", "warning.svg")
b = Gtk.Button(label=label)
if os.path.exists(filename):
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
filename,
int(round(self.img_width * width_scale)),
int(round(self.img_height * height_scale)),
True
)
img = Gtk.Image.new_from_pixbuf(pixbuf)
b.set_image(img)
b.set_hexpand(True)
b.set_vexpand(True)
b.set_can_focus(False)
b.set_image(self.Image(image_name, scale))
b.set_image_position(position)
b.set_always_show_image(True)
b.props.relief = Gtk.ReliefStyle.NONE
if word_wrap is True:
try:
@ -276,25 +223,15 @@ class KlippyGtk:
return dialog
def ToggleButtonImage(self, image_name, label, style=False, width_scale=1.38, height_scale=1.38):
filename = os.path.join(klipperscreendir, "styles", self.theme, "images", str(image_name) + ".svg")
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
filename,
int(round(self.img_width * width_scale)),
int(round(self.img_height * height_scale)),
True
)
img = Gtk.Image.new_from_pixbuf(pixbuf)
def ToggleButtonImage(self, image_name, label, style=False, scale=1.38):
b = Gtk.ToggleButton(label=label)
b.set_image(img)
b.set_hexpand(True)
b.set_vexpand(True)
b.set_can_focus(False)
b.set_image(self.Image(image_name, scale))
b.set_image_position(Gtk.PositionType.TOP)
b.set_always_show_image(True)
b.props.relief = Gtk.ReliefStyle.NONE
if style is not False:
ctx = b.get_style_context()

View File

@ -151,9 +151,6 @@ class KlippyFiles():
return False
def get_thumbnail_location(self, filename):
if not self.has_thumbnail(filename):
return None
thumb = self.files[filename]['thumbnails'][0]
if thumb['local'] is False:
return ['http', thumb['path']]

View File

@ -34,9 +34,9 @@ class Keypad(Gtk.Box):
for i in range(len(keys)):
id = 'button_' + str(keys[i][0])
if keys[i][0] == "B":
self.labels[id] = self._gtk.ButtonImage("backspace", None, None, 1, 1)
self.labels[id] = self._gtk.ButtonImage("backspace", None, None, 1)
elif keys[i][0] == "E":
self.labels[id] = self._gtk.ButtonImage("complete", None, None, 1, 1)
self.labels[id] = self._gtk.ButtonImage("complete", None, None, 1)
else:
self.labels[id] = Gtk.Button(keys[i][0])
self.labels[id].connect('clicked', self.update_entry, keys[i][0])
@ -48,7 +48,7 @@ class Keypad(Gtk.Box):
self.labels['entry'].props.xalign = 0.5
self.labels['entry'].connect("activate", self.update_entry, "E")
b = self._gtk.ButtonImage('cancel', _('Close'), None, 1, 1)
b = self._gtk.ButtonImage('cancel', _('Close'), None, 1)
b.connect("clicked", close_function)
self.add(self.labels['entry'])

View File

@ -34,24 +34,22 @@ class BasePanel(ScreenPanel):
self.control_grid.set_size_request(action_bar_width, action_bar_height)
self.control_grid.get_style_context().add_class('action_bar')
self.control['back'] = self._gtk.ButtonImage('back', None, None, 1, 1)
self.control['back'] = self._gtk.ButtonImage('back', None, None, 1)
self.control['back'].connect("clicked", self.back)
self.control['home'] = self._gtk.ButtonImage('main', None, None, 1, 1)
self.control['home'] = self._gtk.ButtonImage('main', None, None, 1)
self.control['home'].connect("clicked", self.menu_return, True)
if len(self._config.get_printers()) > 1:
self.control['printer_select'] = self._gtk.ButtonImage(
'shuffle', None, None, 1, 1)
self.control['printer_select'] = self._gtk.ButtonImage('shuffle', None, None, 1)
self.control['printer_select'].connect("clicked", self._screen.show_printer_select)
self.control['macro_shortcut'] = self._gtk.ButtonImage(
'custom-script', None, None, 1, 1)
self.control['macro_shortcut'] = self._gtk.ButtonImage('custom-script', None, None, 1)
self.control['macro_shortcut'].connect("clicked", self.menu_item_clicked, "gcode_macros", {
"name": "Macros",
"panel": "gcode_macros"
})
self.control['estop'] = self._gtk.ButtonImage('emergency', None, None, 1, 1)
self.control['estop'] = self._gtk.ButtonImage('emergency', None, None, 1)
self.control['estop'].connect("clicked", self.emergency_stop)
self.locations = {
@ -151,20 +149,20 @@ class BasePanel(ScreenPanel):
if device.startswith("extruder"):
if self._printer.extrudercount > 1:
if device == "extruder":
ext_img = self._gtk.Image("extruder-0.svg", None, .5, .5)
ext_img = self._gtk.Image("extruder-0", .5)
else:
ext_img = self._gtk.Image("extruder-%s.svg" % device[8:], None, .5, .5)
ext_img = self._gtk.Image("extruder-%s" % device[8:], .5)
else:
ext_img = self._gtk.Image("extruder.svg", None, .5, .5)
ext_img = self._gtk.Image("extruder", .5)
self.labels[device + '_box'].pack_start(ext_img, True, True, 3)
elif device.startswith("heater_bed"):
bed_img = self._gtk.Image("bed.svg", None, .5, .5)
bed_img = self._gtk.Image("bed", .5)
self.labels[device + '_box'].pack_start(bed_img, True, True, 3)
elif device.startswith("temperature_fan"):
fan_img = self._gtk.Image("fan.svg", None, .5, .5)
fan_img = self._gtk.Image("fan", .5)
self.labels[device + '_box'].pack_start(fan_img, True, True, 3)
else:
temp_img = self._gtk.Image("heat-up.svg", None, .5, .5)
temp_img = self._gtk.Image("heat-up", .5)
self.labels[device + '_box'].pack_start(temp_img, True, True, 3)
self.labels[device + '_box'].pack_start(self.labels[device], True, True, 0)

View File

@ -114,14 +114,14 @@ class BedLevelPanel(ScreenPanel):
logging.debug("Using %d-screw locations [x,y] [%dx%d]", len(self.screws), self.x_cnt, self.y_cnt)
self.labels['bl'] = self._gtk.ButtonImage("bed-level-t-l", None, None, 2.5, 2.5)
self.labels['br'] = self._gtk.ButtonImage("bed-level-t-r", None, None, 2.5, 2.5)
self.labels['fl'] = self._gtk.ButtonImage("bed-level-b-l", None, None, 2.5, 2.5)
self.labels['fr'] = self._gtk.ButtonImage("bed-level-b-r", None, None, 2.5, 2.5)
self.labels['lm'] = self._gtk.ButtonImage("bed-level-l-m", None, None, 2.5, 2.5)
self.labels['rm'] = self._gtk.ButtonImage("bed-level-r-m", None, None, 2.5, 2.5)
self.labels['fm'] = self._gtk.ButtonImage("bed-level-b-m", None, None, 2.5, 2.5)
self.labels['bm'] = self._gtk.ButtonImage("bed-level-t-m", None, None, 2.5, 2.5)
self.labels['bl'] = self._gtk.ButtonImage("bed-level-t-l", None, None, 2.5)
self.labels['br'] = self._gtk.ButtonImage("bed-level-t-r", None, None, 2.5)
self.labels['fl'] = self._gtk.ButtonImage("bed-level-b-l", None, None, 2.5)
self.labels['fr'] = self._gtk.ButtonImage("bed-level-b-r", None, None, 2.5)
self.labels['lm'] = self._gtk.ButtonImage("bed-level-l-m", None, None, 2.5)
self.labels['rm'] = self._gtk.ButtonImage("bed-level-r-m", None, None, 2.5)
self.labels['fm'] = self._gtk.ButtonImage("bed-level-b-m", None, None, 2.5)
self.labels['bm'] = self._gtk.ButtonImage("bed-level-t-m", None, None, 2.5)
bedgrid = Gtk.Grid()
bedgrid.attach(self.labels['bl'], 1, 0, 1, 1)

View File

@ -39,7 +39,7 @@ class BedMeshPanel(ScreenPanel):
addprofile = self._gtk.ButtonImage("increase", " %s" % _("Add bed mesh profile"),
"color1", .5, .5, Gtk.PositionType.LEFT, False)
"color1", .5, Gtk.PositionType.LEFT, False)
addprofile.connect("clicked", self.show_create_profile)
addprofile.set_size_request(60, 0)
addprofile.set_hexpand(False)

View File

@ -82,17 +82,17 @@ class FineTunePanel(ScreenPanel):
self.labels['z+'] = self._gtk.ButtonImage("z-farther", _("Z+"), "color1")
self.labels['z-'] = self._gtk.ButtonImage("z-closer", _("Z-"), "color1")
self.labels['zoffset'] = self._gtk.ButtonImage("refresh", " 0.00" + _("mm"),
"color1", .6, .6, Gtk.PositionType.LEFT, False)
"color1", .6, Gtk.PositionType.LEFT, False)
self.labels['speed+'] = self._gtk.ButtonImage("speed+", _("Speed +"), "color3")
self.labels['speed-'] = self._gtk.ButtonImage("speed-", _("Speed -"), "color3")
self.labels['speedfactor'] = self._gtk.ButtonImage("refresh", " 100%",
"color3", .6, .6, Gtk.PositionType.LEFT, False)
"color3", .6, Gtk.PositionType.LEFT, False)
self.labels['extrude+'] = self._gtk.ButtonImage("flow+", _("Extrusion +"), "color4")
self.labels['extrude-'] = self._gtk.ButtonImage("flow-", _("Extrusion -"), "color4")
self.labels['extrudefactor'] = self._gtk.ButtonImage("refresh", " 100%",
"color4", .6, .6, Gtk.PositionType.LEFT, False)
"color4", .6, Gtk.PositionType.LEFT, False)
grid.attach(self.labels['z+'], 0, 0, 1, 1)
grid.attach(self.labels['z-'], 1, 0, 1, 1)
@ -110,17 +110,17 @@ class FineTunePanel(ScreenPanel):
else:
self.labels['z+'] = self._gtk.ButtonImage("z-farther", _("Z+"), "color1")
self.labels['zoffset'] = self._gtk.ButtonImage("refresh", " 0.00" + _("mm"),
"color1", .6, .6, Gtk.PositionType.LEFT, False)
"color1", .6, Gtk.PositionType.LEFT, False)
self.labels['z-'] = self._gtk.ButtonImage("z-closer", _("Z-"), "color1")
self.labels['speed+'] = self._gtk.ButtonImage("speed+", _("Speed +"), "color3")
self.labels['speedfactor'] = self._gtk.ButtonImage("refresh", " 100%",
"color3", .6, .6, Gtk.PositionType.LEFT, False)
"color3", .6, Gtk.PositionType.LEFT, False)
self.labels['speed-'] = self._gtk.ButtonImage("speed-", _("Speed -"), "color3")
self.labels['extrude+'] = self._gtk.ButtonImage("flow+", _("Extrusion +"), "color4")
self.labels['extrudefactor'] = self._gtk.ButtonImage("refresh", " 100%",
"color4", .6, .6, Gtk.PositionType.LEFT, False)
"color4", .6, Gtk.PositionType.LEFT, False)
self.labels['extrude-'] = self._gtk.ButtonImage("flow-", _("Extrusion -"), "color4")
grid.attach(self.labels['zoffset'], 0, 0, 1, 1)
grid.attach(self.labels['z+'], 0, 1, 1, 1)

View File

@ -86,7 +86,7 @@ class JobStatusPanel(ScreenPanel):
overlay.add(self.labels['darea'])
overlay.add_overlay(box)
self.labels['thumbnail'] = self._gtk.Image("file.svg", False, 1.6, 1.6)
self.labels['thumbnail'] = self._gtk.Image("file", 2)
i = 0
for extruder in self._printer.get_tools():
@ -94,7 +94,7 @@ class JobStatusPanel(ScreenPanel):
self.labels[extruder] = Gtk.Label(label="")
self.labels[extruder].get_style_context().add_class("printing-info")
if i <= 4:
ext_img = self._gtk.Image("extruder-%s.svg" % i, None, .6, .6)
ext_img = self._gtk.Image("extruder-%s" % i, .6)
self.labels[extruder + '_box'].add(ext_img)
self.labels[extruder + '_box'].add(self.labels[extruder])
i += 1
@ -103,7 +103,7 @@ class JobStatusPanel(ScreenPanel):
self.current_extruder = self._printer.get_stat("toolhead", "extruder")
temp_grid.attach(self.labels[self.current_extruder + '_box'], 0, 0, 1, 1)
if self._printer.has_heated_bed():
heater_bed = self._gtk.Image("bed.svg", None, .6, .6)
heater_bed = self._gtk.Image("bed", .6)
self.labels['heater_bed'] = Gtk.Label(label="")
self.labels['heater_bed'].get_style_context().add_class("printing-info")
heater_bed_box = Gtk.Box(spacing=0)
@ -113,7 +113,7 @@ class JobStatusPanel(ScreenPanel):
self.labels['temp_grid'] = temp_grid
# Create time remaining items
hourglass = self._gtk.Image("hourglass.svg", None, .6, .6)
hourglass = self._gtk.Image("hourglass", .6)
self.labels['left'] = Gtk.Label(label=_("Left:"))
self.labels['left'].get_style_context().add_class("printing-info")
self.labels['time_left'] = Gtk.Label(label="0s")
@ -125,7 +125,7 @@ class JobStatusPanel(ScreenPanel):
self.labels['itl_box'] = itl_box
# Create overall items
clock = self._gtk.Image("clock.svg", None, .6, .6)
clock = self._gtk.Image("clock", .6)
self.labels['elapsed'] = Gtk.Label(label=_("Elapsed:"))
self.labels['elapsed'].get_style_context().add_class("printing-info")
self.labels['duration'] = Gtk.Label(label="0s")
@ -146,7 +146,7 @@ class JobStatusPanel(ScreenPanel):
timegrid.attach(it2_box, 1, 1, 1, 1)
self.labels['timegrid'] = timegrid
position = self._gtk.Image("move.svg", None, .6, .6)
position = self._gtk.Image("move", .6)
self.labels['pos_x'] = Gtk.Label(label="X: 0")
self.labels['pos_x'].get_style_context().add_class("printing-info")
self.labels['pos_y'] = Gtk.Label(label="Y: 0")
@ -163,19 +163,19 @@ class JobStatusPanel(ScreenPanel):
pos_box.add(posgrid)
self.labels['pos_box'] = pos_box
speed = self._gtk.Image("speed+.svg", None, .6, .6)
speed = self._gtk.Image("speed+", .6)
self.labels['speed'] = Gtk.Label(label="")
self.labels['speed'].get_style_context().add_class("printing-info")
speed_box = Gtk.Box(spacing=0)
speed_box.add(speed)
speed_box.add(self.labels['speed'])
extrusion = self._gtk.Image("extrude.svg", None, .6, .6)
extrusion = self._gtk.Image("extrude", .6)
self.labels['extrusion'] = Gtk.Label(label="")
self.labels['extrusion'].get_style_context().add_class("printing-info")
extrusion_box = Gtk.Box(spacing=0)
extrusion_box.add(extrusion)
extrusion_box.add(self.labels['extrusion'])
fan = self._gtk.Image("fan.svg", None, .6, .6)
fan = self._gtk.Image("fan", .6)
self.labels['fan'] = Gtk.Label(label="")
self.labels['fan'].get_style_context().add_class("printing-info")
fan_box = Gtk.Box(spacing=0)

View File

@ -130,7 +130,7 @@ class MainPanel(MenuPanel):
text = "<span underline='double' underline_color='#%s'>%s</span>" % (color, devname.capitalize())
name = self._gtk.ButtonImage(image, devname.capitalize().replace("_", " "),
None, .5, .5, Gtk.PositionType.LEFT, False)
None, .5, Gtk.PositionType.LEFT, False)
name.connect('clicked', self.on_popover_clicked, device)
name.set_alignment(0, .5)
name.get_style_context().add_class(class_name)

View File

@ -55,7 +55,7 @@ class PrintPanel(ScreenPanel):
sbox.add(s)
i += 1
refresh = self._gtk.ButtonImage("refresh", None, None, .5, .5)
refresh = self._gtk.ButtonImage("refresh", None, None, .5)
refresh.connect('clicked', self._refresh_files)
sbox.add(refresh)
sbox.set_hexpand(True)
@ -125,7 +125,7 @@ class PrintPanel(ScreenPanel):
file.set_hexpand(True)
file.set_vexpand(False)
icon = self._gtk.Image("folder.svg", False, 1, 1)
icon = self._gtk.Image("folder", 1)
file.add(icon)
file.add(labels)
@ -216,7 +216,7 @@ class PrintPanel(ScreenPanel):
if pixbuf is not None:
icon.set_from_pixbuf(pixbuf)
else:
icon = self._gtk.Image("file.svg", False, 1.6, 1.6)
icon = self._gtk.Image("file", 1.6)
file.add(icon)
file.add(labels)

View File

@ -22,7 +22,7 @@ class SplashScreenPanel(ScreenPanel):
def initialize(self, panel_name):
_ = self.lang.gettext
image = self._gtk.Image("klipper.svg", None, 3.2, 3.2)
image = self._gtk.Image("klipper", 3.2)
self.labels['text'] = Gtk.Label(_("Initializing printer..."))
self.labels['text'].set_line_wrap(True)

View File

@ -54,8 +54,8 @@ class TemperaturePanel(ScreenPanel):
def create_right_panel(self):
_ = self.lang.gettext
cooldown = self._gtk.ButtonImage('cool-down', _('Cooldown'), "color4", 1, 1, Gtk.PositionType.LEFT, False)
adjust = self._gtk.ButtonImage('fine-tune', '', "color3", 1, 1, Gtk.PositionType.LEFT, False)
cooldown = self._gtk.ButtonImage('cool-down', _('Cooldown'), "color4", 1, Gtk.PositionType.LEFT, False)
adjust = self._gtk.ButtonImage('fine-tune', '', "color3", 1, Gtk.PositionType.LEFT, False)
right = self._gtk.HomogeneousGrid()
right.attach(cooldown, 0, 0, 2, 1)
@ -336,7 +336,7 @@ class TemperaturePanel(ScreenPanel):
text = "<span underline='double' underline_color='#%s'>%s</span>" % (color, devname.capitalize())
name = self._gtk.ButtonImage(image, devname.capitalize().replace("_", " "),
None, .5, .5, Gtk.PositionType.LEFT, False)
None, .5, Gtk.PositionType.LEFT, False)
name.connect('clicked', self.on_popover_clicked, device)
name.set_alignment(0, .5)
name.get_style_context().add_class(class_name)