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 Utils {
|
||||||
namespace Internal {
|
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
|
class DirIterator : public QAbstractFileEngineIterator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@@ -66,6 +66,19 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
#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,
|
IteratorUniquePtr beginEntryList(const QString &path,
|
||||||
QDir::Filters filters,
|
QDir::Filters filters,
|
||||||
const QStringList &filterNames) override
|
const QStringList &filterNames) override
|
||||||
|
@@ -72,6 +72,11 @@ public:
|
|||||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
||||||
IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters,
|
IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters,
|
||||||
const QStringList &filterNames) final;
|
const QStringList &filterNames) final;
|
||||||
|
IteratorUniquePtr beginEntryList(
|
||||||
|
const QString &path,
|
||||||
|
QDirListing::IteratorFlags filters,
|
||||||
|
const QStringList &filterNames) final;
|
||||||
|
|
||||||
IteratorUniquePtr endEntryList() final { return {}; }
|
IteratorUniquePtr endEntryList() final { return {}; }
|
||||||
#else
|
#else
|
||||||
Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) final;
|
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)
|
#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,
|
QAbstractFileEngine::IteratorUniquePtr FSEngineImpl::beginEntryList(const QString &path,
|
||||||
QDir::Filters filters,
|
QDir::Filters filters,
|
||||||
const QStringList &filterNames)
|
const QStringList &filterNames)
|
||||||
@@ -462,6 +487,15 @@ public:
|
|||||||
return std::make_unique<FileIteratorWrapper>(
|
return std::make_unique<FileIteratorWrapper>(
|
||||||
QFSFileEngine::beginEntryList(path, filters, filterNames));
|
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
|
#else
|
||||||
Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) final
|
Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) final
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user