diff --git a/src/libtomahawk-widgets/NetworkActivityWidget.cpp b/src/libtomahawk-widgets/NetworkActivityWidget.cpp index 6f81a45a5..49e4d6ba8 100644 --- a/src/libtomahawk-widgets/NetworkActivityWidget.cpp +++ b/src/libtomahawk-widgets/NetworkActivityWidget.cpp @@ -22,16 +22,24 @@ #include "audio/AudioEngine.h" #include "database/Database.h" #include "database/DatabaseCommand_NetworkCharts.h" -#include "playlist/PlaylistChartItemDelegate.h" +#include "database/DatabaseCommand_TrendingTracks.h" +#include "playlist/AlbumItemDelegate.h" +// #include "playlist/PlaylistChartItemDelegate.h" +#include "playlist/ViewHeader.h" #include "utils/AnimatedSpinner.h" +#include "utils/ImageRegistry.h" #include "utils/Logger.h" +#include "utils/TomahawkStyle.h" #include "utils/TomahawkUtilsGui.h" +#include "widgets/OverlayWidget.h" #include #include +#include #include -#define NETWORKCHARTS_NUM_TRACKS 100 +#define NETWORKCHARTS_NUM_TRACKS 20 +#define TRENDING_TRACKS_NUM 3 using namespace Tomahawk; using namespace Tomahawk::Widgets; @@ -40,28 +48,17 @@ NetworkActivityWidget::NetworkActivityWidget( QWidget* parent ) : QWidget( parent ) , d_ptr( new NetworkActivityWidgetPrivate ( this ) ) { - d_func()->ui->setupUi( this ); + Q_D( NetworkActivityWidget ); + QWidget* widget = new QWidget(); - TomahawkUtils::unmarginLayout( layout() ); - TomahawkUtils::unmarginLayout( d_func()->ui->stackLeft->layout() ); - TomahawkUtils::unmarginLayout( d_func()->ui->verticalLayout_2->layout() ); - TomahawkUtils::unmarginLayout( d_func()->ui->horizontalLayout->layout() ); - TomahawkUtils::unmarginLayout( d_func()->ui->breadCrumbLeft->layout() ); + d->ui->setupUi( widget ); - d_func()->crumbModelLeft = new QStandardItemModel( this ); - d_func()->sortedProxy = new QSortFilterProxyModel( this ); + d->crumbModelLeft = new QStandardItemModel( this ); + d->sortedProxy = new QSortFilterProxyModel( this ); - d_func()->ui->breadCrumbLeft->setRootIcon( TomahawkUtils::defaultPixmap( TomahawkUtils::NetworkActivity, TomahawkUtils::Original ) ); + // d_func()->ui->breadCrumbLeft->setRootIcon( TomahawkUtils::defaultPixmap( TomahawkUtils::NetworkActivity, TomahawkUtils::Original ) ); connect( d_func()->ui->breadCrumbLeft, SIGNAL( activateIndex( QModelIndex ) ), SLOT( leftCrumbIndexChanged( QModelIndex ) ) ); - d_func()->ui->tracksViewLeft->setHeaderHidden( true ); - d_func()->ui->tracksViewLeft->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); - PlaylistChartItemDelegate* del = new PlaylistChartItemDelegate( d_func()->ui->tracksViewLeft, d_func()->ui->tracksViewLeft->proxyModel() ); - d_func()->ui->tracksViewLeft->setPlaylistItemDelegate( del ); - d_func()->ui->tracksViewLeft->setUniformRowHeights( false ); - - d_func()->playlistInterface = d_func()->ui->tracksViewLeft->playlistInterface(); - // Build up breadcrumb QStandardItem* rootItem = d_func()->crumbModelLeft->invisibleRootItem(); QStandardItem* chartItem = new QStandardItem( tr( "Charts" ) ); @@ -81,6 +78,111 @@ NetworkActivityWidget::NetworkActivityWidget( QWidget* parent ) d_func()->sortedProxy->setSourceModel( d_func()->crumbModelLeft ); d_func()->ui->breadCrumbLeft->setModel( d_func()->sortedProxy ); d_func()->ui->breadCrumbLeft->setVisible( true ); + + + { + // d->ui->tracksViewLeft->setHeaderHidden( true ); + // d->ui->tracksViewLeft->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + // PlaylistChartItemDelegate* del = new PlaylistChartItemDelegate( d->ui->tracksViewLeft, d->ui->tracksViewLeft->proxyModel() ); + AlbumItemDelegate* del = new AlbumItemDelegate( d->ui->tracksViewLeft, d->ui->tracksViewLeft->proxyModel(), true ); + d->ui->tracksViewLeft->setPlaylistItemDelegate( del ); + // d->ui->tracksViewLeft->setUniformRowHeights( false ); + // d->ui->tracksViewLeft->overlay()->setEnabled( false ); + d->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Short ); + d->ui->tracksViewLeft->setAutoResize( true ); + d->ui->tracksViewLeft->setAlternatingRowColors( false ); + d->ui->tracksViewLeft->setSortingEnabled( false ); + d->ui->tracksViewLeft->setEmptyTip( tr( "Sorry, we could not find any top hits for this artist!" ) ); + + d->playlistInterface = d->ui->tracksViewLeft->playlistInterface(); + + QPalette p = d->ui->tracksViewLeft->palette(); + p.setColor( QPalette::Text, TomahawkStyle::PAGE_TRACKLIST_TRACK_SOLVED ); + p.setColor( QPalette::BrightText, TomahawkStyle::PAGE_TRACKLIST_TRACK_UNRESOLVED ); + p.setColor( QPalette::Foreground, TomahawkStyle::PAGE_TRACKLIST_NUMBER ); + p.setColor( QPalette::Highlight, TomahawkStyle::PAGE_TRACKLIST_HIGHLIGHT ); + p.setColor( QPalette::HighlightedText, TomahawkStyle::PAGE_TRACKLIST_HIGHLIGHT_TEXT ); + + d->ui->tracksViewLeft->setPalette( p ); + d->ui->tracksViewLeft->setFrameShape( QFrame::NoFrame ); + d->ui->tracksViewLeft->setAttribute( Qt::WA_MacShowFocusRect, 0 ); + d->ui->tracksViewLeft->setStyleSheet( "QTreeView { background-color: transparent; }" ); + + TomahawkStyle::stylePageFrame( d->ui->chartsFrame ); + } + + + // Trending Tracks + { + d->trendingTracksModel = new PlaylistModel( d->ui->trendingTracksView ); + // TODO: + // m_tracksModel = new RecentlyPlayedModel( ui->tracksView, HISTORY_TRACK_ITEMS ); + d->ui->trendingTracksView->proxyModel()->setStyle( PlayableProxyModel::Short ); + d->ui->trendingTracksView->overlay()->setEnabled( false ); + d->ui->trendingTracksView->setPlaylistModel( d->trendingTracksModel ); + d->ui->trendingTracksView->setAutoResize( true ); + d->ui->trendingTracksView->setAlternatingRowColors( false ); + + QPalette p = d->ui->trendingTracksView->palette(); + p.setColor( QPalette::Text, TomahawkStyle::PAGE_TRACKLIST_TRACK_SOLVED ); + p.setColor( QPalette::BrightText, TomahawkStyle::PAGE_TRACKLIST_TRACK_UNRESOLVED ); + p.setColor( QPalette::Foreground, TomahawkStyle::PAGE_TRACKLIST_NUMBER ); + p.setColor( QPalette::Highlight, TomahawkStyle::PAGE_TRACKLIST_HIGHLIGHT ); + p.setColor( QPalette::HighlightedText, TomahawkStyle::PAGE_TRACKLIST_HIGHLIGHT_TEXT ); + + d->ui->trendingTracksView->setPalette( p ); + d->ui->trendingTracksView->setFrameShape( QFrame::NoFrame ); + d->ui->trendingTracksView->setAttribute( Qt::WA_MacShowFocusRect, 0 ); + d->ui->trendingTracksView->setStyleSheet( "QTreeView { background-color: transparent; }" ); + + TomahawkStyle::stylePageFrame( d->ui->trendingTracksFrame ); + } + { + QFont f = d->ui->trendingTracksLabel->font(); + f.setFamily( "Pathway Gothic One" ); + + QPalette p = d->ui->trendingTracksLabel->palette(); + p.setColor( QPalette::Foreground, TomahawkStyle::PAGE_CAPTION ); + + d->ui->trendingTracksLabel->setFont( f ); + d->ui->trendingTracksLabel->setPalette( p ); + } + + // Hot Playlists + { + TomahawkStyle::stylePageFrame( d->ui->hotPlaylistsFrame ); + + QFont f = d->ui->hotPlaylistsLabel->font(); + f.setFamily( "Pathway Gothic One" ); + + QPalette p = d->ui->hotPlaylistsLabel->palette(); + p.setColor( QPalette::Foreground, TomahawkStyle::PAGE_CAPTION ); + + d->ui->hotPlaylistsLabel->setFont( f ); + d->ui->hotPlaylistsLabel->setPalette( p ); + } + + { + QScrollArea* area = new QScrollArea(); + area->setWidgetResizable( true ); + area->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn ); + area->setWidget( widget ); + + QVBoxLayout* layout = new QVBoxLayout(); + layout->addWidget( area ); + setLayout( layout ); + TomahawkUtils::unmarginLayout( layout ); + } + + { + // Load trending tracks + qRegisterMetaType< QList< QPair< double,Tomahawk::track_ptr > > >("QList< QPair< double,Tomahawk::track_ptr > >"); + DatabaseCommand_TrendingTracks* dbcmd = new DatabaseCommand_TrendingTracks(); + dbcmd->setLimit( TRENDING_TRACKS_NUM ); + connect( dbcmd, SIGNAL( done( QList< QPair< double,Tomahawk::track_ptr > >) ), + SLOT( trendingTracks( QList< QPair< double,Tomahawk::track_ptr > > ) ) ); + Database::instance()->enqueue( dbcmd_ptr( dbcmd ) ); + } } @@ -97,6 +199,13 @@ NetworkActivityWidget::playlistInterface() const } +QPixmap +NetworkActivityWidget::pixmap() const +{ + return ImageRegistry::instance()->pixmap( RESPATH "images/network-activity.svg", QSize( 0, 0 ) ); +} + + bool NetworkActivityWidget::isBeingPlayed() const { @@ -177,6 +286,25 @@ NetworkActivityWidget::overallCharts( const QList& tracks ) } +void +NetworkActivityWidget::trendingTracks( const QList >& _tracks ) +{ + Q_D( NetworkActivityWidget ); + + d->trendingTracksModel->startLoading(); + QList tracks; + QList< QPair< double, track_ptr > >::const_iterator iter = _tracks.constBegin(); + const QList< QPair< double, track_ptr > >::const_iterator end = _tracks.constEnd(); + for(; iter != end; ++iter) + { + tracks << iter->second; + } + + d->trendingTracksModel->appendTracks( tracks ); + d->trendingTracksModel->finishLoading(); +} + + void NetworkActivityWidget::leftCrumbIndexChanged( const QModelIndex& index ) { @@ -309,9 +437,11 @@ NetworkActivityWidget::showOverallCharts() d_func()->activeView = OverallChart; if ( !d_func()->overallChartsModel.isNull() ) { - d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large ); + // d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large ); d_func()->ui->tracksViewLeft->setPlaylistModel( d_func()->overallChartsModel ); - d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 ); + d_func()->ui->tracksViewLeft->setAutoResize( true ); + // d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 ); + // d_func()->ui->tracksViewLeft->setAutoResize( true ); } else { diff --git a/src/libtomahawk-widgets/NetworkActivityWidget.h b/src/libtomahawk-widgets/NetworkActivityWidget.h index cfa87fed0..a1f29194d 100644 --- a/src/libtomahawk-widgets/NetworkActivityWidget.h +++ b/src/libtomahawk-widgets/NetworkActivityWidget.h @@ -51,9 +51,10 @@ public: virtual Tomahawk::playlistinterface_ptr playlistInterface() const; virtual QString title() const { return tr( "Network Activity" ); } - virtual QString description() const { return QString(); } + virtual QString description() const { return QString("Listening activity among your friends"); } + virtual QPixmap pixmap() const; - virtual bool showInfoBar() const { return false; } + virtual bool showInfoBar() const { return true; } virtual bool isBeingPlayed() const; virtual bool jumpToCurrentTrack(); @@ -65,6 +66,8 @@ private slots: void yearlyCharts( const QList& ); void overallCharts( const QList& ); + void trendingTracks( const QList< QPair< double,Tomahawk::track_ptr > >& tracks ); + void leftCrumbIndexChanged( const QModelIndex& ); private: diff --git a/src/libtomahawk-widgets/NetworkActivityWidget.ui b/src/libtomahawk-widgets/NetworkActivityWidget.ui index 6ed86a3c5..031080488 100644 --- a/src/libtomahawk-widgets/NetworkActivityWidget.ui +++ b/src/libtomahawk-widgets/NetworkActivityWidget.ui @@ -7,37 +7,153 @@ 0 0 875 - 513 + 520 - + + + 0 + + + 0 + - + + + + 10 + + + + + + + + + + + 20 + + + + Trending Tracks + + + + + + + + 0 + 0 + + + + + 320 + 0 + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + 20 + + + + Hot Playlists + + + + + + + + 0 + 0 + + + + + 320 + 0 + + + + + + + + + + + Qt::Vertical + + + + 20 + 100 + + + + + + - - - 0 - - - - - - - - 320 - 0 - - - - - - + + + + 0 + + + 0 + + + + + + + + + 0 + 0 + + + + + 320 + 0 + + + + + + + Tomahawk::Widgets::PlaylistWidget + QListWidget +
PlaylistWidget.h
+
PlaylistView QTreeView diff --git a/src/libtomahawk-widgets/NetworkActivityWidget_p.h b/src/libtomahawk-widgets/NetworkActivityWidget_p.h index a5f1302df..d11720dcb 100644 --- a/src/libtomahawk-widgets/NetworkActivityWidget_p.h +++ b/src/libtomahawk-widgets/NetworkActivityWidget_p.h @@ -44,6 +44,9 @@ private: QPointer monthlyChartsModel; QPointer yearlyChartsModel; QPointer overallChartsModel; + + QPointer trendingTracksModel; + Tomahawk::Widgets::NetworkActivityWidget::ViewType activeView; }; diff --git a/src/libtomahawk/CMakeLists.txt b/src/libtomahawk/CMakeLists.txt index cf6a6220d..8305ede8b 100644 --- a/src/libtomahawk/CMakeLists.txt +++ b/src/libtomahawk/CMakeLists.txt @@ -237,60 +237,60 @@ list(APPEND libSources database/DatabaseImpl.cpp database/DatabaseResolver.cpp database/DatabaseCommand.cpp - database/DatabaseCommandLoggable.cpp - database/DatabaseCommand_Resolve.cpp - database/DatabaseCommand_AllArtists.cpp - database/DatabaseCommand_AllAlbums.cpp - database/DatabaseCommand_AllTracks.cpp + database/DatabaseCommand_AddClientAuth.cpp database/DatabaseCommand_AddFiles.cpp + database/DatabaseCommand_AddSource.cpp + database/DatabaseCommand_AllAlbums.cpp + database/DatabaseCommand_AllArtists.cpp + database/DatabaseCommand_AllTracks.cpp + database/DatabaseCommand_ArtistStats.cpp + database/DatabaseCommand_ClientAuthValid.cpp + database/DatabaseCommand_CollectionAttributes.cpp + database/DatabaseCommand_CollectionStats.cpp + database/DatabaseCommand_CreateDynamicPlaylist.cpp + database/DatabaseCommand_CreatePlaylist.cpp + database/DatabaseCommand_DeleteDynamicPlaylist.cpp database/DatabaseCommand_DeleteFiles.cpp + database/DatabaseCommand_DeleteInboxEntry.cpp + database/DatabaseCommand_DeletePlaylist.cpp database/DatabaseCommand_DirMtimes.cpp database/DatabaseCommand_FileMTimes.cpp - database/DatabaseCommand_LoadFiles.cpp - database/DatabaseCommand_LogPlayback.cpp - database/DatabaseCommand_AddSource.cpp - database/DatabaseCommand_SourceOffline.cpp - database/DatabaseCommand_CollectionStats.cpp - database/DatabaseCommand_TrackStats.cpp - database/DatabaseCommand_ArtistStats.cpp - database/DatabaseCommand_LoadPlaylistEntries.cpp - database/DatabaseCommand_LoadInboxEntries.cpp - database/DatabaseCommand_ModifyPlaylist.cpp - database/DatabaseCommand_PlaybackHistory.cpp - database/DatabaseCommand_SetPlaylistRevision.cpp + database/DatabaseCommand_GenericSelect.cpp + database/DatabaseCommand_LoadAllAutoPlaylists.cpp database/DatabaseCommand_LoadAllPlaylists.cpp database/DatabaseCommand_LoadAllSortedPlaylists.cpp database/DatabaseCommand_LoadAllSources.cpp - database/DatabaseCommand_CreatePlaylist.cpp - database/DatabaseCommand_DeletePlaylist.cpp - database/DatabaseCommand_RenamePlaylist.cpp - database/DatabaseCommand_LoadOps.cpp - database/DatabaseCommand_UpdateSearchIndex.cpp - database/DatabaseCommand_SetDynamicPlaylistRevision.cpp - database/DatabaseCommand_CreateDynamicPlaylist.cpp + database/DatabaseCommand_LoadAllStations.cpp database/DatabaseCommand_LoadDynamicPlaylist.cpp database/DatabaseCommand_LoadDynamicPlaylistEntries.cpp - database/DatabaseCommand_LoadAllAutoPlaylists.cpp - database/DatabaseCommand_LoadAllStations.cpp - database/DatabaseCommand_DeleteDynamicPlaylist.cpp - database/DatabaseCommand_AddClientAuth.cpp - database/DatabaseCommand_ClientAuthValid.cpp - database/DatabaseCommand_SocialAction.cpp + database/DatabaseCommand_LoadFiles.cpp + database/DatabaseCommand_LoadInboxEntries.cpp + database/DatabaseCommand_LoadOps.cpp + database/DatabaseCommand_LoadPlaylistEntries.cpp database/DatabaseCommand_LoadSocialActions.cpp database/DatabaseCommand_LoadTrackAttributes.cpp - database/DatabaseCommand_GenericSelect.cpp - database/DatabaseCommand_SetCollectionAttributes.cpp - database/DatabaseCommand_CollectionAttributes.cpp - database/DatabaseCommand_TrackAttributes.cpp - database/DatabaseCommand_SetTrackAttributes.cpp - database/DatabaseCommand_PlaybackCharts.cpp - database/DatabaseCommand_ShareTrack.cpp - database/DatabaseCommand_DeleteInboxEntry.cpp + database/DatabaseCommand_LogPlayback.cpp database/DatabaseCommand_ModifyInboxEntry.cpp + database/DatabaseCommand_ModifyPlaylist.cpp database/DatabaseCommand_NetworkCharts.cpp - database/Database.cpp - database/TomahawkSqlQuery.cpp + database/DatabaseCommand_PlaybackCharts.cpp + database/DatabaseCommand_PlaybackHistory.cpp + database/DatabaseCommand_RenamePlaylist.cpp + database/DatabaseCommand_Resolve.cpp + database/DatabaseCommand_SetCollectionAttributes.cpp + database/DatabaseCommand_SetDynamicPlaylistRevision.cpp + database/DatabaseCommand_SetPlaylistRevision.cpp + database/DatabaseCommand_SetTrackAttributes.cpp + database/DatabaseCommand_ShareTrack.cpp + database/DatabaseCommand_SocialAction.cpp + database/DatabaseCommand_SourceOffline.cpp + database/DatabaseCommand_TrackAttributes.cpp + database/DatabaseCommand_TrackStats.cpp + database/DatabaseCommand_TrendingTracks.cpp + database/DatabaseCommand_UpdateSearchIndex.cpp + database/DatabaseCommandLoggable.cpp database/IdThreadWorker.cpp + database/TomahawkSqlQuery.cpp infosystem/InfoSystem.cpp infosystem/InfoSystemCache.cpp diff --git a/src/libtomahawk/database/DatabaseCommand_TrendingTracks.cpp b/src/libtomahawk/database/DatabaseCommand_TrendingTracks.cpp new file mode 100644 index 000000000..f9e7881ab --- /dev/null +++ b/src/libtomahawk/database/DatabaseCommand_TrendingTracks.cpp @@ -0,0 +1,102 @@ +/* === This file is part of Tomahawk Player - === + * + * Copyright 2013, Uwe L. Korn + * + * Tomahawk is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tomahawk is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Tomahawk. If not, see . + */ + +#include "DatabaseCommand_TrendingTracks_p.h" + +#include "database/DatabaseImpl.h" +#include "database/TomahawkSqlQuery.h" +#include "Track.h" + +namespace Tomahawk { + +DatabaseCommand_TrendingTracks::DatabaseCommand_TrendingTracks( QObject* parent ) + : DatabaseCommand( parent, new DatabaseCommand_TrendingTracksPrivate( this ) ) +{ +} + + +DatabaseCommand_TrendingTracks::~DatabaseCommand_TrendingTracks() +{ +} + + +void +DatabaseCommand_TrendingTracks::exec( DatabaseImpl* dbi ) +{ + Q_D( DatabaseCommand_TrendingTracks ); + TomahawkSqlQuery query = dbi->newquery(); + + QString limit; + if ( d->amount > 0 ) + { + limit = QString( "LIMIT 0, %1" ).arg( d->amount ); + } + + QDateTime now = QDateTime::currentDateTime(); + QDateTime _1WeekAgo = now.addDays( -7 ); + QDateTime _2WeeksAgo = now.addDays( -14 ); + QDateTime _3WeeksAgo = now.addDays( -21 ); + + // TODO: + // -> Look at absolute playcount, an increase from 1 to 4 plays per week is currently considered very high + QString timespanSql = QString( + " SELECT COUNT(*) as counter, track " + " FROM playback_log " + " WHERE playback_log.source IS NOT NULL " // exclude self + " AND playback_log.playtime >= %1 AND playback_log.playtime <= %2 " + " GROUP BY playback_log.track " + ); + QString lastWeekSql = timespanSql.arg( _1WeekAgo.toTime_t() ).arg( now.toTime_t() ); + QString _1BeforeLastWeekSql = timespanSql.arg( _2WeeksAgo.toTime_t() ).arg( _1WeekAgo.toTime_t() ); + QString _2BeforeLastWeekSql = timespanSql.arg( _3WeeksAgo.toTime_t() ).arg( _2WeeksAgo.toTime_t() ); + QString sql = QString( + " SELECT track.name, artist.name, ( lastweek.counter - weekbefore.counter ) as slope1, max( weekbefore.counter - week2before.counter, 1 ) as slope2, ( ( lastweek.counter - weekbefore.counter ) / max( weekbefore.counter - week2before.counter, 1 ) ) as trending " + " FROM ( %1 ) lastweek, ( %2 ) weekbefore, ( %3 ) week2before, track, artist " + " WHERE lastweek.track = weekbefore.track AND weekbefore.track = week2before.track " + " AND track.id = lastweek.track AND artist.id = track.artist " + " AND ( lastweek.counter - weekbefore.counter ) > 0" + " ORDER BY slope1 DESC %4 " + ).arg( lastWeekSql ).arg( _1BeforeLastWeekSql ).arg( _2BeforeLastWeekSql ).arg( limit ); + + query.prepare( sql ); + query.exec(); + + + + QList< QPair< double, Tomahawk::track_ptr > > tracks; + while ( query.next() ) + { + Tomahawk::track_ptr track = Tomahawk::Track::get( query.value( 1 ).toString(), query.value( 0 ).toString() ); + if ( !track ) + continue; + + tracks << QPair< double, track_ptr >( query.value( 4 ).toDouble(), track ); + } + + emit done( tracks ); +} + + +void +DatabaseCommand_TrendingTracks::setLimit( unsigned int amount ) +{ + Q_D( DatabaseCommand_TrendingTracks ); + d->amount = amount; +} + +} // namespace Tomahawk diff --git a/src/libtomahawk/database/DatabaseCommand_TrendingTracks.h b/src/libtomahawk/database/DatabaseCommand_TrendingTracks.h new file mode 100644 index 000000000..23c424a2c --- /dev/null +++ b/src/libtomahawk/database/DatabaseCommand_TrendingTracks.h @@ -0,0 +1,57 @@ +/* === This file is part of Tomahawk Player - === + * + * Copyright 2013, Uwe L. Korn + * + * Tomahawk is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tomahawk is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Tomahawk. If not, see . + */ + +#ifndef TOMAHAWK_DATABASECOMMAND_TRENDINGTRACKS_H +#define TOMAHAWK_DATABASECOMMAND_TRENDINGTRACKS_H + +#include "database/DatabaseCommand.h" + +namespace Tomahawk { + +class DatabaseCommand_TrendingTracksPrivate; + +/** + * Find tracks that trend among your friends. + * + * At the moment the most trending tracks are those with the highest quotient of + * plays in the last week and the week before. + */ +class DLLEXPORT DatabaseCommand_TrendingTracks : public Tomahawk::DatabaseCommand +{ + Q_OBJECT +public: + explicit DatabaseCommand_TrendingTracks( QObject *parent = 0 ); + virtual ~DatabaseCommand_TrendingTracks(); + + virtual void exec( DatabaseImpl* ); + + virtual bool doesMutates() const { return false; } + virtual QString commandname() const { return "trendingtracks"; } + + void setLimit( unsigned int amount ); + +signals: + void done( const QList >& tracks ); + +private: + Q_DECLARE_PRIVATE( DatabaseCommand_TrendingTracks ) +}; + +} // namespace Tomahawk + +#endif // TOMAHAWK_DATABASECOMMAND_TRENDINGTRACKS_H diff --git a/src/libtomahawk/database/DatabaseCommand_TrendingTracks_p.h b/src/libtomahawk/database/DatabaseCommand_TrendingTracks_p.h new file mode 100644 index 000000000..99c0cec86 --- /dev/null +++ b/src/libtomahawk/database/DatabaseCommand_TrendingTracks_p.h @@ -0,0 +1,47 @@ +/* === This file is part of Tomahawk Player - === + * + * Copyright 2013, Uwe L. Korn + * + * Tomahawk is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tomahawk is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Tomahawk. If not, see . + */ + +#ifndef DATABASECOMMAND_TRENDINGTRACKS_P_H +#define DATABASECOMMAND_TRENDINGTRACKS_P_H + +#include "database/DatabaseCommand_TrendingTracks.h" + +#include "database/DatabaseCommand_p.h" +#include "Source.h" + +namespace Tomahawk +{ + +class DatabaseCommand_TrendingTracksPrivate: DatabaseCommandPrivate +{ +public: + DatabaseCommand_TrendingTracksPrivate( DatabaseCommand_TrendingTracks* q ) + : DatabaseCommandPrivate( q ) + , amount( 0 ) + { + } + + Q_DECLARE_PUBLIC( DatabaseCommand_TrendingTracks ) + +private: + uint amount; +}; + +} // Tomahawk + +#endif // DATABASECOMMAND_TRENDINGTRACKS_P_H