From 9311f9974a1610c310fd10b9b7e925c1714596c7 Mon Sep 17 00:00:00 2001 From: Olli Date: Sat, 10 Jan 2026 15:42:24 +0100 Subject: [PATCH] Do not try to convert default icon to GDK pixbuf (close #110) --- src/coverpanel.py | 1 + src/librarypanel.py | 27 +++++++++++++++------------ src/playlistpanel.py | 26 +++++++++++++++----------- src/utils.py | 7 ++++--- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/coverpanel.py b/src/coverpanel.py index 312d4da..b6f3c67 100644 --- a/src/coverpanel.py +++ b/src/coverpanel.py @@ -236,6 +236,7 @@ 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 diff --git a/src/librarypanel.py b/src/librarypanel.py index fd56f9f..83cafe2 100644 --- a/src/librarypanel.py +++ b/src/librarypanel.py @@ -293,15 +293,13 @@ 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) @@ -335,6 +333,8 @@ 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) @@ -344,14 +344,13 @@ class LibraryPanel(Adw.Bin): except Exception as e: self._logger.exception("Failed to load albumart", e) if pixbuf is None: - 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: + icon = self._get_default_icon(self._item_size, self._item_size) + grid_item.set_icon(icon) + else: self._grid_pixbufs[album.get_id()] = pixbuf - GObject.idle_add(self._library_grid_model.append, - GridItem(album, pixbuf)) + grid_item.set_cover(pixbuf) + + GObject.idle_add(self._library_grid_model.append, grid_item) i += 1 GObject.idle_add(self.progress_bar.set_fraction, i / n) @@ -440,6 +439,9 @@ 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 # Skalierungswert für Breite und Höhe ermitteln @@ -459,9 +461,10 @@ class LibraryPanel(Adw.Bin): self.standalone_image.set_pixel_size(min(width, height)) self.standalone_image.show() - def _get_default_image(self): + def _get_default_icon(self, width, height): return self._icon_theme.lookup_icon(Utils.STOCK_ICON_DEFAULT, None, - 512, 512, Gtk.TextDirection.LTR, + width, height, + Gtk.TextDirection.LTR, Gtk.IconLookupFlags.FORCE_SYMBOLIC) def _get_selected_albums(self): diff --git a/src/playlistpanel.py b/src/playlistpanel.py index a9b1d8a..3c18e9c 100644 --- a/src/playlistpanel.py +++ b/src/playlistpanel.py @@ -171,15 +171,13 @@ 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) @@ -197,6 +195,8 @@ 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: - 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)) + 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) if self._playlist_stop.is_set(): self._playlist_lock.release() @@ -247,6 +247,9 @@ 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 # Skalierungswert für Breite und Höhe ermitteln @@ -266,9 +269,10 @@ class PlaylistPanel(Adw.Bin): self.standalone_image.set_pixel_size(min(width, height)) self.standalone_image.show() - def _get_default_image(self): + def _get_default_icon(self, width, height): return self._icon_theme.lookup_icon(Utils.STOCK_ICON_DEFAULT, None, - 512, 512, Gtk.TextDirection.LTR, + width, height, + Gtk.TextDirection.LTR, Gtk.IconLookupFlags.FORCE_SYMBOLIC) def _get_selected_albums(self): diff --git a/src/utils.py b/src/utils.py index ed8a04f..89b33af 100644 --- a/src/utils.py +++ b/src/utils.py @@ -86,11 +86,9 @@ class GridItem(GObject.GObject): tooltip = GObject.Property(type=str, default=None) cover = GObject.Property(type=Gdk.Paintable, default=None) - def __init__(self, album, cover): + def __init__(self, album): 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), @@ -103,6 +101,9 @@ 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):