From 84e639606fe1bbeb6c8b67ff68377434e440840a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 16 Jul 2021 21:32:34 -0700 Subject: [PATCH] nodeview: ensure nodes are disconnected when clearing --- app/widget/nodeview/nodeviewscene.cpp | 23 ++++++++++++++++++----- app/widget/nodeview/nodeviewscene.h | 4 ++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/widget/nodeview/nodeviewscene.cpp b/app/widget/nodeview/nodeviewscene.cpp index 4e1ca2207..68b673561 100644 --- a/app/widget/nodeview/nodeviewscene.cpp +++ b/app/widget/nodeview/nodeviewscene.cpp @@ -65,7 +65,10 @@ void NodeViewScene::clear() // deleted. Calling this function appears to update the internal cache and prevent this. selectedItems(); - qDeleteAll(item_map_); + for (auto it=item_map_.cbegin(); it!=item_map_.cend(); it++) { + DisconnectNode(it.key()); + delete it.value(); + } item_map_.clear(); qDeleteAll(edges_); @@ -157,16 +160,14 @@ NodeViewItem* NodeViewScene::AddNode(Node* node) addItem(item); item_map_.insert(node, item); - connect(node, &Node::LabelChanged, this, &NodeViewScene::NodeAppearanceChanged); - connect(node, &Node::ColorChanged, this, &NodeViewScene::NodeAppearanceChanged); + ConnectNode(node); return item; } void NodeViewScene::RemoveNode(Node *node) { - disconnect(node, &Node::ColorChanged, this, &NodeViewScene::NodeAppearanceChanged); - disconnect(node, &Node::LabelChanged, this, &NodeViewScene::NodeAppearanceChanged); + DisconnectNode(node); delete item_map_.take(node); } @@ -224,6 +225,18 @@ NodeViewEdge* NodeViewScene::AddEdgeInternal(const NodeOutput& output, const Nod return edge_ui; } +void NodeViewScene::ConnectNode(Node *n) +{ + connect(n, &Node::LabelChanged, this, &NodeViewScene::NodeAppearanceChanged); + connect(n, &Node::ColorChanged, this, &NodeViewScene::NodeAppearanceChanged); +} + +void NodeViewScene::DisconnectNode(Node *n) +{ + disconnect(n, &Node::ColorChanged, this, &NodeViewScene::NodeAppearanceChanged); + disconnect(n, &Node::LabelChanged, this, &NodeViewScene::NodeAppearanceChanged); +} + Qt::Orientation NodeViewScene::GetFlowOrientation() const { return NodeViewCommon::GetFlowOrientation(direction_); diff --git a/app/widget/nodeview/nodeviewscene.h b/app/widget/nodeview/nodeviewscene.h index 94cadd463..53b74e074 100644 --- a/app/widget/nodeview/nodeviewscene.h +++ b/app/widget/nodeview/nodeviewscene.h @@ -111,6 +111,10 @@ private: NodeViewEdge* AddEdgeInternal(const NodeOutput &output, const NodeInput &input, NodeViewItem* from, NodeViewItem* to); + void ConnectNode(Node *n); + + void DisconnectNode(Node *n); + QHash item_map_; QVector edges_;