[banshee] Option to sub-sort the track list by album year (bgo#577680)



commit 3d5f74cd137087e8a8b15e9378b14c92d2f00f5b
Author: Alexander Kojevnikov <alexander kojevnikov com>
Date:   Wed Feb 24 10:53:46 2010 +1100

    Option to sub-sort the track list by album year (bgo#577680)

 .../DatabaseTrackListModel.cs                      |    7 ++++
 .../Banshee.Library/LibrarySchema.cs               |    7 ++++
 .../Banshee.Library/MusicLibrarySource.cs          |   11 +++++-
 .../Banshee.Services/Banshee.Query/BansheeQuery.cs |   36 ++++++++++++++-----
 4 files changed, 50 insertions(+), 11 deletions(-)
---
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
index 7279c3a..b5bfd80 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
@@ -159,6 +159,13 @@ namespace Banshee.Collection.Database
             return true;
         }
 
+        public void Resort ()
+        {
+            var column = sort_column;
+            sort_column = null;
+            Sort (column);
+        }
+
         private void HandleCacheAggregatesUpdated (IDataReader reader)
         {
             filtered_duration = TimeSpan.FromMilliseconds (reader.IsDBNull (1) ? 0 : Convert.ToInt64 (reader[1]));
diff --git a/src/Core/Banshee.Services/Banshee.Library/LibrarySchema.cs b/src/Core/Banshee.Services/Banshee.Library/LibrarySchema.cs
index a95ee1a..22b540a 100644
--- a/src/Core/Banshee.Services/Banshee.Library/LibrarySchema.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/LibrarySchema.cs
@@ -85,5 +85,12 @@ namespace Banshee.Configuration.Schema
             "Store ratings within supported files",
             "If enabled, rating and playcount metadata will be written back to audio files."
         );
+
+        public static readonly SchemaEntry<bool> SortByAlbumYear = new SchemaEntry<bool>(
+            "library", "sort_albums_by_year",
+            false,
+            "Sort tracks by album year",
+            "If set the tracks will be sorted by album year instead of by album name"
+        );
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs b/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
index 9c39611..053c854 100644
--- a/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
@@ -72,7 +72,16 @@ namespace Banshee.Library
 
             SetFileNamePattern (MusicFileNamePattern);
 
-            PreferencesPage.Add (new Section ("misc", Catalog.GetString ("Miscellaneous"), 10));
+            Section misc = PreferencesPage.Add (new Section ("misc",
+                Catalog.GetString ("Miscellaneous"), 10));
+
+            misc.Add (new SchemaPreference<bool> (LibrarySchema.SortByAlbumYear,
+                Catalog.GetString ("_Sort an artist's albums by year, not title"), null,
+                delegate {
+                    DatabaseTrackModel.Resort ();
+                    DatabaseTrackModel.Reload ();
+                }
+            ));
         }
 
         public static string GetDefaultBaseDirectory ()
diff --git a/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs b/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
index 1754568..3d48fdd 100644
--- a/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
+++ b/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
@@ -372,9 +372,15 @@ namespace Banshee.Query
             BpmField.ShortLabel         = Catalog.GetString ("BPM");
             SkipCountField.ShortLabel   = Catalog.GetString ("Skips");
             PlayCountField.ShortLabel   = Catalog.GetString ("Plays");
+
+            default_sort = String.Format (default_sort_template, "");
+            default_sort_by_year = String.Format (default_sort_template, "CoreTracks.Year ASC, ");
         }
 
-        private const string default_sort = @"CoreAlbums.ArtistNameSortKey ASC, CoreAlbums.TitleSortKey ASC, CoreTracks.Disc ASC, CoreTracks.TrackNumber ASC";
+        private const string default_sort_template = @"CoreAlbums.ArtistNameSortKey ASC, {0}CoreAlbums.TitleSortKey ASC, CoreTracks.Disc ASC, CoreTracks.TrackNumber ASC";
+        private static readonly string default_sort;
+        private static readonly string default_sort_by_year;
+
         public static string GetSort (string key)
         {
             return GetSort (key, false);
@@ -382,6 +388,10 @@ namespace Banshee.Query
 
         public static string GetSort (string key, bool asc)
         {
+            bool sort_by_year = Banshee.Configuration.Schema.LibrarySchema.SortByAlbumYear.Get ();
+            string sort_by_year_part = sort_by_year ? "CoreTracks.Year ASC," : "";
+            string sort = sort_by_year ? default_sort_by_year : default_sort;
+
             string ascDesc = asc ? "ASC" : "DESC";
             string sort_query = null;
             // TODO use the QueryFields here instead of matching on a string key
@@ -391,39 +401,44 @@ namespace Banshee.Query
                 case "grouping":
                     sort_query = String.Format (@"
                         CoreAlbums.ArtistNameSortKey ASC,
+                        {1}
                         CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber {0}", ascDesc);
+                        CoreTracks.TrackNumber {0}", ascDesc, sort_by_year_part);
                     break;
 
                 case "albumartist":
                     sort_query = String.Format (@"
                         CoreAlbums.ArtistNameSortKey {0},
+                        {1}
                         CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber ASC", ascDesc);
+                        CoreTracks.TrackNumber ASC", ascDesc, sort_by_year_part);
                     break;
 
                 case "artist":
                     sort_query = String.Format (@"
                         CoreArtists.NameSortKey {0},
+                        {1}
                         CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber ASC", ascDesc);
+                        CoreTracks.TrackNumber ASC", ascDesc, sort_by_year_part);
                     break;
 
                 case "album":
                     sort_query = String.Format (@"
                         CoreAlbums.TitleSortKey {0},
+                        {1}
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber ASC", ascDesc);
+                        CoreTracks.TrackNumber ASC", ascDesc, sort_by_year_part);
                     break;
 
                 case "title":
                     sort_query = String.Format (@"
                         CoreTracks.TitleSortKey {0},
                         CoreAlbums.ArtistNameSortKey ASC,
-                        CoreAlbums.TitleSortKey ASC", ascDesc);
+                        {1}
+                        CoreAlbums.TitleSortKey ASC", ascDesc, sort_by_year_part);
                     break;
 
                 case "random":
@@ -433,9 +448,10 @@ namespace Banshee.Query
                 case "disc":
                     sort_query = String.Format (@"
                         CoreAlbums.ArtistNameSortKey ASC,
+                        {1}
                         CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc {0},
-                        CoreTracks.TrackNumber ASC", ascDesc);
+                        CoreTracks.TrackNumber ASC", ascDesc, sort_by_year_part);
                     break;
 
                 // FIXME hacks to aid in migration of these sort keys to actually
@@ -454,14 +470,14 @@ namespace Banshee.Query
                 case "comment":
                     sort_query = String.Format (
                         "HYENA_COLLATION_KEY(CoreTracks.{0}) {1}, {2}",
-                        column ?? key, ascDesc, default_sort
+                        column ?? key, ascDesc, sort
                     );
                     break;
 
                 case "score":
                     sort_query = String.Format (@"
                         CoreTracks.Score {0},
-                        CoreTracks.Playcount {0}, {1}", ascDesc, default_sort);
+                        CoreTracks.Playcount {0}, {1}", ascDesc, sort);
                     break;
 
                 case "year":
@@ -484,7 +500,7 @@ namespace Banshee.Query
                 case "licenseuri":
                     sort_query = String.Format (
                         "CoreTracks.{0} {1}, {2}",
-                        column ?? key, ascDesc, default_sort
+                        column ?? key, ascDesc, sort
                     );
                     break;
                 default:



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