1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-13 09:34:53 +02:00

Make job counting generic

This commit is contained in:
Jeff Mitchell
2012-04-21 11:43:51 -04:00
parent 0b796a3085
commit eb0ed267fa
4 changed files with 33 additions and 14 deletions

View File

@@ -45,6 +45,13 @@ JobStatusItem::collapseItem() const
} }
int
JobStatusItem::concurrentJobLimit() const
{
return 0;
}
bool bool
JobStatusItem::hasCustomDelegate() const JobStatusItem::hasCustomDelegate() const
{ {

View File

@@ -58,6 +58,8 @@ public:
virtual bool collapseItem() const; virtual bool collapseItem() const;
virtual bool allowMultiLine() const; virtual bool allowMultiLine() const;
virtual int concurrentJobLimit() const;
virtual bool hasCustomDelegate() const; virtual bool hasCustomDelegate() const;
virtual void createDelegate( QObject* parent ); virtual void createDelegate( QObject* parent );
virtual QStyledItemDelegate* customDelegate() const; virtual QStyledItemDelegate* customDelegate() const;

View File

@@ -26,7 +26,6 @@
JobStatusModel::JobStatusModel( QObject* parent ) JobStatusModel::JobStatusModel( QObject* parent )
: QAbstractListModel ( parent ) : QAbstractListModel ( parent )
, m_aclJobCount( 0 )
{ {
} }
@@ -42,12 +41,19 @@ JobStatusModel::~JobStatusModel()
void void
JobStatusModel::addJob( JobStatusItem* item ) JobStatusModel::addJob( JobStatusItem* item )
{ {
if ( item->type() == "acljob" && m_aclJobCount >= 3 ) if ( item->concurrentJobLimit() > 0 )
{ {
m_aclJobQueue.enqueue( item ); if ( m_jobTypeCount[ item->type() ] >= item->concurrentJobLimit() )
return; {
m_jobQueue[ item->type() ].enqueue( item );
return;
}
int currentJobCount = m_jobTypeCount[ item->type() ];
currentJobCount++;
m_jobTypeCount[ item->type() ] = currentJobCount;
} }
connect( item, SIGNAL( statusChanged() ), this, SLOT( itemUpdated() ) ); connect( item, SIGNAL( statusChanged() ), this, SLOT( itemUpdated() ) );
connect( item, SIGNAL( finished() ), this, SLOT( itemFinished() ) ); connect( item, SIGNAL( finished() ), this, SLOT( itemFinished() ) );
@@ -184,16 +190,20 @@ JobStatusModel::itemFinished()
if ( item->customDelegate() ) if ( item->customDelegate() )
emit customDelegateJobRemoved( idx ); emit customDelegateJobRemoved( idx );
if ( item->type() == "acljob" ) if ( item->concurrentJobLimit() > 0 )
m_aclJobCount--;
item->deleteLater();
if ( !m_aclJobQueue.empty() )
{ {
JobStatusItem* item = m_aclJobQueue.dequeue(); int currentJobs = m_jobTypeCount[ item->type() ];
QMetaObject::invokeMethod( this, "addJob", Qt::QueuedConnection, Q_ARG( JobStatusItem*, item ) ); currentJobs--;
m_jobTypeCount[ item->type() ] = currentJobs;
if ( !m_jobQueue[ item->type() ].isEmpty() )
{
JobStatusItem* item = m_jobQueue[ item->type() ].dequeue();
QMetaObject::invokeMethod( this, "addJob", Qt::QueuedConnection, Q_ARG( JobStatusItem*, item ) );
}
} }
item->deleteLater();
} }

View File

@@ -60,8 +60,8 @@ private slots:
private: private:
QList< JobStatusItem* > m_items; QList< JobStatusItem* > m_items;
QHash< QString, QList< JobStatusItem* > > m_collapseCount; QHash< QString, QList< JobStatusItem* > > m_collapseCount;
QQueue< JobStatusItem* > m_aclJobQueue; QHash< QString, QQueue< JobStatusItem* > > m_jobQueue;
int m_aclJobCount; QHash< QString, int > m_jobTypeCount;
}; };
#endif // JOBSTATUSMODEL_H #endif // JOBSTATUSMODEL_H