[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/multimedia/amarok/src
From:       Bart Cerneels <bart.cerneels () kde ! org>
Date:       2009-07-19 18:57:10
Message-ID: 1248029830.048443.23263.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 999402 by shanachie:

Refactor UserPlaylists a bit further.
With the groupingproxy not enabled the view updates correctly now.

 M  +37 -0     browsers/playlistbrowser/UserPlaylistModel.cpp  
 M  +7 -1      browsers/playlistbrowser/UserPlaylistModel.h  
 M  +5 -13     context/applets/serviceinfo/ServiceInfo.cpp  
 M  +1 -3      context/applets/serviceinfo/ServiceInfo.h  
 M  +43 -22    meta/Playlist.h  
 M  +5 -9      meta/SqlPlaylist.cpp  
 M  +0 -2      meta/SqlPlaylist.h  
 M  +0 -2      meta/XSPFPlaylist.cpp  


--- trunk/extragear/multimedia/amarok/src/browsers/playlistbrowser/UserPlaylistModel.cpp \
#999401:999402 @@ -123,6 +123,7 @@
     {
         Meta::PlaylistPtr playlist = Meta::PlaylistPtr::staticCast( i.next() );
         m_playlists << playlist;
+        playlist->subscribe( this );
     }
 }
 
@@ -315,9 +316,12 @@
     }
 
     beginRemoveRows( parent, row, row + count - 1 );
+    //ignore notifications while removing tracks
+    playlist->unsubscribe( this );
     for( int i = row; i < row + count; i++ )
         //deleting a track moves the next track up, so use the same row number each \
time  playlist->removeTrack( row );
+    playlist->subscribe( this );
     endRemoveRows();
 
     return true;
@@ -555,4 +559,37 @@
     return playlist->tracks()[index.row()];
 }
 
+void
+PlaylistBrowserNS::UserModel::trackAdded( Meta::PlaylistPtr playlist, Meta::TrackPtr \
track, int position ) +{
+    DEBUG_BLOCK
+    debug() << "From playlist: " << playlist->prettyName();
+    debug() << "Track: " << track->prettyName() << "position: " << position;
+    int indexNumber = m_playlists.indexOf( playlist );
+    if( indexNumber == -1 )
+    {
+        debug() << "Error: this playlist is not in the list of this model.";
+        return;
+    }
+    QModelIndex playlistIdx = index( indexNumber, 0, QModelIndex() );
+    rowsInserted( playlistIdx, position, position );
+}
+
+void
+PlaylistBrowserNS::UserModel::trackRemoved( Meta::PlaylistPtr playlist, int position \
) +{
+    DEBUG_BLOCK
+    debug() << "From playlist: " << playlist->prettyName();
+    debug() << "position: " << position;
+    int indexNumber = m_playlists.indexOf( playlist );
+    if( indexNumber == -1 )
+    {
+        debug() << "Error: this playlist is not in the list of this model.";
+        return;
+    }
+    QModelIndex playlistIdx = index( indexNumber, 0, QModelIndex() );
+    beginRemoveRows( playlistIdx, position, position );
+    endRemoveRows();
+}
+
 #include "UserPlaylistModel.moc"
--- trunk/extragear/multimedia/amarok/src/browsers/playlistbrowser/UserPlaylistModel.h \
#999401:999402 @@ -34,7 +34,8 @@
 /**
 	@author Nikolaj Hald Nielsen <nhnFreespirit@gmail.com>
 */
-class UserModel : public QAbstractItemModel, public MetaPlaylistModel
+class UserModel : public QAbstractItemModel, public MetaPlaylistModel,
+                  public Meta::PlaylistObserver
 {
     Q_OBJECT
     public:
@@ -81,6 +82,11 @@
         Meta::PlaylistList selectedPlaylists() { return m_selectedPlaylists; }
         Meta::TrackList selectedTracks() { return m_selectedTracks; }
 
+        /* Meta::PlaylistObserver methods */
+        virtual void trackAdded( Meta::PlaylistPtr playlist, Meta::TrackPtr track,
+                                 int position );
+        virtual void trackRemoved( Meta::PlaylistPtr playlist, int position );
+
     public slots:
         void slotLoad();
         void slotAppend();
--- trunk/extragear/multimedia/amarok/src/context/applets/serviceinfo/ServiceInfo.cpp \
#999401:999402 @@ -154,24 +154,16 @@
 {
     debug() << "Link clicked: " << url.toString();
 
-    if ( url.toString().startsWith( "amarok://", Qt::CaseInsensitive ) ) {
+    if ( url.toString().startsWith( "amarok://", Qt::CaseInsensitive ) )
+    {
         AmarokUrl aUrl( url.toString() );
         aUrl.run();
-    } else if ( url.toString().contains( ".xspf", Qt::CaseInsensitive ) ) {
-
+    }
+    else if ( url.toString().contains( ".xspf", Qt::CaseInsensitive ) )
+    {
         Meta::XSPFPlaylist * playlist = new Meta::XSPFPlaylist( url );
-        playlist->subscribe( this );
-
     }
 }
 
-void ServiceInfo::trackListChanged( Meta::Playlist * playlist )
-{
-    playlist->unsubscribe( this );
-    Meta::PlaylistPtr playlistPtr( playlist );
-    The::playlistController()->insertOptioned( playlistPtr, Playlist::Append );
-}
-
-
 #include "ServiceInfo.moc"
 
--- trunk/extragear/multimedia/amarok/src/context/applets/serviceinfo/ServiceInfo.h \
#999401:999402 @@ -39,7 +39,7 @@
 class QSpinBox;
 class QCheckBox;
 
-class ServiceInfo : public Context::Applet, public Meta::PlaylistObserver
+class ServiceInfo : public Context::Applet
 {
     Q_OBJECT
 public:
@@ -49,8 +49,6 @@
     void paintInterface( QPainter *painter, const QStyleOptionGraphicsItem *option, \
                const QRect &contentsRect );
     void constraintsEvent( Plasma::Constraints constraints = Plasma::AllConstraints \
);  
-    virtual void trackListChanged( Meta::Playlist* playlist );
-
 public slots:
     void dataUpdated( const QString& name, const Plasma::DataEngine::Data &data );
 private slots:
--- trunk/extragear/multimedia/amarok/src/meta/Playlist.h #999401:999402
@@ -36,7 +36,6 @@
 
 namespace Meta
 {
-
     class Playlist;
 
     typedef KSharedPtr<Playlist> PlaylistPtr;
@@ -45,10 +44,20 @@
     class AMAROK_EXPORT PlaylistObserver
     {
         public:
-            /** This method is called when  a playlist has changed.
+            void subscribeTo( PlaylistPtr );
+            void unsubscribeFrom( PlaylistPtr );
+
+            /** This method is called when a track has been added to the playlist.
              */
-            virtual void trackListChanged( Playlist* playlist ) = 0;
+            virtual void trackAdded( PlaylistPtr playlist, TrackPtr track, int \
position ) = 0; +            /** This method is called when a track is removed from \
to the playlist. +             */
+            virtual void trackRemoved( PlaylistPtr playlist, int position ) = 0;
+
             virtual ~PlaylistObserver() {}
+
+        private:
+            QSet<PlaylistPtr> m_playlistSubscriptions;
     };
 
     class AMAROK_EXPORT Playlist : public virtual QSharedData
@@ -91,24 +100,19 @@
 
             virtual Capability* createCapabilityInterface( Capability::Type type ) = \
0;  
-            virtual KUrl retrievableUrl() { return KUrl(); }
-
-            virtual bool load( QTextStream &stream ) { Q_UNUSED( stream ); return \
                false; }
-            virtual bool save( const QString &location, bool relative ) { Q_UNUSED( \
                location); Q_UNUSED( relative); return false; }
-
             /**
              * Retrieves a specialized interface which represents a capability of \
                this
-             * MetaBase object.
-             *
-             * @returns a pointer to the capability interface if it exists, 0 \
                otherwise
-             */
-            template <class CapIface> CapIface *create()
-            {
-                Meta::Capability::Type type = CapIface::capabilityInterfaceType();
-                Meta::Capability *iface = createCapabilityInterface(type);
-                return qobject_cast<CapIface *>(iface);
+             * MetaBase object.                                                      \
 +             *                                                                      \
 +             * @returns a pointer to the capability interface if it exists, 0 \
otherwise                                             +             */                \
 +            template <class CapIface> CapIface *create()                            \
 +            {                                                                       \
 +                Meta::Capability::Type type = CapIface::capabilityInterfaceType();  \
 +                Meta::Capability *iface = createCapabilityInterface(type);          \
 +                return qobject_cast<CapIface *>(iface);                             \
  }
-
+            
             /**
              * Tests if a MetaBase object provides a given capability interface.
              *
@@ -119,13 +123,30 @@
                 return hasCapabilityInterface( CapIface::capabilityInterfaceType() \
);  }
 
+            virtual KUrl retrievableUrl() { return KUrl(); }
+
+            virtual bool load( QTextStream &stream ) { Q_UNUSED( stream ); return \
false; } +            virtual bool save( const QString &location, bool relative ) { \
Q_UNUSED( location); Q_UNUSED( relative); return false; } +
         protected:
-            virtual void notifyObservers() const {
-                foreach( PlaylistObserver *observer, m_observers )
-                    observer->trackListChanged( const_cast<Meta::Playlist*>( this ) \
); +            inline void notifyObserversTrackAdded( Meta::TrackPtr track, int \
position ) +            {
+                foreach( Meta::PlaylistObserver *observer, m_observers )
+                {
+                    if( m_observers.contains( observer ) ) // guard against \
observers removing themselves in destructors +                        \
observer->trackAdded( Meta::PlaylistPtr( this ), track, position ); +                \
}  }
 
-        protected:
+            inline void notifyObserversTrackRemoved( int position )
+            {
+                foreach( Meta::PlaylistObserver *observer, m_observers )
+                {
+                    if( m_observers.contains( observer ) ) // guard against \
observers removing themselves in destructors +                        \
observer->trackRemoved( Meta::PlaylistPtr( this ), position ); +                }
+            }
+
             QSet<Meta::PlaylistObserver*> m_observers;
             QString m_name;
     };
--- trunk/extragear/multimedia/amarok/src/meta/SqlPlaylist.cpp #999401:999402
@@ -214,13 +214,18 @@
     DEBUG_BLOCK
     int insertAt = (position == -1) ? m_tracks.count() : position;
     m_tracks.insert( insertAt, track );
+    notifyObserversTrackAdded( track, position );
 }
 
 void
 Meta::SqlPlaylist::removeTrack( int position )
 {
     DEBUG_BLOCK
+    debug() << "position: " << position;
+    if( position < 0 || position >= m_tracks.size() )
+        return;
     m_tracks.removeAt( position );
+    notifyObserversTrackRemoved( position );
 }
 
 void
@@ -261,7 +266,6 @@
             //debug() << "added track: " << trackPtr->name();
 
         }
-
     }
 
     m_tracksLoaded = true;
@@ -292,11 +296,3 @@
 {
     return m_dbId;
 }
-
-/*
-void
-Meta::SqlPlaylist::reparent( SqlPlaylistGroupPtr parent )
-{
-    m_parent = parent;
-    saveToDb( false );
-}*/
--- trunk/extragear/multimedia/amarok/src/meta/SqlPlaylist.h #999401:999402
@@ -73,8 +73,6 @@
 
         void removeFromDb();
 
-        //bool load();
-
     private:
         void loadTracks();
         void saveTracks();
--- trunk/extragear/multimedia/amarok/src/meta/XSPFPlaylist.cpp #999401:999402
@@ -148,8 +148,6 @@
         return false;
     }
 
-    notifyObservers();
-
     return true;
 }
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic