From d1803f84e17a85e9bf08a853f6afc4b4c4762fe5 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 22 Jan 2021 16:31:58 +0100 Subject: [PATCH] Add "File Name Index" locator filter for Linux Using the "locate" tool. Change-Id: Ic752b2d17e4874b95432510597ff33d5e3f967c5 Reviewed-by: Cristian Adam --- src/plugins/coreplugin/CMakeLists.txt | 5 +++ src/plugins/coreplugin/locator/locator.cpp | 4 +-- .../locator/spotlightlocatorfilter.cpp | 34 +++++++++++++------ .../locator/spotlightlocatorfilter.h | 5 +++ 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/plugins/coreplugin/CMakeLists.txt b/src/plugins/coreplugin/CMakeLists.txt index fdf91cee044..965eacd19f7 100644 --- a/src/plugins/coreplugin/CMakeLists.txt +++ b/src/plugins/coreplugin/CMakeLists.txt @@ -178,6 +178,11 @@ extend_qtc_plugin(Core DEPENDS ${FWAppKit} SOURCES progressmanager/progressmanager_mac.mm +) + +extend_qtc_plugin(Core + CONDITION NOT WIN32 + SOURCES locator/spotlightlocatorfilter.h locator/spotlightlocatorfilter.cpp ) diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index ea79a27dc24..f753c3fc55b 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -59,7 +59,7 @@ #include #include -#ifdef Q_OS_MACOS +#ifdef Q_OS_UNIX #include "spotlightlocatorfilter.h" #endif @@ -90,7 +90,7 @@ public: MenuBarFilter m_menubarFilter; UrlLocatorFilter m_urlFilter{UrlLocatorFilter::tr("Web Search"), "RemoteHelpFilter"}; UrlLocatorFilter m_bugFilter{UrlLocatorFilter::tr("Qt Project Bugs"), "QtProjectBugs"}; -#ifdef Q_OS_MACOS +#ifdef Q_OS_UNIX SpotlightLocatorFilter m_spotlightLocatorFilter; #endif }; diff --git a/src/plugins/coreplugin/locator/spotlightlocatorfilter.cpp b/src/plugins/coreplugin/locator/spotlightlocatorfilter.cpp index 5af7b6a45ba..11b8322dce6 100644 --- a/src/plugins/coreplugin/locator/spotlightlocatorfilter.cpp +++ b/src/plugins/coreplugin/locator/spotlightlocatorfilter.cpp @@ -32,10 +32,12 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -169,8 +171,26 @@ void SpotlightIterator::ensureNext() SpotlightLocatorFilter::SpotlightLocatorFilter() { + if (HostOsInfo::isMacHost()) { + command = [](const QString &query, Qt::CaseSensitivity sensitivity) { + QString quoted = query; + quoted.replace('\\', "\\\\").replace('\'', "\\\'").replace('\"', "\\\""); + return QStringList( + {"mdfind", + QString("kMDItemFSName = '*%1*'%2") + .arg(quoted, sensitivity == Qt::CaseInsensitive ? QString("c") : QString())}); + }; + } else { + command = [](const QString &query, Qt::CaseSensitivity sensitivity) { + QString regex = query; + regex = regex.replace('*', ".*"); + return QStringList({"locate"}) + + (sensitivity == Qt::CaseInsensitive ? QStringList({"-i"}) : QStringList()) + + QStringList({"-l", "10000", "-r", regex}); + }; + } setId("SpotlightFileNamesLocatorFilter"); - setDisplayName(tr("Spotlight File Name Index")); + setDisplayName(tr("File Name Index")); setShortcutString("md"); } @@ -180,16 +200,10 @@ void SpotlightLocatorFilter::prepareSearch(const QString &entry) if (fp.filePath.isEmpty()) { setFileIterator(new BaseFileFilter::ListIterator(Utils::FilePaths())); } else { - // only pass the file name part to spotlight to allow searches like "somepath/*foo" + // only pass the file name part to allow searches like "somepath/*foo" int lastSlash = fp.filePath.lastIndexOf(QLatin1Char('/')); - QString quoted = fp.filePath.mid(lastSlash + 1); - quoted.replace('\\', "\\\\").replace('\'', "\\\'").replace('\"', "\\\""); - setFileIterator(new SpotlightIterator( - {"mdfind", - QString("kMDItemFSName = '*%1*'%2") - .arg(quoted, - caseSensitivity(fp.filePath) == Qt::CaseInsensitive ? QString("c") - : QString())})); + const QString query = fp.filePath.mid(lastSlash + 1); + setFileIterator(new SpotlightIterator(command(query, caseSensitivity(fp.filePath)))); } BaseFileFilter::prepareSearch(entry); } diff --git a/src/plugins/coreplugin/locator/spotlightlocatorfilter.h b/src/plugins/coreplugin/locator/spotlightlocatorfilter.h index 5f22032d42d..5b1b4bef95d 100644 --- a/src/plugins/coreplugin/locator/spotlightlocatorfilter.h +++ b/src/plugins/coreplugin/locator/spotlightlocatorfilter.h @@ -27,6 +27,8 @@ #include "basefilefilter.h" +#include + namespace Core { namespace Internal { @@ -38,6 +40,9 @@ public: void prepareSearch(const QString &entry) override; void refresh(QFutureInterface &future) override; + +private: + std::function command; }; } // Internal