JSONTreeModel.cpp
Go to the documentation of this file.
1 #include "JSONTreeModel.h"
2 
4 
5 namespace armarx
6 {
7 
8  void JSONTreeModel::setRoot(nlohmann::json const& rootParam)
9  {
10  root = rootParam;
11  rows.clear();
12  rows[&root] = 0;
13  parents.clear();
14  parents[&root] = nullptr;
15  names.clear();
16  names[&root] = "";
17  }
18 
19  QModelIndex JSONTreeModel::index(int row, int column, const QModelIndex& parentIndex) const
20  {
21  nlohmann::json* parent = refFrom(parentIndex);
22  if (row >= int(parent->size()))
23  {
24  return QModelIndex();
25  }
26 
27  nlohmann::json* child = nullptr;
28  if (parent->is_array())
29  {
30  child = &parent->at(row);
31  names[child] = "[" + std::to_string(row) + "]";
32  }
33  else if (parent->is_object())
34  {
35  auto it = parent->begin();
36  std::advance(it, row);
37  child = &it.value();
38  names[child] = it.key();
39  }
40 
41  if (child)
42  {
43  parents[child] = parent;
44  rows[child] = row;
45 
46  return createIndex(row, column, child);
47  }
48  else
49  {
50  return QModelIndex();
51  }
52 
53  }
54 
55  QModelIndex JSONTreeModel::parent(const QModelIndex& index) const
56  {
57  if (!index.isValid())
58  {
59  return QModelIndex();
60  }
61 
62  nlohmann::json* child = refFrom(index);
63  if (!parents.count(child))
64  {
65  //ARMARX_WARNING << "Map does not contain parent for child: " <<
66  // (child ? child->dump(2) : "(null)");
67  return QModelIndex();
68  }
69  nlohmann::json* parent = parents.at(child);
70  if (parent == nullptr)
71  {
72  return QModelIndex();
73  }
74  int row = rows.at(parent);
75 
76  return createIndex(row, 0, parent);
77  }
78 
79  int JSONTreeModel::rowCount(const QModelIndex& parentIndex) const
80  {
81  if (parentIndex.column() > 1)
82  {
83  return 0;
84  }
85 
86  nlohmann::json* parent = refFrom(parentIndex);
87  if (parent->is_array() || parent->is_object())
88  {
89  return parent->size();
90  }
91  else
92  {
93  return 0;
94  }
95  }
96 
97  int JSONTreeModel::columnCount(const QModelIndex& parent) const
98  {
99  return 2;
100  }
101 
102  QVariant JSONTreeModel::data(const QModelIndex& index, int role) const
103  {
104  if (!index.isValid())
105  {
106  return QVariant();
107  }
108 
109  if (role != Qt::DisplayRole)
110  {
111  return QVariant();
112  }
113 
114  nlohmann::json* ref = refFrom(index);
115 
116  if (index.column() == 0)
117  {
118  if (!names.count(ref))
119  {
120  ARMARX_WARNING << "Map does not contain name for ref: " <<
121  (ref ? ref->dump(2) : "(null)");
122  return QVariant();
123  }
124  std::string const& name = names.at(ref);
125  return QVariant(name.c_str());
126  }
127 
128  switch (ref->type())
129  {
130  case nlohmann::json::value_t::null:
131  return QVariant("null");
132  case nlohmann::json::value_t::object:
133  return QVariant("object");
134  case nlohmann::json::value_t::array:
135  return QVariant("array");
136  case nlohmann::json::value_t::string:
137  return QVariant(ref->get<std::string>().c_str());
138  case nlohmann::json::value_t::boolean:
139  return QVariant(ref->get<bool>());
140  case nlohmann::json::value_t::number_integer:
141  return QVariant(ref->get<int>());
142  case nlohmann::json::value_t::number_unsigned:
143  return QVariant(ref->get<unsigned int>());
144  case nlohmann::json::value_t::number_float:
145  return QVariant(ref->get<float>());
146 
147  default:
148  return QVariant("n/a");
149  }
150  }
151 
152  QVariant JSONTreeModel::headerData(int section, Qt::Orientation orientation, int role) const
153  {
154  if (role != Qt::DisplayRole)
155  {
156  return QVariant();
157  }
158 
159  switch (section)
160  {
161  case 0:
162  return QVariant("Name");
163  case 1:
164  return QVariant("Value");
165  default:
166  return QVariant();
167  }
168  }
169 
170  nlohmann::json* JSONTreeModel::refFrom(const QModelIndex& index) const
171  {
172  if (index.isValid())
173  {
174  return static_cast<nlohmann::json*>(index.internalPointer());
175  }
176  else
177  {
178  return &root;
179  }
180  }
181 
182 }
GfxTL::Orientation
ScalarT Orientation(const VectorXD< 2, ScalarT > &p1, const VectorXD< 2, ScalarT > &p2, const VectorXD< 2, ScalarT > &c)
Definition: Orientation.h:9
index
uint8_t index
Definition: EtherCATFrame.h:59
armarx::JSONTreeModel::columnCount
int columnCount(const QModelIndex &parent) const override
Definition: JSONTreeModel.cpp:97
JSONTreeModel.h
armarx::JSONTreeModel::headerData
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
Definition: JSONTreeModel.cpp:152
armarx::JSONTreeModel::index
QModelIndex index(int row, int column, const QModelIndex &parent) const override
Definition: JSONTreeModel.cpp:19
armarx::JSONTreeModel::rowCount
int rowCount(const QModelIndex &parent) const override
Definition: JSONTreeModel.cpp:79
armarx::to_string
const std::string & to_string(const std::string &s)
Definition: StringHelpers.h:40
armarx::JSONTreeModel::parent
QModelIndex parent(const QModelIndex &index) const override
Definition: JSONTreeModel.cpp:55
armarx::JSONTreeModel::data
QVariant data(const QModelIndex &index, int role) const override
Definition: JSONTreeModel.cpp:102
Logging.h
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:28
armarx::JSONTreeModel::setRoot
void setRoot(nlohmann::json const &root)
Definition: JSONTreeModel.cpp:8