diff --git a/src/plugins/coreplugin/locator/externaltoolsfilter.cpp b/src/plugins/coreplugin/locator/externaltoolsfilter.cpp index f19ec49a69d..d62a9903071 100644 --- a/src/plugins/coreplugin/locator/externaltoolsfilter.cpp +++ b/src/plugins/coreplugin/locator/externaltoolsfilter.cpp @@ -25,6 +25,65 @@ ExternalToolsFilter::ExternalToolsFilter() setPriority(Medium); } +LocatorMatcherTasks ExternalToolsFilter::matchers() +{ + using namespace Utils::Tasking; + + TreeStorage storage; + + const auto onSetup = [storage] { + const QString input = storage->input(); + + LocatorFilterEntries bestEntries; + LocatorFilterEntries betterEntries; + LocatorFilterEntries goodEntries; + const Qt::CaseSensitivity entryCaseSensitivity = caseSensitivity(input); + const QMap externalToolsById = ExternalToolManager::toolsById(); + for (ExternalTool *tool : externalToolsById) { + int index = tool->displayName().indexOf(input, 0, entryCaseSensitivity); + LocatorFilterEntry::HighlightInfo::DataType hDataType = LocatorFilterEntry::HighlightInfo::DisplayName; + if (index < 0) { + index = tool->description().indexOf(input, 0, entryCaseSensitivity); + hDataType = LocatorFilterEntry::HighlightInfo::ExtraInfo; + } + + if (index >= 0) { + LocatorFilterEntry filterEntry; + filterEntry.displayName = tool->displayName(); + filterEntry.acceptor = [tool] { + auto runner = new ExternalToolRunner(tool); + if (runner->hasError()) + MessageManager::writeFlashing(runner->errorString()); + return AcceptResult(); + }; + filterEntry.extraInfo = tool->description(); + filterEntry.highlightInfo = LocatorFilterEntry::HighlightInfo(index, input.length(), hDataType); + + if (filterEntry.displayName.startsWith(input, entryCaseSensitivity)) + bestEntries.append(filterEntry); + else if (filterEntry.displayName.contains(input, entryCaseSensitivity)) + betterEntries.append(filterEntry); + else + goodEntries.append(filterEntry); + } + } + LocatorFilterEntry configEntry; + configEntry.displayName = "Configure External Tool..."; + configEntry.extraInfo = "Opens External Tool settings"; + configEntry.acceptor = [] { + QMetaObject::invokeMethod(CorePlugin::instance(), [] { + ICore::showOptionsDialog(Constants::SETTINGS_ID_TOOLS); + }, Qt::QueuedConnection); + return AcceptResult(); + }; + + storage->reportOutput(bestEntries + betterEntries + goodEntries + + LocatorFilterEntries{configEntry}); + return true; + }; + return {{Sync(onSetup), storage}}; +} + QList ExternalToolsFilter::matchesFor(QFutureInterface &, const QString &) { diff --git a/src/plugins/coreplugin/locator/externaltoolsfilter.h b/src/plugins/coreplugin/locator/externaltoolsfilter.h index e97c04c2768..74c83112b50 100644 --- a/src/plugins/coreplugin/locator/externaltoolsfilter.h +++ b/src/plugins/coreplugin/locator/externaltoolsfilter.h @@ -18,6 +18,8 @@ public: QList matchesFor(QFutureInterface &future, const QString &entry) override; private: + LocatorMatcherTasks matchers() final; + QList m_results; };