1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-07 14:46:33 +02:00

NetworkActivity now features Charts

This commit is contained in:
Uwe L. Korn
2013-06-04 20:37:33 +02:00
parent b1f8993e9c
commit 91fc20d0c8
2 changed files with 167 additions and 15 deletions

View File

@@ -19,16 +19,28 @@
#include "NetworkActivityWidget.h" #include "NetworkActivityWidget.h"
#include "ui_NetworkActivityWidget.h" #include "ui_NetworkActivityWidget.h"
#include "Pipeline.h"
#include "database/Database.h"
#include "database/DatabaseCommand_NetworkCharts.h"
#include "playlist/PlaylistChartItemDelegate.h"
#include "utils/AnimatedSpinner.h" #include "utils/AnimatedSpinner.h"
#include "utils/TomahawkUtilsGui.h" #include "utils/TomahawkUtilsGui.h"
#include <QDateTime>
#include <QStandardItemModel>
#include <QtConcurrentRun> #include <QtConcurrentRun>
#define NETWORKCHARTS_NUM_TRACKS 100
#define NETWORKCHARTS_WEEK_CHARTS "week"
#define NETWORKCHARTS_MONTH_CHARTS "month"
#define NETWORKCHARTS_YEAR_CHARTS "year"
using namespace Tomahawk;
NetworkActivityWidget::NetworkActivityWidget( QWidget *parent ) NetworkActivityWidget::NetworkActivityWidget( QWidget *parent )
: QWidget( parent ) : QWidget( parent )
, ui( new Ui::NetworkActivityWidget ) , ui( new Ui::NetworkActivityWidget )
//, m_sortedProxy( 0 ) , m_sortedProxy( 0 )
//, m_loading( true )
{ {
ui->setupUi( this ); ui->setupUi( this );
@@ -37,31 +49,30 @@ NetworkActivityWidget::NetworkActivityWidget( QWidget *parent )
TomahawkUtils::unmarginLayout( ui->horizontalLayout->layout() ); TomahawkUtils::unmarginLayout( ui->horizontalLayout->layout() );
TomahawkUtils::unmarginLayout( ui->breadCrumbLeft->layout() ); TomahawkUtils::unmarginLayout( ui->breadCrumbLeft->layout() );
// m_crumbModelLeft = new QStandardItemModel( this ); m_crumbModelLeft = new QStandardItemModel( this );
// m_sortedProxy = new QSortFilterProxyModel( this ); m_sortedProxy = new QSortFilterProxyModel( this );
// m_sortedProxy->setDynamicSortFilter( true ); m_sortedProxy->setDynamicSortFilter( true );
// m_sortedProxy->setFilterCaseSensitivity( Qt::CaseInsensitive ); m_sortedProxy->setFilterCaseSensitivity( Qt::CaseInsensitive );
ui->breadCrumbLeft->setRootIcon( TomahawkUtils::defaultPixmap( TomahawkUtils::NetworkActivity, TomahawkUtils::Original ) ); ui->breadCrumbLeft->setRootIcon( TomahawkUtils::defaultPixmap( TomahawkUtils::NetworkActivity, TomahawkUtils::Original ) );
// connect( ui->breadCrumbLeft, SIGNAL( activateIndex( QModelIndex ) ), SLOT( leftCrumbIndexChanged( QModelIndex ) ) ); connect( ui->breadCrumbLeft, SIGNAL( activateIndex( QModelIndex ) ), SLOT( leftCrumbIndexChanged( QModelIndex ) ) );
ui->tracksViewLeft->setHeaderHidden( true ); ui->tracksViewLeft->setHeaderHidden( true );
ui->tracksViewLeft->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); ui->tracksViewLeft->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
// PlaylistChartItemDelegate* del = new PlaylistChartItemDelegate( ui->tracksViewLeft, ui->tracksViewLeft->proxyModel() ); PlaylistChartItemDelegate* del = new PlaylistChartItemDelegate( ui->tracksViewLeft, ui->tracksViewLeft->proxyModel() );
// ui->tracksViewLeft->setItemDelegate( del ); ui->tracksViewLeft->setItemDelegate( del );
ui->tracksViewLeft->setUniformRowHeights( false ); ui->tracksViewLeft->setUniformRowHeights( false );
m_playlistInterface = ui->tracksViewLeft->playlistInterface(); m_playlistInterface = ui->tracksViewLeft->playlistInterface();
// Lets have a spinner until loaded // Lets have a spinner until loaded
ui->breadCrumbLeft->setVisible( false ); ui->breadCrumbLeft->setVisible( false );
m_spinner = QSharedPointer<AnimatedSpinner>( new AnimatedSpinner( ui->tracksViewLeft ) ); m_spinner = new AnimatedSpinner( ui->tracksViewLeft );
m_spinner->fadeIn(); m_spinner->fadeIn();
} }
NetworkActivityWidget::~NetworkActivityWidget() NetworkActivityWidget::~NetworkActivityWidget()
{ {
delete ui;
} }
Tomahawk::playlistinterface_ptr Tomahawk::playlistinterface_ptr
@@ -73,7 +84,9 @@ NetworkActivityWidget::playlistInterface() const
bool bool
NetworkActivityWidget::jumpToCurrentTrack() NetworkActivityWidget::jumpToCurrentTrack()
{ {
// TODO if ( ui->tracksViewLeft->model() && ui->tracksViewLeft->jumpToCurrentTrack() )
return true;
return false; return false;
} }
@@ -84,7 +97,127 @@ NetworkActivityWidget::fetchData()
QtConcurrent::run( this, &NetworkActivityWidget::actualFetchData ); QtConcurrent::run( this, &NetworkActivityWidget::actualFetchData );
} }
void
NetworkActivityWidget::weeklyCharts( const QList<Tomahawk::track_ptr>& tracks )
{
QSharedPointer<QMutexLocker> locker = QSharedPointer<QMutexLocker>( new QMutexLocker( &m_retrieveMutex ) );
m_weeklyChartsModel = new PlaylistModel( ui->tracksViewLeft );
m_weeklyChartsModel->startLoading();
// Pipeline::instance()->resolve( tracks );
m_weeklyChartsModel->appendTracks( tracks );
m_weeklyChartsModel->finishLoading();
checkDone( locker );
}
void
NetworkActivityWidget::monthlyCharts( const QList<Tomahawk::track_ptr>& tracks )
{
QSharedPointer<QMutexLocker> locker = QSharedPointer<QMutexLocker>( new QMutexLocker( &m_retrieveMutex ) );
m_monthlyChartsModel = new PlaylistModel( ui->tracksViewLeft );
m_monthlyChartsModel->startLoading();
// Pipeline::instance()->resolve( tracks );
m_monthlyChartsModel->appendTracks( tracks );
m_monthlyChartsModel->finishLoading();
checkDone( locker );
}
void
NetworkActivityWidget::yearlyCharts( const QList<Tomahawk::track_ptr>& tracks )
{
QSharedPointer<QMutexLocker> locker = QSharedPointer<QMutexLocker>( new QMutexLocker( &m_retrieveMutex ) );
m_yearlyChartsModel = new PlaylistModel( ui->tracksViewLeft );
m_yearlyChartsModel->startLoading();
// Pipeline::instance()->resolve( tracks );
m_yearlyChartsModel->appendTracks( tracks );
m_yearlyChartsModel->finishLoading();
checkDone( locker );
}
void
NetworkActivityWidget::leftCrumbIndexChanged( QModelIndex index )
{
QStandardItem* item = m_crumbModelLeft->itemFromIndex( m_sortedProxy->mapToSource( index ) );
if ( !item )
return;
if ( !item->data( Breadcrumb::ChartIdRole ).isValid() )
return;
const QString chartId = item->data( Breadcrumb::ChartIdRole ).toString();
if ( chartId == NETWORKCHARTS_WEEK_CHARTS )
{
ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large );
ui->tracksViewLeft->setPlaylistModel( m_weeklyChartsModel );
ui->tracksViewLeft->proxyModel()->sort( -1 );
}
else if ( chartId == NETWORKCHARTS_MONTH_CHARTS )
{
ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large );
ui->tracksViewLeft->setPlaylistModel( m_monthlyChartsModel );
ui->tracksViewLeft->proxyModel()->sort( -1 );
}
else if ( chartId == NETWORKCHARTS_YEAR_CHARTS )
{
ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large );
ui->tracksViewLeft->setPlaylistModel( m_yearlyChartsModel );
ui->tracksViewLeft->proxyModel()->sort( -1 );
}
}
void void
NetworkActivityWidget::actualFetchData() NetworkActivityWidget::actualFetchData()
{ {
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 );
connect( yearCharts, SIGNAL( done( QList<Tomahawk::track_ptr> ) ), SLOT( yearlyCharts( QList<Tomahawk::track_ptr> ) ) );
Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( yearCharts ) );
}
void
NetworkActivityWidget::checkDone( QSharedPointer<QMutexLocker> )
{
if ( !m_weeklyChartsModel.isNull() && !m_yearlyChartsModel.isNull() && !m_monthlyChartsModel.isNull() )
{
// All charts are loaded, do the remaining work UI work.
// Build up breadcrumb
QStandardItem* rootItem = m_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 );
m_sortedProxy->setSourceModel( m_crumbModelLeft );
m_sortedProxy->sort( 0, Qt::AscendingOrder );
ui->breadCrumbLeft->setModel( m_sortedProxy );
m_spinner->fadeOut();
ui->breadCrumbLeft->setVisible( true );
}
} }

View File

@@ -22,6 +22,10 @@
#include "ViewPage.h" #include "ViewPage.h"
class AnimatedSpinner; class AnimatedSpinner;
class PlaylistModel;
class QModelIndex;
class QStandardItemModel;
class QSortFilterProxyModel;
namespace Ui namespace Ui
{ {
class NetworkActivityWidget; class NetworkActivityWidget;
@@ -45,14 +49,29 @@ public:
void fetchData(); void fetchData();
signals: signals:
public slots: private slots:
void weeklyCharts( const QList<Tomahawk::track_ptr>& );
void monthlyCharts( const QList<Tomahawk::track_ptr>& );
void yearlyCharts( const QList<Tomahawk::track_ptr>& );
void leftCrumbIndexChanged( QModelIndex );
private: private:
void actualFetchData(); void actualFetchData();
void checkDone( QSharedPointer<QMutexLocker> );
Ui::NetworkActivityWidget* ui; QMutex m_retrieveMutex;
QSharedPointer<Ui::NetworkActivityWidget> ui;
Tomahawk::playlistinterface_ptr m_playlistInterface; Tomahawk::playlistinterface_ptr m_playlistInterface;
QSharedPointer<AnimatedSpinner> m_spinner; AnimatedSpinner* m_spinner;
QStandardItemModel* m_crumbModelLeft;
QSortFilterProxyModel* m_sortedProxy;
QPointer<PlaylistModel> m_weeklyChartsModel;
QPointer<PlaylistModel> m_monthlyChartsModel;
QPointer<PlaylistModel> m_yearlyChartsModel;
}; };
#endif // NETWORKACTIVITYWIDGET_H #endif // NETWORKACTIVITYWIDGET_H