From e5e0d0323ef504b6a7e0952e90d5b7f3f63b5e77 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 6 May 2020 22:53:01 +1000 Subject: [PATCH] nodeview: implemented weighted auto-positioning Similar to the previous approach, but cleaner and hopefully easier to extend. --- app/widget/nodeview/nodeviewscene.cpp | 31 ++++++++++++++++++++++----- app/widget/nodeview/nodeviewscene.h | 2 ++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/app/widget/nodeview/nodeviewscene.cpp b/app/widget/nodeview/nodeviewscene.cpp index 4b11dd423..95fa2ab2b 100644 --- a/app/widget/nodeview/nodeviewscene.cpp +++ b/app/widget/nodeview/nodeviewscene.cpp @@ -222,6 +222,19 @@ void NodeViewScene::RemoveEdge(NodeEdgePtr edge) delete edge_map_.take(edge.get()); } +int NodeViewScene::DetermineWeight(Node *n) +{ + QList inputs = n->GetImmediateDependencies(); + + int weight = 0; + + foreach (Node* i, inputs) { + weight += DetermineWeight(i); + } + + return qMax(1, weight); +} + Qt::Orientation NodeViewScene::GetFlowOrientation() const { return NodeViewCommon::GetFlowOrientation(direction_); @@ -243,15 +256,23 @@ void NodeViewScene::ReorganizeFrom(Node* n) QPointF parent_pos = n->GetPosition(); + int weight_count = DetermineWeight(n); + qreal child_x = parent_pos.x() - 1.0; - qreal children_height = immediates.size()-1; + qreal children_height = weight_count-1; qreal children_y = parent_pos.y() - children_height * 0.5; - for (int i=0;iSetPosition(QPointF(child_x, - children_y + i)); + int weight_counter = 0; - ReorganizeFrom(immediates.at(i)); + foreach (Node* i, immediates) { + int weight = DetermineWeight(i); + + i->SetPosition(QPointF(child_x, + children_y + weight_counter + (weight - 1) * 0.5)); + + weight_counter += weight; + + ReorganizeFrom(i); } } diff --git a/app/widget/nodeview/nodeviewscene.h b/app/widget/nodeview/nodeviewscene.h index d512278e1..dbbae253f 100644 --- a/app/widget/nodeview/nodeviewscene.h +++ b/app/widget/nodeview/nodeviewscene.h @@ -114,6 +114,8 @@ public slots: void RemoveEdge(NodeEdgePtr edge); private: + static int DetermineWeight(Node* n); + QHash item_map_; QHash edge_map_;