Galaxis Codebase  1.0.0
Team Galaxis software stack for the Carolo Cup 2023 - ROS2 based software
jsontreemodel.cpp
Go to the documentation of this file.
1 #include <QtGui>
2 #include <list>
3 #include "jsontreemodel.h"
4 
5 using nlohmann::json;
6 using namespace nlohmann::detail;
7 
8 JsonTreeModel::JsonTreeModel(const QStringList &headers, const nlohmann::json &data,
9  QObject *parent)
10  : QAbstractItemModel(parent)
11 {
12  QVector<QVariant> rootData;
13  foreach (QString header, headers)
14  rootData << header;
15 
16  rootItem = new JsonTreeItem(rootData);
18 }
19 
21 {
22  delete rootItem;
23 }
24 
25 int JsonTreeModel::columnCount(const QModelIndex & /* parent */) const
26 {
27  return rootItem->columnCount();
28 }
29 
30 QVariant JsonTreeModel::data(const QModelIndex &index, int role) const
31 {
32  if (!index.isValid())
33  return QVariant();
34 
35  if (role != Qt::DisplayRole && role != Qt::EditRole)
36  return QVariant();
37 
38  JsonTreeItem *item = getItem(index);
39 
40  return item->data(index.column());
41 }
42 
43 Qt::ItemFlags JsonTreeModel::flags(const QModelIndex &index) const
44 {
45  if (!index.isValid())
46  return 0;
47 
48  return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
49 }
50 
51 JsonTreeItem *JsonTreeModel::getItem(const QModelIndex &index) const
52 {
53  if (index.isValid()) {
54  JsonTreeItem *item = static_cast<JsonTreeItem*>(index.internalPointer());
55  if (item) return item;
56  }
57  return rootItem;
58 }
59 
60 QVariant JsonTreeModel::headerData(int section, Qt::Orientation orientation,
61  int role) const
62 {
63  if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
64  return rootItem->data(section);
65 
66  return QVariant();
67 }
68 
69 QModelIndex JsonTreeModel::index(int row, int column, const QModelIndex &parent) const
70 {
71  if (parent.isValid() && parent.column() != 0)
72  return QModelIndex();
73 
74  JsonTreeItem *parentItem = getItem(parent);
75 
76  JsonTreeItem *childItem = parentItem->child(row);
77  if (childItem)
78  return createIndex(row, column, childItem);
79  else
80  return QModelIndex();
81 }
82 
83 bool JsonTreeModel::insertColumns(int position, int columns, const QModelIndex &parent)
84 {
85  bool success;
86 
87  beginInsertColumns(parent, position, position + columns - 1);
88  success = rootItem->insertColumns(position, columns);
89  endInsertColumns();
90 
91  return success;
92 }
93 
94 bool JsonTreeModel::insertRows(int position, int rows, const QModelIndex &parent)
95 {
96  JsonTreeItem *parentItem = getItem(parent);
97  bool success;
98 
99  beginInsertRows(parent, position, position + rows - 1);
100  success = parentItem->insertChildren(position, rows, rootItem->columnCount());
101  endInsertRows();
102 
103  return success;
104 }
105 
106 QModelIndex JsonTreeModel::parent(const QModelIndex &index) const
107 {
108  if (!index.isValid())
109  return QModelIndex();
110 
111  JsonTreeItem *childItem = getItem(index);
112  JsonTreeItem *parentItem = childItem->parent();
113 
114  if (parentItem == rootItem)
115  return QModelIndex();
116 
117  return createIndex(parentItem->childNumber(), 0, parentItem);
118 }
119 
120 bool JsonTreeModel::removeColumns(int position, int columns, const QModelIndex &parent)
121 {
122  bool success;
123 
124  beginRemoveColumns(parent, position, position + columns - 1);
125  success = rootItem->removeColumns(position, columns);
126  endRemoveColumns();
127 
128  if (rootItem->columnCount() == 0)
129  removeRows(0, rowCount());
130 
131  return success;
132 }
133 
134 bool JsonTreeModel::removeRows(int position, int rows, const QModelIndex &parent)
135 {
136  JsonTreeItem *parentItem = getItem(parent);
137  bool success = true;
138 
139  beginRemoveRows(parent, position, position + rows - 1);
140  success = parentItem->removeChildren(position, rows);
141  endRemoveRows();
142 
143  return success;
144 }
145 
146 int JsonTreeModel::rowCount(const QModelIndex &parent) const
147 {
148  JsonTreeItem *parentItem = getItem(parent);
149 
150  return parentItem->childCount();
151 }
152 
153 bool JsonTreeModel::setData(const QModelIndex &index, const QVariant &value,
154  int role)
155 {
156  if (role != Qt::EditRole)
157  return false;
158 
159  JsonTreeItem *item = getItem(index);
160  bool result = item->setData(index.column(), value);
161 
162  if (result)
163  emit dataChanged(index, index);
164 
165  return result;
166 }
167 
168 bool JsonTreeModel::setHeaderData(int section, Qt::Orientation orientation,
169  const QVariant &value, int role)
170 {
171  if (role != Qt::EditRole || orientation != Qt::Horizontal)
172  return false;
173 
174  bool result = rootItem->setData(section, value);
175 
176  if (result)
177  emit headerDataChanged(orientation, section, section);
178 
179  return result;
180 }
181 
183 {
184  nlohmann::json* data = (nlohmann::json*)&lines;
185  //QList<JsonTreeItem*> parents;
186  QVector<QVariant> columnData;
187  //parents << parent;
188 
189  /*
190  JsonTreeItem *parent1 = parents.last();
191  parent1->insertChildren(parent1->childCount(), 1, 2);
192  parent1->child(parent1->childCount() - 1)->setData(0, QVariant(tr("A")));
193  parent1->child(parent1->childCount() - 1)->setData(1, QVariant(tr("fdsfs")));
194 
195  JsonTreeItem *parent2 = parents.last()->child(0);
196  parent2->insertChildren(parent2->childCount(), 1, 2);
197  parent2->child(parent2->childCount() - 1)->setData(0, QVariant(tr("B")));
198  parent2->child(parent2->childCount() - 1)->setData(1, QVariant(tr("fdsfs")));
199  */
200 
201  int len = data->size();
202  nlohmann::json::iterator dataIt = data->begin();
203 
204  for (int i = 0; i < len; i++)
205  {
206  std::string keyStr;
207  auto key = dataIt.key();
208  auto vType = data->type();
209  QVariant keyIndex, keyData, keyType;
210  if (vType == value_t::array )
211  {
212  QString arrayIndex("");
213  arrayIndex.append(QString().sprintf("%i", i));
214  keyIndex = QVariant(arrayIndex);
215  keyData = QVariant(tr(dataIt->dump().c_str()));
216  keyType = QVariant(getTypeString(dataIt.value().type()));
217  }
218  else
219  {
220  // key = data->at(i);
221  keyIndex = QVariant(tr(key.c_str()));
222  if (dataIt.value().type() != value_t::object ) {
223  keyData = QVariant(tr(dataIt->dump().c_str()));
224  }
225  else {
226  keyData = QVariant("");
227  }
228  keyType = QVariant(getTypeString(dataIt.value().type()));
229  }
230 
231  columnData.clear();
232  columnData.push_back(keyIndex);
233  columnData.push_back(keyData);
234  columnData.push_back(keyType);
235 
236  JsonTreeItem *parent1 = parent;
237  parent1->insertChildren(parent1->childCount(), 1, rootItem->columnCount());
238  for (int column = 0; column < columnData.size(); ++column)
239  parent1->child(parent1->childCount() - 1)->setData(column, columnData[column]);
240 
241  if (data->type() == value_t::array)
242  {
243  if (dataIt.value().type() == value_t::array || dataIt.value().type() == value_t::object)
244  {
245  setupModelData(dataIt.value(), parent1->child(parent1->childCount() - 1));
246  }
247  }
248  else
249  {
250  if (dataIt.value().type() == value_t::array || dataIt.value().type() == value_t::object)
251  {
252  setupModelData(dataIt.value(), parent1->child(parent1->childCount() - 1));
253  }
254  }
255 
256  dataIt++;
257  }
258 }
259 
261 {
262  return rootItem;
263 }
264 
265 QString JsonTreeModel::getTypeString(value_t vType)
266 {
267  QString typeString;
268  switch (vType)
269  {
270  case value_t::array:
271  typeString = tr("array");
272  break;
273  case value_t::boolean:
274  typeString = tr("boolean");
275  break;
276  case value_t::number_integer:
277  typeString = tr("integer");
278  break;
279  case value_t::null:
280  typeString = tr("null");
281  break;
282  case value_t::object:
283  typeString = tr("object");
284  break;
285  case value_t::number_float:
286  typeString = tr("double");
287  break;
288  case value_t::string:
289  typeString = tr("string");
290  break;
291  case value_t::number_unsigned:
292  typeString = tr("unsigned integer");
293  break;
294  defalut:
295  typeString = tr("type error");
296  }
297  return typeString;
298 }
JsonTreeModel::rowCount
int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: jsontreemodel.cpp:146
JsonTreeItem::insertColumns
bool insertColumns(int position, int columns)
Definition: jsontreeitem.cpp:58
JsonTreeItem::removeColumns
bool removeColumns(int position, int columns)
Definition: jsontreeitem.cpp:88
JsonTreeItem::removeChildren
bool removeChildren(int position, int count)
Definition: jsontreeitem.cpp:77
JsonTreeModel::setData
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Definition: jsontreemodel.cpp:153
JsonTreeModel::getItem
JsonTreeItem * getItem(const QModelIndex &index) const
Definition: jsontreemodel.cpp:51
json
nlohmann::json json
Definition: AutoPilotNode.hpp:21
JsonTreeModel::~JsonTreeModel
~JsonTreeModel()
Definition: jsontreemodel.cpp:20
JsonTreeItem::childCount
int childCount() const
Definition: jsontreeitem.cpp:21
JsonTreeModel::insertRows
bool insertRows(int position, int rows, const QModelIndex &parent=QModelIndex())
Definition: jsontreemodel.cpp:94
JsonTreeModel::insertColumns
bool insertColumns(int position, int columns, const QModelIndex &parent=QModelIndex())
Definition: jsontreemodel.cpp:83
JsonTreeItem::parent
JsonTreeItem * parent()
Definition: jsontreeitem.cpp:72
JsonTreeModel::headerData
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
Definition: jsontreemodel.cpp:60
JsonTreeItem::columnCount
int columnCount() const
Definition: jsontreeitem.cpp:34
JsonTreeModel::data
QVariant data(const QModelIndex &index, int role) const
Definition: jsontreemodel.cpp:30
JsonTreeItem::child
JsonTreeItem * child(int number)
Definition: jsontreeitem.cpp:16
JsonTreeModel::JsonTreeModel
JsonTreeModel(const QStringList &headers, const nlohmann::json &data, QObject *parent=0)
Definition: jsontreemodel.cpp:8
JsonTreeModel::removeColumns
bool removeColumns(int position, int columns, const QModelIndex &parent=QModelIndex())
Definition: jsontreemodel.cpp:120
JsonTreeModel::setHeaderData
bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role=Qt::EditRole)
Definition: jsontreemodel.cpp:168
JsonTreeModel::parent
QModelIndex parent(const QModelIndex &index) const
Definition: jsontreemodel.cpp:106
JsonTreeItem::childNumber
int childNumber() const
Definition: jsontreeitem.cpp:26
JsonTreeItem::setData
bool setData(int column, const QVariant &value)
Definition: jsontreeitem.cpp:102
JsonTreeModel::columnCount
int columnCount(const QModelIndex &parent=QModelIndex()) const
Definition: jsontreemodel.cpp:25
JsonTreeModel::getRootItem
JsonTreeItem * getRootItem()
Definition: jsontreemodel.cpp:260
JsonTreeItem::data
QVariant data(int column) const
Definition: jsontreeitem.cpp:39
JsonTreeModel::setupModelData
void setupModelData(const nlohmann::json &lines, JsonTreeItem *parent)
Definition: jsontreemodel.cpp:182
JsonTreeModel::rootItem
JsonTreeItem * rootItem
Definition: jsontreemodel.h:55
JsonTreeModel::getTypeString
QString getTypeString(value_t vType)
Definition: jsontreemodel.cpp:265
JsonTreeModel::index
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: jsontreemodel.cpp:69
jsontreemodel.h
JsonTreeItem::insertChildren
bool insertChildren(int position, int count, int columns)
Definition: jsontreeitem.cpp:44
JsonTreeModel::removeRows
bool removeRows(int position, int rows, const QModelIndex &parent=QModelIndex())
Definition: jsontreemodel.cpp:134
JsonTreeItem
Definition: jsontreeitem.h:8
JsonTreeModel::flags
Qt::ItemFlags flags(const QModelIndex &index) const
Definition: jsontreemodel.cpp:43