mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-06 22:26:32 +02:00
NetworkActivity now features Charts
This commit is contained in:
@@ -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 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user