diff --git a/src/plugins/macros/macrolocatorfilter.cpp b/src/plugins/macros/macrolocatorfilter.cpp index 8c90cccd156..dacb522f266 100644 --- a/src/plugins/macros/macrolocatorfilter.cpp +++ b/src/plugins/macros/macrolocatorfilter.cpp @@ -14,6 +14,7 @@ using namespace Core; using namespace Macros; using namespace Macros::Internal; +using namespace Utils; MacroLocatorFilter::MacroLocatorFilter() : m_icon(QPixmap(":/macros/images/macro.png")) @@ -25,7 +26,55 @@ MacroLocatorFilter::MacroLocatorFilter() setDefaultShortcutString("rm"); } -MacroLocatorFilter::~MacroLocatorFilter() = default; +LocatorMatcherTasks MacroLocatorFilter::matchers() +{ + using namespace Tasking; + + TreeStorage storage; + + const auto onSetup = [storage, icon = m_icon] { + const QString input = storage->input(); + const Qt::CaseSensitivity entryCaseSensitivity = caseSensitivity(input); + const QMap ¯os = MacroManager::macros(); + LocatorFilterEntries goodEntries; + LocatorFilterEntries betterEntries; + for (auto it = macros.cbegin(); it != macros.cend(); ++it) { + const QString displayName = it.key(); + const QString description = it.value()->description(); + int index = displayName.indexOf(input, 0, entryCaseSensitivity); + LocatorFilterEntry::HighlightInfo::DataType hDataType + = LocatorFilterEntry::HighlightInfo::DisplayName; + if (index < 0) { + index = description.indexOf(input, 0, entryCaseSensitivity); + hDataType = LocatorFilterEntry::HighlightInfo::ExtraInfo; + } + + if (index >= 0) { + LocatorFilterEntry filterEntry; + filterEntry.displayName = displayName; + filterEntry.acceptor = [displayName] { + IEditor *editor = EditorManager::currentEditor(); + if (editor) + editor->widget()->setFocus(Qt::OtherFocusReason); + MacroManager::instance()->executeMacro(displayName); + return AcceptResult(); + }; + filterEntry.displayIcon = icon; + filterEntry.extraInfo = description; + filterEntry.highlightInfo = LocatorFilterEntry::HighlightInfo(index, input.length(), + hDataType); + if (index == 0) + betterEntries.append(filterEntry); + else + goodEntries.append(filterEntry); + } + } + storage->reportOutput(betterEntries + goodEntries); + return true; + }; + + return {{Sync(onSetup), storage}}; +} QList MacroLocatorFilter::matchesFor(QFutureInterface &future, const QString &entry) { diff --git a/src/plugins/macros/macrolocatorfilter.h b/src/plugins/macros/macrolocatorfilter.h index 3807548f69e..189cfcc6973 100644 --- a/src/plugins/macros/macrolocatorfilter.h +++ b/src/plugins/macros/macrolocatorfilter.h @@ -14,11 +14,12 @@ class MacroLocatorFilter : public Core::ILocatorFilter public: MacroLocatorFilter(); - ~MacroLocatorFilter() override; QList matchesFor(QFutureInterface &future, const QString &entry) override; private: + Core::LocatorMatcherTasks matchers() final; + const QIcon m_icon; };