1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-03-20 15:59:42 +01: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 "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/TomahawkUtilsGui.h"
#include <QDateTime>
#include <QStandardItemModel>
#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 )
: QWidget( parent )
, ui( new Ui::NetworkActivityWidget )
//, m_sortedProxy( 0 )
//, m_loading( true )
, m_sortedProxy( 0 )
{
ui->setupUi( this );
@ -37,31 +49,30 @@ NetworkActivityWidget::NetworkActivityWidget( QWidget *parent )
TomahawkUtils::unmarginLayout( ui->horizontalLayout->layout() );
TomahawkUtils::unmarginLayout( ui->breadCrumbLeft->layout() );
// m_crumbModelLeft = new QStandardItemModel( this );
// m_sortedProxy = new QSortFilterProxyModel( this );
// m_sortedProxy->setDynamicSortFilter( true );
// m_sortedProxy->setFilterCaseSensitivity( Qt::CaseInsensitive );
m_crumbModelLeft = new QStandardItemModel( this );
m_sortedProxy = new QSortFilterProxyModel( this );
m_sortedProxy->setDynamicSortFilter( true );
m_sortedProxy->setFilterCaseSensitivity( Qt::CaseInsensitive );
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->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
// PlaylistChartItemDelegate* del = new PlaylistChartItemDelegate( ui->tracksViewLeft, ui->tracksViewLeft->proxyModel() );
// ui->tracksViewLeft->setItemDelegate( del );
PlaylistChartItemDelegate* del = new PlaylistChartItemDelegate( ui->tracksViewLeft, ui->tracksViewLeft->proxyModel() );
ui->tracksViewLeft->setItemDelegate( del );
ui->tracksViewLeft->setUniformRowHeights( false );
m_playlistInterface = ui->tracksViewLeft->playlistInterface();
// Lets have a spinner until loaded
ui->breadCrumbLeft->setVisible( false );
m_spinner = QSharedPointer<AnimatedSpinner>( new AnimatedSpinner( ui->tracksViewLeft ) );
m_spinner = new AnimatedSpinner( ui->tracksViewLeft );
m_spinner->fadeIn();
}
NetworkActivityWidget::~NetworkActivityWidget()
{
delete ui;
}
Tomahawk::playlistinterface_ptr
@ -73,7 +84,9 @@ NetworkActivityWidget::playlistInterface() const
bool
NetworkActivityWidget::jumpToCurrentTrack()
{
// TODO
if ( ui->tracksViewLeft->model() && ui->tracksViewLeft->jumpToCurrentTrack() )
return true;
return false;
}
@ -84,7 +97,127 @@ NetworkActivityWidget::fetchData()
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
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"
class AnimatedSpinner;
class PlaylistModel;
class QModelIndex;
class QStandardItemModel;
class QSortFilterProxyModel;
namespace Ui
{
class NetworkActivityWidget;
@ -45,14 +49,29 @@ public:
void fetchData();
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:
void actualFetchData();
void checkDone( QSharedPointer<QMutexLocker> );
Ui::NetworkActivityWidget* ui;
QMutex m_retrieveMutex;
QSharedPointer<Ui::NetworkActivityWidget> ui;
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