summaryrefslogtreecommitdiff
path: root/src/filetree.h
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-12-10 13:09:44 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2020-02-04 03:33:16 -0500
commita4624f239fe5d152ec8797c1a3f8c2b2aeaef1ba (patch)
tree1371a463d11f9f7f66eae07daf898b4c1b7cc0c9 /src/filetree.h
parente8027bfeaae9382c99b7e0a0503ec5eae774934f (diff)
split FileTreeModel, initial implementation, some stuff is broken
Diffstat (limited to 'src/filetree.h')
-rw-r--r--src/filetree.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/filetree.h b/src/filetree.h
new file mode 100644
index 00000000..a9eac64e
--- /dev/null
+++ b/src/filetree.h
@@ -0,0 +1,110 @@
+#include "directoryentry.h"
+#include <QAbstractItemModel>
+#include <QFileIconProvider>
+
+class OrganizerCore;
+
+class FileTreeItem
+{
+public:
+ enum Flag
+ {
+ NoFlags = 0x00,
+ Directory = 0x01,
+ FromArchive = 0x02,
+ Conflicted = 0x04
+ };
+
+ Q_DECLARE_FLAGS(Flags, Flag);
+
+ FileTreeItem();
+ FileTreeItem(
+ FileTreeItem* parent,
+ std::wstring virtualParentPath, std::wstring realPath, Flags flags,
+ std::wstring file, std::wstring mod);
+
+ FileTreeItem(const FileTreeItem&) = delete;
+ FileTreeItem& operator=(const FileTreeItem&) = delete;
+ FileTreeItem(FileTreeItem&&) = default;
+ FileTreeItem& operator=(FileTreeItem&&) = default;
+
+ void add(std::unique_ptr<FileTreeItem> child);
+ const std::vector<std::unique_ptr<FileTreeItem>>& children() const;
+
+ FileTreeItem* parent();
+ const QString& filename() const;
+ const QString& mod() const;
+ bool isFromArchive() const;
+ bool isHidden() const;
+ bool isConflicted() const;;
+ QFileIconProvider::IconType icon() const;
+
+ void setLoaded(bool b);
+
+private:
+ FileTreeItem* m_parent;
+ QString m_virtualParentPath;
+ QString m_realPath;
+ Flags m_flags;
+ QString m_file;
+ QString m_mod;
+ bool m_loaded;
+ std::vector<std::unique_ptr<FileTreeItem>> m_children;
+};
+
+
+class FileTreeModel : public QAbstractItemModel
+{
+ Q_OBJECT;
+
+public:
+ enum Flag
+ {
+ NoFlags = 0x00,
+ Conflicts = 0x01,
+ Archives = 0x02
+ };
+
+ Q_DECLARE_FLAGS(Flags, Flag);
+
+ FileTreeModel(OrganizerCore& core, QObject* parent=nullptr);
+
+ void setFlags(Flags f);
+ void refresh();
+
+ QModelIndex index(int row, int col, const QModelIndex& parent={}) const override;
+ QModelIndex parent(const QModelIndex& index) const override;
+ int rowCount(const QModelIndex& parent={}) const override;
+ int columnCount(const QModelIndex& parent={}) const override;
+ QVariant data(const QModelIndex& index, int role=Qt::DisplayRole) const override;
+ QVariant headerData(int i, Qt::Orientation ori, int role=Qt::DisplayRole) const override;
+
+private:
+ using DirectoryIterator = std::vector<MOShared::DirectoryEntry*>::const_iterator;
+ OrganizerCore& m_core;
+ mutable FileTreeItem m_root;
+ Flags m_flags;
+ QIcon m_fileIcon, m_directoryIcon;
+
+ bool showConflicts() const;
+ bool showArchives() const;
+
+ void fill(
+ FileTreeItem& parentItem, const MOShared::DirectoryEntry& parentEntry,
+ const std::wstring& parentPath);
+
+ void fillDirectories(
+ FileTreeItem& parentItem, const std::wstring& path,
+ DirectoryIterator begin, DirectoryIterator end);
+
+ void fillFiles(
+ FileTreeItem& parentItem, const std::wstring& path,
+ const std::vector<MOShared::FileEntry::Ptr>& files);
+
+ std::wstring makeModName(const MOShared::FileEntry& file, int originID) const;
+
+ FileTreeItem* itemFromIndex(const QModelIndex& index) const;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(FileTreeModel::Flags);
+Q_DECLARE_OPERATORS_FOR_FLAGS(FileTreeItem::Flags);