7#include <QtCore/qjsonobject.h>
11using namespace Qt::Literals::StringLiterals;
14 : m_parent(parentItem)
20 : m_parent(parentItem)
22 QVariantMap variantMap = data.toMap();
23 unpackVariantMap(variantMap);
27 : m_parent(parentItem)
29 unpackVariantMap(data);
37 std::vector<std::unique_ptr<QQmlTreeRow>> pending =
std::move(m_children);
40 while (!pending.empty()) {
41 std::unique_ptr<QQmlTreeRow> row =
std::move(pending.back());
44 for (
auto &child : row->m_children)
45 pending.push_back(std::move(child));
46 row->m_children.clear();
52 m_children.push_back(std::unique_ptr<QQmlTreeRow>(child));
58 child->setParent(
this);
59 m_children.insert(m_children.begin() + index, std::move(child));
62void QQmlTreeRow::unpackVariantMap(
const QVariantMap &variantMap)
68 std::vector<std::pair<QQmlTreeRow *, QVariantMap>> pending;
69 pending.emplace_back(
this, variantMap);
71 while (!pending.empty()) {
72 auto [row, map] =
std::move(pending.back());
75 for (
auto it = map.cbegin(); it != map.cend(); ++it) {
76 const QString& key = it.key();
77 const QVariant& value = it.value();
79 if ((value.typeId() == QMetaType::Type::QVariantList) && (key == ROWS_PROPERTY_NAME)) {
80 const QList<QVariant> variantList = value.toList();
81 for (
const QVariant &rowAsVariant : variantList) {
82 auto child = std::make_unique<QQmlTreeRow>(row);
83 pending.emplace_back(child.get(), rowAsVariant.toMap());
84 row->m_children.push_back(std::move(child));
87 row->dataMap.insert(key, value);
95 m_children.erase(child);
100 m_children.erase(std::next(m_children.begin(), i));
105 auto it =
std::next(m_children.begin(), i);
106 std::unique_ptr<QQmlTreeRow> child =
std::move(*it);
107 m_children.erase(it);
114 const QVariantMap variantMap = data.toJsonObject().toVariantMap();
115 unpackVariantMap(variantMap);
121 unpackVariantMap(data);
126 if (dataMap.contains(key))
127 dataMap[key] = value;
139 size_t nextChild = 0;
140 QVariantList children = {};
143 std::vector<Frame> pending;
144 pending.push_back({
this });
147 while (!pending.empty()) {
148 Frame &top = pending.back();
149 if (top.nextChild < top.row->m_children.size()) {
150 const QQmlTreeRow *child = top.row->m_children[top.nextChild++].get();
151 pending.push_back({ child });
155 QVariantMap variantMap(top.row->dataMap);
156 if (!top.row->m_children.empty())
157 variantMap[ROWS_PROPERTY_NAME] = top.children;
162 pending.back().children.append(QVariant(variantMap));
172 for (
const auto &child : m_children)
173 size += child->subTreeSize();
void addChild(QQmlTreeRow *child)
QVariant toVariant() const
std::unique_ptr< QQmlTreeRow > takeChild(int i)
void setData(const QVariant &data)
void setParent(QQmlTreeRow *parent)
void setField(const QString &key, const QVariant &value)
void removeChild(std::vector< std::unique_ptr< QQmlTreeRow > >::const_iterator &child)
QQmlTreeRow(QQmlTreeRow *parentItem=nullptr)
QQmlTreeRow(const QVariant &data, QQmlTreeRow *parentItem=nullptr)
void insertChild(int index, std::unique_ptr< QQmlTreeRow > child)
void removeChildAt(int i)
Combined button and popup list for selecting options.