Deleting Connectable from the connectables vector is resulting in segfault.

This commit is contained in:
Sebastian
2024-12-02 00:28:44 +01:00
parent f926b95092
commit 722848d46b
7 changed files with 28 additions and 19 deletions
+1
View File
@@ -153,6 +153,7 @@ namespace VISEQ::APP {
void update(){ void update(){
state->update(canvas->camera); state->update(canvas->camera);
canvas->update(); canvas->update();
gm.update();
mutex.lock(); mutex.lock();
updateMidiPorts(); updateMidiPorts();
+10 -2
View File
@@ -10,7 +10,7 @@ namespace VISEQ::BASE {
public: public:
Connectable() {} Connectable() {}
Connectable(Vec2Df position) : Draggable(position) {} Connectable(Vec2Df position) : Draggable(position) {}
virtual ~Connectable() {} virtual ~Connectable() {remove();}
inline static std::vector<std::shared_ptr<Connectable>> connectables; inline static std::vector<std::shared_ptr<Connectable>> connectables;
@@ -24,7 +24,12 @@ namespace VISEQ::BASE {
} }
virtual void init() { 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 { virtual void drag(Vec2Df new_position) override {
@@ -39,6 +44,8 @@ namespace VISEQ::BASE {
virtual void connect() { virtual void connect() {
if(picked_up){ if(picked_up){
std::cout << getPtr() << std::endl;
std::cout << "connect use count: " << getPtr().use_count() << std::endl;
for(auto c : connectables){ for(auto c : connectables){
if(c != getPtr() && c->hovering()) { if(c != getPtr() && c->hovering()) {
partner = c; partner = c;
@@ -46,6 +53,7 @@ namespace VISEQ::BASE {
new_partner = true; new_partner = true;
partner->new_partner = true; partner->new_partner = true;
std::cout << "connect use count: " << getPtr().use_count() << std::endl; std::cout << "connect use count: " << getPtr().use_count() << std::endl;
std::cout << connectables.size() << std::endl;
break; break;
} }
} }
+2
View File
@@ -13,6 +13,8 @@ namespace VISEQ::GRAPH {
class Connector : public BASE::Connectable, public GraphItem{ class Connector : public BASE::Connectable, public GraphItem{
public: public:
Connector() {} Connector() {}
//~Connector() {BASE::Connectable::remove();}
Connector(std::shared_ptr<GraphItem> parent, Vec2Df center_position, float orbit) : orbit(orbit) { Connector(std::shared_ptr<GraphItem> parent, Vec2Df center_position, float orbit) : orbit(orbit) {
setPosition(center_position); setPosition(center_position);
setParent(parent); setParent(parent);
+2 -2
View File
@@ -17,8 +17,8 @@ namespace VISEQ::GRAPH::EDGES {
std::shared_ptr<NODES::Node> start; std::shared_ptr<NODES::Node> start;
std::shared_ptr<NODES::Node> end; std::shared_ptr<NODES::Node> end;
std::shared_ptr<Connector> start_conn; std::weak_ptr<Connector> start_conn;
std::shared_ptr<Connector> end_conn; std::weak_ptr<Connector> end_conn;
EdgeType edgeType; EdgeType edgeType;
+6 -13
View File
@@ -223,19 +223,9 @@ namespace VISEQ::GRAPH {
} }
void removeEdges(){ void removeEdges(){
for(auto edge : remove_edges){ for(auto edge : remove_edges){
edge->start_conn->partner.reset(); // edge->start->removeConnector(edge->start_conn);
std::cout << "connectors size: " << edge->start->connectors.size() << std::endl; // edge->end->removeConnector(edge->end_conn);
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;
std::erase(edge->start->connections, edge); std::erase(edge->start->connections, edge);
std::erase(edge->end->connections, edge); std::erase(edge->end->connections, edge);
std::erase(edges, edge); std::erase(edges, edge);
@@ -311,9 +301,12 @@ namespace VISEQ::GRAPH {
std::ranges::copy(copy_connections.begin(), copy_connections.end(), std::back_inserter(edges)); 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(!remove_edges.empty()) removeEdges();
if(!split_edges.empty()) splitEdges(); if(!split_edges.empty()) splitEdges();
}
void drawEdges(Vec2Df mouse_pos, Camera2D cam){
for(auto c : edges){ for(auto c : edges){
Vec2Df v1_position = c->start->position - ((c->start->position - c->end->position)).norm() * (c->start->radius + c->connector_offset); 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); Vec2Df v2_position = c->end->position - ((c->end->position - c->start->position)).norm() * (c->end->radius + c->connector_offset);
+1
View File
@@ -189,6 +189,7 @@ namespace VISEQ::INTERACTION{
auto connector = std::dynamic_pointer_cast<Connector>(e.item); auto connector = std::dynamic_pointer_cast<Connector>(e.item);
auto connector_to = std::dynamic_pointer_cast<Connector>(connector->partner); auto connector_to = std::dynamic_pointer_cast<Connector>(connector->partner);
gm->addConnection(std::dynamic_pointer_cast<Node>(connector->parent), std::dynamic_pointer_cast<Node>(connector_to->parent)); gm->addConnection(std::dynamic_pointer_cast<Node>(connector->parent), std::dynamic_pointer_cast<Node>(connector_to->parent));
std::cout << "connector use count: " << connector->getPtr().use_count() << std::endl;
connect_once = true; connect_once = true;
} }
+4
View File
@@ -57,6 +57,10 @@ namespace VISEQ::GRAPH::NODES {
connectors.back()->init(); connectors.back()->init();
} }
void removeConnector(std::shared_ptr<Connector> connector){
std::erase(connectors, connector);
}
void init() { void init() {
addConnector(); addConnector();
} }