Deleting Connectable from the connectables vector is resulting in segfault.
This commit is contained in:
@@ -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
@@ -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,9 +24,14 @@ 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 {
|
||||||
connecting = true;
|
connecting = true;
|
||||||
connecting_position = new_position;
|
connecting_position = new_position;
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
|
|
||||||
|
|||||||
+7
-14
@@ -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);
|
||||||
@@ -310,10 +300,13 @@ 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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -56,7 +56,11 @@ namespace VISEQ::GRAPH::NODES {
|
|||||||
connectors.emplace_back(std::make_shared<Connector>(GraphItem::getptr(), position, radius + 5.0f));
|
connectors.emplace_back(std::make_shared<Connector>(GraphItem::getptr(), position, radius + 5.0f));
|
||||||
connectors.back()->init();
|
connectors.back()->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void removeConnector(std::shared_ptr<Connector> connector){
|
||||||
|
std::erase(connectors, connector);
|
||||||
|
}
|
||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
addConnector();
|
addConnector();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user