summaryrefslogtreecommitdiff
path: root/src/qdirfiletree.cpp
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2021-05-12 20:41:41 +0200
committerMikaël Capelle <capelle.mikael@gmail.com>2021-05-12 20:41:41 +0200
commitc44b1cb3a3c27811cb98f4d1a645a75b81dda673 (patch)
tree6a0aace02c9aeb7db008df28b210b1306f4c8b02 /src/qdirfiletree.cpp
parent2a5dd6c7cfe3c4b70491c4ababcaa67ae4264f41 (diff)
Add option to ignore root meta.ini when creating IFileTree for QDir.
Diffstat (limited to 'src/qdirfiletree.cpp')
-rw-r--r--src/qdirfiletree.cpp56
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);
+ }
}