aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/coreplugin/locator/commandlocator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/coreplugin/locator/commandlocator.cpp')
-rw-r--r--src/plugins/coreplugin/locator/commandlocator.cpp128
1 files changed, 44 insertions, 84 deletions
diff --git a/src/plugins/coreplugin/locator/commandlocator.cpp b/src/plugins/coreplugin/locator/commandlocator.cpp
index de2989bc17c..e960b4df85d 100644
--- a/src/plugins/coreplugin/locator/commandlocator.cpp
+++ b/src/plugins/coreplugin/locator/commandlocator.cpp
@@ -5,7 +5,6 @@
#include <coreplugin/actionmanager/command.h>
-#include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <QAction>
@@ -14,97 +13,58 @@ using namespace Utils;
namespace Core {
-struct CommandLocatorPrivate
-{
- QList<Command *> commands;
- QList<QPair<int, QString>> commandsData;
-};
-
-/*!
- \class Core::CommandLocator
- \inmodule QtCreator
- \internal
-*/
-
-CommandLocator::CommandLocator(Id id,
- const QString &displayName,
- const QString &shortCutString,
- QObject *parent) :
- ILocatorFilter(parent),
- d(new CommandLocatorPrivate)
+CommandLocator::CommandLocator(Id id, const QString &displayName, const QString &shortCutString,
+ QObject *parent)
+ : ILocatorFilter(parent)
{
setId(id);
setDisplayName(displayName);
setDefaultShortcutString(shortCutString);
}
-CommandLocator::~CommandLocator()
-{
- delete d;
-}
-
-void CommandLocator::appendCommand(Command *cmd)
-{
- d->commands.push_back(cmd);
-}
-
-void CommandLocator::prepareSearch(const QString &entry)
+LocatorMatcherTasks CommandLocator::matchers()
{
- Q_UNUSED(entry)
- d->commandsData = {};
- const int count = d->commands.size();
- // Get active, enabled actions matching text, store in list.
- // Reference via index in extraInfo.
- for (int i = 0; i < count; ++i) {
- Command *command = d->commands.at(i);
- if (!command->isActive())
- continue;
- QAction *action = command->action();
- if (action && action->isEnabled())
- d->commandsData.append({i, action->text()});
- }
-}
-
-QList<LocatorFilterEntry> CommandLocator::matchesFor(QFutureInterface<LocatorFilterEntry> &future, const QString &entry)
-{
- QList<LocatorFilterEntry> goodEntries;
- QList<LocatorFilterEntry> betterEntries;
- const Qt::CaseSensitivity entryCaseSensitivity = caseSensitivity(entry);
- for (const auto &pair : std::as_const(d->commandsData)) {
- if (future.isCanceled())
- break;
-
- const QString text = Utils::stripAccelerator(pair.second);
- const int index = text.indexOf(entry, 0, entryCaseSensitivity);
- if (index >= 0) {
- LocatorFilterEntry filterEntry(this, text, QVariant(pair.first));
- filterEntry.highlightInfo = {index, int(entry.length())};
-
- if (index == 0)
- betterEntries.append(filterEntry);
- else
- goodEntries.append(filterEntry);
+ using namespace Tasking;
+
+ TreeStorage<LocatorStorage> storage;
+
+ const auto onSetup = [storage, commands = m_commands] {
+ const QString input = storage->input();
+ const Qt::CaseSensitivity inputCaseSensitivity = caseSensitivity(input);
+ LocatorFilterEntries goodEntries;
+ LocatorFilterEntries betterEntries;
+ for (Command *command : commands) {
+ if (!command->isActive())
+ continue;
+
+ QAction *action = command->action();
+ if (!action || !action->isEnabled())
+ continue;
+
+ const QString text = Utils::stripAccelerator(action->text());
+ const int index = text.indexOf(input, 0, inputCaseSensitivity);
+ if (index >= 0) {
+ LocatorFilterEntry entry;
+ entry.displayName = text;
+ entry.acceptor = [actionPointer = QPointer(action)] {
+ if (actionPointer) {
+ QMetaObject::invokeMethod(actionPointer, [actionPointer] {
+ if (actionPointer && actionPointer->isEnabled())
+ actionPointer->trigger();
+ }, Qt::QueuedConnection);
+ }
+ return AcceptResult();
+ };
+ entry.highlightInfo = {index, int(input.length())};
+ if (index == 0)
+ betterEntries.append(entry);
+ else
+ goodEntries.append(entry);
+ }
}
- }
- betterEntries.append(goodEntries);
- return betterEntries;
-}
-
-void CommandLocator::accept(const LocatorFilterEntry &entry,
- QString *newText, int *selectionStart, int *selectionLength) const
-{
- Q_UNUSED(newText)
- Q_UNUSED(selectionStart)
- Q_UNUSED(selectionLength)
- // Retrieve action via index.
- const int index = entry.internalData.toInt();
- QTC_ASSERT(index >= 0 && index < d->commands.size(), return);
- QAction *action = d->commands.at(index)->action();
- // avoid nested stack trace and blocking locator by delayed triggering
- QMetaObject::invokeMethod(action, [action] {
- if (action->isEnabled())
- action->trigger();
- }, Qt::QueuedConnection);
+ storage->reportOutput(betterEntries + goodEntries);
+ };
+ return {{Sync(onSetup), storage}};
}
} // namespace Core