forked from qt-creator/qt-creator
SubDirFileContainer: Add optional filtering function
Change-Id: Icf972babadc87dbc681ca282984b82484afc68c4 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -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
|
||||||
|
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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();
|
||||||
|
Reference in New Issue
Block a user