diff --git a/src/libtomahawk/Album.cpp b/src/libtomahawk/Album.cpp index 4e3dc61fd..3671fc170 100644 --- a/src/libtomahawk/Album.cpp +++ b/src/libtomahawk/Album.cpp @@ -32,6 +32,8 @@ using namespace Tomahawk; Album::~Album() { + m_ownRef.clear(); + #ifndef ENABLE_HEADLESS delete m_cover; #endif @@ -65,6 +67,8 @@ Album::get( unsigned int id, const QString& name, const Tomahawk::artist_ptr& ar } album_ptr a = album_ptr( new Album( id, name, artist ), &QObject::deleteLater ); + a->setWeakRef( a.toWeakRef() ); + if ( id > 0 ) s_albums.insert( id, a ); @@ -87,13 +91,9 @@ Album::Album( unsigned int id, const QString& name, const Tomahawk::artist_ptr& void -Album::onTracksAdded( const QList<Tomahawk::query_ptr>& tracks ) +Album::onTracksLoaded( Tomahawk::ModelMode mode, const Tomahawk::collection_ptr& collection ) { - Tomahawk::AlbumPlaylistInterface* api = dynamic_cast< Tomahawk::AlbumPlaylistInterface* >( playlistInterface().data() ); - if ( api ) - api->addQueries( tracks ); - - emit tracksAdded( tracks ); + emit tracksAdded( playlistInterface( mode, collection )->tracks(), mode, collection ); } @@ -206,12 +206,25 @@ Album::infoSystemFinished( const QString& target ) Tomahawk::playlistinterface_ptr -Album::playlistInterface() +Album::playlistInterface( ModelMode mode, const Tomahawk::collection_ptr& collection ) { - if ( m_playlistInterface.isNull() ) + playlistinterface_ptr pli = m_playlistInterface[ mode ][ collection ]; + + if ( pli.isNull() ) { - m_playlistInterface = Tomahawk::playlistinterface_ptr( new Tomahawk::AlbumPlaylistInterface( this ) ); + pli = Tomahawk::playlistinterface_ptr( new Tomahawk::AlbumPlaylistInterface( this, mode, collection ) ); + connect( pli.data(), SIGNAL( tracksLoaded( Tomahawk::ModelMode, Tomahawk::collection_ptr ) ), + SLOT( onTracksLoaded( Tomahawk::ModelMode, Tomahawk::collection_ptr ) ) ); + + m_playlistInterface[ mode ][ collection ] = pli; } - return m_playlistInterface; + return pli; +} + + +QList<Tomahawk::query_ptr> +Album::tracks( ModelMode mode, const Tomahawk::collection_ptr& collection ) +{ + return playlistInterface( mode, collection )->tracks(); } diff --git a/src/libtomahawk/Album.h b/src/libtomahawk/Album.h index a7f4f8902..baef2b235 100644 --- a/src/libtomahawk/Album.h +++ b/src/libtomahawk/Album.h @@ -55,15 +55,19 @@ public: #endif bool infoLoaded() const { return m_infoLoaded; } - Tomahawk::playlistinterface_ptr playlistInterface(); + QList<Tomahawk::query_ptr> tracks( ModelMode mode = Mixed, const Tomahawk::collection_ptr& collection = Tomahawk::collection_ptr() ); + Tomahawk::playlistinterface_ptr playlistInterface( ModelMode mode, const Tomahawk::collection_ptr& collection = Tomahawk::collection_ptr() ); + + QWeakPointer< Tomahawk::Album > weakRef() { return m_ownRef; } + void setWeakRef( QWeakPointer< Tomahawk::Album > weakRef ) { m_ownRef = weakRef; } signals: - void tracksAdded( const QList<Tomahawk::query_ptr>& tracks ); + void tracksAdded( const QList<Tomahawk::query_ptr>& tracks, Tomahawk::ModelMode mode, const Tomahawk::collection_ptr& collection ); void updated(); void coverChanged(); private slots: - void onTracksAdded( const QList<Tomahawk::query_ptr>& tracks ); + void onTracksLoaded(Tomahawk::ModelMode mode, const Tomahawk::collection_ptr& collection ); void infoSystemInfo( const Tomahawk::InfoSystem::InfoRequestData& requestData, const QVariant& output ); void infoSystemFinished( const QString& target ); @@ -75,6 +79,7 @@ private: QString m_name; artist_ptr m_artist; QByteArray m_coverBuffer; + bool m_infoLoaded; mutable bool m_infoLoading; mutable QString m_uuid; @@ -84,9 +89,13 @@ private: mutable QHash< int, QPixmap > m_coverCache; #endif - Tomahawk::playlistinterface_ptr m_playlistInterface; + QHash< Tomahawk::ModelMode, QHash< Tomahawk::collection_ptr, Tomahawk::playlistinterface_ptr > > m_playlistInterface; + + QWeakPointer< Tomahawk::Album > m_ownRef; }; } // ns +Q_DECLARE_METATYPE( Tomahawk::album_ptr ) + #endif