banshee r3861 - in trunk/banshee: . src/Clients/Nereid/Nereid src/Core/Banshee.Services/Banshee.MediaEngine src/Core/Banshee.Services/Banshee.PlaybackController src/Core/Banshee.Services/Banshee.Sources src/Core/Banshee.ThickClient/Banshee.Collection.Gui src/Core/Banshee.ThickClient/Banshee.Gui src/Core/Banshee.ThickClient/Banshee.Sources.Gui src/Extensions/Banshee.MiniMode/Banshee.MiniMode src/Extensions/Banshee.PlayQueue src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue



Author: gburt
Date: Thu May  1 21:23:46 2008
New Revision: 3861
URL: http://svn.gnome.org/viewvc/banshee?rev=3861&view=rev

Log:
2008-05-01  Gabriel Burt  <gabriel burt gmail com>

	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtistListView.cs:
	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/AlbumListView.cs:
	* src/Extensions/Banshee.MiniMode/Banshee.MiniMode/SourceComboBox.cs:
	* src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs:
	* src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs:
	* src/Clients/Nereid/Nereid/PlayerInterface.cs:
	Use NextSource instead of Source.

	* src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.mdp: Updated.

	* src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:
	Change to the play queue on the next transition after adding items to it.
	Fixes BGO #524637.

	* src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs: Clean up method.

	* src/Core/Banshee.Services/Banshee.Sources/Source.cs: Override ToString = Name

	* src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs:
	Add NextSource property, which you can set to change the source on the
	next transition.

	* src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:
	Add IsPlaying () convenience method.


Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Clients/Nereid/Nereid/PlayerInterface.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/AlbumListView.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtistListView.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs
   trunk/banshee/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/SourceComboBox.cs
   trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.mdp
   trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs

Modified: trunk/banshee/src/Clients/Nereid/Nereid/PlayerInterface.cs
==============================================================================
--- trunk/banshee/src/Clients/Nereid/Nereid/PlayerInterface.cs	(original)
+++ trunk/banshee/src/Clients/Nereid/Nereid/PlayerInterface.cs	Thu May  1 21:23:46 2008
@@ -250,14 +250,23 @@
             };
             
             composite_view.TrackView.RowActivated += delegate (object o, RowActivatedArgs<TrackInfo> args) {
-                SetPlaybackControllerSource (ServiceManager.SourceManager.ActiveSource);
-                ServiceManager.PlayerEngine.OpenPlay (args.RowValue);
+                Source source = ServiceManager.SourceManager.ActiveSource;
+                if (source is ITrackModelSource) {
+                    ServiceManager.PlaybackController.Source = (ITrackModelSource)source;
+                    ServiceManager.PlayerEngine.OpenPlay (args.RowValue);
+                }
             };
 
             source_view.RowActivated += delegate {
-                SetPlaybackControllerSource (ServiceManager.SourceManager.ActiveSource);
-                if (GtkUtilities.NoImportantModifiersAreSet (Gdk.ModifierType.ControlMask)) {
-                    ServiceManager.PlaybackController.Next ();
+                Source source = ServiceManager.SourceManager.ActiveSource;
+                if (source is ITrackModelSource) {
+                    ServiceManager.PlaybackController.NextSource = (ITrackModelSource)source;
+                    // Allow changing the play source without stopping the current song by
+                    // holding ctrl when activating a source. After the song is done, playback will
+                    // continue from the new source.
+                    if (GtkUtilities.NoImportantModifiersAreSet (Gdk.ModifierType.ControlMask)) {
+                        ServiceManager.PlaybackController.Next ();
+                    }
                 }
             };
             
@@ -482,17 +491,6 @@
             UpdateSourceInformation ();
         }
 
-        private void SetPlaybackControllerSource (Source source)
-        {
-            // Set the source from which to play to the current source since
-            // the user manually began playback from this source
-            if (!(source is ITrackModelSource)) {
-                source = ServiceManager.SourceManager.DefaultSource;
-            }
-            
-            ServiceManager.PlaybackController.Source = (ITrackModelSource)source;    
-        }
-
         private void UpdateSourceInformation ()
         {
             Source source = ServiceManager.SourceManager.ActiveSource;

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs	Thu May  1 21:23:46 2008
@@ -431,8 +431,12 @@
         
         public bool IsPlaying (TrackInfo track)
         {
-            return CurrentState != PlayerEngineState.Idle && CurrentState != PlayerEngineState.NotReady && 
-                track != null && track.TrackEqual (CurrentTrack);
+            return IsPlaying () && track != null && track.TrackEqual (CurrentTrack);
+        }
+        
+        public bool IsPlaying ()
+        {
+            return CurrentState != PlayerEngineState.Idle && CurrentState != PlayerEngineState.NotReady;
         }
 
         private void CheckPending ()

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs	Thu May  1 21:23:46 2008
@@ -63,6 +63,7 @@
         
         private PlayerEngineService player_engine;
         private ITrackModelSource source;
+        private ITrackModelSource next_source;
         
         private event PlaybackControllerStoppedHandler dbus_stopped;
         event PlaybackControllerStoppedHandler IPlaybackController.Stopped {
@@ -72,6 +73,7 @@
         
         public event EventHandler Stopped;
         public event EventHandler SourceChanged;
+        public event EventHandler NextSourceChanged;
         public event EventHandler TrackStarted;
         public event EventHandler Transition;
         
@@ -131,6 +133,7 @@
         
         public void First ()
         {
+            Source = NextSource;
             // This and OnTransition() below commented out b/c of BGO #524556
             //raise_started_after_transition = true;
             
@@ -150,6 +153,7 @@
         
         public void Next (bool restart)
         {
+            Source = NextSource;
             raise_started_after_transition = true;
 
             player_engine.IncrementLastPlayed ();
@@ -170,6 +174,7 @@
         
         public void Previous (bool restart)
         {
+            Source = NextSource;
             raise_started_after_transition = true;
 
             player_engine.IncrementLastPlayed ();
@@ -313,6 +318,14 @@
             }
         }
         
+        protected void OnNextSourceChanged ()
+        {
+            EventHandler handler = NextSourceChanged;
+            if (handler != null) {
+                handler (this, EventArgs.Empty);
+            }
+        }
+        
         protected virtual void OnTrackStarted ()
         {
             EventHandler handler = TrackStarted;
@@ -337,6 +350,7 @@
             
             set {
                 if (source != value) {
+                    NextSource = value;
                     source = value;
                     source_set_at = DateTime.Now;
                     OnSourceChanged ();
@@ -344,6 +358,20 @@
             }
         }
         
+        public ITrackModelSource NextSource {
+            get { return next_source ?? Source; }
+            set {
+                if (next_source != value) {
+                    next_source = value;
+                    OnNextSourceChanged ();
+                    
+                    if (!player_engine.IsPlaying ()) {
+                        Source = next_source;
+                    }
+                }
+            }
+        }
+        
         public PlaybackShuffleMode ShuffleMode {
             get { return shuffle_mode; }
             set { shuffle_mode = value; }

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs	Thu May  1 21:23:46 2008
@@ -583,6 +583,11 @@
         }
         
 #endregion
+
+        public override string ToString ()
+        {
+            return Name;
+        }
         
         string IService.ServiceName {
             get { return String.Format ("{0}{1}", DBusServiceManager.MakeDBusSafeString (Name), "Source"); }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/AlbumListView.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/AlbumListView.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/AlbumListView.cs	Thu May  1 21:23:46 2008
@@ -53,7 +53,7 @@
             RowHeightProvider = renderer.ComputeRowHeight;
             
             RowActivated += delegate {
-                ServiceManager.PlaybackController.Source = (ServiceManager.SourceManager.ActiveSource 
+                ServiceManager.PlaybackController.NextSource = (ServiceManager.SourceManager.ActiveSource 
                     as Banshee.Sources.ITrackModelSource);
                 ServiceManager.PlaybackController.Next ();
             };

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtistListView.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtistListView.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtistListView.cs	Thu May  1 21:23:46 2008
@@ -48,7 +48,7 @@
             ColumnController = column_controller;
             
             RowActivated += delegate {
-                ServiceManager.PlaybackController.Source = (ServiceManager.SourceManager.ActiveSource as Banshee.Sources.ITrackModelSource);
+                ServiceManager.PlaybackController.NextSource = (ServiceManager.SourceManager.ActiveSource as Banshee.Sources.ITrackModelSource);
                 ServiceManager.PlaybackController.Next ();
             };
         }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs	Thu May  1 21:23:46 2008
@@ -230,17 +230,17 @@
 
         private void OnJumpToPlayingTrack (object o, EventArgs args)
         {
-            Source playback_src = ServiceManager.PlaybackController.Source as Source;
+            ITrackModelSource track_src = ServiceManager.PlaybackController.Source;
+            Source src = track_src as Source;
 
-            if (playback_src != null && playback_src is ITrackModelSource) {
-                ITrackModelSource track_src = (playback_src as ITrackModelSource);
+            if (track_src != null && src != null) {
                 int i = track_src.TrackModel.IndexOf (ServiceManager.PlaybackController.CurrentTrack);
                 if (i != -1) {
                     // TODO clear the search/filters if there are any, since they might be hiding the currently playing item?
                     // and/or switch to the track's primary source?  what if it's been removed from the library all together?
-                    IListView<TrackInfo> track_list = (track_src as Source).Properties.Get<IListView<TrackInfo>> ("Track.IListView");
+                    IListView<TrackInfo> track_list = src.Properties.Get<IListView<TrackInfo>> ("Track.IListView");
                     if (track_list != null) {
-                        ServiceManager.SourceManager.SetActiveSource (playback_src);
+                        ServiceManager.SourceManager.SetActiveSource (src);
                         track_src.TrackModel.Selection.Clear (false);
                         track_src.TrackModel.Selection.Select (i);
                         track_list.CenterOn (i);

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs	Thu May  1 21:23:46 2008
@@ -116,7 +116,7 @@
             Pixbuf icon = SourceIconResolver.ResolveIcon (source);
             
             FontDescription fd = widget.PangoContext.FontDescription.Copy ();
-            fd.Weight = (ISource)ServiceManager.PlaybackController.Source == (ISource)source 
+            fd.Weight = (ISource)ServiceManager.PlaybackController.NextSource == (ISource)source 
                 ? Pango.Weight.Bold 
                 : Pango.Weight.Normal;
 

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs	Thu May  1 21:23:46 2008
@@ -126,7 +126,7 @@
                 });
             };
             
-            ServiceManager.PlaybackController.SourceChanged += delegate {
+            ServiceManager.PlaybackController.NextSourceChanged += delegate {
                 QueueDraw ();
             };
             

Modified: trunk/banshee/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/SourceComboBox.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/SourceComboBox.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/SourceComboBox.cs	Thu May  1 21:23:46 2008
@@ -80,7 +80,7 @@
                     if(new_source != null && ServiceManager.SourceManager.ActiveSource != new_source) {
                         ServiceManager.SourceManager.SetActiveSource(new_source);
                         if(new_source is ITrackModelSource) {
-                            ServiceManager.PlaybackController.Source = (ITrackModelSource)new_source;
+                            ServiceManager.PlaybackController.NextSource = (ITrackModelSource)new_source;
                         }
                     }
                 }

Modified: trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.mdp	Thu May  1 21:23:46 2008
@@ -9,9 +9,9 @@
   </Configurations>
   <Contents>
     <File name="Banshee.PlayQueue/PlayQueueSource.cs" subtype="Code" buildaction="Compile" />
-    <File name="Resources/Banshee.PlayQueue.addin.xml" subtype="Code" buildaction="EmbedAsResource" />
     <File name="Resources/ActiveSourceUI.xml" subtype="Code" buildaction="EmbedAsResource" />
     <File name="Resources/GlobalUI.xml" subtype="Code" buildaction="EmbedAsResource" />
+    <File name="Banshee.PlayQueue.addin.xml" subtype="Code" buildaction="EmbedAsResource" />
   </Contents>
   <References>
     <ProjectReference type="Project" localcopy="True" refto="Banshee.Core" />

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	Thu May  1 21:23:46 2008
@@ -73,6 +73,8 @@
 
             ServiceManager.SourceManager.AddSource (this);
             
+            // TODO change this Gtk.Action code so that the actions can be removed.  And so this
+            // class doesn't depend on Gtk/ThickClient.
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
             uia_service.TrackActions.Add (new ActionEntry [] {
                 new ActionEntry ("AddToPlayQueueAction", Stock.Add,
@@ -110,14 +112,22 @@
             ServiceManager.SourceManager.MusicLibrary.TracksDeleted += HandleTracksDeleted;
             ServiceManager.SourceManager.VideoLibrary.TracksChanged += HandleTracksChanged;
             ServiceManager.SourceManager.VideoLibrary.TracksDeleted += HandleTracksDeleted;
+            
+            TrackModel.Reloaded += delegate {
+                if (Count == 0) {
+                    ServiceManager.PlaybackController.Source = (ITrackModelSource)ServiceManager.SourceManager.DefaultSource;
+                }
+            };
+            
+            Reload ();
 
-            SetAsPlayingSource ();
+            SetAsPlaybackSourceUnlessPlaying ();
         }
         
-        private void SetAsPlayingSource ()
+        private void SetAsPlaybackSourceUnlessPlaying ()
         {
-            if (Count > 0 && ServiceManager.PlayerEngine.CurrentState != PlayerEngineState.Playing) {
-                ServiceManager.PlaybackController.Source = this;
+            if (Count > 0) {
+                ServiceManager.PlaybackController.NextSource = this;
             }
         }
 
@@ -149,7 +159,7 @@
         protected override void OnTracksAdded ()
         {
             base.OnTracksAdded ();
-            SetAsPlayingSource ();
+            SetAsPlaybackSourceUnlessPlaying ();
         }
         
         protected override void OnUpdated ()
@@ -173,7 +183,11 @@
             if (args.Event == PlayerEngineEvent.EndOfStream) {
                 RemovePlayingTrack ();
             } else if (args.Event == PlayerEngineEvent.StartOfStream) {
-                playing_track = ServiceManager.PlayerEngine.CurrentTrack as DatabaseTrackInfo; 
+                if (this == ServiceManager.PlaybackController.Source) {
+                    playing_track = ServiceManager.PlayerEngine.CurrentTrack as DatabaseTrackInfo; 
+                } else {
+                    playing_track = null;
+                }
             }
         }
         
@@ -184,6 +198,7 @@
         
         private void OnClearPlayQueue (object o, EventArgs args)
         {
+            playing_track = null;
             RemoveTrackRange ((DatabaseTrackListModel)TrackModel, new Hyena.Collections.RangeCollection.Range (0, Count));
             Reload ();
         }
@@ -222,10 +237,8 @@
         {
             RemovePlayingTrack ();
             
-            if (Count <= 0) {
-                playing_track = null;
-                ServiceManager.PlaybackController.Source = (ITrackModelSource)ServiceManager.SourceManager.DefaultSource;
-                ServiceManager.PlaybackController.Next ();
+            if (Count == 0) {
+                ServiceManager.PlaybackController.Next (restart);
                 return;
             }
             



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