Locator: Reuse TaskTree and TaskProgress

Change-Id: Icafef3463ec8956e5a4cfdf61d5a9b9ba9da09ec
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Jarek Kobus
2023-01-05 14:45:23 +01:00
parent 3171064ee2
commit c794194027
2 changed files with 33 additions and 32 deletions

View File

@@ -17,27 +17,20 @@
#include "spotlightlocatorfilter.h" #include "spotlightlocatorfilter.h"
#include "urllocatorfilter.h" #include "urllocatorfilter.h"
#include <coreplugin/coreplugin.h>
#include <coreplugin/coreconstants.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/settingsdatabase.h> #include <coreplugin/settingsdatabase.h>
#include <coreplugin/statusbarmanager.h> #include <coreplugin/statusbarmanager.h>
#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/editormanager/editormanager_p.h> #include <coreplugin/editormanager/editormanager_p.h>
#include <coreplugin/actionsfilter.h> #include <coreplugin/actionsfilter.h>
#include <coreplugin/progressmanager/progressmanager.h> #include <coreplugin/progressmanager/taskprogress.h>
#include <coreplugin/progressmanager/futureprogress.h>
#include <extensionsystem/pluginmanager.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/mapreduce.h> #include <utils/asynctask.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
#include <QAction>
#include <QMainWindow> #include <QMainWindow>
#include <QSettings>
using namespace Utils; using namespace Utils;
@@ -154,10 +147,7 @@ ExtensionSystem::IPlugin::ShutdownFlag Locator::aboutToShutdown(
{ {
m_shuttingDown = true; m_shuttingDown = true;
m_refreshTimer.stop(); m_refreshTimer.stop();
if (m_refreshTask.isRunning()) { m_taskTree.reset();
m_refreshTask.cancel();
m_refreshTask.waitForFinished();
}
return LocatorWidget::aboutToShutdown(emitAsynchronousShutdownFinished); return LocatorWidget::aboutToShutdown(emitAsynchronousShutdownFinished);
} }
@@ -380,28 +370,38 @@ void Locator::setUseCenteredPopupForShortcut(bool center)
m_instance->m_settings.useCenteredPopup = center; m_instance->m_settings.useCenteredPopup = center;
} }
void Locator::refresh(QList<ILocatorFilter *> filters) void Locator::refresh(const QList<ILocatorFilter *> &filters)
{ {
if (m_shuttingDown) if (m_shuttingDown)
return; return;
if (m_refreshTask.isRunning()) { m_taskTree.reset(); // Superfluous, just for clarity. The next reset() below is enough.
m_refreshTask.cancel(); m_refreshingFilters = Utils::filteredUnique(m_refreshingFilters + filters);
m_refreshTask.waitForFinished();
// this is not ideal because some of the previous filters might have finished, but we using namespace Tasking;
// currently cannot find out which part of a map-reduce has finished QList<TaskItem> tasks{parallel};
filters = Utils::filteredUnique(m_refreshingFilters + filters); for (ILocatorFilter *filter : std::as_const(m_refreshingFilters)) {
const auto setupRefresh = [filter](AsyncTask<void> &async) {
async.setAsyncCallData(&ILocatorFilter::refresh, filter);
};
const auto onRefreshDone = [this, filter](const AsyncTask<void> &async) {
Q_UNUSED(async)
m_refreshingFilters.removeOne(filter);
};
tasks.append(Async<void>(setupRefresh, onRefreshDone));
} }
m_refreshingFilters = filters;
m_refreshTask = Utils::map(filters, &ILocatorFilter::refresh, Utils::MapReduceOption::Unordered); m_taskTree.reset(new TaskTree{tasks});
ProgressManager::addTask(m_refreshTask, tr("Updating Locator Caches"), Constants::TASK_INDEX); connect(m_taskTree.get(), &TaskTree::done, this, [this] {
Utils::onFinished(m_refreshTask, this, [this](const QFuture<void> &future) { saveSettings();
if (!future.isCanceled()) { m_taskTree.release()->deleteLater();
saveSettings();
m_refreshingFilters.clear();
m_refreshTask = QFuture<void>();
}
}); });
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) void Locator::showFilter(ILocatorFilter *filter, LocatorWidget *widget)

View File

@@ -8,12 +8,13 @@
#include <coreplugin/actionmanager/command.h> #include <coreplugin/actionmanager/command.h>
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
#include <QFuture>
#include <QObject> #include <QObject>
#include <QTimer> #include <QTimer>
#include <functional> #include <functional>
namespace Utils { class TaskTree; }
namespace Core { namespace Core {
namespace Internal { namespace Internal {
@@ -52,7 +53,7 @@ signals:
void filtersChanged(); void filtersChanged();
public slots: public slots:
void refresh(QList<ILocatorFilter *> filters); void refresh(const QList<ILocatorFilter *> &filters);
void saveSettings() const; void saveSettings() const;
private: private:
@@ -74,7 +75,7 @@ private:
QList<ILocatorFilter *> m_customFilters; QList<ILocatorFilter *> m_customFilters;
QMap<Utils::Id, QAction *> m_filterActionMap; QMap<Utils::Id, QAction *> m_filterActionMap;
QTimer m_refreshTimer; QTimer m_refreshTimer;
QFuture<void> m_refreshTask; std::unique_ptr<Utils::TaskTree> m_taskTree;
QList<ILocatorFilter *> m_refreshingFilters; QList<ILocatorFilter *> m_refreshingFilters;
}; };