[gnome-music/wip/mschraal/playlists-fixes] grltrackerplaylists: Sort most played



commit b4db74cb4a7e424019755f19e7d20e0a6fd6b37a
Author: Marinus Schraal <mschraal gnome org>
Date:   Fri Feb 21 12:19:38 2020 +0100

    grltrackerplaylists: Sort most played

 gnomemusic/coregrilo.py                         |  2 ++
 gnomemusic/grilowrappers/grltrackerplaylists.py | 32 ++++++++++++++++++++++---
 2 files changed, 31 insertions(+), 3 deletions(-)
---
diff --git a/gnomemusic/coregrilo.py b/gnomemusic/coregrilo.py
index 3fcdb3ec..83887abb 100644
--- a/gnomemusic/coregrilo.py
+++ b/gnomemusic/coregrilo.py
@@ -182,6 +182,8 @@ class CoreGrilo(GObject.GObject):
             if failed_keys:
                 self._log.warning("Unable to update {}".format(failed_keys))
 
+            self._coremodel.emit("smart-playlist-change")
+
         for wrapper in self._wrappers.values():
             if media.get_source() == wrapper.source.props.source_id:
                 wrapper.props.source.store_metadata(
diff --git a/gnomemusic/grilowrappers/grltrackerplaylists.py b/gnomemusic/grilowrappers/grltrackerplaylists.py
index c5f2b2bf..92851d7e 100644
--- a/gnomemusic/grilowrappers/grltrackerplaylists.py
+++ b/gnomemusic/grilowrappers/grltrackerplaylists.py
@@ -27,8 +27,8 @@ import time
 from gettext import gettext as _
 
 import gi
-gi.require_versions({"Grl": "0.3"})
-from gi.repository import Gio, Grl, GLib, GObject
+gi.require_versions({"Gfm": "0.1", "Grl": "0.3"})
+from gi.repository import Gfm, Gio, Grl, GLib, GObject
 
 from gnomemusic.coresong import CoreSong
 import gnomemusic.utils as utils
@@ -730,11 +730,18 @@ class SmartPlaylist(Playlist):
         super().__init__(**args)
 
         self.props.is_smart = True
+        self._filter_model = None
+
+    def _playlist_sort(self, coresong_a, coresong_b):
+        return 0
 
     @GObject.Property(type=Gio.ListStore, default=None)
     def model(self):
         if self._model is None:
             self._model = Gio.ListStore.new(CoreSong)
+            self._filter_model = Gfm.SortListModel.new(self._model)
+            self._filter_model.set_sort_func(
+                utils.wrap_list_store_sort_func(self._playlist_sort))
 
             self._window.notifications_popup.push_loading()
 
@@ -760,7 +767,7 @@ class SmartPlaylist(Playlist):
             self._source.query(
                 self.props.query, self.METADATA_KEYS, options, _add_to_model)
 
-        return self._model
+        return self._filter_model
 
     def update(self):
         """Updates playlist model."""
@@ -808,6 +815,8 @@ class SmartPlaylist(Playlist):
                 self._model.append(coresong)
                 self.props.count += 1
 
+        self._filter_model.resort()
+
 
 class MostPlayed(SmartPlaylist):
     """Most Played smart playlist"""
@@ -845,6 +854,23 @@ class MostPlayed(SmartPlaylist):
             "location_filter": self._tracker_wrapper.location_filter()
         }
 
+    def _playlist_sort(self, coresong_a, coresong_b):
+        playcount_a = coresong_a.props.play_count
+        playcount_b = coresong_b.props.play_count
+
+        if playcount_a == playcount_b:
+            return utils.natural_sort_names(
+                coresong_a.props.title, coresong_b.props.title)
+
+        return coresong_a.props.play_count < coresong_b.props.play_count
+
+    def _finish_update(self, new_model_medias):
+        super()._finish_update(new_model_medias)
+
+        # NOTE: Debug print.
+        for idx, coresong in enumerate(self._filter_model):
+            print(idx, coresong.props.play_count, coresong.props.title)
+
 
 class NeverPlayed(SmartPlaylist):
     """Never Played smart playlist"""


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]