FutureProgress *ProgressView::addTask(const QFuture<void> &future, const QString &title, const QString &type, ProgressManager::ProgressFlags flags) { removeOldTasks(type); if (m_taskList.size() == 3) removeOneOldTask(); FutureProgress *progress = new FutureProgress(this); progress->setTitle(title); progress->setFuture(future); m_layout->insertWidget(0, progress); m_taskList.append(progress); progress->setType(type); if (flags.testFlag(ProgressManager::KeepOnFinish)) { progress->setKeepOnFinish(FutureProgress::KeepOnFinishTillUserInteraction); } else { progress->setKeepOnFinish(FutureProgress::HideOnFinish); } connect(progress, SIGNAL(removeMe()), this, SLOT(slotRemoveTask())); return progress; }
FutureProgress *ProgressManagerPrivate::doAddTask(const QFuture<void> &future, const QString &title, Id type, ProgressFlags flags) { // watch QFutureWatcher<void> *watcher = new QFutureWatcher<void>(); m_runningTasks.insert(watcher, type); connect(watcher, &QFutureWatcherBase::progressRangeChanged, this, &ProgressManagerPrivate::updateSummaryProgressBar); connect(watcher, &QFutureWatcherBase::progressValueChanged, this, &ProgressManagerPrivate::updateSummaryProgressBar); connect(watcher, &QFutureWatcherBase::finished, this, &ProgressManagerPrivate::taskFinished); watcher->setFuture(future); // handle application task if (flags & ShowInApplicationIcon) { if (m_applicationTask) disconnectApplicationTask(); m_applicationTask = watcher; setApplicationProgressRange(future.progressMinimum(), future.progressMaximum()); setApplicationProgressValue(future.progressValue()); connect(m_applicationTask, &QFutureWatcherBase::progressRangeChanged, this, &ProgressManagerPrivate::setApplicationProgressRange); connect(m_applicationTask, &QFutureWatcherBase::progressValueChanged, this, &ProgressManagerPrivate::setApplicationProgressValue); setApplicationProgressVisible(true); } // create FutureProgress and manage task list removeOldTasks(type); if (m_taskList.size() == 10) removeOneOldTask(); FutureProgress *progress = new FutureProgress; progress->setTitle(title); progress->setFuture(future); m_progressView->addProgressWidget(progress); m_taskList.append(progress); progress->setType(type); if (flags.testFlag(ProgressManager::KeepOnFinish)) progress->setKeepOnFinish(FutureProgress::KeepOnFinishTillUserInteraction); else progress->setKeepOnFinish(FutureProgress::HideOnFinish); connect(progress, &FutureProgress::hasErrorChanged, this, &ProgressManagerPrivate::updateSummaryProgressBar); connect(progress, &FutureProgress::removeMe, this, &ProgressManagerPrivate::slotRemoveTask); connect(progress, &FutureProgress::fadeStarted, this, &ProgressManagerPrivate::updateSummaryProgressBar); connect(progress, &FutureProgress::statusBarWidgetChanged, this, &ProgressManagerPrivate::updateStatusDetailsWidget); updateStatusDetailsWidget(); emit taskStarted(type); return progress; }