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 +++++++++++++++++++++++++++++++++++++++++++--------- src/qdirfiletree.h | 4 +++- 2 files changed, 50 insertions(+), 10 deletions(-) (limited to 'src') 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); + } } diff --git a/src/qdirfiletree.h b/src/qdirfiletree.h index 219a3a6f..e9229bf5 100644 --- a/src/qdirfiletree.h +++ b/src/qdirfiletree.h @@ -41,10 +41,12 @@ public: * @brief Create a new file tree representing the given directory. * * @param directory Directory to represent. + * @param ignoreRootMeta If true, the meta.ini file in the root folder will + * be ignored. * * @return a file tree representing the given directory. */ - static std::shared_ptr makeTree(QDir directory); + static std::shared_ptr makeTree(QDir directory, bool ignoreRootMeta = true); protected: -- cgit v1.3.1