[gnome-music/wip/jfelder/playlists-core-rewrite-prep-work: 9/19] playlists: Sort playlists
- From: Jean Felder <jfelder src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/jfelder/playlists-core-rewrite-prep-work: 9/19] playlists: Sort playlists
- Date: Tue, 2 Jul 2019 13:28:43 +0000 (UTC)
commit 7f4521b72561821b2415d3e85eedabdc5ab8967b
Author: Jean Felder <jfelder src gnome org>
Date: Tue Jun 4 16:37:55 2019 +0200
playlists: Sort playlists
Smart playlists are ranked first. Then, playlists are listed in order
of creation.
gnomemusic/playlists.py | 38 ++++++++++++++++++++++++++++++++------
gnomemusic/query.py | 1 +
2 files changed, 33 insertions(+), 6 deletions(-)
---
diff --git a/gnomemusic/playlists.py b/gnomemusic/playlists.py
index ab17c824..7ca7d1d7 100644
--- a/gnomemusic/playlists.py
+++ b/gnomemusic/playlists.py
@@ -25,6 +25,7 @@
# code, but you are not obligated to do so. If you do not wish to do so,
# delete this exception statement from your version.
+import math
import gi
gi.require_version("Dazzle", "1.0")
@@ -43,6 +44,7 @@ logger = logging.getLogger(__name__)
class Playlist(GObject.Object):
""" Base class of all playlists """
+ creation_date = GObject.Property(type=GLib.DateTime, default=None)
is_smart = GObject.Property(type=bool, default=False)
pl_id = GObject.Property(type=str, default=None)
query = GObject.Property(type=str, default=None)
@@ -52,13 +54,32 @@ class Playlist(GObject.Object):
def __repr__(self):
return "<Playlist>"
- def __init__(self, pl_id=None, query=None, tag_text=None, title=None):
+ def __init__(
+ self, pl_id=None, query=None, tag_text=None, title=None,
+ creation_date=None):
super().__init__()
self.props.pl_id = pl_id
self.props.query = query
self.props.tag_text = tag_text
self.props.title = title
+ self.props.creation_date = creation_date
+
+ @staticmethod
+ def compare_playlist_func(playlist_a, playlist_b):
+ if playlist_a.props.is_smart:
+ if not playlist_b.props.is_smart:
+ return -1
+ return GLib.strcmp0(playlist_a.props.title, playlist_b.props.title)
+
+ if playlist_b.props.is_smart:
+ return 1
+
+ # cannot use GLib.DateTime.compare
+ # https://gitlab.gnome.org/GNOME/pygobject/issues/334
+ date_diff = playlist_a.props.creation_date.difference(
+ playlist_b.props.creation_date)
+ return math.copysign(1, date_diff)
class SmartPlaylist(Playlist):
@@ -238,9 +259,11 @@ class Playlists(GObject.GObject):
return
playlist = Playlist(
- pl_id=item.get_id(), title=utils.get_media_title(item))
+ pl_id=item.get_id(), title=utils.get_media_title(item),
+ creation_date=item.get_creation_date())
- self._playlists_model.append(playlist)
+ self._playlists_model.insert_sorted(
+ playlist, Playlist.compare_playlist_func)
@log
def _create_smart_playlist(self, playlist):
@@ -361,7 +384,8 @@ class Playlists(GObject.GObject):
self.emit("playlist-updated", smart_playlist)
return
- self._playlists_model.append(smart_playlist)
+ self._playlists_model.insert_sorted(
+ smart_playlist, Playlist.compare_playlist_func)
@log
def update_all_smart_playlists(self):
@@ -375,8 +399,10 @@ class Playlists(GObject.GObject):
return
new_playlist = Playlist(
- pl_id=item.get_id(), title=utils.get_media_title(item))
- self._playlists_model.append(new_playlist)
+ pl_id=item.get_id(), title=utils.get_media_title(item),
+ creation_date=item.get_creation_date())
+ self._playlists_model.insert_sorted(
+ new_playlist, Playlist.compare_playlist_func)
self.emit("playlist-created", item)
def cursor_callback(cursor, res, data):
diff --git a/gnomemusic/query.py b/gnomemusic/query.py
index b4a1784b..8415711e 100644
--- a/gnomemusic/query.py
+++ b/gnomemusic/query.py
@@ -224,6 +224,7 @@ class Query():
rdf:type(?playlist)
tracker:id(?playlist) AS ?id
nie:title(?playlist) AS ?title
+ tracker:added(?playlist) AS ?creation_date
nfo:entryCounter(?playlist) AS ?childcount
{
%(where_clause)s
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]