Index: core/libs/progressmanager/progressmanager.h =================================================================== --- core/libs/progressmanager/progressmanager.h +++ core/libs/progressmanager/progressmanager.h @@ -189,6 +189,8 @@ */ void progressItemProgress(ProgressItem*, unsigned int); + void progressItemTotal(ProgressItem*, unsigned int); + /** * Emitted when a progress item was completed. The item will be * deleted afterwards, so slots connected to this are the last @@ -391,6 +393,8 @@ */ void progressItemProgress(ProgressItem*, unsigned int); + void progressItemTotal(ProgressItem*, unsigned int); + /** * @see ProgressItem::progressItemCompleted() */ Index: core/libs/progressmanager/progressmanager.cpp =================================================================== --- core/libs/progressmanager/progressmanager.cpp +++ core/libs/progressmanager/progressmanager.cpp @@ -123,7 +123,7 @@ { if (!d->canceled) { - setProgress(100); + setProgress(d->total); } emit progressItemCompleted(this); @@ -236,7 +236,8 @@ void ProgressItem::updateProgress() { int total = d->total; - setProgress(total? d->completed * 100 / total : 0); + int completed = d->completed; + setProgress(total ? completed : 0); } bool ProgressItem::advance(unsigned int v) @@ -249,11 +250,13 @@ void ProgressItem::setTotalItems(unsigned int v) { d->total.fetchAndStoreOrdered(v); + emit progressItemTotal(this, v); } void ProgressItem::incTotalItems(unsigned int v) { d->total.fetchAndAddOrdered(v); + emit progressItemTotal(this, d->total); } unsigned int ProgressItem::totalItems() const @@ -512,6 +515,9 @@ connect(t, SIGNAL(progressItemProgress(ProgressItem*,uint)), this, SIGNAL(progressItemProgress(ProgressItem*,uint))); + connect(t, SIGNAL(progressItemTotal(ProgressItem*,uint)), + this, SIGNAL(progressItemTotal(ProgressItem*,uint))); + connect(t, SIGNAL(progressItemAdded(ProgressItem*)), this, SIGNAL(progressItemAdded(ProgressItem*))); Index: core/libs/progressmanager/progressview.h =================================================================== --- core/libs/progressmanager/progressview.h +++ core/libs/progressmanager/progressview.h @@ -138,6 +138,7 @@ void slotTransactionCompleted(ProgressItem*); void slotTransactionCanceled(ProgressItem*); void slotTransactionProgress(ProgressItem*, unsigned int progress); + void slotTransactionTotal(ProgressItem*, unsigned int total); void slotTransactionStatus(ProgressItem*, const QString&); void slotTransactionLabel(ProgressItem*, const QString&); void slotTransactionUsesBusyIndicator(ProgressItem*, bool); Index: core/libs/progressmanager/progressview.cpp =================================================================== --- core/libs/progressmanager/progressview.cpp +++ core/libs/progressmanager/progressview.cpp @@ -210,6 +210,7 @@ d->progress = new QProgressBar(h); d->progress->setMaximum(100); d->progress->setValue(item->progress()); + d->progress->setFormat(QStringLiteral("%v / %m")); h->layout()->addWidget(d->progress); if (item->canBeCanceled()) @@ -355,6 +356,9 @@ connect(pm, SIGNAL(progressItemProgress(ProgressItem*,uint)), this, SLOT(slotTransactionProgress(ProgressItem*,uint))); + connect(pm, SIGNAL(progressItemTotal(ProgressItem*,uint)), + this, SLOT(slotTransactionTotal(ProgressItem*,uint))); + connect(pm, SIGNAL(progressItemStatus(ProgressItem*,QString)), this, SLOT(slotTransactionStatus(ProgressItem*,QString))); @@ -460,6 +464,15 @@ } } +void ProgressView::slotTransactionTotal(ProgressItem* item, unsigned int total) +{ + if (d->transactionsToListviewItems.contains(item)) + { + TransactionItem* const ti = d->transactionsToListviewItems[item]; + ti->setTotalSteps(total); + } +} + void ProgressView::slotTransactionStatus(ProgressItem* item, const QString& status) { if (d->transactionsToListviewItems.contains(item)) Index: core/libs/progressmanager/statusbarprogresswidget.h =================================================================== --- core/libs/progressmanager/statusbarprogresswidget.h +++ core/libs/progressmanager/statusbarprogresswidget.h @@ -56,6 +56,7 @@ void slotProgressItemAdded(ProgressItem* i); void slotProgressItemCompleted(ProgressItem* i); void slotProgressItemProgress(ProgressItem* i, unsigned int value); + void slotProgressItemTotal(ProgressItem* i, unsigned int value); protected Q_SLOTS: Index: core/libs/progressmanager/statusbarprogresswidget.cpp =================================================================== --- core/libs/progressmanager/statusbarprogresswidget.cpp +++ core/libs/progressmanager/statusbarprogresswidget.cpp @@ -294,6 +294,9 @@ disconnect(d->currentItem, SIGNAL(progressItemProgress(ProgressItem*,uint)), this, SLOT(slotProgressItemProgress(ProgressItem*,uint))); + disconnect(d->currentItem, SIGNAL(progressItemTotal(ProgressItem*,uint)), + this, SLOT(slotProgressItemTotal(ProgressItem*,uint))); + d->currentItem = nullptr; } @@ -303,14 +306,17 @@ { connect(d->currentItem, SIGNAL(progressItemProgress(ProgressItem*,uint)), this, SLOT(slotProgressItemProgress(ProgressItem*,uint))); + + connect(d->currentItem, SIGNAL(progressItemTotal(ProgressItem*,uint)), + this, SLOT(slotProgressItemTotal(ProgressItem*,uint))); } } void StatusbarProgressWidget::activateSingleItemMode() { - d->pProgressBar->setMaximum(100); d->pProgressBar->setValue(d->currentItem->progress()); d->pProgressBar->setTextVisible(true); + d->pProgressBar->setFormat(QStringLiteral("%v / %m")); } void StatusbarProgressWidget::slotShowItemDelayed() @@ -357,6 +363,16 @@ d->pProgressBar->setValue(value); } +void StatusbarProgressWidget::slotProgressItemTotal(ProgressItem* item, unsigned int value) +{ + if (item != d->currentItem) // single item mode; discard others + { + return; + } + + d->pProgressBar->setMaximum(value); +} + void StatusbarProgressWidget::setMode() { switch (d->mode)