class VirtualModelAdapter { public: // virtual int getItemsCount(void *parent) = 0; virtual void * getItem(void *parent, int index) = 0; virtual QVariant data(void *item, int role) = 0; // void beginUpdate(); void endUpdate(); }
class InternalNode { InternalNode *parent; void *item; size_t parentIndex; std::vector<std::unique_ptr<InternalNode>> children; }
void VirtualTreeModel::syncNodeList(InternalNode &node, void *parent) { InternalChildren &nodes = node.children; int srcStart = 0; int srcCur = srcStart; int destStart = 0; auto index = getIndex(node); while (srcCur <= static_cast<int>(nodes.size())) { bool finishing = srcCur >= static_cast<int>(nodes.size()); int destCur = 0; InternalNode *curNode = nullptr; if (!finishing) { curNode = nodes[srcCur].get(); destCur = m_adapter->indexOf(parent, curNode->item, destStart); } if (destCur >= 0) { // remove skipped source nodes if (srcCur > srcStart) { beginRemoveRows(index, srcStart, srcCur-1); node.eraseChildren(nodes.begin() + srcStart, nodes.begin() + srcCur); if (!finishing) srcCur = srcStart; endRemoveRows(); } srcStart = srcCur + 1; if (finishing) destCur = m_adapter->getItemsCount(parent); // insert skipped new nodes if (destCur > destStart) { int insertCount = destCur - destStart; beginInsertRows(index, srcCur, srcCur + insertCount - 1); for (int i = 0, cur = srcCur; i < insertCount; i++, cur++) { void *obj = m_adapter->getItem(parent, destStart + i); auto newNode = new InternalNode(&node, obj, cur); nodes.emplace(nodes.begin() + cur, newNode); } node.insertedChildren(srcCur + insertCount); endInsertRows(); srcCur += insertCount; destStart += insertCount; } destStart = destCur + 1; if (curNode && curNode->isInitialized(m_adapter)) { syncNodeList(*curNode, curNode->item); srcStart = srcCur + 1; } } srcCur++; } node.childInitialized = true; }
class Part { Part *parent; QString name; std::vector<std::unique_ptr<Part>> subParts; }
lass VirtualPartAdapter : public VirtualModelAdapter { int getItemsCount(void *parent) override; void * getItem(void *parent, int index) override; QVariant data(void *item, int role) override; void * getItemParent(void *item) override; Part *getValue(void * data); };
m_adapter->beginUpdate(); Part* cur = currentPart(); auto g1 = cur->add("NewType"); g1->add("my class"); g1->add("my struct"); m_adapter->endUpdate();
m_adapter-> QueuedUpdate(); Part* cur = currentPart(); auto g1 = cur->add("NewType"); g1->add("my class"); g1->add("my struct");
Source: https://habr.com/ru/post/250431/
All Articles