From d74d6a1542d9bb0777f130351fa532b4c632025f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 28 Apr 2020 03:43:35 +1000 Subject: [PATCH] nodes: implementing saving/loading node positions from project file --- app/common/xmlutils.cpp | 13 ++++++++++++- app/node/node.cpp | 6 +++++- app/node/node.h | 2 +- app/widget/nodeview/nodeviewitem.cpp | 2 +- app/widget/nodeview/nodeviewscene.cpp | 2 +- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/app/common/xmlutils.cpp b/app/common/xmlutils.cpp index 0b39e6d32..087648822 100644 --- a/app/common/xmlutils.cpp +++ b/app/common/xmlutils.cpp @@ -26,15 +26,25 @@ OLIVE_NAMESPACE_ENTER -Node* XMLLoadNode(QXmlStreamReader* reader) { +Node* XMLLoadNode(QXmlStreamReader* reader) +{ QString node_id; quintptr node_ptr = 0; + QPointF node_pos; XMLAttributeLoop(reader, attr) { if (attr.name() == QStringLiteral("id")) { node_id = attr.value().toString(); } else if (attr.name() == QStringLiteral("ptr")) { node_ptr = attr.value().toULongLong(); + } else if (attr.name() == QStringLiteral("pos")) { + QStringList pos = attr.value().toString().split(':'); + + // Protection in case this file has been messed with + if (pos.size() == 2) { + node_pos.setX(pos.at(0).toDouble()); + node_pos.setY(pos.at(1).toDouble()); + } } } @@ -47,6 +57,7 @@ Node* XMLLoadNode(QXmlStreamReader* reader) { if (node) { node->setProperty("xml_ptr", node_ptr); + node->SetPosition(node_pos); } else { qWarning() << "Failed to load" << node_id << "- no node with that ID is installed"; } diff --git a/app/node/node.cpp b/app/node/node.cpp index 8f42b9dc2..cea3c1417 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -103,6 +103,10 @@ void Node::Save(QXmlStreamWriter *writer, const QString &custom_name) const writer->writeAttribute(QStringLiteral("ptr"), QString::number(reinterpret_cast(this))); + writer->writeAttribute(QStringLiteral("pos"), + QStringLiteral("%1:%2").arg(QString::number(GetPosition().x()), + QString::number(GetPosition().y()))); + foreach (NodeParam* param, parameters()) { param->Save(writer); } @@ -550,7 +554,7 @@ NodeValue Node::InputValueFromTable(NodeInput *input, NodeValueDatabase &db, boo } } -const QPointF &Node::GetPosition() +const QPointF &Node::GetPosition() const { return position_; } diff --git a/app/node/node.h b/app/node/node.h index 656713224..4c4826b07 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -342,7 +342,7 @@ public: virtual NodeValue InputValueFromTable(NodeInput* input, NodeValueDatabase &db, bool take) const; - const QPointF& GetPosition(); + const QPointF& GetPosition() const; void SetPosition(const QPointF& pos); diff --git a/app/widget/nodeview/nodeviewitem.cpp b/app/widget/nodeview/nodeviewitem.cpp index 014105560..f3d0d3b9d 100644 --- a/app/widget/nodeview/nodeviewitem.cpp +++ b/app/widget/nodeview/nodeviewitem.cpp @@ -176,7 +176,7 @@ void NodeViewItem::SetNode(Node *n) } } - setPos(node_->GetPosition()); + SetNodePosition(node_->GetPosition()); } update(); diff --git a/app/widget/nodeview/nodeviewscene.cpp b/app/widget/nodeview/nodeviewscene.cpp index bcadfd733..628e72517 100644 --- a/app/widget/nodeview/nodeviewscene.cpp +++ b/app/widget/nodeview/nodeviewscene.cpp @@ -159,8 +159,8 @@ void NodeViewScene::AddNode(Node* node) { NodeViewItem* item = new NodeViewItem(); - item->SetNode(node); item->SetFlowDirection(direction_); + item->SetNode(node); addItem(item); item_map_.insert(node, item);