diff --git a/src/libs/utils/fsengine/diriterator.h b/src/libs/utils/fsengine/diriterator.h index d6605b44264..4386116dd91 100644 --- a/src/libs/utils/fsengine/diriterator.h +++ b/src/libs/utils/fsengine/diriterator.h @@ -15,6 +15,38 @@ namespace Utils { namespace Internal { +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) +inline std::pair 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: diff --git a/src/libs/utils/fsengine/fixedlistfsengine.h b/src/libs/utils/fsengine/fixedlistfsengine.h index b27d3bc978a..36d1df3db91 100644 --- a/src/libs/utils/fsengine/fixedlistfsengine.h +++ b/src/libs/utils/fsengine/fixedlistfsengine.h @@ -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(m_children, path, filters, filterNames); + } + IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames) override diff --git a/src/libs/utils/fsengine/fsenginehandler.cpp b/src/libs/utils/fsengine/fsenginehandler.cpp index ba4235e6c3d..4580ebdcb57 100644 --- a/src/libs/utils/fsengine/fsenginehandler.cpp +++ b/src/libs/utils/fsengine/fsenginehandler.cpp @@ -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(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( QFSFileEngine::beginEntryList(path, filters, filterNames)); } + + IteratorUniquePtr beginEntryList( + const QString &path, + QDirListing::IteratorFlags filters, + const QStringList &filterNames) override + { + return std::make_unique( + QFSFileEngine::beginEntryList(path, filters, filterNames)); + } #else Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) final {