[banshee] [SmartPlaylist] Add IsHiddenWhenEmpty property



commit 8916a962a1811b22ed597b1044ab1e1cb4841922
Author: Gabriel Burt <gabriel burt gmail com>
Date:   Tue Aug 24 14:36:38 2010 -0500

    [SmartPlaylist] Add IsHiddenWhenEmpty property

 .../Banshee.Database/BansheeDbFormatMigrator.cs    |   11 ++++-
 .../SmartPlaylistDefinition.cs                     |   18 +++++++-
 .../Banshee.SmartPlaylist/SmartPlaylistSource.cs   |   42 ++++++++++++++++----
 3 files changed, 58 insertions(+), 13 deletions(-)
---
diff --git a/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs b/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
index 908f43f..3d7bfd0 100644
--- a/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
+++ b/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
@@ -56,7 +56,7 @@ namespace Banshee.Database
         // NOTE: Whenever there is a change in ANY of the database schema,
         //       this version MUST be incremented and a migration method
         //       MUST be supplied to match the new version number
-        protected const int CURRENT_VERSION = 42;
+        protected const int CURRENT_VERSION = 43;
         protected const int CURRENT_METADATA_VERSION = 7;
 
 #region Migration Driver
@@ -940,6 +940,12 @@ namespace Banshee.Database
             return true;
         }
 
+        [DatabaseVersion (43)]
+        private bool Migrate_43 ()
+        {
+            Execute ("ALTER TABLE CoreSmartPlaylists ADD COLUMN IsHiddenWhenEmpty INTEGER");
+            return true;
+        }
 
 #pragma warning restore 0169
 
@@ -1120,7 +1126,8 @@ namespace Banshee.Database
                     LimitNumber         TEXT,
                     LimitCriterion      TEXT,
                     CachedCount         INTEGER,
-                    IsTemporary         INTEGER DEFAULT 0
+                    IsTemporary         INTEGER DEFAULT 0,
+                    IsHiddenWhenEmpty   INTEGER DEFAULT 0
                 )
             ");
 
diff --git a/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistDefinition.cs b/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistDefinition.cs
index eea45b0..dc08c3c 100644
--- a/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistDefinition.cs
+++ b/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistDefinition.cs
@@ -43,9 +43,15 @@ namespace Banshee.SmartPlaylist
         public readonly QueryOrder Order;
         public readonly QueryLimit Limit;
         public readonly IntegerQueryValue LimitNumber;
+        public readonly bool HiddenWhenEmpty;
 
         public SmartPlaylistDefinition (string name, string description, string condition)
-            : this (name, description, condition, 0, (QueryLimit)null, null)
+            : this (name, description, condition, 0, (QueryLimit)null, null, false)
+        {
+        }
+
+        public SmartPlaylistDefinition (string name, string description, string condition, bool hiddenWhenEmpty)
+            : this (name, description, condition, 0, (QueryLimit)null, null, hiddenWhenEmpty)
         {
         }
 
@@ -56,7 +62,12 @@ namespace Banshee.SmartPlaylist
         }
 
         public SmartPlaylistDefinition (string name, string description, string condition,
-            int limit_number, QueryLimit limit, QueryOrder order)
+            int limit_number, QueryLimit limit, QueryOrder order) : this (name, description, condition, limit_number, limit, order, false)
+        {
+        }
+
+        public SmartPlaylistDefinition (string name, string description, string condition,
+            int limit_number, QueryLimit limit, QueryOrder order, bool hiddenWhenEmpty)
         {
             Name = name;
             Description = description;
@@ -65,6 +76,7 @@ namespace Banshee.SmartPlaylist
             LimitNumber.SetValue (limit_number);
             Limit = limit;
             Order = order;
+            HiddenWhenEmpty = hiddenWhenEmpty;
         }
 
         public SmartPlaylistSource ToSmartPlaylistSource (PrimarySource primary_source)
@@ -72,7 +84,7 @@ namespace Banshee.SmartPlaylist
             return new SmartPlaylistSource (
                 Name,
                 UserQueryParser.Parse (Condition, BansheeQuery.FieldSet),
-                Order, Limit, LimitNumber,
+                Order, Limit, LimitNumber, HiddenWhenEmpty,
                 primary_source
             );
         }
diff --git a/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs b/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
index 8f8f69e..efeab49 100644
--- a/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
+++ b/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
@@ -177,6 +177,8 @@ namespace Banshee.SmartPlaylist
             }
         }
 
+        public bool IsHiddenWhenEmpty { get; private set; }
+
         public override bool HasDependencies {
             get { return dependencies.Count > 0; }
         }
@@ -200,19 +202,25 @@ namespace Banshee.SmartPlaylist
         }
 
         public SmartPlaylistSource (string name, QueryNode condition, QueryOrder order, QueryLimit limit, IntegerQueryValue limit_value, PrimarySource parent)
+            : this (name, condition, order, limit, limit_value, false, parent)
+        {
+        }
+
+        public SmartPlaylistSource (string name, QueryNode condition, QueryOrder order, QueryLimit limit, IntegerQueryValue limit_value, bool hiddenWhenEmpty, PrimarySource parent)
             : this (name, parent)
         {
             ConditionTree = condition;
             QueryOrder = order;
             Limit = limit;
             LimitValue = limit_value;
+            IsHiddenWhenEmpty = hiddenWhenEmpty;
 
             SetProperties ();
             UpdateDependencies ();
         }
 
         // For existing smart playlists that we're loading from the database
-        protected SmartPlaylistSource (int dbid, string name, string condition_xml, string order_by, string limit_number, string limit_criterion, PrimarySource parent, int count, bool is_temp) :
+        protected SmartPlaylistSource (int dbid, string name, string condition_xml, string order_by, string limit_number, string limit_criterion, PrimarySource parent, int count, bool is_temp, bool hiddenWhenEmpty) :
             base (generic_name, name, dbid, -1, 0, parent, is_temp)
         {
             ConditionXml = condition_xml;
@@ -221,6 +229,7 @@ namespace Banshee.SmartPlaylist
             LimitValue = new IntegerQueryValue ();
             LimitValue.ParseUserQuery (limit_number);
             SavedCount = count;
+            IsHiddenWhenEmpty = hiddenWhenEmpty;
 
             SetProperties ();
             UpdateDependencies ();
@@ -288,19 +297,23 @@ namespace Banshee.SmartPlaylist
                 PrimarySource.TracksChanged += HandleTracksChanged;
                 PrimarySource.TracksDeleted += HandleTracksDeleted;
             }
+
+            if (IsHiddenWhenEmpty) {
+                RefreshAndReload ();
+            }
         }
 
         protected override void Create ()
         {
             DbId = ServiceManager.DbConnection.Execute (new HyenaSqliteCommand (@"
                 INSERT INTO CoreSmartPlaylists
-                    (Name, Condition, OrderBy, LimitNumber, LimitCriterion, PrimarySourceID, IsTemporary)
-                    VALUES (?, ?, ?, ?, ?, ?, ?)",
+                    (Name, Condition, OrderBy, LimitNumber, LimitCriterion, PrimarySourceID, IsTemporary, IsHiddenWhenEmpty)
+                    VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
                 Name, ConditionXml,
                 IsLimited ? QueryOrder.Name : null,
                 IsLimited ? LimitValue.ToSql () : null,
                 IsLimited ? Limit.Name : null,
-                PrimarySourceId, IsTemporary
+                PrimarySourceId, IsTemporary, IsHiddenWhenEmpty
             ));
             UpdateDependencies ();
         }
@@ -315,13 +328,14 @@ namespace Banshee.SmartPlaylist
                         LimitNumber = ?,
                         LimitCriterion = ?,
                         CachedCount = ?,
-                        IsTemporary = ?
+                        IsTemporary = ?,
+                        IsHiddenWhenEmpty = ?
                     WHERE SmartPlaylistID = ?",
                 Name, ConditionXml,
                 IsLimited ? QueryOrder.Name : null,
                 IsLimited ? LimitValue.ToSql () : null,
                 IsLimited ? Limit.Name : null,
-                Count, IsTemporary, DbId
+                Count, IsTemporary, IsHiddenWhenEmpty, DbId
             ));
             UpdateDependencies ();
         }
@@ -357,6 +371,17 @@ namespace Banshee.SmartPlaylist
                 Refresh ();
 
             base.Reload ();
+
+            if (IsHiddenWhenEmpty && Parent != null) {
+                bool contains_me = Parent.ContainsChildSource (this);
+                int count = Count;
+
+                if (count == 0 && contains_me) {
+                    Parent.RemoveChildSource (this);
+                } else if (count > 0 && !contains_me) {
+                    Parent.AddChildSource (this);
+                }
+            }
         }
 
         public void Refresh ()
@@ -491,7 +516,7 @@ namespace Banshee.SmartPlaylist
         {
             ClearTemporary ();
             using (HyenaDataReader reader = new HyenaDataReader (ServiceManager.DbConnection.Query (
-                @"SELECT SmartPlaylistID, Name, Condition, OrderBy, LimitNumber, LimitCriterion, PrimarySourceID, CachedCount, IsTemporary
+                @"SELECT SmartPlaylistID, Name, Condition, OrderBy, LimitNumber, LimitCriterion, PrimarySourceID, CachedCount, IsTemporary, IsHiddenWhenEmpty
                     FROM CoreSmartPlaylists WHERE PrimarySourceID = ?", parent.DbId))) {
                 while (reader.Read ()) {
                     SmartPlaylistSource playlist = null;
@@ -500,7 +525,8 @@ namespace Banshee.SmartPlaylist
                             reader.Get<int> (0), reader.Get<string> (1),
                             reader.Get<string> (2), reader.Get<string> (3),
                             reader.Get<string> (4), reader.Get<string> (5),
-                            parent, reader.Get<int> (7), reader.Get<bool> (8)
+                            parent, reader.Get<int> (7), reader.Get<bool> (8),
+                            reader.Get<bool> (9)
                         );
                     } catch (Exception e) {
                         Log.Warning ("Ignoring Smart Playlist", String.Format ("Caught error: {0}", e), false);



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