1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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);
|