Utils: Wrap various file system iteration flags and filters

... into a single class.

This makes passing them around as a whole easier, and opens a path
to have "generic" filters in form of a lambda or such.

Change-Id: Ibf644b2fedcf0f1a35258030710afff8f5873f88
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2022-01-21 12:22:54 +01:00
parent c6fdb66b2b
commit 1fc83d2a56
35 changed files with 121 additions and 143 deletions

View File

@@ -718,19 +718,16 @@ bool FilePath::createDir() const
return dir.mkpath(dir.absolutePath());
}
FilePaths FilePath::dirEntries(const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags,
QDir::SortFlags sort) const
FilePaths FilePath::dirEntries(const FileFilter &filter, QDir::SortFlags sort) const
{
FilePaths result;
if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.iterateDirectory, return {});
const auto callBack = [&result](const FilePath &path) { result.append(path); return true; };
s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters, flags);
s_deviceHooks.iterateDirectory(*this, callBack, filter);
} else {
QDirIterator dit(m_data, nameFilters, filters, flags);
QDirIterator dit(m_data, filter.nameFilters, filter.fileFilters, filter.iteratorFlags);
while (dit.hasNext())
result.append(FilePath::fromString(dit.next()));
}
@@ -748,7 +745,7 @@ FilePaths FilePath::dirEntries(const QStringList &nameFilters,
FilePaths FilePath::dirEntries(QDir::Filters filters) const
{
return dirEntries({}, filters);
return dirEntries(FileFilter({}, filters));
}
// This runs \a callBack on each directory entry matching all \a filters and
@@ -756,17 +753,15 @@ FilePaths FilePath::dirEntries(QDir::Filters filters) const
// An empty \nameFilters list matches every name.
void FilePath::iterateDirectory(const std::function<bool(const FilePath &item)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
const FileFilter &filter) const
{
if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.iterateDirectory, return);
s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters, flags);
s_deviceHooks.iterateDirectory(*this, callBack, filter);
return;
}
QDirIterator it(m_data, nameFilters, filters, flags);
QDirIterator it(m_data, filter.nameFilters, filter.fileFilters, filter.iteratorFlags);
while (it.hasNext()) {
if (!callBack(FilePath::fromString(it.next())))
return;
@@ -1454,6 +1449,15 @@ QTextStream &operator<<(QTextStream &s, const FilePath &fn)
return s << fn.toString();
}
FileFilter::FileFilter(const QStringList &nameFilters,
const QDir::Filters fileFilters,
const QDirIterator::IteratorFlags flags)
: nameFilters(nameFilters),
fileFilters(fileFilters),
iteratorFlags(flags)
{
}
} // namespace Utils
std::hash<Utils::FilePath>::result_type