diff --git a/src/accounts/spotify/SpotifyPlaylistUpdater.cpp b/src/accounts/spotify/SpotifyPlaylistUpdater.cpp index 7d54a0005..fd29bbac4 100644 --- a/src/accounts/spotify/SpotifyPlaylistUpdater.cpp +++ b/src/accounts/spotify/SpotifyPlaylistUpdater.cpp @@ -32,7 +32,7 @@ QPixmap* SpotifyPlaylistUpdater::s_typePixmap = 0; #endif Tomahawk::PlaylistUpdaterInterface* -SpotifyUpdaterFactory::create( const Tomahawk::playlist_ptr& pl, const QString &key ) +SpotifyUpdaterFactory::create( const Tomahawk::playlist_ptr& pl, const QVariantHash &settings ) { if ( !m_account ) { @@ -54,9 +54,9 @@ SpotifyUpdaterFactory::create( const Tomahawk::playlist_ptr& pl, const QString & } // Register the updater with the account - const QString spotifyId = TomahawkSettings::instance()->value( QString( "%1/spotifyId" ).arg( key ) ).toString(); - const QString latestRev = TomahawkSettings::instance()->value( QString( "%1/latestrev" ).arg( key ) ).toString(); - const bool sync = TomahawkSettings::instance()->value( QString( "%1/sync" ).arg( key ) ).toBool(); + const QString spotifyId = settings.value( "spotifyId" ).toString(); + const QString latestRev = settings.value( "%1/latestrev" ).toString(); + const bool sync = settings.value( "%1/sync" ).toBool(); Q_ASSERT( !spotifyId.isEmpty() ); SpotifyPlaylistUpdater* updater = new SpotifyPlaylistUpdater( m_account.data(), latestRev, spotifyId, pl ); @@ -89,6 +89,8 @@ SpotifyPlaylistUpdater::init() connect( playlist().data(), SIGNAL( renamed( QString, QString ) ), this, SLOT( tomahawkPlaylistRenamed( QString, QString ) ) ); connect( playlist().data(), SIGNAL( revisionLoaded( Tomahawk::PlaylistRevision ) ), this, SLOT( playlistRevisionLoaded() ), Qt::QueuedConnection ); // Queued so that in Playlist.cpp:443 we let the playlist clear its own queue first // TODO reorders in a playlist + + saveToSettings(); } @@ -122,12 +124,8 @@ SpotifyPlaylistUpdater::remove( bool askToDeletePlaylist ) void -SpotifyPlaylistUpdater::removeFromSettings( const QString& group ) const +SpotifyPlaylistUpdater::aboutToDelete() { - TomahawkSettings::instance()->remove( QString( "%1/latestrev" ).arg( group ) ); - TomahawkSettings::instance()->remove( QString( "%1/sync" ).arg( group ) ); - TomahawkSettings::instance()->remove( QString( "%1/spotifyId" ).arg( group ) ); - if ( m_sync ) { if ( QThread::currentThread() != QApplication::instance()->thread() ) @@ -173,11 +171,15 @@ SpotifyPlaylistUpdater::playlistRevisionLoaded() void -SpotifyPlaylistUpdater::saveToSettings( const QString& group ) const +SpotifyPlaylistUpdater::saveToSettings() { - TomahawkSettings::instance()->setValue( QString( "%1/latestrev" ).arg( group ), m_latestRev ); - TomahawkSettings::instance()->setValue( QString( "%1/sync" ).arg( group ), m_sync ); - TomahawkSettings::instance()->setValue( QString( "%1/spotifyId" ).arg( group ), m_spotifyId ); + QVariantHash s = settings(); + + s[ "latestrev" ] = m_latestRev; + s[ "sync" ] = m_sync; + s[ "spotifyId" ] = m_spotifyId; + + saveSettings( s ); } @@ -214,6 +216,7 @@ SpotifyPlaylistUpdater::setSync( bool sync ) m_sync = sync; + saveToSettings(); emit changed(); } @@ -543,6 +546,9 @@ SpotifyPlaylistUpdater::onTracksInsertedReturn( const QString& msgType, const QV if ( changed.size() > 0 ) playlist()->updateEntries( uuid(), playlist()->currentrevision(), changed ); + // Update with latest rev when/if we use it +// saveToSettings(); + } diff --git a/src/accounts/spotify/SpotifyPlaylistUpdater.h b/src/accounts/spotify/SpotifyPlaylistUpdater.h index d0c987191..d07fc172a 100644 --- a/src/accounts/spotify/SpotifyPlaylistUpdater.h +++ b/src/accounts/spotify/SpotifyPlaylistUpdater.h @@ -67,9 +67,9 @@ public slots: void tomahawkTracksRemoved( const QList& ); void tomahawkTracksMoved( const QList& ,int ); void tomahawkPlaylistRenamed( const QString&, const QString& ); + protected: - virtual void removeFromSettings(const QString& group) const; - virtual void saveToSettings(const QString& group) const; + void aboutToDelete(); private slots: // SpotifyResolver message handlers, all take msgtype, msg as argument @@ -82,6 +82,8 @@ private slots: void playlistRevisionLoaded(); private: void init(); + void saveToSettings(); + /// Finds the nearest spotify id from pos to the beginning of the playlist QString nearestSpotifyTrack( const QList< Tomahawk::plentry_ptr >& entries, int pos ); QVariantList plentryToVariant( const QList< Tomahawk::plentry_ptr >& entries ); @@ -109,7 +111,7 @@ class SpotifyUpdaterFactory : public Tomahawk::PlaylistUpdaterFactory public: SpotifyUpdaterFactory() {} - virtual Tomahawk::PlaylistUpdaterInterface* create( const Tomahawk::playlist_ptr& pl, const QString& key ); + virtual Tomahawk::PlaylistUpdaterInterface* create( const Tomahawk::playlist_ptr& pl, const QVariantHash& settings ); virtual QString type() const { return "spotify"; } private: diff --git a/src/libtomahawk/TomahawkSettings.cpp b/src/libtomahawk/TomahawkSettings.cpp index 8012c398c..0a8a0104a 100644 --- a/src/libtomahawk/TomahawkSettings.cpp +++ b/src/libtomahawk/TomahawkSettings.cpp @@ -45,7 +45,7 @@ operator<<(QDataStream& out, const PlaylistUpdaterInterface::SerializedUpdaters& foreach( const QString& key, updaters.keys() ) { PlaylistUpdaterInterface::SerializedUpdater updater = updaters[ key ]; - out << key << updater.type << updater.sync << updater.customData; + out << key << updater.type << updater.customData; } return out; } @@ -66,9 +66,8 @@ operator>>(QDataStream& in, PlaylistUpdaterInterface::SerializedUpdaters& update qint32 state, userRating; in >> key; in >> type; - in >> sync; in >> customData; - updaters[ key ] = PlaylistUpdaterInterface::SerializedUpdater( type, sync, customData ); + updaters[ key ] = PlaylistUpdaterInterface::SerializedUpdater( type, customData ); } return in; @@ -1219,3 +1218,26 @@ TomahawkSettings::setImportXspfPath( const QString& path ) { setValue( "importXspfPath", path ); } + + +PlaylistUpdaterInterface::SerializedUpdaters +TomahawkSettings::playlistUpdaters() const +{ + return value( "playlistupdaters" ).value< PlaylistUpdaterInterface::SerializedUpdaters >(); +} + + +void +TomahawkSettings::setPlaylistUpdaters( const PlaylistUpdaterInterface::SerializedUpdaters& updaters ) +{ + setValue( "playlistupdaters", QVariant::fromValue< PlaylistUpdaterInterface::SerializedUpdaters >( updaters ) ); +} + + +void +TomahawkSettings::registerCustomSettingsHandlers() +{ + qRegisterMetaType< Tomahawk::PlaylistUpdaterInterface::SerializedUpdater >( "Tomahawk::PlaylistUpdaterInterface::SerializedUpdater" ); + qRegisterMetaType< Tomahawk::PlaylistUpdaterInterface::SerializedUpdaters >( "Tomahawk::PlaylistUpdaterInterface::SerializedUpdaters" ); + qRegisterMetaTypeStreamOperators< Tomahawk::PlaylistUpdaterInterface::SerializedUpdaters >( "Tomahawk::PlaylistUpdaterInterface::SerializedUpdaters" ); +} diff --git a/src/libtomahawk/TomahawkSettings.h b/src/libtomahawk/TomahawkSettings.h index 4e4035a8a..6c3fc9f7c 100644 --- a/src/libtomahawk/TomahawkSettings.h +++ b/src/libtomahawk/TomahawkSettings.h @@ -23,6 +23,8 @@ #include "Playlist.h" +#include "playlist/PlaylistUpdaterInterface.h" + #include #include @@ -201,6 +203,9 @@ public: void setImportXspfPath( const QString& path ); QString importXspfPath() const; + Tomahawk::PlaylistUpdaterInterface::SerializedUpdaters playlistUpdaters() const; + void setPlaylistUpdaters( const Tomahawk::PlaylistUpdaterInterface::SerializedUpdaters& updaters ); + static void registerCustomSettingsHandlers(); signals: diff --git a/src/libtomahawk/playlist/PlaylistUpdaterInterface.cpp b/src/libtomahawk/playlist/PlaylistUpdaterInterface.cpp index 6118d4515..700001227 100644 --- a/src/libtomahawk/playlist/PlaylistUpdaterInterface.cpp +++ b/src/libtomahawk/playlist/PlaylistUpdaterInterface.cpp @@ -35,21 +35,22 @@ PlaylistUpdaterInterface* PlaylistUpdaterInterface::loadForPlaylist( const playlist_ptr& pl ) { TomahawkSettings* s = TomahawkSettings::instance(); - const QString key = QString( "playlistupdaters/%1" ).arg( pl->guid() ); - if ( s->contains( QString( "%1/type" ).arg( key ) ) ) + + const SerializedUpdaters updaters = s->playlistUpdaters(); + if ( updaters.contains( pl->guid() ) ) { // Ok, we have one we can try to load - const QString type = s->value( QString( "%1/type" ).arg( key ) ).toString(); PlaylistUpdaterInterface* updater = 0; + const SerializedUpdater info = updaters[ pl->guid() ]; - if ( !s_factories.contains( type ) ) + if ( !s_factories.contains( info.type ) ) { Q_ASSERT( false ); // You forgot to register your new updater type with the factory.... return 0; } - updater = s_factories[ type ]->create( pl, key ); + updater = s_factories[ info.type ]->create( pl, info.customData ); return updater; } @@ -72,13 +73,19 @@ PlaylistUpdaterInterface::PlaylistUpdaterInterface( const playlist_ptr& pl ) void PlaylistUpdaterInterface::save() { + if ( m_playlist.isNull() ) + return; + TomahawkSettings* s = TomahawkSettings::instance(); - const QString key = QString( "playlistupdaters/%1" ).arg( m_playlist->guid() ); - if ( !s->contains( QString( "%1/type" ).arg( key ) ) ) - { - s->setValue( QString( "%1/type" ).arg( key ), type() ); - } - saveToSettings( key ); + + SerializedUpdaters updaters = s->playlistUpdaters(); + + SerializedUpdater updater = updaters.value( m_playlist ->guid() ); + updater.type = type(); + updater.customData = m_extraData; + updaters[ m_playlist->guid() ] = updater; + + s->setPlaylistUpdaters( updaters ); } void @@ -88,9 +95,27 @@ PlaylistUpdaterInterface::remove() return; TomahawkSettings* s = TomahawkSettings::instance(); - const QString key = QString( "playlistupdaters/%1" ).arg( m_playlist->guid() ); - removeFromSettings( key ); - s->remove( QString( "%1/type" ).arg( key ) ); + + SerializedUpdaters updaters = s->playlistUpdaters(); + if ( updaters.remove( m_playlist->guid() ) ) + s->setPlaylistUpdaters( updaters ); + + aboutToDelete(); deleteLater(); } + + +QVariantHash +PlaylistUpdaterInterface::settings() const +{ + return m_extraData; +} + + +void +PlaylistUpdaterInterface::saveSettings( const QVariantHash& settings ) +{ + m_extraData = settings; + save(); +} diff --git a/src/libtomahawk/playlist/PlaylistUpdaterInterface.h b/src/libtomahawk/playlist/PlaylistUpdaterInterface.h index 42d0225b1..6ea530a2a 100644 --- a/src/libtomahawk/playlist/PlaylistUpdaterInterface.h +++ b/src/libtomahawk/playlist/PlaylistUpdaterInterface.h @@ -46,10 +46,10 @@ public: // used when loading/saving from settings struct SerializedUpdater { QString type; - bool sync; QVariantHash customData; - SerializedUpdater( const QString& t, bool s, const QVariantHash cd ) : type( t ), sync( s ), customData( cd ) {} + SerializedUpdater( const QString& t, const QVariantHash cd ) : type( t ), customData( cd ) {} + SerializedUpdater() {} }; typedef QHash< QString, SerializedUpdater > SerializedUpdaters; @@ -89,11 +89,14 @@ public slots: void save(); protected: - virtual void saveToSettings( const QString& group ) const = 0; - virtual void removeFromSettings( const QString& group ) const = 0; + virtual void aboutToDelete() {} + + QVariantHash settings() const; + void saveSettings( const QVariantHash& settings ); private: playlist_ptr m_playlist; + QVariantHash m_extraData; static QMap< QString, PlaylistUpdaterFactory* > s_factories; }; @@ -106,9 +109,12 @@ public: virtual ~PlaylistUpdaterFactory() {} virtual QString type() const = 0; - virtual PlaylistUpdaterInterface* create( const playlist_ptr&, const QString& settingsKey ) = 0; + virtual PlaylistUpdaterInterface* create( const playlist_ptr&, const QVariantHash& settings ) = 0; }; } +Q_DECLARE_METATYPE( Tomahawk::PlaylistUpdaterInterface::SerializedUpdater ); +Q_DECLARE_METATYPE( Tomahawk::PlaylistUpdaterInterface::SerializedUpdaters ); + #endif // PLAYLISTUPDATERINTERFACE_H diff --git a/src/libtomahawk/playlist/XspfUpdater.cpp b/src/libtomahawk/playlist/XspfUpdater.cpp index 9259fa6e3..01f7dda71 100644 --- a/src/libtomahawk/playlist/XspfUpdater.cpp +++ b/src/libtomahawk/playlist/XspfUpdater.cpp @@ -20,7 +20,6 @@ #include "Playlist.h" #include "utils/XspfLoader.h" -#include "TomahawkSettings.h" #include "Pipeline.h" #include "utils/TomahawkUtils.h" @@ -33,11 +32,11 @@ using namespace Tomahawk; PlaylistUpdaterInterface* -XspfUpdaterFactory::create( const playlist_ptr &pl, const QString& settingsKey ) +XspfUpdaterFactory::create( const playlist_ptr &pl, const QVariantHash& settings ) { - const bool autoUpdate = TomahawkSettings::instance()->value( QString( "%1/autoupdate" ).arg( settingsKey ) ).toBool(); - const int interval = TomahawkSettings::instance()->value( QString( "%1/interval" ).arg( settingsKey ) ).toInt(); - const QString url = TomahawkSettings::instance()->value( QString( "%1/xspfurl" ).arg( settingsKey ) ).toString(); + const bool autoUpdate = settings.value( "autoupdate" ).toBool(); + const int interval = settings.value( "interval" ).toInt(); + const QString url = settings.value( "xspfurl" ).toString(); XspfUpdater* updater = new XspfUpdater( pl, interval, autoUpdate, url ); @@ -113,24 +112,6 @@ XspfUpdater::playlistLoaded( const QList& newEntries ) } -void -XspfUpdater::saveToSettings( const QString& group ) const -{ - TomahawkSettings::instance()->setValue( QString( "%1/autoupdate" ).arg( group ), m_autoUpdate ); - TomahawkSettings::instance()->setValue( QString( "%1/interval" ).arg( group ), m_timer->interval() ); - TomahawkSettings::instance()->setValue( QString( "%1/xspfurl" ).arg( group ), m_url ); -} - - -void -XspfUpdater::removeFromSettings( const QString& group ) const -{ - TomahawkSettings::instance()->remove( QString( "%1/autoupdate" ).arg( group ) ); - TomahawkSettings::instance()->remove( QString( "%1/interval" ).arg( group ) ); - TomahawkSettings::instance()->remove( QString( "%1/xspfurl" ).arg( group ) ); -} - - void XspfUpdater::setAutoUpdate( bool autoUpdate ) { @@ -141,8 +122,9 @@ XspfUpdater::setAutoUpdate( bool autoUpdate ) else m_timer->stop(); - const QString key = QString( "playlistupdaters/%1/autoupdate" ).arg( playlist()->guid() ); - TomahawkSettings::instance()->setValue( key, m_autoUpdate ); + QVariantHash s = settings(); + s[ "autoupdate" ] = m_autoUpdate; + saveSettings( s ); // Update immediately as well if ( m_autoUpdate ) @@ -152,8 +134,9 @@ XspfUpdater::setAutoUpdate( bool autoUpdate ) void XspfUpdater::setInterval( int intervalMsecs ) { - const QString key = QString( "playlistupdaters/%1/interval" ).arg( playlist()->guid() ); - TomahawkSettings::instance()->setValue( key, intervalMsecs ); + QVariantHash s = settings(); + s[ "interval" ] = intervalMsecs; + saveSettings( s ); if ( !m_timer ) m_timer = new QTimer( this ); diff --git a/src/libtomahawk/playlist/XspfUpdater.h b/src/libtomahawk/playlist/XspfUpdater.h index e797386bb..cbe875119 100644 --- a/src/libtomahawk/playlist/XspfUpdater.h +++ b/src/libtomahawk/playlist/XspfUpdater.h @@ -52,10 +52,6 @@ public slots: void updateNow(); void setAutoUpdate( bool autoUpdate ); -protected: - void saveToSettings( const QString& group ) const; - void removeFromSettings(const QString& group) const; - private slots: void playlistLoaded( const QList & ); @@ -75,7 +71,7 @@ public: XspfUpdaterFactory() {} virtual QString type() const { return "xspf"; } - virtual PlaylistUpdaterInterface* create( const playlist_ptr& pl, const QString& settingsKey ); + virtual PlaylistUpdaterInterface* create( const playlist_ptr& pl, const QVariantHash& settings ); }; }