diff --git a/src/TomahawkWindow.cpp b/src/TomahawkWindow.cpp index 925fb68c9..399b687a5 100644 --- a/src/TomahawkWindow.cpp +++ b/src/TomahawkWindow.cpp @@ -266,7 +266,7 @@ TomahawkWindow::setupSideBar() m_sourcetree = new SourceTreeView( this ); JobStatusView* jobsView = new JobStatusView( m_sidebar ); - m_jobsModel = new JobStatusModel( jobsView ); + m_jobsModel = new JobStatusSortModel( jobsView ); jobsView->setModel( m_jobsModel ); m_queueView = new QueueView( m_sidebar ); diff --git a/src/TomahawkWindow.h b/src/TomahawkWindow.h index 715b652f0..b61e1d993 100644 --- a/src/TomahawkWindow.h +++ b/src/TomahawkWindow.h @@ -39,7 +39,7 @@ namespace Tomahawk } } -class JobStatusModel; +class JobStatusSortModel; class QSearchField; class SourceTreeView; class QAction; @@ -162,7 +162,7 @@ private: QPushButton* m_queueButton; QueueView* m_queueView; AnimatedSplitter* m_sidebar; - JobStatusModel* m_jobsModel; + JobStatusSortModel* m_jobsModel; QAction* m_backAction; QAction* m_forwardAction; diff --git a/src/libtomahawk/jobview/AclJobItem.h b/src/libtomahawk/jobview/AclJobItem.h index 42c2c60f7..e9b515264 100644 --- a/src/libtomahawk/jobview/AclJobItem.h +++ b/src/libtomahawk/jobview/AclJobItem.h @@ -64,6 +64,8 @@ public: explicit ACLJobItem( ACLRegistry::User user, const QString &username ); virtual ~ACLJobItem(); + virtual int weight() const { return 99; } + virtual QString rightColumnText() const { return QString(); } virtual QString mainText() const { return QString(); } virtual QPixmap icon() const { return QPixmap(); } diff --git a/src/libtomahawk/jobview/IndexingJobItem.h b/src/libtomahawk/jobview/IndexingJobItem.h index 61bf5a05f..cda9e673f 100644 --- a/src/libtomahawk/jobview/IndexingJobItem.h +++ b/src/libtomahawk/jobview/IndexingJobItem.h @@ -30,6 +30,7 @@ public: void done(); + virtual int weight() const { return 50; } virtual QString rightColumnText() const { return QString(); } virtual QString mainText() const; virtual QPixmap icon() const; diff --git a/src/libtomahawk/jobview/JobStatusItem.h b/src/libtomahawk/jobview/JobStatusItem.h index f8255ada9..e2d8ca606 100644 --- a/src/libtomahawk/jobview/JobStatusItem.h +++ b/src/libtomahawk/jobview/JobStatusItem.h @@ -44,6 +44,7 @@ public: virtual ~JobStatusItem(); virtual QString type() const = 0; + virtual int weight() const { return 0; } /// Please cache this. virtual QPixmap icon() const = 0; diff --git a/src/libtomahawk/jobview/JobStatusModel.cpp b/src/libtomahawk/jobview/JobStatusModel.cpp index 8ff7032c2..9442129ba 100644 --- a/src/libtomahawk/jobview/JobStatusModel.cpp +++ b/src/libtomahawk/jobview/JobStatusModel.cpp @@ -25,6 +25,70 @@ #include +JobStatusSortModel::JobStatusSortModel( QObject* parent ) + : QSortFilterProxyModel( parent ) + , m_subModel( this ) +{ + setDynamicSortFilter( true ); + + connect( &m_subModel, SIGNAL( rowsInserted( QModelIndex, int, int ) ), this, SIGNAL( rowsInserted( QModelIndex, int, int ) ) ); + connect( &m_subModel, SIGNAL( rowsRemoved( QModelIndex, int, int ) ), this, SIGNAL( rowsRemoved( QModelIndex, int, int ) ) ); + connect( &m_subModel, SIGNAL( modelReset() ), this, SIGNAL( modelReset() ) ); + + connect( &m_subModel, SIGNAL( customDelegateJobInserted( int, JobStatusItem* ) ), this, SLOT( customDelegateJobInsertedSlot( int, JobStatusItem* ) ) ); + connect( &m_subModel, SIGNAL( customDelegateJobRemoved( int ) ), this, SLOT( customDelegateJobRemovedSlot( int ) ) ); + connect( &m_subModel, SIGNAL( refreshDelegates() ), this, SLOT( refreshDelegatesSlot() ) ); +} + + +JobStatusSortModel::~JobStatusSortModel() +{ +} + + +void +JobStatusSortModel::addJob( JobStatusItem* item ) +{ + m_subModel.addJob( item ); +} + + +void +JobStatusSortModel::customDelegateJobInsertedSlot( int row, JobStatusItem* item ) +{ + emit customDelegateJobInserted( mapFromSource( m_subModel.index( row ) ).row(), item ); +} + + +void +JobStatusSortModel::customDelegateJobRemovedSlot( int row ) +{ + emit customDelegateJobRemoved( mapFromSource( m_subModel.index( row ) ).row() ); +} + + +void +JobStatusSortModel::refreshDelegatesSlot() +{ + emit refreshDelegates(); +} + + +bool +JobStatusSortModel::lessThan( const QModelIndex& left, const QModelIndex& right ) const +{ + QVariant leftVar = left.data( JobStatusModel::JobDataRole ); + JobStatusItem* leftItem = leftVar.value< JobStatusItem* >(); + QVariant rightVar = right.data( JobStatusModel::JobDataRole ); + JobStatusItem* rightItem = rightVar.value< JobStatusItem* >(); + if ( !leftItem || !rightItem ) + return false; + + return leftItem->weight() < rightItem->weight(); +} + + + JobStatusModel::JobStatusModel( QObject* parent ) : QAbstractListModel ( parent ) { diff --git a/src/libtomahawk/jobview/JobStatusModel.h b/src/libtomahawk/jobview/JobStatusModel.h index 7db63267f..7a5a4f65e 100644 --- a/src/libtomahawk/jobview/JobStatusModel.h +++ b/src/libtomahawk/jobview/JobStatusModel.h @@ -22,6 +22,7 @@ #include "DllMacro.h" #include +#include #include class QStyledItemDelegate; @@ -66,4 +67,30 @@ private: QHash< QString, int > m_jobTypeCount; }; +class DLLEXPORT JobStatusSortModel : public QSortFilterProxyModel +{ + Q_OBJECT + +public: + JobStatusSortModel( QObject* parent = 0 ); + virtual ~JobStatusSortModel(); + +signals: + void customDelegateJobInserted( int row, JobStatusItem* item ); + void customDelegateJobRemoved( int row ); + void refreshDelegates(); + +public slots: + void addJob( JobStatusItem* item ); + void customDelegateJobInsertedSlot( int row, JobStatusItem* item); + void customDelegateJobRemovedSlot( int row ); + void refreshDelegatesSlot(); + +protected: + virtual bool lessThan( const QModelIndex & left, const QModelIndex & right ) const; + +private: + JobStatusModel m_subModel; +}; + #endif // JOBSTATUSMODEL_H diff --git a/src/libtomahawk/jobview/JobStatusView.cpp b/src/libtomahawk/jobview/JobStatusView.cpp index a19e9e961..26254ebff 100644 --- a/src/libtomahawk/jobview/JobStatusView.cpp +++ b/src/libtomahawk/jobview/JobStatusView.cpp @@ -83,7 +83,7 @@ JobStatusView::JobStatusView( AnimatedSplitter* parent ) void -JobStatusView::setModel( JobStatusModel* m ) +JobStatusView::setModel( JobStatusSortModel* m ) { m_model = m; m_view->setModel( m ); @@ -114,7 +114,7 @@ JobStatusView::customDelegateJobInserted( int row, JobStatusItem* item ) tLog() << Q_FUNC_INFO << "delegate found"; connect( delegate, SIGNAL( update( const QModelIndex& ) ), m_view, SLOT( update( const QModelIndex & ) ) ); connect( delegate, SIGNAL( aclResult( ACLRegistry::ACL ) ), item, SLOT( aclResult( ACLRegistry::ACL ) ) ); - delegate->emitSizeHintChanged( m_model->index( row ) ); + delegate->emitSizeHintChanged( m_model->index( row, 0 ) ); } else tLog() << Q_FUNC_INFO << "delegate was not properly found!"; @@ -127,6 +127,7 @@ void JobStatusView::customDelegateJobRemoved( int row ) { tLog() << Q_FUNC_INFO << "row is" << row; + checkCount(); } @@ -138,7 +139,7 @@ JobStatusView::refreshDelegates() for ( int i = 0; i < count; i++ ) { tLog() << Q_FUNC_INFO << "checking row" << i; - QModelIndex index = m_model->index( i ); + QModelIndex index = m_model->index( i, 0 ); QVariant itemVar = index.data( JobStatusModel::JobDataRole ); if ( !itemVar.canConvert< JobStatusItem* >() || !itemVar.value< JobStatusItem* >() ) { diff --git a/src/libtomahawk/jobview/JobStatusView.h b/src/libtomahawk/jobview/JobStatusView.h index c845815de..653b3dbf1 100644 --- a/src/libtomahawk/jobview/JobStatusView.h +++ b/src/libtomahawk/jobview/JobStatusView.h @@ -26,7 +26,7 @@ class QAbstractItemModel; class QListView; -class JobStatusModel; +class JobStatusSortModel; class JobStatusItem; class StreamConnection; class QStyledItemDelegate; @@ -47,9 +47,9 @@ public: QSize sizeHint() const; - void setModel( JobStatusModel* model ); + void setModel( JobStatusSortModel* model ); - JobStatusModel* model() { return m_model; } + JobStatusSortModel* model() { return m_model; } private slots: void checkCount(); @@ -59,7 +59,7 @@ private slots: private: QListView* m_view; - JobStatusModel* m_model; + JobStatusSortModel* m_model; AnimatedSplitter* m_parent; mutable int m_cachedHeight;