summaryrefslogtreecommitdiff
path: root/src/filetreemodel.h
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-12-19 19:01:13 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2020-02-04 03:33:18 -0500
commita7051df5da4139661169f227861b712453e7b8b0 (patch)
tree43b0bf72d4bf1be6d6f1d12880a92545a5fa433f /src/filetreemodel.h
parente0c605be1d32b74b14da18cc7de4a66a4f6f3ecb (diff)
split item and model
Diffstat (limited to 'src/filetreemodel.h')
-rw-r--r--src/filetreemodel.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/filetreemodel.h b/src/filetreemodel.h
new file mode 100644
index 00000000..0cfe19c7
--- /dev/null
+++ b/src/filetreemodel.h
@@ -0,0 +1,101 @@
+#ifndef MODORGANIZER_FILETREEMODEL_INCLUDED
+#define MODORGANIZER_FILETREEMODEL_INCLUDED
+
+#include "filetreeitem.h"
+#include "iconfetcher.h"
+#include "directoryentry.h"
+
+class OrganizerCore;
+
+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;
+ bool hasChildren(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;
+ Qt::ItemFlags flags(const QModelIndex& index) const override;
+ FileTreeItem* itemFromIndex(const QModelIndex& index) const;
+
+private:
+ enum class FillFlag
+ {
+ None = 0x00,
+ PruneDirectories = 0x01
+ };
+
+ Q_DECLARE_FLAGS(FillFlags, FillFlag);
+
+ using DirectoryIterator = std::vector<MOShared::DirectoryEntry*>::const_iterator;
+ OrganizerCore& m_core;
+ mutable FileTreeItem m_root;
+ Flags m_flags;
+ mutable IconFetcher m_iconFetcher;
+ mutable std::vector<QModelIndex> m_iconPending;
+ mutable QTimer m_iconPendingTimer;
+
+ 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, FillFlags flags);
+
+ void fillFiles(
+ FileTreeItem& parentItem, const std::wstring& path,
+ const std::vector<MOShared::FileEntry::Ptr>& files, FillFlags flags);
+
+
+ void update(
+ FileTreeItem& parentItem, const MOShared::DirectoryEntry& parentEntry,
+ const std::wstring& parentPath);
+
+ void updateDirectories(
+ FileTreeItem& parentItem, const std::wstring& path,
+ const MOShared::DirectoryEntry& parentEntry, FillFlags flags);
+
+ void updateFiles(
+ FileTreeItem& parentItem, const std::wstring& path,
+ const MOShared::DirectoryEntry& parentEntry, FillFlags flags);
+
+ std::wstring makeModName(const MOShared::FileEntry& file, int originID) const;
+
+ void ensureLoaded(FileTreeItem* item) const;
+ void updatePendingIcons();
+ void removePendingIcons(const QModelIndex& parent, int first, int last);
+
+ bool shouldShowFile(const MOShared::FileEntry& file) const;
+ bool hasFilesAnywhere(const MOShared::DirectoryEntry& dir) const;
+ QString makeTooltip(const FileTreeItem& item) const;
+ QVariant makeIcon(const FileTreeItem& item, const QModelIndex& index) const;
+
+ QModelIndex indexFromItem(FileTreeItem* item, int row, int col) const;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(FileTreeModel::Flags);
+Q_DECLARE_OPERATORS_FOR_FLAGS(FileTreeItem::Flags);
+
+#endif // MODORGANIZER_FILETREEMODEL_INCLUDED