-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Expand file tree
/
Copy pathtreeitem.h
More file actions
159 lines (128 loc) · 3.96 KB
/
Copy pathtreeitem.h
File metadata and controls
159 lines (128 loc) · 3.96 KB
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#pragma once
#include <QIcon>
#include <QList>
#include <QString>
#include <QUrl>
#include <QVariant>
#include <memory>
#include "util/assert.h"
class LibraryFeature;
class TreeItem final {
struct PrivateRootTag {};
public:
static constexpr int kInvalidRow = -1;
static std::unique_ptr<TreeItem> newRoot(
LibraryFeature* pFeature) {
DEBUG_ASSERT(pFeature);
return std::make_unique<TreeItem>(pFeature, PrivateRootTag{});
}
explicit TreeItem(
QString label = QString(),
QVariant data = QVariant())
: TreeItem(nullptr, std::move(label), std::move(data)) {
}
// This constructor should actually be private. But that wouldn't
// work for std::make_unique(). The private, nested tag essentially
// makes this constructor unavailable for everyone else.
TreeItem(
LibraryFeature* pFeature,
PrivateRootTag)
: TreeItem(pFeature) {
}
~TreeItem();
/////////////////////////////////////////////////////////////////////////
// Feature
/////////////////////////////////////////////////////////////////////////
LibraryFeature* feature() const {
DEBUG_ASSERT(
!m_pParent ||
m_pParent->m_pFeature == m_pFeature);
return m_pFeature;
}
/////////////////////////////////////////////////////////////////////////
// Parent
/////////////////////////////////////////////////////////////////////////
TreeItem* parent() const {
return m_pParent;
}
bool hasParent() const {
return m_pParent != nullptr;
}
bool isRoot() const {
return !hasParent();
}
// Returns the position of this object within its parent
// or kInvalidRow if this is a root item without a parent.
int parentRow() const;
/////////////////////////////////////////////////////////////////////////
// Children
/////////////////////////////////////////////////////////////////////////
bool hasChildren() const {
return !m_children.empty();
}
int childRows() const {
return m_children.size();
}
TreeItem* child(int row) const;
const QList<TreeItem*>& children() const {
return m_children;
}
TreeItem* appendChild(
QString label,
QVariant data = QVariant());
// multiple child items
// take ownership of children items
void insertChildren(int row, std::vector<std::unique_ptr<TreeItem>>&& children);
void removeChildren(int row, int count);
void insertChild(int row, std::unique_ptr<TreeItem> pChild);
/////////////////////////////////////////////////////////////////////////
// Payload
/////////////////////////////////////////////////////////////////////////
void setLabel(const QString& label) {
m_label = label;
}
const QString& getLabel() const {
return m_label;
}
void setData(const QVariant& data) {
m_data = data;
}
const QVariant& getData() const {
return m_data;
}
void setUrl(const QUrl& url) {
m_url = url;
}
const QUrl& getUrl() const {
return m_url;
}
void setIcon(const QIcon& icon) {
m_icon = icon;
}
const QIcon& getIcon() {
return m_icon;
}
void setBold(bool bold) {
m_bold = bold;
}
bool isBold() const {
return m_bold;
}
private:
explicit TreeItem(
LibraryFeature* pFeature,
QString label = QString(),
QVariant data = QVariant());
void initFeatureRecursively(LibraryFeature* pFeature);
// The library feature is inherited from the parent.
// For all child items this is just a shortcut to the
// library feature of the root item!
LibraryFeature* m_pFeature;
TreeItem* m_pParent;
QList<TreeItem*> m_children; // owned child items
QString m_label;
QVariant m_data;
QUrl m_url;
QIcon m_icon;
bool m_bold;
};