diff --git a/data/ui/library-panel.ui b/data/ui/library-panel.ui index b835e3f..b5512e3 100644 --- a/data/ui/library-panel.ui +++ b/data/ui/library-panel.ui @@ -221,14 +221,10 @@ vertical - true - true contain false - true - true GtkListItem diff --git a/meson.build b/meson.build index 67b6caf..a8e88cc 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('mcg', - version: '4.0.2', + version: '4.0.1', meson_version: '>= 0.59.0', default_options: [ 'warning_level=2', diff --git a/src/coverpanel.py b/src/coverpanel.py index b6f3c67..d9c5d31 100644 --- a/src/coverpanel.py +++ b/src/coverpanel.py @@ -236,7 +236,6 @@ class CoverPanel(Gtk.Overlay): pixbuf = self._cover_pixbuf # Check pixelbuffer if pixbuf is None: - self.cover_default.set_pixel_size(min(size_width, size_height)/2) return # Skalierungswert für Breite und Höhe ermitteln @@ -252,5 +251,4 @@ class CoverPanel(Gtk.Overlay): return self.cover_image.set_from_pixbuf( pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.HYPER)) - self.cover_image.set_pixel_size(min(width, height)) self.cover_image.show() diff --git a/src/librarypanel.py b/src/librarypanel.py index 02d8c08..e2ae1fb 100644 --- a/src/librarypanel.py +++ b/src/librarypanel.py @@ -293,13 +293,15 @@ class LibraryPanel(Adw.Bin): def set_albumart(self, album, data): if album in self._selected_albums: - self._standalone_pixbuf = None if data: # Load image and draw it try: self._standalone_pixbuf = Utils.load_pixbuf(data) except Exception: self._logger.exception("Failed to set albumart") + self._standalone_pixbuf = self._get_default_image() + else: + self._standalone_pixbuf = self._get_default_image() # Show image GObject.idle_add(self._show_image) @@ -333,24 +335,23 @@ class LibraryPanel(Adw.Bin): self._grid_pixbufs.clear() for album_id in albums.keys(): album = albums[album_id] - grid_item = GridItem(album) - pixbuf = None try: pixbuf = Utils.load_thumbnail(cache, self._client, album, size) except client.CommandException: # Exception is handled by client pass - except Exception: - self._logger.exception("Failed to load albumart") + except Exception as e: + self._logger.exception("Failed to load albumart", e) if pixbuf is None: - icon = self._get_default_icon(self._item_size, self._item_size) - grid_item.set_icon(icon) - else: + pixbuf = self._icon_theme.lookup_icon( + Utils.STOCK_ICON_DEFAULT, None, self._item_size, + self._item_size, Gtk.TextDirection.LTR, + Gtk.IconLookupFlags.FORCE_SYMBOLIC) + if pixbuf is not None: self._grid_pixbufs[album.get_id()] = pixbuf - grid_item.set_cover(pixbuf) - - GObject.idle_add(self._library_grid_model.append, grid_item) + GObject.idle_add(self._library_grid_model.append, + GridItem(album, pixbuf)) i += 1 GObject.idle_add(self.progress_bar.set_fraction, i / n) @@ -439,26 +440,27 @@ class LibraryPanel(Adw.Bin): pixbuf = self._standalone_pixbuf # Check pixelbuffer if pixbuf is None: - icon = self._get_default_icon(size_width, size_height) - self.standalone_image.set_from_paintable(icon) - self.standalone_image.set_pixel_size(min(size_width, size_height)/2) return - (width, height) = Utils.calculate_size(pixbuf.get_width(), - pixbuf.get_height(), size_width, - size_height) + # Skalierungswert für Breite und Höhe ermitteln + ratio_w = float(size_width) / float(pixbuf.get_width()) + ratio_h = float(size_height) / float(pixbuf.get_height()) + # Kleineren beider Skalierungswerte nehmen, nicht Hochskalieren + ratio = min(ratio_w, ratio_h) + ratio = min(ratio, 1) + # Neue Breite und Höhe berechnen + width = int(math.floor(pixbuf.get_width() * ratio)) + height = int(math.floor(pixbuf.get_height() * ratio)) if width <= 0 or height <= 0: return # Pixelpuffer auf Oberfläche zeichnen self.standalone_image.set_from_pixbuf( pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.HYPER)) - self.standalone_image.set_pixel_size(min(width, height)) self.standalone_image.show() - def _get_default_icon(self, width, height): + def _get_default_image(self): return self._icon_theme.lookup_icon(Utils.STOCK_ICON_DEFAULT, None, - width, height, - Gtk.TextDirection.LTR, + 512, 512, Gtk.TextDirection.LTR, Gtk.IconLookupFlags.FORCE_SYMBOLIC) def _get_selected_albums(self): diff --git a/src/playlistpanel.py b/src/playlistpanel.py index 9f59e93..34abfee 100644 --- a/src/playlistpanel.py +++ b/src/playlistpanel.py @@ -171,13 +171,15 @@ class PlaylistPanel(Adw.Bin): def set_albumart(self, album, data): if album in self._selected_albums: - self._standalone_pixbuf = None if data: # Load image and draw it try: self._standalone_pixbuf = Utils.load_pixbuf(data) except Exception: self._logger.exception("Failed to set albumart") + self._cover_pixbuf = self._get_default_image() + else: + self._cover_pixbuf = self._get_default_image() # Show image GObject.idle_add(self._show_image) @@ -195,8 +197,6 @@ class PlaylistPanel(Adw.Bin): cache = client.MCGCache(host, size) for album in playlist: - grid_item = GridItem(album) - pixbuf = None # Load albumart thumbnail try: @@ -207,12 +207,12 @@ class PlaylistPanel(Adw.Bin): except Exception: self._logger.exception("Failed to load albumart") if pixbuf is None: - icon = self._get_default_icon(self._item_size, self._item_size) - grid_item.set_icon(icon) - else: - grid_item.set_cover(pixbuf) - - GObject.idle_add(self._playlist_grid_model.append, grid_item) + pixbuf = self._icon_theme.lookup_icon( + Utils.STOCK_ICON_DEFAULT, None, self._item_size, + self._item_size, Gtk.TextDirection.LTR, + Gtk.IconLookupFlags.FORCE_SYMBOLIC) + if pixbuf is not None: + self._playlist_grid_model.append(GridItem(album, pixbuf)) if self._playlist_stop.is_set(): self._playlist_lock.release() @@ -247,26 +247,27 @@ class PlaylistPanel(Adw.Bin): pixbuf = self._standalone_pixbuf # Check pixelbuffer if pixbuf is None: - icon = self._get_default_icon(size_width, size_height) - self.standalone_image.set_from_paintable(icon) - self.standalone_image.set_pixel_size(min(size_width, size_height)/2) return - (width, height) = Utils.calculate_size(pixbuf.get_width(), - pixbuf.get_height(), size_width, - size_height) + # Skalierungswert für Breite und Höhe ermitteln + ratio_w = float(size_width) / float(pixbuf.get_width()) + ratio_h = float(size_height) / float(pixbuf.get_height()) + # Kleineren beider Skalierungswerte nehmen, nicht Hochskalieren + ratio = min(ratio_w, ratio_h) + ratio = min(ratio, 1) + # Neue Breite und Höhe berechnen + width = int(math.floor(pixbuf.get_width() * ratio)) + height = int(math.floor(pixbuf.get_height() * ratio)) if width <= 0 or height <= 0: return # Pixelpuffer auf Oberfläche zeichnen self.standalone_image.set_from_pixbuf( pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.HYPER)) - self.standalone_image.set_pixel_size(min(width, height)) self.standalone_image.show() - def _get_default_icon(self, width, height): + def _get_default_image(self): return self._icon_theme.lookup_icon(Utils.STOCK_ICON_DEFAULT, None, - width, height, - Gtk.TextDirection.LTR, + 512, 512, Gtk.TextDirection.LTR, Gtk.IconLookupFlags.FORCE_SYMBOLIC) def _get_selected_albums(self): diff --git a/src/utils.py b/src/utils.py index 544e415..ed8a04f 100644 --- a/src/utils.py +++ b/src/utils.py @@ -2,9 +2,7 @@ import gi import hashlib -import math import locale -import logging import os gi.require_version('Gtk', '4.0') @@ -37,17 +35,9 @@ class Utils: if albumart: pixbuf = Utils.load_pixbuf(albumart) if pixbuf is not None: - (width, height) = Utils.calculate_size(pixbuf.get_width(), - pixbuf.get_height(), - size, size) - pixbuf = pixbuf.scale_simple(width, height, + pixbuf = pixbuf.scale_simple(size, size, GdkPixbuf.InterpType.HYPER) - try: - pixbuf.savev(cache_url, 'jpeg', [], []) - except Exception as e: - logger = logging.getLogger(__name__) - logger.warning("Failed to save thumbnail for album\"%s\": " - "%s", album.get_title(), e) + pixbuf.savev(cache_url, 'jpeg', [], []) return pixbuf @staticmethod @@ -82,19 +72,6 @@ class Utils: m.update(value.encode('utf-8')) return m.hexdigest() - @staticmethod - def calculate_size(src_width, src_height, dest_width, dest_height): - ratio_w = float(dest_width) / float(src_width) - ratio_h = float(dest_height) / float(src_height) - ratio = min(min(ratio_w, ratio_h), 1) - if ratio == 1: - return (src_width, src_height) - - width = int(math.floor(src_width * ratio)) - height = int(math.floor(src_height * ratio)) - - return (width, height) - class SortOrder: ARTIST = 0 @@ -109,9 +86,11 @@ class GridItem(GObject.GObject): tooltip = GObject.Property(type=str, default=None) cover = GObject.Property(type=Gdk.Paintable, default=None) - def __init__(self, album): + def __init__(self, album, cover): super().__init__() self._album = album + if cover: + self.cover = Gdk.Texture.new_for_pixbuf(cover) self.tooltip = GObject.markup_escape_text("\n".join([ album.get_title(), ', '.join(album.get_dates()), Utils.create_artists_label(album), @@ -124,9 +103,6 @@ class GridItem(GObject.GObject): def set_cover(self, cover): self.cover = Gdk.Texture.new_for_pixbuf(cover) - def set_icon(self, icon): - self.cover = icon - class SearchFilter(Gtk.Filter):