void JobStatusView::refreshDelegates() { int count = m_model->rowCount(); for ( int i = 0; i < count; i++ ) { QModelIndex index = m_model->index( i, 0 ); QVariant itemVar = index.data( JobStatusModel::JobDataRole ); if ( !itemVar.canConvert< JobStatusItem* >() || !itemVar.value< JobStatusItem* >() ) { tLog() << Q_FUNC_INFO << "unable to fetch JobStatusItem* at row" << i; continue; } JobStatusItem* item = itemVar.value< JobStatusItem* >(); if ( item->hasCustomDelegate() ) m_view->setItemDelegateForRow( i, item->customDelegate() ); else m_view->setItemDelegateForRow( i, m_view->itemDelegate() ); } checkCount(); }
void JobStatusModel::itemFinished() { JobStatusItem* item = qobject_cast< JobStatusItem* >( sender() ); Q_ASSERT( item ); // tDebug() << "Got item finished:" << item->type() << item->mainText() << item; if ( !m_items.contains( item ) && !m_collapseCount.contains( item->type() ) ) return; // foreach( JobStatusItem* item, m_items ) // { // qDebug() << "ITEM #:" << item; // } // foreach( const QString& str, m_collapseCount.keys() ) // { // tDebug() << "\t" << str; // foreach( JobStatusItem* chain, m_collapseCount[ str ] ) // qDebug() << "\t\t" << chain; // } if ( m_collapseCount.contains( item->type() ) ) { const int indexOf = m_items.indexOf( m_collapseCount[ item->type() ].first() ); // tDebug() << "index in main list of collapsed irst item:" << indexOf; if ( m_collapseCount[ item->type() ].first() == item && m_items.contains( m_collapseCount[ item->type() ].first() ) && m_collapseCount[ item->type() ].size() > 1 ) { // the placeholder we use that links m_items and m_collapsecount is done, so choose another one m_items.replace( m_items.indexOf( m_collapseCount[ item->type() ].first() ), m_collapseCount[ item->type() ][ 1 ] ); // qDebug() << "Replaced" << m_collapseCount[ item->type() ].first() << "with:" << m_collapseCount[ item->type() ][ 1 ] << m_items; } m_collapseCount[ item->type() ].removeAll( item ); // tDebug() << "New collapse count list:" << m_collapseCount[ item->type() ]; if ( m_collapseCount[ item->type() ].isEmpty() ) m_collapseCount.remove( item->type() ); else { // One less to count, but item is still there const QModelIndex idx = index( indexOf, 0, QModelIndex() ); emit dataChanged( idx, idx ); return; } } // Remove row completely const int idx = m_items.indexOf( item ); // tDebug() << "Got index of item:" << idx; Q_ASSERT( idx >= 0 ); beginRemoveRows( QModelIndex(), idx, idx ); m_items.removeAll( item ); endRemoveRows(); if ( item->customDelegate() ) emit customDelegateJobRemoved( idx ); if ( item->concurrentJobLimit() > 0 ) { int currentJobs = m_jobTypeCount[ item->type() ]; 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 ) ); }