forked from qt-creator/qt-creator
Utils: Add support for QDirListing
qtbase added another way to list directories in 7c663d04d7635da519a4a72ae4c75e6355d5c67e. We add support for it here. Change-Id: Id328c0c826c2dc424106835ab66fc21066824777 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -15,6 +15,38 @@
|
||||
namespace Utils {
|
||||
namespace Internal {
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
||||
inline std::pair<QDir::Filters, QDirIterator::IteratorFlags> convertQDirListingIteratorFlags(
|
||||
QDirListing::IteratorFlags flags)
|
||||
{
|
||||
QDir::Filters filters = QDir::Files | QDir::Dirs | QDir::System | QDir::NoDotAndDotDot;
|
||||
QDirIterator::IteratorFlags iteratorFlags = QDirIterator::NoIteratorFlags;
|
||||
|
||||
if (flags & QDirListing::IteratorFlag::ExcludeFiles)
|
||||
filters.setFlag(QDir::Files, false);
|
||||
if (flags & QDirListing::IteratorFlag::ExcludeDirs)
|
||||
filters.setFlag(QDir::Dirs, false);
|
||||
if (flags & QDirListing::IteratorFlag::ExcludeSpecial)
|
||||
filters.setFlag(QDir::System, false);
|
||||
if (flags & QDirListing::IteratorFlag::CaseSensitive)
|
||||
filters.setFlag(QDir::CaseSensitive, true);
|
||||
if (flags & QDirListing::IteratorFlag::IncludeHidden)
|
||||
filters.setFlag(QDir::Hidden, true);
|
||||
|
||||
if (flags & QDirListing::IteratorFlag::IncludeDotAndDotDot) {
|
||||
filters.setFlag(QDir::NoDot, false);
|
||||
filters.setFlag(QDir::NoDotDot, false);
|
||||
}
|
||||
|
||||
if (flags & QDirListing::IteratorFlag::Recursive)
|
||||
iteratorFlags.setFlag(QDirIterator::Subdirectories, true);
|
||||
if (flags & QDirListing::IteratorFlag::FollowDirSymlinks)
|
||||
iteratorFlags.setFlag(QDirIterator::FollowSymlinks, true);
|
||||
|
||||
return {filters, iteratorFlags};
|
||||
}
|
||||
#endif
|
||||
|
||||
class DirIterator : public QAbstractFileEngineIterator
|
||||
{
|
||||
public:
|
||||
|
@@ -66,6 +66,19 @@ public:
|
||||
}
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
||||
QAbstractFileEngine::IteratorUniquePtr beginEntryList(
|
||||
const QString &path,
|
||||
QDirListing::IteratorFlags itFlags,
|
||||
const QStringList &filterNames) override
|
||||
{
|
||||
// We do not support recursive or following symlinks for the Fixed List engine.
|
||||
Q_ASSERT(itFlags.testFlag(QDirListing::IteratorFlag::Recursive) == false);
|
||||
|
||||
const auto [filters, _] = convertQDirListingIteratorFlags(itFlags);
|
||||
|
||||
return std::make_unique<DirIterator>(m_children, path, filters, filterNames);
|
||||
}
|
||||
|
||||
IteratorUniquePtr beginEntryList(const QString &path,
|
||||
QDir::Filters filters,
|
||||
const QStringList &filterNames) override
|
||||
|
@@ -72,6 +72,11 @@ public:
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
||||
IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters,
|
||||
const QStringList &filterNames) final;
|
||||
IteratorUniquePtr beginEntryList(
|
||||
const QString &path,
|
||||
QDirListing::IteratorFlags filters,
|
||||
const QStringList &filterNames) final;
|
||||
|
||||
IteratorUniquePtr endEntryList() final { return {}; }
|
||||
#else
|
||||
Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) final;
|
||||
@@ -379,6 +384,26 @@ bool FSEngineImpl::cloneTo(QAbstractFileEngine *target)
|
||||
}
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
||||
|
||||
QAbstractFileEngine::IteratorUniquePtr FSEngineImpl::beginEntryList(
|
||||
const QString &path, QDirListing::IteratorFlags itFlags, const QStringList &filterNames)
|
||||
{
|
||||
const auto [filters, iteratorFlags] = convertQDirListingIteratorFlags(itFlags);
|
||||
|
||||
FilePaths paths{m_filePath.pathAppended(".")};
|
||||
m_filePath.iterateDirectory(
|
||||
[&paths](const FilePath &p, const FilePathInfo &fi) {
|
||||
paths.append(p);
|
||||
FilePathInfoCache::CachedData *data
|
||||
= new FilePathInfoCache::CachedData{fi, QDateTime::currentDateTime().addSecs(60)};
|
||||
g_filePathInfoCache.cache(p, data);
|
||||
return IterationPolicy::Continue;
|
||||
},
|
||||
{filterNames, filters, iteratorFlags});
|
||||
|
||||
return std::make_unique<DirIterator>(std::move(paths), path, filters, filterNames);
|
||||
}
|
||||
|
||||
QAbstractFileEngine::IteratorUniquePtr FSEngineImpl::beginEntryList(const QString &path,
|
||||
QDir::Filters filters,
|
||||
const QStringList &filterNames)
|
||||
@@ -462,6 +487,15 @@ public:
|
||||
return std::make_unique<FileIteratorWrapper>(
|
||||
QFSFileEngine::beginEntryList(path, filters, filterNames));
|
||||
}
|
||||
|
||||
IteratorUniquePtr beginEntryList(
|
||||
const QString &path,
|
||||
QDirListing::IteratorFlags filters,
|
||||
const QStringList &filterNames) override
|
||||
{
|
||||
return std::make_unique<FileIteratorWrapper>(
|
||||
QFSFileEngine::beginEntryList(path, filters, filterNames));
|
||||
}
|
||||
#else
|
||||
Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) final
|
||||
{
|
||||
|
Reference in New Issue
Block a user