/
waterstone
/
json_inspector
Обзор
Документация
Войти
/
waterstone
/
json_inspector
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
tree_model.cpp
152 строки
4 KB
Peter Sakhno
Udjust data presentation
14 ноя 2025, 10:09
14 ноя 2025, 10:09
a35c7cd
Код
Авторство
О чём код?
#include "tree_model.h" bool TreeModel::CanSave() const { return static_cast<bool>(m_root_node); } void TreeModel::SetData(const JSONNodeSP& root_node_ptr) { beginResetModel(); m_root_node = root_node_ptr; endResetModel(); } JSONNodeWP TreeModel::GetData() const { return m_root_node; } JSONNodeWPC TreeModel::GetDataById(JSONNode::ID id) const { if (!m_root_node) return {}; auto node = m_root_node->FindNode(id); return node ? *node : JSONNodeWP(); } int TreeModel::columnCount(const QModelIndex&) const { return 1; } QVariant TreeModel::data(const QModelIndex &index, int role) const { if (!m_root_node || !index.isValid()) return {}; if (role != Qt::DisplayRole) return {}; const JSONNode::ID id = static_cast<decltype(id)>(index.internalId()); auto item = m_root_node->FindNode(id); if (!item) return {}; auto item_ptr = item->lock(); if (!item_ptr) return {}; QString out = QString::fromStdString(item_ptr->GetTag()); switch (item_ptr->GetType()) { case JSONNode::Type::Object: if (!out.isEmpty()) out += QStringLiteral(" "); out += QStringLiteral("{...}"); break; case JSONNode::Type::Array: if (!out.isEmpty()) out += QStringLiteral(" "); out += QStringLiteral("[...]"); break; case JSONNode::Type::Value: if (out.isEmpty()) out += QStringLiteral("<...>"); break; } return out; } Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::NoItemFlags; return QAbstractItemModel::flags(index); } QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const { Q_UNUSED(section); if (Qt::Horizontal == orientation && Qt::DisplayRole == role) return QString(tr("Nodes:")); return {}; } QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const { if (!parent.isValid()) { if (!m_root_node) return {}; const quintptr id = static_cast<decltype(id)>(m_root_node->GetId()); return createIndex(row, column, id); } if (!m_root_node || column > 0) return {}; const JSONNode::ID id = static_cast<decltype(id)>(parent.internalId()); auto parent_item = m_root_node->FindNode(id); if (!parent_item) return {}; auto parent_item_ptr = parent_item->lock(); if (!parent_item_ptr) return {}; auto child_item = parent_item_ptr->GetChildAt(row).lock(); if (!child_item) return {}; return createIndex(row, column, static_cast<quintptr>(child_item->GetId())); } QModelIndex TreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) return {}; const JSONNode::ID id = static_cast<decltype(id)>(index.internalId()); auto child_item = m_root_node->FindNode(id); if (!child_item) return {}; auto child_item_ptr = child_item->lock(); if (!child_item_ptr) return {}; auto parent_item = child_item_ptr->GetParent().lock(); if (!parent_item) return {}; const auto row = parent_item->Row(); return createIndex(row, 0, static_cast<quintptr>(parent_item->GetId())); } int TreeModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) return m_root_node ? 1 : 0; if (parent.column() > 0) return 0; const JSONNode::ID id = static_cast<decltype(id)>(parent.internalId()); auto parent_item = m_root_node->FindNode(id); if (!parent_item) return 0; auto parent_item_ptr = parent_item->lock(); if (!parent_item_ptr) return 0; return parent_item_ptr->ChildrenCount(); }