diff options
| author | Mikaël Capelle <capelle.mikael@gmail.com> | 2021-05-12 20:41:41 +0200 |
|---|---|---|
| committer | Mikaël Capelle <capelle.mikael@gmail.com> | 2021-05-12 20:41:41 +0200 |
| commit | c44b1cb3a3c27811cb98f4d1a645a75b81dda673 (patch) | |
| tree | 6a0aace02c9aeb7db008df28b210b1306f4c8b02 /src/qdirfiletree.cpp | |
| parent | 2a5dd6c7cfe3c4b70491c4ababcaa67ae4264f41 (diff) | |
Add option to ignore root meta.ini when creating IFileTree for QDir.
Diffstat (limited to 'src/qdirfiletree.cpp')
| -rw-r--r-- | src/qdirfiletree.cpp | 56 |
1 files changed, 47 insertions, 9 deletions
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<const IFileTree> parent, QDir dir) : FileTreeEntry(parent, dir.dirName()), QDirFileTree(), qDir(dir) { } @@ -25,7 +21,8 @@ protected: std::shared_ptr<FileTreeEntry> makeFile(std::shared_ptr<const IFileTree> parent, QString name) const override { return nullptr; } std::shared_ptr<IFileTree> makeDirectory(std::shared_ptr<const IFileTree> parent, QString name) const override { return nullptr; } - bool doPopulate(std::shared_ptr<const IFileTree> parent, std::vector<std::shared_ptr<FileTreeEntry>>& entries) const override { + bool doPopulate(std::shared_ptr<const IFileTree> parent, std::vector<std::shared_ptr<FileTreeEntry>>& 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<IFileTree> QDirFileTree::doClone() const { + std::shared_ptr<IFileTree> QDirFileTree::doClone() const + { return std::make_shared<QDirFileTreeImpl>(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<const IFileTree> parent, std::vector<std::shared_ptr<FileTreeEntry>>& 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<QDirFileTreeImpl>(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<IFileTree> QDirFileTree::doClone() const + { + return std::make_shared<QDirRootFileTreeImpl>(qDir); + } + +}; + /** * */ -std::shared_ptr<const QDirFileTree> QDirFileTree::makeTree(QDir directory) { - return std::make_shared<QDirFileTreeImpl>(nullptr, directory); +std::shared_ptr<const QDirFileTree> QDirFileTree::makeTree(QDir directory, bool ignoreRootMeta) +{ + if (ignoreRootMeta) { + return std::make_shared<QDirRootFileTreeImpl>(directory); + } + else { + return std::make_shared<QDirFileTreeImpl>(nullptr, directory); + } } |
