mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-03-19 23:39:42 +01:00
Lazyload Network Activities
This commit is contained in:
parent
a31f4c770a
commit
e06cb12630
@ -497,7 +497,6 @@ ViewPage *ViewManager::showNetworkActivityPage()
|
||||
if ( !m_networkActivityWidget )
|
||||
{
|
||||
m_networkActivityWidget = new NetworkActivityWidget( m_widget );
|
||||
m_networkActivityWidget->fetchData();
|
||||
}
|
||||
|
||||
return show( m_networkActivityWidget );
|
||||
|
@ -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 );
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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 <QDateTime>
|
||||
@ -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<Tomahawk::track_ptr>& 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<Tomahawk::track_ptr>& 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<Tomahawk::track_ptr>& 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<track_ptr>& 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<Tomahawk::track_ptr> ) ), SLOT( weeklyCharts( QList<Tomahawk::track_ptr> ) ) );
|
||||
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<Tomahawk::track_ptr> ) ), SLOT( monthlyCharts( QList<Tomahawk::track_ptr> ) ) );
|
||||
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<Tomahawk::track_ptr> ) ), SLOT( overallCharts( QList<Tomahawk::track_ptr> ) ) );
|
||||
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<Tomahawk::track_ptr> ) ), SLOT( weeklyCharts( QList<Tomahawk::track_ptr> ) ) );
|
||||
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<Tomahawk::track_ptr> ) ), SLOT( monthlyCharts( QList<Tomahawk::track_ptr> ) ) );
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -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<Tomahawk::track_ptr>& );
|
||||
void monthlyCharts( const QList<Tomahawk::track_ptr>& );
|
||||
void yearlyCharts( const QList<Tomahawk::track_ptr>& );
|
||||
void overallCharts( const QList<Tomahawk::track_ptr>& );
|
||||
|
||||
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;
|
||||
|
@ -37,13 +37,14 @@ public:
|
||||
private:
|
||||
QSharedPointer<Ui::NetworkActivityWidget> ui;
|
||||
Tomahawk::playlistinterface_ptr playlistInterface;
|
||||
AnimatedSpinner* spinner;
|
||||
QStandardItemModel* crumbModelLeft;
|
||||
QSortFilterProxyModel* sortedProxy;
|
||||
|
||||
QPointer<PlaylistModel> weeklyChartsModel;
|
||||
QPointer<PlaylistModel> monthlyChartsModel;
|
||||
QPointer<PlaylistModel> yearlyChartsModel;
|
||||
QPointer<PlaylistModel> overallChartsModel;
|
||||
NetworkActivityWidget::ViewType activeView;
|
||||
};
|
||||
|
||||
#endif // NETWORKACTIVITYWIDGET_P_H
|
||||
|
Loading…
x
Reference in New Issue
Block a user