diff --git a/src/libtomahawk/playlist.cpp b/src/libtomahawk/playlist.cpp index d3e88a764..bb3ff7a6a 100644 --- a/src/libtomahawk/playlist.cpp +++ b/src/libtomahawk/playlist.cpp @@ -220,6 +220,8 @@ Playlist::load( const QString& guid ) bool Playlist::remove( const playlist_ptr& playlist ) { + playlist->aboutToBeDeleted( playlist ); + TomahawkSettings *s = TomahawkSettings::instance(); s->removePlaylistSettings( playlist->guid() ); diff --git a/src/libtomahawk/playlist.h b/src/libtomahawk/playlist.h index ba705328c..dfbccb8e8 100644 --- a/src/libtomahawk/playlist.h +++ b/src/libtomahawk/playlist.h @@ -190,6 +190,12 @@ signals: /// renamed etc. void changed(); + /** + * delete command is scheduled but not completed. Do not call remove() again once this + * is emitted. + */ + void aboutToBeDeleted( const Tomahawk::playlist_ptr& pl ); + /// was deleted, eh? void deleted( const Tomahawk::playlist_ptr& pl ); diff --git a/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp b/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp index e69dbb320..205c7e8e2 100644 --- a/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp +++ b/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp @@ -26,6 +26,7 @@ #include "database/databasecommand_setdynamicplaylistrevision.h" #include "database/databasecommand_loaddynamicplaylist.h" #include "database/databasecommand_deletedynamicplaylist.h" +#include "tomahawksettings.h" using namespace Tomahawk; @@ -249,6 +250,10 @@ DynamicPlaylist::loadRevision( const QString& rev ) bool DynamicPlaylist::remove( const Tomahawk::dynplaylist_ptr& playlist ) { + playlist->aboutToBeDeleted( playlist ); + + TomahawkSettings::instance()->removePlaylistSettings( playlist->guid() ); + DatabaseCommand_DeletePlaylist* cmd = new DatabaseCommand_DeleteDynamicPlaylist( playlist->author(), playlist->guid() ); Database::instance()->enqueue( QSharedPointer(cmd) ); diff --git a/src/libtomahawk/playlist/dynamic/DynamicPlaylist.h b/src/libtomahawk/playlist/dynamic/DynamicPlaylist.h index c53c96dd2..90a63da6e 100644 --- a/src/libtomahawk/playlist/dynamic/DynamicPlaylist.h +++ b/src/libtomahawk/playlist/dynamic/DynamicPlaylist.h @@ -115,6 +115,7 @@ signals: /// emitted when the playlist revision changes (whenever the playlist changes) void dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision ); + void aboutToBeDeleted( const Tomahawk::dynplaylist_ptr& pl ); void deleted( const Tomahawk::dynplaylist_ptr& pl ); public slots: diff --git a/src/sourcetree/items/collectionitem.cpp b/src/sourcetree/items/collectionitem.cpp index a47b3a258..984bb798c 100644 --- a/src/sourcetree/items/collectionitem.cpp +++ b/src/sourcetree/items/collectionitem.cpp @@ -80,18 +80,10 @@ CollectionItem::CollectionItem( SourcesModel* mdl, SourceTreeItem* parent, cons connect( source->collection().data(), SIGNAL( playlistsAdded( QList ) ), SLOT( onPlaylistsAdded( QList ) ), Qt::QueuedConnection ); - connect( source->collection().data(), SIGNAL( playlistsDeleted( QList ) ), - SLOT( onPlaylistsDeleted( QList ) ), Qt::QueuedConnection ); - connect( source->collection().data(), SIGNAL( autoPlaylistsAdded( QList< Tomahawk::dynplaylist_ptr > ) ), SLOT( onAutoPlaylistsAdded( QList ) ), Qt::QueuedConnection ); - connect( source->collection().data(), SIGNAL( autoPlaylistsDeleted( QList ) ), - SLOT( onAutoPlaylistsDeleted( QList ) ), Qt::QueuedConnection ); - connect( source->collection().data(), SIGNAL( stationsAdded( QList ) ), SLOT( onStationsAdded( QList ) ), Qt::QueuedConnection ); - connect( source->collection().data(), SIGNAL( stationsDeleted( QList ) ), - SLOT( onStationsDeleted( QList ) ), Qt::QueuedConnection ); } @@ -163,6 +155,14 @@ CollectionItem::playlistsAddedInternal( SourceTreeItem* parent, const QList< dyn // qDebug() << "Dynamic Playlist added:" << p->title() << p->creator() << p->info(); p->loadRevision(); items << plItem; + + if( p->mode() == Static ) { + connect( p.data(), SIGNAL( aboutToBeDeleted( Tomahawk::dynplaylist_ptr ) ), + SLOT( onAutoPlaylistDeleted( Tomahawk::dynplaylist_ptr ) ), Qt::QueuedConnection ); + } else { + connect( p.data(), SIGNAL( aboutToBeDeleted( Tomahawk::dynplaylist_ptr ) ), + SLOT( onStationDeleted( Tomahawk::dynplaylist_ptr ) ), Qt::QueuedConnection ); + } } parent->endRowsAdded(); } @@ -170,20 +170,17 @@ CollectionItem::playlistsAddedInternal( SourceTreeItem* parent, const QList< dyn template< typename T > void -CollectionItem::playlistsDeletedInternal( SourceTreeItem* parent, const QList< T >& playlists ) +CollectionItem::playlistDeletedInternal( SourceTreeItem* parent, const T& p ) { Q_ASSERT( parent ); // How can we delete playlists if we have none? - QList< SourceTreeItem* > items; - foreach( const T& playlist, playlists ) { - int curCount = parent->children().count(); - for( int i = 0; i < curCount; i++ ) { - PlaylistItem* pl = qobject_cast< PlaylistItem* >( parent->children().at( i ) ); - if( pl && pl->playlist() == playlist ) { - parent->beginRowsRemoved( i, i ); - parent->removeChild( pl ); - parent->endRowsRemoved(); - break; - } + int curCount = parent->children().count(); + for( int i = 0; i < curCount; i++ ) { + PlaylistItem* pl = qobject_cast< PlaylistItem* >( parent->children().at( i ) ); + if( pl && pl->playlist() == p ) { + parent->beginRowsRemoved( i, i ); + parent->removeChild( pl ); + parent->endRowsRemoved(); + break; } } } @@ -217,15 +214,19 @@ CollectionItem::onPlaylistsAdded( const QList< playlist_ptr >& playlists ) // qDebug() << "Playlist added:" << p->title() << p->creator() << p->info(); p->loadRevision(); items << plItem; + + connect( p.data(), SIGNAL( aboutToBeDeleted( Tomahawk::playlist_ptr ) ), + SLOT( onPlaylistDeleted( Tomahawk::playlist_ptr ) ), Qt::QueuedConnection ); + } m_playlists->endRowsAdded(); } void -CollectionItem::onPlaylistsDeleted( const QList< playlist_ptr >& playlists ) +CollectionItem::onPlaylistDeleted( const playlist_ptr& playlist ) { - playlistsDeletedInternal( m_playlists, playlists ); + playlistDeletedInternal( m_playlists, playlist ); } @@ -247,12 +248,12 @@ CollectionItem::onAutoPlaylistsAdded( const QList< dynplaylist_ptr >& playlists void -CollectionItem::onAutoPlaylistsDeleted( const QList< dynplaylist_ptr >& playlists ) +CollectionItem::onAutoPlaylistDeleted( const dynplaylist_ptr& playlist ) { if( !m_playlists ) qDebug() << "NO playlist category item for a deleting playlist.."; - playlistsDeletedInternal( m_playlists, playlists ); + playlistDeletedInternal( m_playlists, playlist ); } @@ -274,9 +275,9 @@ CollectionItem::onStationsAdded( const QList< dynplaylist_ptr >& stations ) void -CollectionItem::onStationsDeleted( const QList< dynplaylist_ptr >& stations ) +CollectionItem::onStationDeleted( const dynplaylist_ptr& station ) { - playlistsDeletedInternal( m_stations, stations ); + playlistDeletedInternal( m_stations, station ); } void diff --git a/src/sourcetree/items/collectionitem.h b/src/sourcetree/items/collectionitem.h index c8519cf77..90615dac0 100644 --- a/src/sourcetree/items/collectionitem.h +++ b/src/sourcetree/items/collectionitem.h @@ -45,11 +45,11 @@ public: private slots: void onPlaylistsAdded( const QList& playlists ); - void onPlaylistsDeleted( const QList& playlists ); + void onPlaylistDeleted( const Tomahawk::playlist_ptr& playlists ); void onAutoPlaylistsAdded( const QList& playlists ); - void onAutoPlaylistsDeleted( const QList& playlists ); + void onAutoPlaylistDeleted( const Tomahawk::dynplaylist_ptr& playlists ); void onStationsAdded( const QList& stations ); - void onStationsDeleted( const QList& stations ); + void onStationDeleted( const Tomahawk::dynplaylist_ptr& stations ); void tempPageActivated( Tomahawk::ViewPage* ); Tomahawk::ViewPage* tempItemClicked(); @@ -61,7 +61,7 @@ private slots: private: void playlistsAddedInternal( SourceTreeItem* parent, const QList< Tomahawk::dynplaylist_ptr >& playlists ); template< typename T > - void playlistsDeletedInternal( SourceTreeItem* parent, const QList< T >& playlists ); + void playlistDeletedInternal( SourceTreeItem* parent, const T& playlists ); Tomahawk::source_ptr m_source; CategoryItem* m_playlists;