From d2bd6b87443d457db298131e97691ea38c961698 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Sun, 11 Sep 2011 16:40:45 -0400 Subject: [PATCH] Support resolver icons --- src/AtticaManager.cpp | 83 ++++++++++++++++++++++++++++++++++++++++ src/AtticaManager.h | 11 +++++- src/GetNewStuffModel.cpp | 2 +- src/GetNewStuffModel.h | 1 + 4 files changed, 95 insertions(+), 2 deletions(-) diff --git a/src/AtticaManager.cpp b/src/AtticaManager.cpp index e5d477ba5..32f5c61fb 100644 --- a/src/AtticaManager.cpp +++ b/src/AtticaManager.cpp @@ -41,8 +41,58 @@ AtticaManager::AtticaManager( QObject* parent ) // resolvers m_manager.addProviderFile( QUrl( "http://bakery.tomahawk-player.org:10480/resolvers/providers.xml" ) ); + QTimer::singleShot( 0, this, SLOT( loadPixmapsFromCache() ) ); } +AtticaManager::~AtticaManager() +{ + savePixmapsToCache(); +} + +void +AtticaManager::loadPixmapsFromCache() +{ + QDir cacheDir = TomahawkUtils::appDataDir(); + if ( !cacheDir.cd( "atticacache" ) ) // doesn't exist, no cache + return; + + foreach ( const QString& file, cacheDir.entryList( QStringList() << "*.png", QDir::Files | QDir::NoSymLinks ) ) + { + // load all the pixmaps + QFileInfo info( file ); + QPixmap icon( cacheDir.absoluteFilePath( file ) ); + m_resolversIconCache[ info.baseName() ] = icon; + } +} + +void +AtticaManager::savePixmapsToCache() +{ + QDir cacheDir = TomahawkUtils::appDataDir(); + if ( !cacheDir.cd( "atticacache" ) ) // doesn't exist, create + { + cacheDir.mkdir( "atticacache" ); + cacheDir.cd( "atticache" ); + } + + foreach( const QString& id, m_resolversIconCache.keys() ) + { + const QString filename = cacheDir.absoluteFilePath( QString( "%1.png" ).arg( id ) ); + if ( !m_resolversIconCache[ id ].save( filename ) ) + { + tLog() << "Failed to open cache file for writing:" << filename; + continue; + } + } +} + +QPixmap +AtticaManager::iconForResolver( const Content& resolver ) +{ + return m_resolversIconCache.value( resolver.id(), QPixmap() ); +} + + Content::List AtticaManager::resolvers() const { @@ -99,8 +149,41 @@ AtticaManager::resolversList( BaseJob* j ) m_resolvers = job->itemList(); m_resolverStates = TomahawkSettings::instance()->atticaResolverStates(); + + // load icon cache from disk, and fetch any we are missing + foreach ( Content resolver, m_resolvers ) + { + if ( !m_resolversIconCache.contains( resolver.id() ) && !resolver.icons().isEmpty() ) + { + QNetworkReply* fetch = TomahawkUtils::nam()->get( QNetworkRequest( resolver.icons().first().url() ) ); + fetch->setProperty( "resolverId", resolver.id() ); + + connect( fetch, SIGNAL( finished() ), this, SLOT( resolverIconFetched() ) ); + } + } } +void +AtticaManager::resolverIconFetched() +{ + QNetworkReply* reply = qobject_cast< QNetworkReply* >( sender() ); + Q_ASSERT( reply ); + + const QString resolverId = reply->property( "resolverId" ).toString(); + + if ( !reply->error() == QNetworkReply::NoError ) + { + tLog() << "Failed to fetch resolver icon image:" << reply->errorString(); + return; + } + + QByteArray data = reply->readAll(); + QPixmap icon; + icon.loadFromData( data ); + m_resolversIconCache[ resolverId ] = icon; +} + + void AtticaManager::installResolver( const Content& resolver ) { diff --git a/src/AtticaManager.h b/src/AtticaManager.h index 8480e724c..2399d58b1 100644 --- a/src/AtticaManager.h +++ b/src/AtticaManager.h @@ -28,6 +28,7 @@ #include #include #include +#include #endif class AtticaManager : public QObject @@ -53,13 +54,14 @@ public: } explicit AtticaManager ( QObject* parent = 0 ); - virtual ~AtticaManager() {} + virtual ~AtticaManager(); #ifdef LIBATTICA_FOUND bool resolversLoaded() const; Attica::Content::List resolvers() const; ResolverState resolverState( const Attica::Content& resolver ) const; + QPixmap iconForResolver( const Attica::Content& id ); // Looks up in icon cache void installResolver( const Attica::Content& resolver ); void uninstallResolver( const Attica::Content& resolver ); @@ -79,6 +81,9 @@ private slots: void resolverDownloadFinished( Attica::BaseJob* ); void payloadFetched(); + void loadPixmapsFromCache(); + void savePixmapsToCache(); + private: QString extractPayload( const QString& filename, const QString& resolverId ) const; void doResolverRemove( const QString& id ) const; @@ -88,10 +93,14 @@ private: Attica::Provider m_resolverProvider; Attica::Content::List m_resolvers; + QHash m_resolversIconCache; + StateHash m_resolverStates; #endif static AtticaManager* s_instance; + public slots: + void resolverIconFetched(); }; #endif // ATTICAMANAGER_H diff --git a/src/GetNewStuffModel.cpp b/src/GetNewStuffModel.cpp index cf7040d0a..8fc539c47 100644 --- a/src/GetNewStuffModel.cpp +++ b/src/GetNewStuffModel.cpp @@ -76,7 +76,7 @@ GetNewStuffModel::data( const QModelIndex& index, int role ) const case Qt::DisplayRole: return resolver.name(); case Qt::DecorationRole: - return QVariant::fromValue< QPixmap >( QPixmap( RESPATH "images/delegate-add.png" ) ); + return QVariant::fromValue< QPixmap >( AtticaManager::instance()->iconForResolver( resolver ) ); case DownloadUrlRole: // TODO return QUrl(); diff --git a/src/GetNewStuffModel.h b/src/GetNewStuffModel.h index a44e3f274..60e2e9104 100644 --- a/src/GetNewStuffModel.h +++ b/src/GetNewStuffModel.h @@ -22,6 +22,7 @@ #include #include +#include class GetNewStuffModel: public QAbstractListModel {