diff options
Diffstat (limited to 'src/plugins/coreplugin/locator/commandlocator.cpp')
-rw-r--r-- | src/plugins/coreplugin/locator/commandlocator.cpp | 128 |
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 |