From 722848d46b2cf84f45eb502388a2998ef2d63282 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 2 Dec 2024 00:28:44 +0100 Subject: [PATCH] Deleting Connectable from the connectables vector is resulting in segfault. --- src/app-manager.h | 1 + src/connectable.h | 12 ++++++++++-- src/connector.h | 2 ++ src/edge.h | 4 ++-- src/graph-manager.h | 21 +++++++-------------- src/interaction-manager.h | 1 + src/node.h | 6 +++++- 7 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/app-manager.h b/src/app-manager.h index f960529..da66d49 100644 --- a/src/app-manager.h +++ b/src/app-manager.h @@ -153,6 +153,7 @@ namespace VISEQ::APP { void update(){ state->update(canvas->camera); canvas->update(); + gm.update(); mutex.lock(); updateMidiPorts(); diff --git a/src/connectable.h b/src/connectable.h index aa1f741..2a75e68 100644 --- a/src/connectable.h +++ b/src/connectable.h @@ -10,7 +10,7 @@ namespace VISEQ::BASE { public: Connectable() {} Connectable(Vec2Df position) : Draggable(position) {} - virtual ~Connectable() {} + virtual ~Connectable() {remove();} inline static std::vector> connectables; @@ -24,9 +24,14 @@ namespace VISEQ::BASE { } virtual void init() { - connectables.emplace_back(this); + VISEQ::BASE::Connectable::connectables.emplace_back(this); } + virtual void remove() { + std::cout << "delete Connectable: " << getPtr() << std::endl; + // std::erase(VISEQ::BASE::Connectable::connectables, getPtr()); + } + virtual void drag(Vec2Df new_position) override { connecting = true; connecting_position = new_position; @@ -39,6 +44,8 @@ namespace VISEQ::BASE { virtual void connect() { if(picked_up){ + std::cout << getPtr() << std::endl; + std::cout << "connect use count: " << getPtr().use_count() << std::endl; for(auto c : connectables){ if(c != getPtr() && c->hovering()) { partner = c; @@ -46,6 +53,7 @@ namespace VISEQ::BASE { new_partner = true; partner->new_partner = true; std::cout << "connect use count: " << getPtr().use_count() << std::endl; + std::cout << connectables.size() << std::endl; break; } } diff --git a/src/connector.h b/src/connector.h index 0388aca..94948b1 100644 --- a/src/connector.h +++ b/src/connector.h @@ -13,6 +13,8 @@ namespace VISEQ::GRAPH { class Connector : public BASE::Connectable, public GraphItem{ public: Connector() {} + //~Connector() {BASE::Connectable::remove();} + Connector(std::shared_ptr parent, Vec2Df center_position, float orbit) : orbit(orbit) { setPosition(center_position); setParent(parent); diff --git a/src/edge.h b/src/edge.h index 6993698..9344ebd 100644 --- a/src/edge.h +++ b/src/edge.h @@ -17,8 +17,8 @@ namespace VISEQ::GRAPH::EDGES { std::shared_ptr start; std::shared_ptr end; - std::shared_ptr start_conn; - std::shared_ptr end_conn; + std::weak_ptr start_conn; + std::weak_ptr end_conn; EdgeType edgeType; diff --git a/src/graph-manager.h b/src/graph-manager.h index 6313b13..9cd3440 100644 --- a/src/graph-manager.h +++ b/src/graph-manager.h @@ -223,19 +223,9 @@ namespace VISEQ::GRAPH { } void removeEdges(){ - for(auto edge : remove_edges){ - edge->start_conn->partner.reset(); - std::cout << "connectors size: " << edge->start->connectors.size() << std::endl; - std::cout << "use count: " << edge->start_conn.use_count() << std::endl; - edge->start_conn.reset(); - edge->end_conn.reset(); - std::cout << "connectors size: " << edge->start->connectors.size() << std::endl; - std::cout << "use count: " << edge->start_conn.use_count() << std::endl; - std::erase(edge->start->connectors, edge->start_conn); - std::erase(edge->end->connectors, edge->end_conn); - std::cout << "connectors size: " << edge->start->connectors.size() << std::endl; - std::cout << "use count: " << edge->start_conn.use_count() << std::endl; + // edge->start->removeConnector(edge->start_conn); + // edge->end->removeConnector(edge->end_conn); std::erase(edge->start->connections, edge); std::erase(edge->end->connections, edge); std::erase(edges, edge); @@ -310,10 +300,13 @@ namespace VISEQ::GRAPH { } std::ranges::copy(copy_connections.begin(), copy_connections.end(), std::back_inserter(edges)); } - - void drawEdges(Vec2Df mouse_pos, Camera2D cam){ + + void update(){ if(!remove_edges.empty()) removeEdges(); if(!split_edges.empty()) splitEdges(); + } + + void drawEdges(Vec2Df mouse_pos, Camera2D cam){ for(auto c : edges){ Vec2Df v1_position = c->start->position - ((c->start->position - c->end->position)).norm() * (c->start->radius + c->connector_offset); Vec2Df v2_position = c->end->position - ((c->end->position - c->start->position)).norm() * (c->end->radius + c->connector_offset); diff --git a/src/interaction-manager.h b/src/interaction-manager.h index 5607c7c..9f80061 100644 --- a/src/interaction-manager.h +++ b/src/interaction-manager.h @@ -189,6 +189,7 @@ namespace VISEQ::INTERACTION{ auto connector = std::dynamic_pointer_cast(e.item); auto connector_to = std::dynamic_pointer_cast(connector->partner); gm->addConnection(std::dynamic_pointer_cast(connector->parent), std::dynamic_pointer_cast(connector_to->parent)); + std::cout << "connector use count: " << connector->getPtr().use_count() << std::endl; connect_once = true; } diff --git a/src/node.h b/src/node.h index ad3eee3..015c134 100644 --- a/src/node.h +++ b/src/node.h @@ -56,7 +56,11 @@ namespace VISEQ::GRAPH::NODES { connectors.emplace_back(std::make_shared(GraphItem::getptr(), position, radius + 5.0f)); connectors.back()->init(); } - + + void removeConnector(std::shared_ptr connector){ + std::erase(connectors, connector); + } + void init() { addConnector(); }