-
Notifications
You must be signed in to change notification settings - Fork 364
/
JsonTreeItem.cpp
163 lines (138 loc) · 3.51 KB
/
JsonTreeItem.cpp
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
160
161
162
#include "JsonTreeItem.h"
JsonTreeItem::JsonTreeItem(JsonTreeItem *parent)
:theParentItem(parent)
,theItemType(JsonTreeItem::None)
,theItemDatas({{0,"[Key]"},{1,"[Value]"}}) //默认两行
{
}
JsonTreeItem::JsonTreeItem(const QHash<int, QVariant> &datas, JsonTreeItem::JsonItemType type, JsonTreeItem *parent)
:theParentItem(parent)
,theItemType(type)
,theItemDatas(datas)
{
}
JsonTreeItem::~JsonTreeItem()
{
deleteAllChild();
}
bool JsonTreeItem::insertChild(int row, JsonTreeItem *child)
{
if(row<0||row>theChildItems.count())
return false;
theChildItems.insert(row,child);
child->setParentItem(this);
return true;
}
bool JsonTreeItem::removeChild(int row)
{
if(row<0||row+1>theChildItems.count())
return false;
delete theChildItems.takeAt(row);
return true;
}
bool JsonTreeItem::insertChildren(int row, int count)
{
if(row<0||row>theChildItems.count())
return false;
for(int i=0;i<count;i++){
JsonTreeItem *item=new JsonTreeItem(this);
//目前还没有delegate来自定义操作,所以new item默认为json Value类型
item->setType(JsonTreeItem::Value);
//这里新增的次序无所谓row+i
theChildItems.insert(row,item);
}
return true;
}
bool JsonTreeItem::removeChildren(int row, int count)
{
if (row<0||row+count>theChildItems.count())
return false;
for(int i=0;i<count;i++){
delete theChildItems.takeAt(row+i);
}
return true;
}
void JsonTreeItem::appendChild(JsonTreeItem *child)
{
theChildItems.append(child);
child->setParentItem(this);
}
void JsonTreeItem::deleteAllChild()
{
qDeleteAll(theChildItems);
theChildItems.clear();
}
JsonTreeItem *JsonTreeItem::childItem(int row)
{
return theChildItems.value(row);
}
JsonTreeItem *JsonTreeItem::parentItem()
{
return theParentItem;
}
void JsonTreeItem::setParentItem(JsonTreeItem *parent)
{
theParentItem=parent;
}
int JsonTreeItem::childCount() const
{
return theChildItems.count();
}
int JsonTreeItem::columnCount() const
{
return theItemDatas.count();
}
QVariant JsonTreeItem::data(int column) const
{
return theItemDatas.value(column,QVariant());
}
void JsonTreeItem::setData(int column, const QVariant &val)
{
theItemDatas.insert(column,val);
}
int JsonTreeItem::row() const
{
if(theParentItem)
return theParentItem->theChildItems.indexOf(const_cast<JsonTreeItem*>(this));
return 0;
}
bool JsonTreeItem::editable(int column) const
{
//在保留默认结构的情况下
//root的key-value都不可编辑
//-->parent:nullptr
//array下级的key不可编辑
//-->parent:array
//array或object的value不可编辑
//-->type()
//此外,如果希望key不可变,column==0返回false即可
if((!theParentItem||!theParentItem->parentItem())||
((0==column)&&(theParentItem->type()==JsonTreeItem::Array))||
((1==column)&&((type()==JsonTreeItem::Array)||(type()==JsonTreeItem::Object))))
return false;
return true;
}
QString JsonTreeItem::key() const
{
return theItemDatas.value(0,"").toString();
}
void JsonTreeItem::setKey(const QString &key)
{
theItemDatas[0]=key;
}
QVariant JsonTreeItem::value() const
{
return theItemDatas.value(1,0);
}
void JsonTreeItem::setValue(const QVariant &value)
{
theItemDatas[1]=value;
}
JsonTreeItem::JsonItemType JsonTreeItem::type() const
{
return theItemType;
}
void JsonTreeItem::setType(JsonTreeItem::JsonItemType type)
{
theItemType=type;
}