From 1efd4e9f992f7bbbc588f5d8c487c3672ca83d17 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 8 May 2020 19:20:24 +1000 Subject: [PATCH] nodeview: further improved auto-positioning system --- app/node/node.cpp | 26 ++++++++++++++++++++++++++ app/node/node.h | 7 ++++++- app/widget/nodeview/nodeview.cpp | 2 +- app/widget/nodeview/nodeviewscene.cpp | 17 +++++++++++------ 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/app/node/node.cpp b/app/node/node.cpp index 90283cb96..7f27ffb71 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -549,6 +549,32 @@ bool Node::OutputsTo(Node *n) const return false; } +int Node::GetRoutesTo(Node *n) const +{ + bool outputs_directly = false; + int routes = 0; + + QList outputs = GetOutputs(); + + foreach (NodeOutput* o, outputs) { + foreach (NodeEdgePtr edge, o->edges()) { + Node* connected_node = edge->input()->parentNode(); + + if (connected_node == n) { + outputs_directly = true; + } else { + routes += connected_node->GetRoutesTo(n); + } + } + } + + if (outputs_directly) { + routes++; + } + + return routes; +} + bool Node::HasInputs() const { return HasParamOfType(NodeParam::kInput, false); diff --git a/app/node/node.h b/app/node/node.h index 0c03c0a7d..58f5533f1 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -229,10 +229,15 @@ public: NodeOutput* GetOutputWithID(const QString& id) const; /** - * @brief Returns whether this Node outputs data to the Node `n` in any way + * @brief Returns whether this Node outputs directly to `n` */ bool OutputsTo(Node* n) const; + /** + * @brief Determines how many paths go from this node out to another node + */ + int GetRoutesTo(Node* n) const; + /** * @brief Return whether this Node has input parameters */ diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index 3e9653bd1..bd4781440 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -38,7 +38,7 @@ NodeView::NodeView(QWidget *parent) : drop_edge_(nullptr) { setScene(&scene_); - setDragMode(RubberBandDrag); + SetDefaultDragMode(RubberBandDrag); setContextMenuPolicy(Qt::CustomContextMenu); setMouseTracking(true); setRenderHint(QPainter::Antialiasing); diff --git a/app/widget/nodeview/nodeviewscene.cpp b/app/widget/nodeview/nodeviewscene.cpp index 95fa2ab2b..40037db84 100644 --- a/app/widget/nodeview/nodeviewscene.cpp +++ b/app/widget/nodeview/nodeviewscene.cpp @@ -229,7 +229,9 @@ int NodeViewScene::DetermineWeight(Node *n) int weight = 0; foreach (Node* i, inputs) { - weight += DetermineWeight(i); + if (i->GetRoutesTo(n) == 1) { + weight += DetermineWeight(i); + } } return qMax(1, weight); @@ -257,6 +259,7 @@ void NodeViewScene::ReorganizeFrom(Node* n) QPointF parent_pos = n->GetPosition(); int weight_count = DetermineWeight(n); + qDebug() << "Weight" << n->id() << "is" << weight_count; qreal child_x = parent_pos.x() - 1.0; qreal children_height = weight_count-1; @@ -265,14 +268,16 @@ void NodeViewScene::ReorganizeFrom(Node* n) int weight_counter = 0; foreach (Node* i, immediates) { - int weight = DetermineWeight(i); + if (i->GetRoutesTo(n) == 1) { + int weight = DetermineWeight(i); - i->SetPosition(QPointF(child_x, - children_y + weight_counter + (weight - 1) * 0.5)); + i->SetPosition(QPointF(child_x, + children_y + weight_counter + (weight - 1) * 0.5)); - weight_counter += weight; + weight_counter += weight; - ReorganizeFrom(i); + ReorganizeFrom(i); + } } }