From e06cb126309aa05d5b0b511222312705c4ab40d1 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 9 Jun 2013 00:18:38 +0200 Subject: [PATCH] Lazyload Network Activities --- src/libtomahawk/ViewManager.cpp | 1 - .../DatabaseCommand_NetworkCharts.cpp | 21 +- .../database/DatabaseCommand_NetworkCharts.h | 1 + .../widgets/NetworkActivityWidget.cpp | 229 ++++++++++++------ .../widgets/NetworkActivityWidget.h | 15 +- .../widgets/NetworkActivityWidget_p.h | 3 +- 6 files changed, 183 insertions(+), 87 deletions(-) diff --git a/src/libtomahawk/ViewManager.cpp b/src/libtomahawk/ViewManager.cpp index b0a7691fe..5dc5ec744 100644 --- a/src/libtomahawk/ViewManager.cpp +++ b/src/libtomahawk/ViewManager.cpp @@ -497,7 +497,6 @@ ViewPage *ViewManager::showNetworkActivityPage() if ( !m_networkActivityWidget ) { m_networkActivityWidget = new NetworkActivityWidget( m_widget ); - m_networkActivityWidget->fetchData(); } return show( m_networkActivityWidget ); diff --git a/src/libtomahawk/database/DatabaseCommand_NetworkCharts.cpp b/src/libtomahawk/database/DatabaseCommand_NetworkCharts.cpp index e7a17ee30..ac7f26769 100644 --- a/src/libtomahawk/database/DatabaseCommand_NetworkCharts.cpp +++ b/src/libtomahawk/database/DatabaseCommand_NetworkCharts.cpp @@ -30,6 +30,12 @@ DatabaseCommand_NetworkCharts::DatabaseCommand_NetworkCharts( const QDateTime &f { } +DatabaseCommand_NetworkCharts::DatabaseCommand_NetworkCharts( QObject *parent ) + : DatabaseCommand( parent ) + , m_amount( 0 ) +{ +} + DatabaseCommand_NetworkCharts::~DatabaseCommand_NetworkCharts() { } @@ -44,17 +50,23 @@ DatabaseCommand_NetworkCharts::exec( DatabaseImpl * dbi ) { limit = QString( "LIMIT 0, %1" ).arg( m_amount ); } + QString timespan; + if ( m_from.isValid() && m_to.isValid() ) + { + timespan = QString( + " AND playback_log.playtime >= %1 AND playback_log.playtime <= %2 " + ).arg( m_from.toTime_t() ).arg( m_to.toTime_t() ); + } QString sql = QString( "SELECT COUNT(*) as counter, track.name, artist.name " " FROM playback_log, track, artist " " WHERE track.id = playback_log.track AND artist.id = track.artist " - " AND playback_log.playtime >= %1 AND playback_log.playtime <= %2 " // incorportrate timespan - " AND playback_log.source IS NOT NULL " // exclude self + " AND playback_log.source IS NOT NULL %1 " // exclude self " GROUP BY playback_log.track " " ORDER BY counter DESC " - " %3" - ).arg( m_from.toTime_t() ).arg( m_to.toTime_t() ).arg( limit ); + " %2" + ).arg( timespan ).arg( limit ); query.prepare( sql ); query.exec(); @@ -71,4 +83,3 @@ DatabaseCommand_NetworkCharts::exec( DatabaseImpl * dbi ) emit done( tracks ); } - diff --git a/src/libtomahawk/database/DatabaseCommand_NetworkCharts.h b/src/libtomahawk/database/DatabaseCommand_NetworkCharts.h index a9b7ec93d..50f5fb303 100644 --- a/src/libtomahawk/database/DatabaseCommand_NetworkCharts.h +++ b/src/libtomahawk/database/DatabaseCommand_NetworkCharts.h @@ -31,6 +31,7 @@ class DLLEXPORT DatabaseCommand_NetworkCharts : public DatabaseCommand { Q_OBJECT public: + explicit DatabaseCommand_NetworkCharts( QObject* parent = 0 ); explicit DatabaseCommand_NetworkCharts( const QDateTime& from, const QDateTime& to, QObject* parent = 0 ); virtual ~DatabaseCommand_NetworkCharts(); diff --git a/src/libtomahawk/widgets/NetworkActivityWidget.cpp b/src/libtomahawk/widgets/NetworkActivityWidget.cpp index 785d18ba7..a51c0bfb5 100644 --- a/src/libtomahawk/widgets/NetworkActivityWidget.cpp +++ b/src/libtomahawk/widgets/NetworkActivityWidget.cpp @@ -24,6 +24,7 @@ #include "database/DatabaseCommand_NetworkCharts.h" #include "playlist/PlaylistChartItemDelegate.h" #include "utils/AnimatedSpinner.h" +#include "utils/Logger.h" #include "utils/TomahawkUtilsGui.h" #include @@ -65,10 +66,26 @@ NetworkActivityWidget::NetworkActivityWidget( QWidget* parent ) d_func()->playlistInterface = d_func()->ui->tracksViewLeft->playlistInterface(); - // Lets have a spinner until loaded - d_func()->ui->breadCrumbLeft->setVisible( false ); - d_func()->spinner = new AnimatedSpinner( d_func()->ui->tracksViewLeft ); - d_func()->spinner->fadeIn(); + // Build up breadcrumb + QStandardItem* rootItem = d_func()->crumbModelLeft->invisibleRootItem(); + QStandardItem* chartItem = new QStandardItem( tr( "Charts" ) ); + rootItem->appendRow( chartItem ); + QStandardItem* weekItem = new QStandardItem( tr( "Last Week" ) ); + weekItem->setData( WeekChart, Breadcrumb::DefaultRole ); + chartItem->appendRow( weekItem ); + QStandardItem* monthItem = new QStandardItem( tr( "Last Month" ) ); + monthItem->setData( MonthChart, Breadcrumb::DefaultRole ); + chartItem->appendRow( monthItem ); + QStandardItem* yearItem = new QStandardItem( tr( "Last Year" ) ); + yearItem->setData( YearChart, Breadcrumb::DefaultRole ); + chartItem->appendRow( yearItem ); + QStandardItem* overallItem = new QStandardItem( tr( "Overall" ) ); + overallItem->setData( OverallChart, Breadcrumb::DefaultRole ); + chartItem->appendRow( overallItem ); + d_func()->sortedProxy->setSourceModel( d_func()->crumbModelLeft ); + d_func()->sortedProxy->sort( 0, Qt::AscendingOrder ); + d_func()->ui->breadCrumbLeft->setModel( d_func()->sortedProxy ); + d_func()->ui->breadCrumbLeft->setVisible( true ); } @@ -105,24 +122,18 @@ NetworkActivityWidget::jumpToCurrentTrack() } -void -NetworkActivityWidget::fetchData() -{ - // Do not block the UI thread - QtConcurrent::run( this, &NetworkActivityWidget::actualFetchData ); -} - - void NetworkActivityWidget::weeklyCharts( const QList& tracks ) { d_func()->weeklyChartsModel = new PlaylistModel( d_func()->ui->tracksViewLeft ); d_func()->weeklyChartsModel->startLoading(); - // Pipeline::instance()->resolve( tracks ); d_func()->weeklyChartsModel->appendTracks( tracks ); d_func()->weeklyChartsModel->finishLoading(); - checkDone(); + if ( d_func()->activeView == WeekChart ) + { + showWeekCharts(); + } } @@ -131,11 +142,13 @@ NetworkActivityWidget::monthlyCharts( const QList& tracks ) { d_func()->monthlyChartsModel = new PlaylistModel( d_func()->ui->tracksViewLeft ); d_func()->monthlyChartsModel->startLoading(); - // Pipeline::instance()->resolve( tracks ); d_func()->monthlyChartsModel->appendTracks( tracks ); d_func()->monthlyChartsModel->finishLoading(); - checkDone(); + if ( d_func()->activeView == MonthChart ) + { + showMonthCharts(); + } } @@ -144,11 +157,27 @@ NetworkActivityWidget::yearlyCharts( const QList& tracks ) { d_func()->yearlyChartsModel = new PlaylistModel( d_func()->ui->tracksViewLeft ); d_func()->yearlyChartsModel->startLoading(); - // Pipeline::instance()->resolve( tracks ); d_func()->yearlyChartsModel->appendTracks( tracks ); d_func()->yearlyChartsModel->finishLoading(); - checkDone(); + if ( d_func()->activeView == YearChart ) + { + showYearCharts(); + } +} + +void +NetworkActivityWidget::overallCharts( const QList& tracks ) +{ + d_func()->overallChartsModel = new PlaylistModel( d_func()->ui->tracksViewLeft ); + d_func()->overallChartsModel->startLoading(); + d_func()->overallChartsModel->appendTracks( tracks ); + d_func()->overallChartsModel->finishLoading(); + + if ( d_func()->activeView == OverallChart ) + { + showOverallCharts(); + } } @@ -158,51 +187,33 @@ NetworkActivityWidget::leftCrumbIndexChanged( const QModelIndex& index ) QStandardItem* item = d_func()->crumbModelLeft->itemFromIndex( d_func()->sortedProxy->mapToSource( index ) ); if ( !item ) return; - if ( !item->data( Breadcrumb::ChartIdRole ).isValid() ) + if ( !item->data( Breadcrumb::DefaultRole ).isValid() ) return; - const QString chartId = item->data( Breadcrumb::ChartIdRole ).toString(); - if ( chartId == NETWORKCHARTS_WEEK_CHARTS ) + int chartId = item->data( Breadcrumb::DefaultRole ).toInt(); + tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Showing chart" << chartId; + switch ( chartId ) { - d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large ); - d_func()->ui->tracksViewLeft->setPlaylistModel( d_func()->weeklyChartsModel ); - d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 ); - } - else if ( chartId == NETWORKCHARTS_MONTH_CHARTS ) - { - d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large ); - d_func()->ui->tracksViewLeft->setPlaylistModel( d_func()->monthlyChartsModel ); - d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 ); - } - else if ( chartId == NETWORKCHARTS_YEAR_CHARTS ) - { - d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large ); - d_func()->ui->tracksViewLeft->setPlaylistModel( d_func()->yearlyChartsModel ); - d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 ); + case WeekChart: + showWeekCharts(); + break; + case MonthChart: + showMonthCharts(); + break; + case YearChart: + showYearCharts(); + break; + case OverallChart: + showOverallCharts(); + break; } } void -NetworkActivityWidget::actualFetchData() +NetworkActivityWidget::fetchYearCharts() { QDateTime to = QDateTime::currentDateTime(); - - // Weekly charts - QDateTime weekAgo = to.addDays( -7 ); - DatabaseCommand_NetworkCharts* weekCharts = new DatabaseCommand_NetworkCharts( weekAgo, to ); - weekCharts->setLimit( NETWORKCHARTS_NUM_TRACKS ); - connect( weekCharts, SIGNAL( done( QList ) ), SLOT( weeklyCharts( QList ) ) ); - Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( weekCharts ) ); - - // Monthly charts - QDateTime monthAgo = to.addMonths( -1 ); - DatabaseCommand_NetworkCharts* monthCharts = new DatabaseCommand_NetworkCharts( monthAgo, to ); - monthCharts->setLimit( NETWORKCHARTS_NUM_TRACKS ); - connect( monthCharts, SIGNAL( done( QList ) ), SLOT( monthlyCharts( QList ) ) ); - Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( monthCharts ) ); - - // Yearly charts QDateTime yearAgo = to.addYears( -1 ); DatabaseCommand_NetworkCharts* yearCharts = new DatabaseCommand_NetworkCharts( yearAgo, to ); yearCharts->setLimit( NETWORKCHARTS_NUM_TRACKS ); @@ -210,32 +221,98 @@ NetworkActivityWidget::actualFetchData() Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( yearCharts ) ); } +void +NetworkActivityWidget::fetchOverallCharts() +{ + DatabaseCommand_NetworkCharts* overallCharts = new DatabaseCommand_NetworkCharts(); + overallCharts->setLimit( NETWORKCHARTS_NUM_TRACKS ); + connect( overallCharts, SIGNAL( done( QList ) ), SLOT( overallCharts( QList ) ) ); + Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( overallCharts ) ); +} + void -NetworkActivityWidget::checkDone() +NetworkActivityWidget::fetchWeekCharts() { - if ( !d_func()->weeklyChartsModel.isNull() && !d_func()->yearlyChartsModel.isNull() && !d_func()->monthlyChartsModel.isNull() ) + QDateTime to = QDateTime::currentDateTime(); + QDateTime weekAgo = to.addDays( -7 ); + DatabaseCommand_NetworkCharts* weekCharts = new DatabaseCommand_NetworkCharts( weekAgo, to ); + weekCharts->setLimit( NETWORKCHARTS_NUM_TRACKS ); + connect( weekCharts, SIGNAL( done( QList ) ), SLOT( weeklyCharts( QList ) ) ); + Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( weekCharts ) ); +} + +void +NetworkActivityWidget::fetchMonthCharts() +{ + QDateTime to = QDateTime::currentDateTime(); + QDateTime monthAgo = to.addMonths( -1 ); + DatabaseCommand_NetworkCharts* monthCharts = new DatabaseCommand_NetworkCharts( monthAgo, to ); + monthCharts->setLimit( NETWORKCHARTS_NUM_TRACKS ); + connect( monthCharts, SIGNAL( done( QList ) ), SLOT( monthlyCharts( QList ) ) ); + Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( monthCharts ) ); +} + + +void +NetworkActivityWidget::showWeekCharts() +{ + d_func()->activeView = WeekChart; + if ( !d_func()->weeklyChartsModel.isNull() ) { - // All charts are loaded, do the remaining work UI work. - - // Build up breadcrumb - QStandardItem* rootItem = d_func()->crumbModelLeft->invisibleRootItem(); - QStandardItem* chartItem = new QStandardItem( tr( "Charts" ) ); - rootItem->appendRow( chartItem ); - QStandardItem* weekItem = new QStandardItem( tr( "Last Week" ) ); - weekItem->setData( NETWORKCHARTS_WEEK_CHARTS, Breadcrumb::ChartIdRole ); - chartItem->appendRow( weekItem ); - QStandardItem* monthItem = new QStandardItem( tr( "Last Month" ) ); - monthItem->setData( NETWORKCHARTS_MONTH_CHARTS, Breadcrumb::ChartIdRole ); - chartItem->appendRow( monthItem ); - QStandardItem* yearItem = new QStandardItem( tr( "Last Year" ) ); - yearItem->setData( NETWORKCHARTS_YEAR_CHARTS, Breadcrumb::ChartIdRole ); - chartItem->appendRow( yearItem ); - d_func()->sortedProxy->setSourceModel( d_func()->crumbModelLeft ); - d_func()->sortedProxy->sort( 0, Qt::AscendingOrder ); - d_func()->ui->breadCrumbLeft->setModel( d_func()->sortedProxy ); - - d_func()->spinner->fadeOut(); - d_func()->ui->breadCrumbLeft->setVisible( true ); + d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large ); + d_func()->ui->tracksViewLeft->setPlaylistModel( d_func()->weeklyChartsModel ); + d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 ); + } + else + { + fetchWeekCharts(); + } +} + +void +NetworkActivityWidget::showMonthCharts() +{ + d_func()->activeView = MonthChart; + if ( !d_func()->monthlyChartsModel.isNull() ) + { + d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large ); + d_func()->ui->tracksViewLeft->setPlaylistModel( d_func()->monthlyChartsModel ); + d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 ); + } + else + { + fetchMonthCharts(); + } +} + +void +NetworkActivityWidget::showYearCharts() +{ + d_func()->activeView = YearChart; + if ( !d_func()->yearlyChartsModel.isNull() ) + { + d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large ); + d_func()->ui->tracksViewLeft->setPlaylistModel( d_func()->yearlyChartsModel ); + d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 ); + } + else + { + fetchYearCharts(); + } +} + +void NetworkActivityWidget::showOverallCharts() +{ + d_func()->activeView = OverallChart; + if ( !d_func()->overallChartsModel.isNull() ) + { + d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large ); + d_func()->ui->tracksViewLeft->setPlaylistModel( d_func()->overallChartsModel ); + d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 ); + } + else + { + fetchOverallCharts(); } } diff --git a/src/libtomahawk/widgets/NetworkActivityWidget.h b/src/libtomahawk/widgets/NetworkActivityWidget.h index 35cb50b1f..cf8513ea9 100644 --- a/src/libtomahawk/widgets/NetworkActivityWidget.h +++ b/src/libtomahawk/widgets/NetworkActivityWidget.h @@ -36,6 +36,7 @@ class NetworkActivityWidget : public QWidget, public Tomahawk::ViewPage { Q_OBJECT public: + enum ViewType { WeekChart = 1, MonthChart = 2, YearChart = 3, OverallChart = 4 }; NetworkActivityWidget(QWidget* parent = 0); ~NetworkActivityWidget(); @@ -49,20 +50,26 @@ public: virtual bool isBeingPlayed() const; virtual bool jumpToCurrentTrack(); - - void fetchData(); signals: private slots: void weeklyCharts( const QList& ); void monthlyCharts( const QList& ); void yearlyCharts( const QList& ); + void overallCharts( const QList& ); void leftCrumbIndexChanged( const QModelIndex& ); private: - void actualFetchData(); - void checkDone(); + void fetchWeekCharts(); + void fetchMonthCharts(); + void fetchYearCharts(); + void fetchOverallCharts(); + + void showWeekCharts(); + void showMonthCharts(); + void showYearCharts(); + void showOverallCharts(); Q_DECLARE_PRIVATE( NetworkActivityWidget ) NetworkActivityWidgetPrivate* d_ptr; diff --git a/src/libtomahawk/widgets/NetworkActivityWidget_p.h b/src/libtomahawk/widgets/NetworkActivityWidget_p.h index 063d265d5..302cbd0dc 100644 --- a/src/libtomahawk/widgets/NetworkActivityWidget_p.h +++ b/src/libtomahawk/widgets/NetworkActivityWidget_p.h @@ -37,13 +37,14 @@ public: private: QSharedPointer ui; Tomahawk::playlistinterface_ptr playlistInterface; - AnimatedSpinner* spinner; QStandardItemModel* crumbModelLeft; QSortFilterProxyModel* sortedProxy; QPointer weeklyChartsModel; QPointer monthlyChartsModel; QPointer yearlyChartsModel; + QPointer overallChartsModel; + NetworkActivityWidget::ViewType activeView; }; #endif // NETWORKACTIVITYWIDGET_P_H