From 090c7c814c11293989598fa390a87a6212910ac4 Mon Sep 17 00:00:00 2001 From: Martin Wagner Date: Sun, 6 Dec 2020 14:11:40 +0100 Subject: [PATCH] made album loading faster (~40% less time) --- bin/mpdevil | 106 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 44 deletions(-) diff --git a/bin/mpdevil b/bin/mpdevil index c103f54..d4af22d 100755 --- a/bin/mpdevil +++ b/bin/mpdevil @@ -653,6 +653,7 @@ class Settings(Gio.Settings): BASE_KEY="org.mpdevil" # temp settings mini_player=GObject.Property(type=bool, default=False) + cursor_watch=GObject.Property(type=bool, default=False) def __init__(self): super().__init__(schema=self.BASE_KEY) @@ -2031,8 +2032,11 @@ class AlbumWindow(FocusFrame): return False # stop after one run def _refresh(self, *args): - def callback(): - GLib.idle_add(self._workaround_clear) + if self._done: + self._done=False + self._settings.set_property("cursor-watch", True) + GLib.idle_add(self._store.clear) + self._iconview.set_model(None) try: # self._artist_window could still be empty genre, artists=self._artist_window.get_selected_artists() except: @@ -2069,50 +2073,55 @@ class AlbumWindow(FocusFrame): except MPDBase.ConnectionError: GLib.idle_add(self._done_callback) return - # display albums - if self._settings.get_boolean("sort-albums-by-year"): - albums=sorted(albums, key=lambda k: k["year"]) - else: - albums=sorted(albums, key=lambda k: k["album"]) - size=self._settings.get_int("album-cover") - for i, album in enumerate(albums): + + def display_albums(): + for i, album in enumerate(albums): + if self.stop_flag: + break + else: + # tooltip + length_human_readable=ClientHelper.calc_display_length(album["songs"]) + discs=album["songs"][-1].get("disc", 1) + if type(discs) == list: + discs=int(discs[0]) + else: + discs=int(discs) + if discs > 1: + tooltip=_("{titles} titles on {discs} discs ({length})").format( + titles=len(album["songs"]), discs=discs, length=length_human_readable) + else: + tooltip=_("{titles} titles ({length})").format( + titles=len(album["songs"]), length=length_human_readable) + # album label + if album["year"] == "": + display_label="{}".format(album["album"]) + else: + display_label="{} ({})".format(album["album"], album["year"]) + display_label_artist=display_label+"\n"+album["artist"] + display_label=display_label.replace("&", "&") + display_label_artist=display_label_artist.replace("&", "&") + # add album + self._store.append( + [album["cover"], display_label, display_label_artist, + tooltip, album["album"], album["year"], album["artist"]] + ) + self._iconview.set_model(self._store) + GLib.idle_add(self._done_callback) + return False + + def load_covers(): + size=self._settings.get_int("album-cover") + for album in albums: + if self.stop_flag: + break + album["cover"]=Cover(self._settings, album["songs"][0]).get_pixbuf(size) if self.stop_flag: - break + GLib.idle_add(self._done_callback) else: - cover=Cover(self._settings, album["songs"][0]).get_pixbuf(size) - # tooltip - length_human_readable=ClientHelper.calc_display_length(album["songs"]) - discs=album["songs"][-1].get("disc", 1) - if type(discs) == list: - discs=int(discs[0]) - else: - discs=int(discs) - if discs > 1: - tooltip=_("{titles} titles on {discs} discs ({length})").format( - titles=len(album["songs"]), discs=discs, length=length_human_readable) - else: - tooltip=_("{titles} titles ({length})").format( - titles=len(album["songs"]), length=length_human_readable) - # album label - if album["year"] == "": - display_label="{}".format(album["album"]) - else: - display_label="{} ({})".format(album["album"], album["year"]) - display_label_artist=display_label+"\n"+album["artist"] - display_label=display_label.replace("&", "&") - display_label_artist=display_label_artist.replace("&", "&") - # add album - GLib.idle_add(self._add_row, - [cover, display_label, display_label_artist, tooltip, album["album"], album["year"], album["artist"]] - ) - # execute pending events - if i%16 == 0: - while Gtk.events_pending(): - Gtk.main_iteration_do(True) - GLib.idle_add(self._done_callback) - if self._done: - self._done=False - callback() + GLib.idle_add(display_albums) + + cover_thread=threading.Thread(target=load_covers, daemon=True) + cover_thread.start() elif not self._refresh in self._pending: self.stop_flag=True self._pending.append(self._refresh) @@ -2124,6 +2133,7 @@ class AlbumWindow(FocusFrame): self._client.wrapped_call("album_to_playlist", album, artist, year, mode) def _done_callback(self, *args): + self._settings.set_property("cursor-watch", False) self.stop_flag=False self._done=True pending=self._pending @@ -3585,6 +3595,7 @@ class MainWindow(Gtk.ApplicationWindow): self._settings.connect("changed::profiles", self._refresh_profiles_menu) self._settings.connect("changed::active-profile", self._on_active_profile_changed) self._settings.connect_after("notify::mini-player", self._on_mini_player) + self._settings.connect_after("notify::cursor-watch", self._on_cursor_watch) self._settings.connect("changed::playlist-right", self._on_playlist_pos_changed) self._client.emitter.connect("current_song_changed", self._on_song_changed) self._client.emitter.connect("disconnected", self._on_disconnected) @@ -3732,6 +3743,13 @@ class MainWindow(Gtk.ApplicationWindow): self._tmp_saved_size=None self._tmp_saved_maximized=None + def _on_cursor_watch(self, obj, typestring): + if obj.get_property("cursor-watch"): + watch_cursor = Gdk.Cursor(Gdk.CursorType.WATCH) + self.get_window().set_cursor(watch_cursor) + else: + self.get_window().set_cursor(None) + def _on_playlist_pos_changed(self, *args): if self._settings.get_boolean("playlist-right"): self._cover_playlist_window.set_orientation(Gtk.Orientation.VERTICAL)