forked from qt-creator/qt-creator
Locator: Reuse TaskTree and TaskProgress
Change-Id: Icafef3463ec8956e5a4cfdf61d5a9b9ba9da09ec Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -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)
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user