From c44b1cb3a3c27811cb98f4d1a645a75b81dda673 Mon Sep 17 00:00:00 2001 From: Mikaƫl Capelle Date: Wed, 12 May 2021 20:41:41 +0200 Subject: Add option to ignore root meta.ini when creating IFileTree for QDir. --- src/qdirfiletree.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 9 deletions(-) (limited to 'src/qdirfiletree.cpp') diff --git a/src/qdirfiletree.cpp b/src/qdirfiletree.cpp index 770a9df8..6fd370bf 100644 --- a/src/qdirfiletree.cpp +++ b/src/qdirfiletree.cpp @@ -7,10 +7,6 @@ using namespace MOBase; class QDirFileTreeImpl : public QDirFileTree { public: - - /** - * - */ QDirFileTreeImpl(std::shared_ptr parent, QDir dir) : FileTreeEntry(parent, dir.dirName()), QDirFileTree(), qDir(dir) { } @@ -25,7 +21,8 @@ protected: std::shared_ptr makeFile(std::shared_ptr parent, QString name) const override { return nullptr; } std::shared_ptr makeDirectory(std::shared_ptr parent, QString name) const override { return nullptr; } - bool doPopulate(std::shared_ptr parent, std::vector>& entries) const override { + bool doPopulate(std::shared_ptr parent, std::vector>& entries) const override + { auto infoList = qDir.entryInfoList(qDir.filter() | QDir::NoDotAndDotDot, QDir::Name | QDir::DirsFirst | QDir::IgnoreCase); for (auto& info : infoList) { if (info.isDir()) { @@ -40,18 +37,59 @@ protected: return true; } - std::shared_ptr QDirFileTree::doClone() const { + std::shared_ptr QDirFileTree::doClone() const + { return std::make_shared(nullptr, qDir); } -private: +protected: QDir qDir; }; +// subclass of QDirFileTreeImpl that ignores meta.ini +// +// only used for the root folder, subdirectories are actually QDirFileTreeImpl +class QDirRootFileTreeImpl : public QDirFileTreeImpl { +public: + + + QDirRootFileTreeImpl(QDir dir) : FileTreeEntry(nullptr, dir.dirName()), QDirFileTreeImpl(nullptr, dir) { } + +protected: + + bool doPopulate(std::shared_ptr parent, std::vector>& entries) const override + { + auto infoList = qDir.entryInfoList(qDir.filter() | QDir::NoDotAndDotDot, QDir::Name | QDir::DirsFirst | QDir::IgnoreCase); + for (auto& info : infoList) { + if (info.isDir()) { + entries.push_back(std::make_shared(parent, QDir(info.absoluteFilePath()))); + } + else if (info.fileName().compare("meta.ini", Qt::CaseInsensitive) != 0) { + entries.push_back(createFileEntry(parent, info.fileName())); + } + } + + // Vector is already sorted: + return true; + } + + std::shared_ptr QDirFileTree::doClone() const + { + return std::make_shared(qDir); + } + +}; + /** * */ -std::shared_ptr QDirFileTree::makeTree(QDir directory) { - return std::make_shared(nullptr, directory); +std::shared_ptr QDirFileTree::makeTree(QDir directory, bool ignoreRootMeta) +{ + if (ignoreRootMeta) { + return std::make_shared(directory); + } + else { + return std::make_shared(nullptr, directory); + } } -- cgit v1.3.1