SubDirFileContainer: Add optional filtering function

Change-Id: Icf972babadc87dbc681ca282984b82484afc68c4
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Jarek Kobus
2024-06-10 13:45:26 +02:00
parent 81ed276828
commit ba73e3e50a
3 changed files with 43 additions and 21 deletions

View File

@@ -462,14 +462,17 @@ static bool isFileIncluded(const QList<QRegularExpression> &filterRegs,
return isIncluded && (exclusionRegs.isEmpty() || !matches(exclusionRegs, filePath)); return isIncluded && (exclusionRegs.isEmpty() || !matches(exclusionRegs, filePath));
} }
std::function<FilePaths(const FilePaths &)> filterFilesFunction(const QStringList &filters, FilterFilesFunction filterFilesFunction(const QStringList &filters,
const QStringList &exclusionFilters) const QStringList &exclusionFilters,
const FilterFileFunction &filterFileFuntion)
{ {
const QList<QRegularExpression> filterRegs = filtersToRegExps(filters); const QList<QRegularExpression> filterRegs = filtersToRegExps(filters);
const QList<QRegularExpression> exclusionRegs = filtersToRegExps(exclusionFilters); const QList<QRegularExpression> exclusionRegs = filtersToRegExps(exclusionFilters);
return [filterRegs, exclusionRegs](const FilePaths &filePaths) { return [filterRegs, exclusionRegs, filterFileFuntion](const FilePaths &filePaths) {
return Utils::filtered(filePaths, [&filterRegs, &exclusionRegs](const FilePath &filePath) { return Utils::filtered(filePaths, [&filterRegs, &exclusionRegs, filterFileFuntion](
return isFileIncluded(filterRegs, exclusionRegs, filePath); const FilePath &filePath) {
return isFileIncluded(filterRegs, exclusionRegs, filePath) &&
(!filterFileFuntion || filterFileFuntion(filePath));
}); });
}; };
} }
@@ -583,12 +586,14 @@ const int s_progressMaximum = 1000;
struct SubDirCache struct SubDirCache
{ {
SubDirCache(const FilePaths &directories, const QStringList &filters, SubDirCache(const FilePaths &directories, const QStringList &filters,
const QStringList &exclusionFilters, QTextCodec *encoding); const QStringList &exclusionFilters,
const FilterFileFunction &filterFileFuntion, QTextCodec *encoding);
std::optional<FileContainerIterator::Item> updateCache(int advanceIntoIndex, std::optional<FileContainerIterator::Item> updateCache(int advanceIntoIndex,
const SubDirCache &initialCache); const SubDirCache &initialCache);
std::function<FilePaths(const FilePaths &)> m_filterFiles; FilterFilesFunction m_filterFilesFunction;
FilterFileFunction m_filterFileFunction;
QTextCodec *m_encoding = nullptr; QTextCodec *m_encoding = nullptr;
QStack<FilePath> m_dirs; QStack<FilePath> m_dirs;
QSet<FilePath> m_knownDirs; QSet<FilePath> m_knownDirs;
@@ -606,8 +611,10 @@ struct SubDirCache
}; };
SubDirCache::SubDirCache(const FilePaths &directories, const QStringList &filters, SubDirCache::SubDirCache(const FilePaths &directories, const QStringList &filters,
const QStringList &exclusionFilters, QTextCodec *encoding) const QStringList &exclusionFilters,
: m_filterFiles(filterFilesFunction(filters, exclusionFilters)) const FilterFileFunction &filterFileFuntion, QTextCodec *encoding)
: m_filterFilesFunction(filterFilesFunction(filters, exclusionFilters, filterFileFuntion))
, m_filterFileFunction(filterFileFuntion)
, m_encoding(encoding == nullptr ? QTextCodec::codecForLocale() : encoding) , m_encoding(encoding == nullptr ? QTextCodec::codecForLocale() : encoding)
{ {
const qreal maxPer = qreal(s_progressMaximum) / directories.count(); const qreal maxPer = qreal(s_progressMaximum) / directories.count();
@@ -642,7 +649,7 @@ std::optional<FileContainerIterator::Item> SubDirCache::updateCache(int advanceI
const FilePath dir = m_dirs.pop(); const FilePath dir = m_dirs.pop();
const qreal dirProgressMax = m_progressValues.pop(); const qreal dirProgressMax = m_progressValues.pop();
const bool processed = m_processedValues.pop(); const bool processed = m_processedValues.pop();
if (dir.exists()) { if (dir.exists() && (!m_filterFileFunction || m_filterFileFunction(dir))) {
using Dir = FilePath; using Dir = FilePath;
using CanonicalDir = FilePath; using CanonicalDir = FilePath;
std::vector<std::pair<Dir, CanonicalDir>> subDirs; std::vector<std::pair<Dir, CanonicalDir>> subDirs;
@@ -657,7 +664,7 @@ std::optional<FileContainerIterator::Item> SubDirCache::updateCache(int advanceI
} }
if (subDirs.empty()) { if (subDirs.empty()) {
const FilePaths allFilePaths = dir.dirEntries(QDir::Files | QDir::Hidden); 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()); m_items.reserve(m_items.size() + filePaths.size());
Utils::reverseForeach(filePaths, [this](const FilePath &file) { Utils::reverseForeach(filePaths, [this](const FilePath &file) {
m_items.append({file, m_encoding}); m_items.append({file, m_encoding});
@@ -706,15 +713,25 @@ static FileContainerIterator::Advancer subDirAdvancer(const SubDirCache &initial
} }
static FileContainer::AdvancerProvider subDirAdvancerProvider(const FilePaths &directories, 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); const SubDirCache initialCache(directories, filters, exclusionFilters, filterFileFuntion,
return [=] { return subDirAdvancer(initialCache); }; encoding);
return [initialCache] { return subDirAdvancer(initialCache); };
} }
SubDirFileContainer::SubDirFileContainer(const FilePaths &directories, const QStringList &filters, SubDirFileContainer::SubDirFileContainer(const FilePaths &directories, const QStringList &filters,
const QStringList &exclusionFilters, QTextCodec *encoding) const QStringList &exclusionFilters, QTextCodec *encoding)
: FileContainer(subDirAdvancerProvider(directories, filters, exclusionFilters, encoding), : FileContainer(subDirAdvancerProvider(directories, filters, exclusionFilters, {}, encoding),
s_progressMaximum) {} s_progressMaximum)
{}
SubDirFileContainer::SubDirFileContainer(const FilePaths &directories,
const FilterFileFunction &filterFileFuntion,
QTextCodec *encoding)
: FileContainer(subDirAdvancerProvider(directories, {}, {}, filterFileFuntion, encoding),
s_progressMaximum)
{}
} // namespace Utils } // namespace Utils

View File

@@ -31,6 +31,9 @@ enum FindFlag {
}; };
Q_DECLARE_FLAGS(FindFlags, FindFlag) Q_DECLARE_FLAGS(FindFlags, FindFlag)
using FilterFileFunction = std::function<bool(const FilePath &filePath)>;
using FilterFilesFunction = std::function<FilePaths(const FilePaths &filePath)>;
QTCREATOR_UTILS_EXPORT QTCREATOR_UTILS_EXPORT
QTextDocument::FindFlags textDocumentFlagsForFindFlags(FindFlags flags); QTextDocument::FindFlags textDocumentFlagsForFindFlags(FindFlags flags);
@@ -39,8 +42,9 @@ void searchInContents(QPromise<SearchResultItems> &promise, const QString &searc
FindFlags flags, const FilePath &filePath, const QString &contents); FindFlags flags, const FilePath &filePath, const QString &contents);
QTCREATOR_UTILS_EXPORT QTCREATOR_UTILS_EXPORT
std::function<FilePaths(const FilePaths &)> filterFilesFunction(const QStringList &filters, FilterFilesFunction filterFilesFunction(const QStringList &filters,
const QStringList &exclusionFilters); const QStringList &exclusionFilters,
const FilterFileFunction &filterFileFuntion = {});
QTCREATOR_UTILS_EXPORT QTCREATOR_UTILS_EXPORT
QStringList splitFilterUiText(const QString &text); QStringList splitFilterUiText(const QString &text);
@@ -150,9 +154,10 @@ public:
class QTCREATOR_UTILS_EXPORT SubDirFileContainer : public FileContainer class QTCREATOR_UTILS_EXPORT SubDirFileContainer : public FileContainer
{ {
public: public:
SubDirFileContainer(const FilePaths &directories, const QStringList &filters,
const QStringList &exclusionFilters, QTextCodec *encoding = nullptr);
SubDirFileContainer(const FilePaths &directories, SubDirFileContainer(const FilePaths &directories,
const QStringList &filters, const FilterFileFunction &filterFileFuntion = {},
const QStringList &exclusionFilters,
QTextCodec *encoding = nullptr); QTextCodec *encoding = nullptr);
}; };

View File

@@ -55,7 +55,7 @@ FileContainer AllProjectsFind::filesForProjects(const QStringList &nameFilters,
const QStringList &exclusionFilters, const QStringList &exclusionFilters,
const QList<Project *> &projects) const QList<Project *> &projects)
{ {
std::function<FilePaths(const FilePaths &)> filterFiles const FilterFilesFunction filterFiles
= Utils::filterFilesFunction(nameFilters, exclusionFilters); = Utils::filterFilesFunction(nameFilters, exclusionFilters);
const QMap<FilePath, QTextCodec *> openEditorEncodings const QMap<FilePath, QTextCodec *> openEditorEncodings
= TextDocument::openedTextDocumentEncodings(); = TextDocument::openedTextDocumentEncodings();