banshee r3403 - in trunk/banshee: . src/Core/Banshee.Services/Banshee.Collection.Database src/Core/Banshee.Services/Banshee.Library src/Core/Banshee.Services/Banshee.Playlist src/Core/Banshee.Services/Banshee.SmartPlaylist src/Core/Banshee.Services/Banshee.Sources src/Core/Banshee.ThickClient/Banshee.Sources.Gui src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue



Author: gburt
Date: Mon Mar 10 19:15:42 2008
New Revision: 3403
URL: http://svn.gnome.org/viewvc/banshee?rev=3403&view=rev

Log:
2008-03-10  Gabriel Burt  <gabriel burt gmail com>

	* src/Core/Banshee.Services/Banshee.Collection.Database/AlbumListDatabaseModel.cs:
	Now depends on the Artist model, resets the artist filter at each reload,
	exposes CacheId and ClearCache.

	* src/Core/Banshee.Services/Banshee.Collection.Database/ArtistListDatabaseModel.cs:
	Expose CacheId property and ClearCache method.

	* src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs:
	Keep references to the artist/album models and regenerate the artist/album
	filter for each reload.

	* src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs: Reset
	the count to 0 when finished importing.

	* src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs:
	Whitespace.
	
	* src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs: Avoid
	triggering the Reloaded event when reloading it twice in a row - no
	flicker.  OnTracksRemoved now reloads the current source, but not the
	library etc.  New PruneArtistsAlbums method that deletes artists/albums
	from the cache that have been removed from the library.

	* src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs: Rename
	TracksRemoved event to TracksDeleted for clarity/parity with method names.
	Override PruneArtistsAlbums method.

	* src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs:
	Fix reloading when selection changes.

	* src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:
	* src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:
	* src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:
	TracksRemoved event renamed to TracksDeleted for clarity.


Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/AlbumListDatabaseModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/ArtistListDatabaseModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs
   trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/AlbumListDatabaseModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/AlbumListDatabaseModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/AlbumListDatabaseModel.cs	Mon Mar 10 19:15:42 2008
@@ -43,29 +43,35 @@
         private readonly BansheeModelProvider<LibraryAlbumInfo> provider;
         private readonly BansheeModelCache<LibraryAlbumInfo> cache;
         private readonly TrackListDatabaseModel track_model;
+        private readonly ArtistListDatabaseModel artist_model;
         private long count;
         private string artist_id_filter_query;
         private string reload_fragment;
         
-        private readonly AlbumInfo select_all_album = new AlbumInfo(null);
+        private readonly AlbumInfo select_all_album = new AlbumInfo (null);
         
-        public AlbumListDatabaseModel(BansheeDbConnection connection, string uuid)
+        public AlbumListDatabaseModel (BansheeDbConnection connection, string uuid)
         {
             provider = LibraryAlbumInfo.Provider;
             cache = new BansheeModelCache <LibraryAlbumInfo> (connection, uuid, this, provider);
             cache.HasSelectAllItem = true;
         }
 
-        public AlbumListDatabaseModel(TrackListDatabaseModel trackModel, 
+        public AlbumListDatabaseModel (TrackListDatabaseModel trackModel, ArtistListDatabaseModel artistModel,
                 BansheeDbConnection connection, string uuid) : this (connection, uuid)
         {
             this.track_model = trackModel;
+            this.artist_model = artistModel;
         }
 
         private bool first_reload = true;
         public override void Reload ()
         {
             if (!first_reload || !cache.Warm) {
+                if (artist_model != null) {
+                    ArtistInfoFilter = artist_model.SelectedItems;
+                }
+
                 bool either = (artist_id_filter_query != null) || (track_model != null);
                 bool both = (artist_id_filter_query != null) && (track_model != null);
 
@@ -95,8 +101,8 @@
 
             first_reload = false;
             count = cache.Count + 1;
-            select_all_album.Title = String.Format("All Albums ({0})", count - 1);
-            OnReloaded();
+            select_all_album.Title = String.Format ("All Albums ({0})", count - 1);
+            OnReloaded ();
         }
         
         public override AlbumInfo this[int index] {
@@ -109,19 +115,18 @@
         }
         
         public override IEnumerable<ArtistInfo> ArtistInfoFilter {
-            set { 
-                ModelHelper.BuildIdFilter<ArtistInfo>(value, "CoreAlbums.ArtistID", artist_id_filter_query,
-                    delegate(ArtistInfo artist) {
-                        if(!(artist is LibraryArtistInfo)) {
+            set {
+                ModelHelper.BuildIdFilter<ArtistInfo> (value, "CoreAlbums.ArtistID", artist_id_filter_query,
+                    delegate (ArtistInfo artist) {
+                        if (!(artist is LibraryArtistInfo)) {
                             return null;
                         }
                         
-                        return ((LibraryArtistInfo)artist).DbId.ToString();
+                        return ((LibraryArtistInfo)artist).DbId.ToString ();
                     },
                 
-                    delegate(string new_filter) {
+                    delegate (string new_filter) {
                         artist_id_filter_query = new_filter;
-                        Reload();
                     }
                 );
             }
@@ -144,6 +149,15 @@
             get { return reload_fragment; }
         }
 
+        public int CacheId {
+            get { return (int) cache.CacheId; }
+        }
+
+        public void ClearCache ()
+        {
+            cache.Clear ();
+        }
+
         public string JoinTable { get { return null; } }
         public string JoinFragment { get { return null; } }
         public string JoinPrimaryKey { get { return null; } }

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/ArtistListDatabaseModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/ArtistListDatabaseModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/ArtistListDatabaseModel.cs	Mon Mar 10 19:15:42 2008
@@ -107,6 +107,15 @@
             get { return (int) count; }
         }
 
+        public int CacheId {
+            get { return (int) cache.CacheId; }
+        }
+
+        public void ClearCache ()
+        {
+            cache.Clear ();
+        }
+
         // Implement ICacheableModel
         public int FetchCount {
             get { return 20; }

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs	Mon Mar 10 19:15:42 2008
@@ -70,6 +70,9 @@
         private string artist_id_filter_query;
         private string album_id_filter_query;
 
+        private ArtistListDatabaseModel artist_model;
+        private AlbumListDatabaseModel album_model;
+
         private string uuid;
         
         private int rows_in_view;
@@ -82,24 +85,26 @@
         }
 
         private bool initialized = false;
-        public void Initialize ()
+        public void Initialize (ArtistListDatabaseModel artist_model, AlbumListDatabaseModel album_model)
         {
             if (initialized)
                 return;
 
+            this.artist_model = artist_model;
+            this.album_model = album_model;
+
             initialized = true;
             cache = new BansheeModelCache <DatabaseTrackInfo> (connection, uuid, this, provider);
             cache.AggregatesUpdated += HandleCacheAggregatesUpdated;
-            Refilter ();
         }
         
         private bool have_new_filter = true;
-        private void GenerateFilterQueryPart()
+        private void GenerateFilterQueryPart ()
         {
             if (!have_new_filter)
                 return;
 
-            if (String.IsNullOrEmpty(Filter)) {
+            if (String.IsNullOrEmpty (Filter)) {
                 filter_query = null;
             } else {
                 QueryNode query_tree = UserQueryParser.Parse (Filter, BansheeQuery.FieldSet);
@@ -113,29 +118,29 @@
             have_new_filter = false;
         }
 
-        private void GenerateSortQueryPart()
+        private void GenerateSortQueryPart ()
         {
             sort_query = (sort_column == null) ?
                 null :
                 BansheeQuery.GetSort (sort_column.SortKey, sort_column.SortType == SortType.Ascending);
         }
 
-        public void Refilter()
+        public void Refilter ()
         {
-            lock(this) {
-                GenerateFilterQueryPart();
+            lock (this) {
+                GenerateFilterQueryPart ();
                 cache.Clear ();
             }
         }
         
-        public void Sort(ISortableColumn column)
+        public void Sort (ISortableColumn column)
         {
-            lock(this) {
+            lock (this) {
                 if (forced_sort_query) {
                     return;
                 }
                 
-                if(sort_column == column && sort_column != null) {
+                if (sort_column == column && sort_column != null) {
                     sort_column.SortType = sort_column.SortType == SortType.Ascending 
                         ? SortType.Descending 
                         : SortType.Ascending;
@@ -143,7 +148,7 @@
             
                 sort_column = column;
             
-                GenerateSortQueryPart();
+                GenerateSortQueryPart ();
                 cache.Clear ();
             }
         }
@@ -154,12 +159,12 @@
             filtered_filesize = reader.IsDBNull (2) ? 0 : Convert.ToInt64 (reader[2]);
         }
         
-        public override void Clear()
+        public override void Clear ()
         {
             cache.Clear ();
             count = 0;
             filtered_count = 0;
-            OnCleared();
+            OnCleared ();
         }
 
         private string unfiltered_query;
@@ -198,15 +203,32 @@
         }*/
         
         private bool first_reload = true;
-        public override void Reload()
+        public override void Reload ()
+        {
+            Reload (true);
+        }
+
+        public void Reload (bool notify)
         {
             if (suppress_reload)
                 return;
 
+            Refilter ();
+
             UpdateUnfilteredAggregates ();
 
             StringBuilder qb = new StringBuilder ();
             qb.Append (UnfilteredQuery);
+
+            if (artist_model != null) {
+                ArtistInfoFilter = artist_model.SelectedItems;
+            }
+
+            if (album_model != null) {
+                //Console.WriteLine ("album_id_filter_query was {0}, and selection count = {1}", album_id_filter_query, album_model.Selection.Count);
+                AlbumInfoFilter = album_model.SelectedItems;
+                //Console.WriteLine ("album_id_filter_query now is {0}", album_id_filter_query);
+            }
             
             if (artist_id_filter_query != null) {
                 qb.Append ("AND ");
@@ -237,13 +259,15 @@
             filtered_count = cache.Count;
             first_reload = false;
 
-            OnReloaded ();
+            if (notify) {
+                OnReloaded ();
+            }
         }
 
         public override int IndexOf (TrackInfo track)
         {
-            DatabaseTrackInfo library_track = track as DatabaseTrackInfo;
-            return (int) (library_track == null ? -1 : cache.IndexOf ((int)library_track.DbId));
+            DatabaseTrackInfo db_track = track as DatabaseTrackInfo;
+            return (int) (db_track == null ? -1 : cache.IndexOf ((int)db_track.DbId));
         }
 
         public override TrackInfo this[int index] {
@@ -277,7 +301,7 @@
         public string Filter {
             get { return filter; }
             set { 
-                lock(this) {
+                lock (this) {
                     filter = value; 
                     have_new_filter = true;
                 }
@@ -317,9 +341,7 @@
 
         public string Condition {
             get { return condition; }
-            set {
-                condition = value;
-            }
+            set { condition = value; }
         }
 
         public string ConditionFragment {
@@ -334,22 +356,20 @@
             else
                 return String.Format (" {0} {1} ", prefix, condition);
         }
-        
+
         public override IEnumerable<ArtistInfo> ArtistInfoFilter {
-            set { 
-                ModelHelper.BuildIdFilter<ArtistInfo>(value, "CoreTracks.ArtistID", artist_id_filter_query,
-                    delegate(ArtistInfo artist) {
-                        if(!(artist is LibraryArtistInfo)) {
+            set {
+                ModelHelper.BuildIdFilter<ArtistInfo> (value, "CoreTracks.ArtistID", artist_id_filter_query,
+                    delegate (ArtistInfo artist) {
+                        if (!(artist is LibraryArtistInfo)) {
                             return null;
                         }
                         
-                        return ((LibraryArtistInfo)artist).DbId.ToString();
+                        return ((LibraryArtistInfo)artist).DbId.ToString ();
                     },
                 
-                    delegate(string new_filter) {
+                    delegate (string new_filter) {
                         artist_id_filter_query = new_filter;
-                        Refilter();
-                        Reload();
                     }
                 );
             }
@@ -357,19 +377,17 @@
         
         public override IEnumerable<AlbumInfo> AlbumInfoFilter {
             set { 
-                ModelHelper.BuildIdFilter<AlbumInfo>(value, "CoreTracks.AlbumID", album_id_filter_query,
-                    delegate(AlbumInfo album) {
-                        if(!(album is LibraryAlbumInfo)) {
+                ModelHelper.BuildIdFilter<AlbumInfo> (value, "CoreTracks.AlbumID", album_id_filter_query,
+                    delegate (AlbumInfo album) {
+                        if (!(album is LibraryAlbumInfo)) {
                             return null;
                         }
                         
-                        return ((LibraryAlbumInfo)album).DbId.ToString();
+                        return ((LibraryAlbumInfo)album).DbId.ToString ();
                     },
                 
-                    delegate(string new_filter) {
+                    delegate (string new_filter) {
                         album_id_filter_query = new_filter;
-                        Refilter();
-                        Reload();
                     }
                 );
             }
@@ -379,10 +397,23 @@
         {
             artist_id_filter_query = null;
             album_id_filter_query = null;
-            Refilter();
-            Reload();
+            Reload ();
         }
 
+        /*private HyenaSqliteCommand check_artists_command = new HyenaSqliteCommand (
+            "SELECT ItemID FROM CoreCache WHERE ModelID = ? AND ItemID NOT IN (SELECT ArtistID FROM CoreArtists)"
+        );
+
+        private HyenaSqliteCommand check_albums_command = new HyenaSqliteCommand (
+            "SELECT ItemID FROM CoreCache WHERE ModelID = ? AND ItemID NOT IN (SELECT AlbumID FROM CoreAlbums)"
+        );*/
+
+        /*public void CheckFilters ()
+        {
+            if (track_model.Artist
+            if (ServiceManager.DbConnection.Query<int> (
+        }*/
+
         public int CacheId {
             get { return (int) cache.CacheId; }
         }
@@ -396,14 +427,14 @@
             set { rows_in_view = value; }
         }
 
-        int IExportableModel.GetLength() 
+        int IExportableModel.GetLength () 
         {
             return Count;
         }
         
-        IDictionary<string, object> IExportableModel.GetMetadata(int index)
+        IDictionary<string, object> IExportableModel.GetMetadata (int index)
         {
-            return this[index].GenerateExportable();
+            return this[index].GenerateExportable ();
         }
 
         private string track_ids_sql;

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs	Mon Mar 10 19:15:42 2008
@@ -174,6 +174,7 @@
 
         protected override void OnImportFinished ()
         {
+            count = 0;
             ServiceManager.SourceManager.Library.NotifyTracksAdded ();
             base.OnImportFinished ();
         }

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs	Mon Mar 10 19:15:42 2008
@@ -149,6 +149,5 @@
         {
             return DbId.GetHashCode ();
         }
-
     }
 }

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs	Mon Mar 10 19:15:42 2008
@@ -271,7 +271,7 @@
             }
         }
 
-        protected override void HandleTracksRemoved (Source sender, TrackEventArgs args)
+        protected override void HandleTracksDeleted (Source sender, TrackEventArgs args)
         {
             if (args.When > last_removed) {
                 last_removed = args.When;
@@ -305,7 +305,7 @@
             PrimarySource primary = parent as PrimarySource;
             if (primary != null) {
                 primary.TracksChanged += HandleTracksChanged;
-                primary.TracksRemoved += HandleTracksRemoved;
+                primary.TracksDeleted += HandleTracksDeleted;
             }
         }
         

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs	Mon Mar 10 19:15:42 2008
@@ -359,7 +359,7 @@
             }
         }
 
-        protected override void HandleTracksRemoved (Source sender, TrackEventArgs args)
+        protected override void HandleTracksDeleted (Source sender, TrackEventArgs args)
         {
             if (args.When > last_removed) {
                 last_removed = args.When;
@@ -384,7 +384,7 @@
             if (primary != null) {
                 primary.TracksAdded += HandleTracksAdded;
                 primary.TracksChanged += HandleTracksChanged;
-                primary.TracksRemoved += HandleTracksRemoved;
+                primary.TracksDeleted += HandleTracksDeleted;
             }
         }
 

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs	Mon Mar 10 19:15:42 2008
@@ -60,8 +60,8 @@
         {
             string uuid = String.Format ("{0}-{1}", this.GetType().Name, id);
             track_model = new TrackListDatabaseModel (ServiceManager.DbConnection, uuid);
-            album_model = new AlbumListDatabaseModel (track_model, ServiceManager.DbConnection, uuid);
             artist_model = new ArtistListDatabaseModel (track_model, ServiceManager.DbConnection, uuid);
+            album_model = new AlbumListDatabaseModel (track_model, artist_model, ServiceManager.DbConnection, uuid);
             reload_limiter = new RateLimiter (RateLimitedReload);
             filter_limiter = new RateLimiter (RateLimitedFilter);
         }
@@ -149,12 +149,17 @@
                     album_model.Reload ();
                     OnUpdated ();
                 }
-            });
+            }
         }
 
         protected virtual void ReloadTrackModel ()
         {
-            track_model.Reload ();
+            ReloadTrackModel (true);
+        }
+
+        protected void ReloadTrackModel (bool notify)
+        {
+            track_model.Reload (notify);
         }
 
         protected virtual void RateLimitedFilter ()
@@ -166,7 +171,7 @@
                     track_model.Filter = FilterQuery;
                     track_model.ClearArtistAlbumFilters ();
                     track_model.SuppressReloads = false;
-                    ReloadTrackModel ();
+                    ReloadTrackModel (false);
 
                     // Then, reload the artist/album models
                     artist_model.Reload ();
@@ -198,7 +203,7 @@
             get { return false; }
         }
 
-        public virtual void RemoveTrack (int index)
+        public void RemoveTrack (int index)
         {
             if (index != -1) {
                 RemoveTrackRange (track_model, new RangeCollection.Range (index, index));
@@ -206,17 +211,11 @@
             }
         }
 
-        public virtual void RemoveTrack (DatabaseTrackInfo track)
+        public void RemoveTrack (DatabaseTrackInfo track)
         {
             RemoveTrack (track_model.IndexOf (track));
         }
 
-        // Methods for removing tracks from this source
-        /*public virtual void RemoveTracks (IEnumerable<TrackInfo> tracks)
-        {
-            throw new NotImplementedException(); 
-        }*/
-
         public virtual void RemoveSelectedTracks ()
         {
             RemoveSelectedTracks (track_model);
@@ -228,12 +227,6 @@
             OnTracksRemoved ();
         }
 
-        // Methods for deleting tracks from this source
-        /*public virtual void DeleteTracks (IEnumerable<TrackInfo> tracks)
-        {
-            throw new NotImplementedException(); 
-        }*/
-
         public virtual void DeleteSelectedTracks ()
         {
             DeleteSelectedTracks (track_model);
@@ -242,7 +235,8 @@
         public virtual void DeleteSelectedTracks (TrackListDatabaseModel model)
         {
             WithTrackSelection (model, DeleteTrackRange);
-            OnTracksRemoved ();
+            PruneArtistsAlbums ();
+            OnTracksDeleted ();
         }
 
         public virtual void RateSelectedTracks (int rating)
@@ -293,17 +287,23 @@
             });
         }
 
-        protected virtual void OnTracksRemoved ()
+        protected virtual void OnTracksDeleted ()
         {
             ThreadAssist.SpawnFromMain (delegate {
-                HandleTracksRemoved (this, new TrackEventArgs ());
+                HandleTracksDeleted (this, new TrackEventArgs ());
                 foreach (PrimarySource psource in PrimarySources) {
-                    psource.NotifyTracksRemoved ();
+                    psource.NotifyTracksDeleted ();
                 }
             });
         }
 
-        // If we are a PrimarySource, reload ourself and our children, otherwise if our Parent
+        protected virtual void OnTracksRemoved ()
+        {
+            PruneArtistsAlbums ();
+            Reload ();
+        }
+
+        // If we are a PrimarySource, return ourself and our children, otherwise if our Parent
         // is one, do so for it, otherwise do so for all PrimarySources.
         private IEnumerable<PrimarySource> PrimarySources {
             get {
@@ -349,7 +349,7 @@
 
         protected void AfterInitialized ()
         {
-            track_model.Initialize ();
+            track_model.Initialize (artist_model, album_model);
             Reload ();
             OnSetupComplete ();
         }
@@ -384,6 +384,30 @@
             }
         }
 
+        protected HyenaSqliteCommand prune_command;
+        protected HyenaSqliteCommand PruneCommand {
+            get {
+                return prune_command ?? prune_command = new HyenaSqliteCommand (String.Format (
+                        @"DELETE FROM CoreCache WHERE ModelID = ? AND ItemID NOT IN (SELECT ArtistID FROM CoreTracks WHERE TrackID IN ({0}));
+                          DELETE FROM CoreCache WHERE ModelID = ? AND ItemID NOT IN (SELECT AlbumID FROM CoreTracks WHERE TrackID IN ({0}));",
+                        track_model.TrackIdsSql
+                    ),
+                    artist_model.CacheId, artist_model.CacheId, 0, artist_model.Count,
+                    album_model.CacheId, album_model.CacheId, 0, album_model.Count
+                );
+            }
+        }
+
+        protected virtual void PruneArtistsAlbums ()
+        {
+            //Hyena.Log.Information ("Pruning artists/albums");
+            ServiceManager.DbConnection.Execute (PruneCommand);
+            //Hyena.Log.Information ("Clearing artists/albums cache");
+            artist_model.Reload ();
+            album_model.Reload ();
+            //Hyena.Log.Information ("Done clearing artists/albums cache");
+        }
+
         protected virtual void HandleTracksAdded (Source sender, TrackEventArgs args)
         {
         }
@@ -392,7 +416,7 @@
         {
         }
 
-        protected virtual void HandleTracksRemoved (Source sender, TrackEventArgs args)
+        protected virtual void HandleTracksDeleted (Source sender, TrackEventArgs args)
         {
         }
 

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs	Mon Mar 10 19:15:42 2008
@@ -76,6 +76,11 @@
             INSERT INTO CoreRemovedTracks SELECT ?, TrackID, Uri FROM CoreTracks WHERE TrackID IN ({0});
             DELETE FROM CoreTracks WHERE TrackID IN ({0})";
 
+        protected HyenaSqliteCommand prune_artists_albums_command = new HyenaSqliteCommand (@"
+            DELETE FROM CoreArtists WHERE ArtistID NOT IN (SELECT ArtistID FROM CoreTracks);
+            DELETE FROM CoreAlbums WHERE AlbumID NOT IN (SELECT AlbumID FROM CoreTracks)
+        ");
+
         protected int source_id;
         public int SourceId {
             get { return source_id; }
@@ -89,7 +94,7 @@
 
         public event TrackEventHandler TracksAdded;
         public event TrackEventHandler TracksChanged;
-        public event TrackEventHandler TracksRemoved;
+        public event TrackEventHandler TracksDeleted;
 
         private static Dictionary<int, PrimarySource> primary_sources = new Dictionary<int, PrimarySource> ();
         public static PrimarySource GetById (int id)
@@ -126,9 +131,9 @@
             OnTracksChanged ();
         }
 
-        internal void NotifyTracksRemoved ()
+        internal void NotifyTracksDeleted ()
         {
-            OnTracksRemoved ();
+            OnTracksDeleted ();
         }
 
         protected void OnErrorSourceUpdated (object o, EventArgs args)
@@ -201,18 +206,31 @@
             });
         }
 
-        protected override void OnTracksRemoved ()
+        protected override void OnTracksDeleted ()
         {
             ThreadAssist.SpawnFromMain (delegate {
                 Reload ();
 
-                TrackEventHandler handler = TracksRemoved;
+                TrackEventHandler handler = TracksDeleted;
                 if (handler != null) {
                     handler (this, new TrackEventArgs ());
                 }
             });
         }
 
+        protected override void OnTracksRemoved ()
+        {
+            PruneArtistsAlbums ();
+            OnTracksDeleted ();
+        }
+
+        public override void RemoveSelectedTracks (TrackListDatabaseModel model)
+        {
+            base.RemoveSelectedTracks (model);
+            PruneArtistsAlbums ();
+            OnTracksDeleted ();
+        }
+
         protected override void RemoveTrackRange (TrackListDatabaseModel model, RangeCollection.Range range)
         {
             ServiceManager.DbConnection.Execute (
@@ -222,5 +240,11 @@
                 model.CacheId, range.Start, range.End - range.Start + 1
             );
         }
+
+        protected override void PruneArtistsAlbums ()
+        {
+            ServiceManager.DbConnection.Execute (prune_artists_albums_command);
+            base.PruneArtistsAlbums ();
+        }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs	Mon Mar 10 19:15:42 2008
@@ -269,12 +269,14 @@
                 if (model != null && o == artist_view.Selection ) {
                     model.ClearArtistAlbumFilters ();
                     album_model.ArtistInfoFilter = null;
+                    album_model.Reload ();
                     if (!album_model.Selection.AllSelected) {
                         UpdateAlbumSelectionFilters ();
                     }
                     artist_view.ScrollTo (0);
                 } else if (model != null && o == album_view.Selection) {
                     model.AlbumInfoFilter = null;
+                    model.Reload ();
                     album_view.ScrollTo (0);
                 }
                 return;
@@ -290,7 +292,9 @@
             
                 model.AlbumInfoFilter = null;
                 model.ArtistInfoFilter = artists;
+                model.Reload ();
                 album_model.ArtistInfoFilter = artists;
+                album_model.Reload ();
             } else if (o == album_view.Selection) {
                 UpdateAlbumSelectionFilters ();
             }
@@ -299,6 +303,7 @@
         private void UpdateAlbumSelectionFilters ()
         {
             (track_view.Model as TrackListModel).AlbumInfoFilter = (album_view.Model as AlbumListModel).SelectedItems;
+            track_view.Model.Reload ();
         }
         
         public void SetModels (TrackListModel track, ArtistListModel artist, AlbumListModel album)

Modified: trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs	Mon Mar 10 19:15:42 2008
@@ -102,7 +102,7 @@
             ServiceManager.SourceManager.ActiveSourceChanged += delegate { UpdateActions (); };
 
             ServiceManager.SourceManager.Library.TracksChanged += HandleTracksChanged;
-            ServiceManager.SourceManager.Library.TracksRemoved += HandleTracksRemoved;
+            ServiceManager.SourceManager.Library.TracksDeleted += HandleTracksDeleted;
         }
         
         public void Dispose ()



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