From c79419402790ecb1a0b27a77740b416c8ce6ac5e Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 5 Jan 2023 14:45:23 +0100 Subject: [PATCH] Locator: Reuse TaskTree and TaskProgress Change-Id: Icafef3463ec8956e5a4cfdf61d5a9b9ba9da09ec Reviewed-by: Eike Ziller --- src/plugins/coreplugin/locator/locator.cpp | 58 +++++++++++----------- src/plugins/coreplugin/locator/locator.h | 7 +-- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index 6380e87cebf..504b0fcb95a 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -17,27 +17,20 @@ #include "spotlightlocatorfilter.h" #include "urllocatorfilter.h" -#include -#include #include #include #include #include #include -#include #include #include -#include -#include -#include +#include #include -#include +#include #include #include -#include #include -#include using namespace Utils; @@ -154,10 +147,7 @@ ExtensionSystem::IPlugin::ShutdownFlag Locator::aboutToShutdown( { m_shuttingDown = true; m_refreshTimer.stop(); - if (m_refreshTask.isRunning()) { - m_refreshTask.cancel(); - m_refreshTask.waitForFinished(); - } + m_taskTree.reset(); return LocatorWidget::aboutToShutdown(emitAsynchronousShutdownFinished); } @@ -380,28 +370,38 @@ void Locator::setUseCenteredPopupForShortcut(bool center) m_instance->m_settings.useCenteredPopup = center; } -void Locator::refresh(QList filters) +void Locator::refresh(const QList &filters) { if (m_shuttingDown) return; - if (m_refreshTask.isRunning()) { - m_refreshTask.cancel(); - m_refreshTask.waitForFinished(); - // this is not ideal because some of the previous filters might have finished, but we - // currently cannot find out which part of a map-reduce has finished - filters = Utils::filteredUnique(m_refreshingFilters + filters); + m_taskTree.reset(); // Superfluous, just for clarity. The next reset() below is enough. + m_refreshingFilters = Utils::filteredUnique(m_refreshingFilters + filters); + + using namespace Tasking; + QList tasks{parallel}; + for (ILocatorFilter *filter : std::as_const(m_refreshingFilters)) { + const auto setupRefresh = [filter](AsyncTask &async) { + async.setAsyncCallData(&ILocatorFilter::refresh, filter); + }; + const auto onRefreshDone = [this, filter](const AsyncTask &async) { + Q_UNUSED(async) + m_refreshingFilters.removeOne(filter); + }; + tasks.append(Async(setupRefresh, onRefreshDone)); } - m_refreshingFilters = filters; - m_refreshTask = Utils::map(filters, &ILocatorFilter::refresh, Utils::MapReduceOption::Unordered); - ProgressManager::addTask(m_refreshTask, tr("Updating Locator Caches"), Constants::TASK_INDEX); - Utils::onFinished(m_refreshTask, this, [this](const QFuture &future) { - if (!future.isCanceled()) { - saveSettings(); - m_refreshingFilters.clear(); - m_refreshTask = QFuture(); - } + + m_taskTree.reset(new TaskTree{tasks}); + connect(m_taskTree.get(), &TaskTree::done, this, [this] { + saveSettings(); + m_taskTree.release()->deleteLater(); }); + connect(m_taskTree.get(), &TaskTree::errorOccurred, this, [this] { + m_taskTree.release()->deleteLater(); + }); + auto progress = new TaskProgress(m_taskTree.get()); + progress->setDisplayName(tr("Updating Locator Caches")); + m_taskTree->start(); } void Locator::showFilter(ILocatorFilter *filter, LocatorWidget *widget) diff --git a/src/plugins/coreplugin/locator/locator.h b/src/plugins/coreplugin/locator/locator.h index 0ab8b75b91e..59da8767d8a 100644 --- a/src/plugins/coreplugin/locator/locator.h +++ b/src/plugins/coreplugin/locator/locator.h @@ -8,12 +8,13 @@ #include #include -#include #include #include #include +namespace Utils { class TaskTree; } + namespace Core { namespace Internal { @@ -52,7 +53,7 @@ signals: void filtersChanged(); public slots: - void refresh(QList filters); + void refresh(const QList &filters); void saveSettings() const; private: @@ -74,7 +75,7 @@ private: QList m_customFilters; QMap m_filterActionMap; QTimer m_refreshTimer; - QFuture m_refreshTask; + std::unique_ptr m_taskTree; QList m_refreshingFilters; };