From ba73e3e50a50fd33d61583cd181be1a2190b8ebb Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 10 Jun 2024 13:45:26 +0200 Subject: [PATCH] SubDirFileContainer: Add optional filtering function Change-Id: Icf972babadc87dbc681ca282984b82484afc68c4 Reviewed-by: Eike Ziller --- src/libs/utils/filesearch.cpp | 49 +++++++++++++------ src/libs/utils/filesearch.h | 13 +++-- .../projectexplorer/allprojectsfind.cpp | 2 +- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/libs/utils/filesearch.cpp b/src/libs/utils/filesearch.cpp index f97934cde40..c023ccab9b9 100644 --- a/src/libs/utils/filesearch.cpp +++ b/src/libs/utils/filesearch.cpp @@ -462,14 +462,17 @@ static bool isFileIncluded(const QList &filterRegs, return isIncluded && (exclusionRegs.isEmpty() || !matches(exclusionRegs, filePath)); } -std::function filterFilesFunction(const QStringList &filters, - const QStringList &exclusionFilters) +FilterFilesFunction filterFilesFunction(const QStringList &filters, + const QStringList &exclusionFilters, + const FilterFileFunction &filterFileFuntion) { const QList filterRegs = filtersToRegExps(filters); const QList exclusionRegs = filtersToRegExps(exclusionFilters); - return [filterRegs, exclusionRegs](const FilePaths &filePaths) { - return Utils::filtered(filePaths, [&filterRegs, &exclusionRegs](const FilePath &filePath) { - return isFileIncluded(filterRegs, exclusionRegs, filePath); + return [filterRegs, exclusionRegs, filterFileFuntion](const FilePaths &filePaths) { + return Utils::filtered(filePaths, [&filterRegs, &exclusionRegs, filterFileFuntion]( + const FilePath &filePath) { + return isFileIncluded(filterRegs, exclusionRegs, filePath) && + (!filterFileFuntion || filterFileFuntion(filePath)); }); }; } @@ -583,12 +586,14 @@ const int s_progressMaximum = 1000; struct SubDirCache { SubDirCache(const FilePaths &directories, const QStringList &filters, - const QStringList &exclusionFilters, QTextCodec *encoding); + const QStringList &exclusionFilters, + const FilterFileFunction &filterFileFuntion, QTextCodec *encoding); std::optional updateCache(int advanceIntoIndex, const SubDirCache &initialCache); - std::function m_filterFiles; + FilterFilesFunction m_filterFilesFunction; + FilterFileFunction m_filterFileFunction; QTextCodec *m_encoding = nullptr; QStack m_dirs; QSet m_knownDirs; @@ -606,8 +611,10 @@ struct SubDirCache }; SubDirCache::SubDirCache(const FilePaths &directories, const QStringList &filters, - const QStringList &exclusionFilters, QTextCodec *encoding) - : m_filterFiles(filterFilesFunction(filters, exclusionFilters)) + const QStringList &exclusionFilters, + const FilterFileFunction &filterFileFuntion, QTextCodec *encoding) + : m_filterFilesFunction(filterFilesFunction(filters, exclusionFilters, filterFileFuntion)) + , m_filterFileFunction(filterFileFuntion) , m_encoding(encoding == nullptr ? QTextCodec::codecForLocale() : encoding) { const qreal maxPer = qreal(s_progressMaximum) / directories.count(); @@ -642,7 +649,7 @@ std::optional SubDirCache::updateCache(int advanceI const FilePath dir = m_dirs.pop(); const qreal dirProgressMax = m_progressValues.pop(); const bool processed = m_processedValues.pop(); - if (dir.exists()) { + if (dir.exists() && (!m_filterFileFunction || m_filterFileFunction(dir))) { using Dir = FilePath; using CanonicalDir = FilePath; std::vector> subDirs; @@ -657,7 +664,7 @@ std::optional SubDirCache::updateCache(int advanceI } if (subDirs.empty()) { const FilePaths allFilePaths = dir.dirEntries(QDir::Files | QDir::Hidden); - const FilePaths filePaths = m_filterFiles(allFilePaths); + const FilePaths filePaths = m_filterFilesFunction(allFilePaths); m_items.reserve(m_items.size() + filePaths.size()); Utils::reverseForeach(filePaths, [this](const FilePath &file) { m_items.append({file, m_encoding}); @@ -706,15 +713,25 @@ static FileContainerIterator::Advancer subDirAdvancer(const SubDirCache &initial } static FileContainer::AdvancerProvider subDirAdvancerProvider(const FilePaths &directories, - const QStringList &filters, const QStringList &exclusionFilters, QTextCodec *encoding) + const QStringList &filters, const QStringList &exclusionFilters, + const FilterFileFunction &filterFileFuntion, QTextCodec *encoding) { - const SubDirCache initialCache(directories, filters, exclusionFilters, encoding); - return [=] { return subDirAdvancer(initialCache); }; + const SubDirCache initialCache(directories, filters, exclusionFilters, filterFileFuntion, + encoding); + return [initialCache] { return subDirAdvancer(initialCache); }; } SubDirFileContainer::SubDirFileContainer(const FilePaths &directories, const QStringList &filters, const QStringList &exclusionFilters, QTextCodec *encoding) - : FileContainer(subDirAdvancerProvider(directories, filters, exclusionFilters, encoding), - s_progressMaximum) {} + : FileContainer(subDirAdvancerProvider(directories, filters, exclusionFilters, {}, encoding), + s_progressMaximum) +{} + +SubDirFileContainer::SubDirFileContainer(const FilePaths &directories, + const FilterFileFunction &filterFileFuntion, + QTextCodec *encoding) + : FileContainer(subDirAdvancerProvider(directories, {}, {}, filterFileFuntion, encoding), + s_progressMaximum) +{} } // namespace Utils diff --git a/src/libs/utils/filesearch.h b/src/libs/utils/filesearch.h index 2d2155a723c..08a0a3a981a 100644 --- a/src/libs/utils/filesearch.h +++ b/src/libs/utils/filesearch.h @@ -31,6 +31,9 @@ enum FindFlag { }; Q_DECLARE_FLAGS(FindFlags, FindFlag) +using FilterFileFunction = std::function; +using FilterFilesFunction = std::function; + QTCREATOR_UTILS_EXPORT QTextDocument::FindFlags textDocumentFlagsForFindFlags(FindFlags flags); @@ -39,8 +42,9 @@ void searchInContents(QPromise &promise, const QString &searc FindFlags flags, const FilePath &filePath, const QString &contents); QTCREATOR_UTILS_EXPORT -std::function filterFilesFunction(const QStringList &filters, - const QStringList &exclusionFilters); +FilterFilesFunction filterFilesFunction(const QStringList &filters, + const QStringList &exclusionFilters, + const FilterFileFunction &filterFileFuntion = {}); QTCREATOR_UTILS_EXPORT QStringList splitFilterUiText(const QString &text); @@ -150,9 +154,10 @@ public: class QTCREATOR_UTILS_EXPORT SubDirFileContainer : public FileContainer { public: + SubDirFileContainer(const FilePaths &directories, const QStringList &filters, + const QStringList &exclusionFilters, QTextCodec *encoding = nullptr); SubDirFileContainer(const FilePaths &directories, - const QStringList &filters, - const QStringList &exclusionFilters, + const FilterFileFunction &filterFileFuntion = {}, QTextCodec *encoding = nullptr); }; diff --git a/src/plugins/projectexplorer/allprojectsfind.cpp b/src/plugins/projectexplorer/allprojectsfind.cpp index 5d8f285b001..b20ebe3dc5e 100644 --- a/src/plugins/projectexplorer/allprojectsfind.cpp +++ b/src/plugins/projectexplorer/allprojectsfind.cpp @@ -55,7 +55,7 @@ FileContainer AllProjectsFind::filesForProjects(const QStringList &nameFilters, const QStringList &exclusionFilters, const QList &projects) { - std::function filterFiles + const FilterFilesFunction filterFiles = Utils::filterFilesFunction(nameFilters, exclusionFilters); const QMap openEditorEncodings = TextDocument::openedTextDocumentEncodings();