From 785160b86bce49dbd44dc2ab429ced38e9281a36 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 26 Feb 2020 00:47:01 +1100 Subject: [PATCH] nodeview: fixed crash when expanding a NodeViewItem with a NodeInputArray --- app/widget/nodeview/nodeviewedge.cpp | 8 ++++---- app/widget/nodeview/nodeviewitem.cpp | 12 ++++++++++++ app/widget/nodeview/nodeviewitem.h | 1 + 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/widget/nodeview/nodeviewedge.cpp b/app/widget/nodeview/nodeviewedge.cpp index b89167788..6aef9dbf7 100644 --- a/app/widget/nodeview/nodeviewedge.cpp +++ b/app/widget/nodeview/nodeviewedge.cpp @@ -56,10 +56,10 @@ NodeEdgePtr NodeViewEdge::edge() return edge_; } -qreal CalculateEdgeYPoint(NodeViewItem *item, int param_index, NodeViewItem *opposing) +qreal CalculateEdgeYPoint(NodeViewItem *item, NodeParam* param, NodeViewItem *opposing) { if (item->IsExpanded()) { - return item->pos().y() + item->GetParameterConnectorRect(param_index).center().y(); + return item->pos().y() + item->GetParameterConnectorRect(param).center().y(); } else { qreal max_height = qMax(opposing->rect().height(), item->rect().height()); @@ -89,8 +89,8 @@ void NodeViewEdge::Adjust() QPointF input_point = QPointF(input->pos().x() + output->rect().left(), 0); // Calculate output/input points - output_point.setY(CalculateEdgeYPoint(output, edge_->output()->index(), input)); - input_point.setY(CalculateEdgeYPoint(input, edge_->input()->index(), output)); + output_point.setY(CalculateEdgeYPoint(output, edge_->output(), input)); + input_point.setY(CalculateEdgeYPoint(input, edge_->input(), output)); // Draw a line between the two setLine(QLineF( diff --git a/app/widget/nodeview/nodeviewitem.cpp b/app/widget/nodeview/nodeviewitem.cpp index f6e295178..2476dac85 100644 --- a/app/widget/nodeview/nodeviewitem.cpp +++ b/app/widget/nodeview/nodeviewitem.cpp @@ -154,6 +154,18 @@ QRectF NodeViewItem::GetParameterConnectorRect(int index) return connector_rect; } +QRectF NodeViewItem::GetParameterConnectorRect(NodeParam *param) +{ + NodeParam* root_param = param; + Node* parent_node = param->parentNode(); + + while (root_param->parent() != parent_node) { + root_param = static_cast(root_param->parent()); + } + + return GetParameterConnectorRect(root_param->index()); +} + QPointF NodeViewItem::GetParameterTextPoint(int index) { if (node_ == nullptr) { diff --git a/app/widget/nodeview/nodeviewitem.h b/app/widget/nodeview/nodeviewitem.h index 7781401d4..363b080aa 100644 --- a/app/widget/nodeview/nodeviewitem.h +++ b/app/widget/nodeview/nodeviewitem.h @@ -75,6 +75,7 @@ public: * Index of the parameter of this node (see NodeParam::index()). */ QRectF GetParameterConnectorRect(int index); + QRectF GetParameterConnectorRect(NodeParam* index); protected: virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;