diff --git a/src/libtomahawk/Album.cpp b/src/libtomahawk/Album.cpp index cf5c234ea..835fc3d08 100644 --- a/src/libtomahawk/Album.cpp +++ b/src/libtomahawk/Album.cpp @@ -237,6 +237,38 @@ Album::sortname() const } +QString +Album::purchaseUrl() const +{ + Q_D( const Album ); + if ( !d->purchaseUrlLoaded ) + { + Tomahawk::InfoSystem::InfoStringHash albumInfo; + albumInfo["artist"] = d->artist->name(); + albumInfo["album"] = d->name; + + Tomahawk::InfoSystem::InfoRequestData requestData; + requestData.caller = infoid(); + requestData.type = Tomahawk::InfoSystem::InfoAlbumPurchaseUrl; + requestData.input = QVariant::fromValue< Tomahawk::InfoSystem::InfoStringHash >( albumInfo ); + requestData.customData = QVariantMap(); + requestData.allSources = true; + + connect( Tomahawk::InfoSystem::InfoSystem::instance(), + SIGNAL( info( Tomahawk::InfoSystem::InfoRequestData, QVariant ) ), + SLOT( infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData, QVariant ) ) ); + + connect( Tomahawk::InfoSystem::InfoSystem::instance(), + SIGNAL( finished( QString ) ), + SLOT( infoSystemFinished( QString ) ) ); + + Tomahawk::InfoSystem::InfoSystem::instance()->getInfo( requestData ); + } + + return d->purchaseUrl; +} + + QPixmap Album::cover( const QSize& size, bool forceLoad ) const { @@ -318,8 +350,19 @@ void Album::infoSystemInfo( const Tomahawk::InfoSystem::InfoRequestData& requestData, const QVariant& output ) { Q_D( Album ); - if ( requestData.caller != infoid() || - requestData.type != Tomahawk::InfoSystem::InfoAlbumCoverArt ) + if ( requestData.caller != infoid() ) + return; + + if ( requestData.type == Tomahawk::InfoSystem::InfoAlbumPurchaseUrl && output.isValid() ) + { + QVariantMap returnedData = output.value< QVariantMap >(); + d->purchaseUrlLoaded = true; + d->purchaseUrl = returnedData["url"].toString(); + emit updated(); + return; + } + + if ( requestData.type != Tomahawk::InfoSystem::InfoAlbumCoverArt ) { return; } diff --git a/src/libtomahawk/Album.h b/src/libtomahawk/Album.h index a3f5a3770..33d347385 100644 --- a/src/libtomahawk/Album.h +++ b/src/libtomahawk/Album.h @@ -61,6 +61,7 @@ public: artist_ptr artist() const; QPixmap cover( const QSize& size, bool forceLoad = true ) const; bool coverLoaded() const; + QString purchaseUrl() const; QList 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() ); diff --git a/src/libtomahawk/Album_p.h b/src/libtomahawk/Album_p.h index e46b200d4..256428a64 100644 --- a/src/libtomahawk/Album_p.h +++ b/src/libtomahawk/Album_p.h @@ -67,6 +67,9 @@ private: artist_ptr artist; + mutable bool purchaseUrlLoaded; + mutable QString purchaseUrl; + mutable bool coverLoaded; mutable bool coverLoading; mutable QString uuid; diff --git a/src/libtomahawk/playlist/TrackDetailView.cpp b/src/libtomahawk/playlist/TrackDetailView.cpp index 28ecb537f..7a3897f3e 100644 --- a/src/libtomahawk/playlist/TrackDetailView.cpp +++ b/src/libtomahawk/playlist/TrackDetailView.cpp @@ -19,6 +19,8 @@ #include "TrackDetailView.h" #include +#include +#include #include #include #include @@ -118,11 +120,21 @@ TrackDetailView::TrackDetailView( QWidget* parent ) TomahawkStyle::styleScrollBar( m_resultsScrollArea->verticalScrollBar() ); m_resultsScrollArea->hide(); + m_buyButton = new QPushButton; + m_buyButton->setStyleSheet( "QPushButton:hover { font-size: 12px; color: #2b2b2b; background: #f8f8f8; border-style: outset; border-width: 2px; border-color: #2b2b2b; }" + "QPushButton { font-size: 12px; color: #ffffff; background-color: #ed0677; border-width: 0px; }" ); + m_buyButton->setMinimumHeight( 30 ); + m_buyButton->setText( tr( "BUY ALBUM" ) ); + m_buyButton->setVisible( false ); + connect( m_buyButton, SIGNAL( clicked() ), SLOT( onBuyButtonClicked() ) ); + QVBoxLayout* layout = new QVBoxLayout; TomahawkUtils::unmarginLayout( layout ); layout->addWidget( m_playableCover ); layout->addSpacerItem( new QSpacerItem( 0, 8, QSizePolicy::Minimum, QSizePolicy::Fixed ) ); layout->addWidget( m_nameLabel ); + layout->addSpacerItem( new QSpacerItem( 0, 4, QSizePolicy::Minimum, QSizePolicy::Fixed ) ); + layout->addWidget( m_buyButton ); layout->addWidget( m_dateLabel ); layout->addWidget( m_infoBox ); layout->addSpacerItem( new QSpacerItem( 0, 32, QSizePolicy::Minimum, QSizePolicy::Fixed ) ); @@ -154,6 +166,10 @@ TrackDetailView::setQuery( const Tomahawk::query_ptr& query ) { if ( m_query ) { + if ( m_query->track()->albumPtr() && !m_query->track()->albumPtr()->name().isEmpty() ) + { + disconnect( m_query->track()->albumPtr().data(), SIGNAL( updated() ), this, SLOT( onAlbumUpdated() ) ); + } disconnect( m_query->track().data(), SIGNAL( updated() ), this, SLOT( onCoverUpdated() ) ); disconnect( m_query->track().data(), SIGNAL( socialActionsLoaded() ), this, SLOT( onSocialActionsLoaded() ) ); disconnect( m_query.data(), SIGNAL( resultsChanged() ), this, SLOT( onResultsChanged() ) ); @@ -176,6 +192,9 @@ TrackDetailView::setQuery( const Tomahawk::query_ptr& query ) if ( m_query->track()->albumPtr() && !m_query->track()->albumPtr()->name().isEmpty() ) { + connect( m_query->track()->albumPtr().data(), SIGNAL( updated() ), SLOT( onAlbumUpdated() ) ); + onAlbumUpdated(); + m_nameLabel->setType( QueryLabel::Album ); m_nameLabel->setAlbum( m_query->track()->albumPtr() ); } @@ -191,6 +210,28 @@ TrackDetailView::setQuery( const Tomahawk::query_ptr& query ) } +void +TrackDetailView::onAlbumUpdated() +{ + if ( m_query && m_query->track()->albumPtr() ) + { + m_buyButton->setVisible( !m_query->track()->albumPtr()->purchaseUrl().isEmpty() ); + } + else + m_buyButton->setVisible( false ); +} + + +void +TrackDetailView::onBuyButtonClicked() +{ + if ( m_query && m_query->track()->albumPtr() ) + { + QDesktopServices::openUrl( QUrl( m_query->track()->albumPtr()->purchaseUrl() ) ); + } +} + + void TrackDetailView::onCoverUpdated() { diff --git a/src/libtomahawk/playlist/TrackDetailView.h b/src/libtomahawk/playlist/TrackDetailView.h index a3dd9191c..3621509f6 100644 --- a/src/libtomahawk/playlist/TrackDetailView.h +++ b/src/libtomahawk/playlist/TrackDetailView.h @@ -30,6 +30,7 @@ class CaptionLabel; class PlayableCover; class QueryLabel; class QScrollArea; +class QPushButton; class DLLEXPORT TrackDetailView : public QWidget, private TomahawkUtils::DpiScaler { @@ -50,9 +51,11 @@ protected: protected slots: private slots: + void onAlbumUpdated(); void onCoverUpdated(); void onSocialActionsLoaded(); void onResultsChanged(); + void onBuyButtonClicked(); private: void setSocialActions(); @@ -65,6 +68,7 @@ private: QLabel* m_lovedIcon; QLabel* m_lovedLabel; CaptionLabel* m_resultsBoxLabel; + QPushButton* m_buyButton; QWidget* m_infoBox; QWidget* m_resultsBox; diff --git a/src/libtomahawk/resolvers/ScriptAccount.cpp b/src/libtomahawk/resolvers/ScriptAccount.cpp index 33e8d136c..e9e6ac606 100644 --- a/src/libtomahawk/resolvers/ScriptAccount.cpp +++ b/src/libtomahawk/resolvers/ScriptAccount.cpp @@ -156,7 +156,6 @@ ScriptAccount::reportScriptJobResult( const QVariantMap& result ) if ( result[ "error"].isNull() ) { const QVariantMap data = result[ "data" ].toMap(); - job->reportResults( data ); } else diff --git a/src/libtomahawk/resolvers/ScriptInfoPlugin.cpp b/src/libtomahawk/resolvers/ScriptInfoPlugin.cpp index d7e857450..7a265ef36 100644 --- a/src/libtomahawk/resolvers/ScriptInfoPlugin.cpp +++ b/src/libtomahawk/resolvers/ScriptInfoPlugin.cpp @@ -169,7 +169,7 @@ ScriptInfoPlugin::onNotInCacheRequestDone( const QVariantMap& result ) default: { - emit info( requestData, result[ "data" ].toMap() ); + emit info( requestData, resultData ); emit updateCache( criteria, result[ "maxAge" ].toLongLong(), requestData.type, resultData ); break; } diff --git a/src/libtomahawk/viewpages/CollectionViewPage.cpp b/src/libtomahawk/viewpages/CollectionViewPage.cpp index 3f366ebda..16ed2014e 100644 --- a/src/libtomahawk/viewpages/CollectionViewPage.cpp +++ b/src/libtomahawk/viewpages/CollectionViewPage.cpp @@ -122,7 +122,7 @@ CollectionViewPage::CollectionViewPage( const Tomahawk::collection_ptr& collecti if ( collection->backendType() == Collection::ScriptCollectionType ) { - QAbstractButton* downloadButton = m_header->addButton( tr( "Download All" ) ); + QAbstractButton* downloadButton = m_header->addButton( tr( "DOWNLOAD ALL" ) ); connect( downloadButton, SIGNAL( clicked() ), SLOT( onDownloadAll() ) ); } diff --git a/src/libtomahawk/widgets/BasicHeader.cpp b/src/libtomahawk/widgets/BasicHeader.cpp index 35c307c1f..ab62697b4 100644 --- a/src/libtomahawk/widgets/BasicHeader.cpp +++ b/src/libtomahawk/widgets/BasicHeader.cpp @@ -124,6 +124,12 @@ QAbstractButton* BasicHeader::addButton( const QString& text ) { QPushButton* button = new QPushButton( this ); + + button->setStyleSheet( "QPushButton:hover { font-size: 12px; color: #2b2b2b; background: #f8f8f8; border-style: outset; border-width: 2px; border-color: #2b2b2b; }" + "QPushButton { font-size: 12px; color: #ffffff; background-color: #ed0677; border-width: 0px; }" ); + button->setMinimumHeight( 30 ); + button->setMinimumWidth( 132 ); + button->setText( text ); ui->horizontalLayout->addWidget( button );