From 638df54ee6ff5eb16a1cfcf15ec5d1b580948de0 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 5 Dec 2024 01:25:00 +0100 Subject: [PATCH] Connecting works again (almost). Connectors need to be copied when splitting edges. --- src/app-manager.h | 15 ++++----------- src/connectable.h | 3 +++ src/connector.h | 8 ++++++-- src/graph-manager.h | 9 +++------ src/interaction-event.h | 6 +++++- src/interaction-manager.h | 31 ++++++++++++++++++++++++------- src/ui.h | 2 +- 7 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/app-manager.h b/src/app-manager.h index 2538da5..052c5e1 100644 --- a/src/app-manager.h +++ b/src/app-manager.h @@ -63,7 +63,7 @@ namespace VISEQ::APP { json graph = json::parse(f); for(auto n : graph.at("gm").at("nodes")){ - gm->addNodeAndUpdate(n.template get>()); + gm->addNode(n.template get>()); } int highest_id = 0; @@ -81,13 +81,6 @@ namespace VISEQ::APP { highest_id = e.at("id"); } } - - for(auto n : graph.at("gm").at("nodes")){ - std::shared_ptr mn = n; - gm->addNode(mn); - //app.gm->nodes.push_back(mn); - std::cout << std::format("adding node {}", mn->id) << std::endl; - } for(auto e : graph.at("gm").at("edges")){ int start_id = e.at("start").get(); @@ -126,10 +119,10 @@ namespace VISEQ::APP { } else { for(int i = 0; i < 4; ++i){ - gm->addMidiNode(Vec2Df{(float)i * state->settings.grid*4 + 7 * state->settings.grid, 2 * state->settings.grid*4}); + gm->createMidiNode(Vec2Df{(float)i * state->settings.grid*4 + 7 * state->settings.grid, 2 * state->settings.grid*4}); } for(int i = 3; i >= 0; --i){ - gm->addMidiNode(Vec2Df{(float)i * state->settings.grid*4 + 7 * state->settings.grid, 3 * state->settings.grid*4}); + gm->createMidiNode(Vec2Df{(float)i * state->settings.grid*4 + 7 * state->settings.grid, 3 * state->settings.grid*4}); } for(int i = 0; i < 8; ++i){ @@ -141,7 +134,7 @@ namespace VISEQ::APP { } void updateMidiPorts(){ - for(auto&n : gm->getMidiNodes()){ + for(auto& n : gm->getMidiNodes()){ auto nc = std::dynamic_pointer_cast(n.lock()); for(auto& mo : sm->midi.midi_out_ports){ if(!nc->midi_outs.contains(mo.number) && mo.enabled){ diff --git a/src/connectable.h b/src/connectable.h index a8471f0..2c79dc5 100644 --- a/src/connectable.h +++ b/src/connectable.h @@ -14,6 +14,8 @@ namespace VISEQ::BASE { bool new_partner = false; bool connecting = false; + bool connected = false; + Vec2Df connecting_position; virtual void drag(Vec2Df new_position) override { @@ -29,6 +31,7 @@ namespace VISEQ::BASE { virtual void connect() { if(picked_up){ connecting = false; + connected = true; } } diff --git a/src/connector.h b/src/connector.h index 51c0d37..44dda45 100644 --- a/src/connector.h +++ b/src/connector.h @@ -20,7 +20,7 @@ namespace VISEQ::GRAPH { setParent(parent); } - std::shared_ptr parent; + std::weak_ptr parent; bool passable = false; @@ -37,7 +37,7 @@ namespace VISEQ::GRAPH { } virtual bool hovering() override { - return !partner.expired() && CheckCollisionPointCircle(SCREEN_MOUSE, position, radius); + return partner.expired() && CheckCollisionPointCircle(SCREEN_MOUSE, position, radius); } void setParent(std::shared_ptr _parent){ @@ -53,6 +53,10 @@ namespace VISEQ::GRAPH { if(hovering() && clicked()) state->pushEvent({getPtr(), APP::Interaction::PICKUP}); if(pickedUp()) state->pushEvent({getPtr(), APP::Interaction::DRAG}); if(picked_up && released()) state->pushEvent({getPtr(), APP::Interaction::PUTDOWN}); + if(connected) { + state->pushEvent({getPtr(), APP::Interaction::CONNECT}); + connected = false; + } if(partner.expired()) position = center_position - ((center_position - SCREEN_MOUSE)).norm() * (radius + orbit); if(!partner.expired()) position = center_position - ((center_position - partner.lock()->position)).norm() * (radius + orbit); diff --git a/src/graph-manager.h b/src/graph-manager.h index 1cca0f7..5be79b8 100644 --- a/src/graph-manager.h +++ b/src/graph-manager.h @@ -59,8 +59,9 @@ namespace VISEQ::GRAPH { return nodes.size(); } - void addMidiNode(Vec2Df position){ + void createMidiNode(Vec2Df position){ nodes.emplace_back(std::make_shared(position)); + nodes.back()->update(); } void setMidiPortForAll(int number, bool _state){ @@ -71,10 +72,6 @@ namespace VISEQ::GRAPH { void addNode(SPTR_Node node){ nodes.insert(nodes.end(), node); - } - - void addNodeAndUpdate(SPTR_Node node){ - addNode(node); node->update(); } @@ -242,7 +239,7 @@ namespace VISEQ::GRAPH { void splitEdges(){ for(auto s : split_edges){ Vec2Df center = s.lock()->end.lock()->position.center(s.lock()->start.lock()->position); - SPTR_Node cn = copyNode(std::dynamic_pointer_cast(s.lock()->start.lock()), center); + SPTR_Node cn = copyNode(std::dynamic_pointer_cast(s.lock()->start.lock()), center); // TODO: copy connectors addConnection(s.lock()->start.lock(), cn); addConnection(cn, s.lock()->end.lock()); remove_edges.push_back(s); diff --git a/src/interaction-event.h b/src/interaction-event.h index 700e5d6..8668147 100644 --- a/src/interaction-event.h +++ b/src/interaction-event.h @@ -12,6 +12,10 @@ namespace VISEQ::APP{ std::shared_ptr item; Interaction action; }; + + inline bool operator==(const InteractionEvent& lhs, const InteractionEvent& rhs){ + return lhs.item == rhs.item; + } - inline static std::deque event_queue; + inline static std::deque event_queue; } diff --git a/src/interaction-manager.h b/src/interaction-manager.h index 306f8c1..ef7c010 100644 --- a/src/interaction-manager.h +++ b/src/interaction-manager.h @@ -13,6 +13,7 @@ #include "state.h" #include "canvas.h" #include +#include #include namespace VISEQ::INTERACTION{ @@ -184,16 +185,32 @@ namespace VISEQ::INTERACTION{ state->mouse_z = canvas->z_index; + for(auto e : APP::event_queue){ + if(!connect_once && e.action == APP::Interaction::CONNECT){ + APP::InteractionEvent partner; + bool found = false; + for(auto ei : APP::event_queue){ + if(ei.action == APP::Interaction::HOVER && ei.item->getType() == GraphItemType::CONNECTOR) { + std::cout << "YEAH" << std::endl; + partner = ei; + found = true; + break; + } + } + if(found && partner != e){ + auto connector = std::dynamic_pointer_cast(e.item); + auto connector_to = std::dynamic_pointer_cast(partner.item); + connector->partner = connector_to; + connector_to->partner = connector; + gm->addConnection(std::dynamic_pointer_cast(connector->parent.lock()), std::dynamic_pointer_cast(connector_to->parent.lock())); + connect_once = true; + } + } + } + while(APP::event_queue.size() > 0 && !exit){ auto e = APP::event_queue.front(); - if(!connect_once && e.action == APP::Interaction::CONNECT){ - auto connector = std::dynamic_pointer_cast(e.item); - auto connector_to = std::dynamic_pointer_cast(connector->partner.lock()); - gm->addConnection(std::dynamic_pointer_cast(connector->parent), std::dynamic_pointer_cast(connector_to->parent)); - connect_once = true; - } - if(e.action == APP::Interaction::HOVER){ state->mouse_z = e.item->z_index; } diff --git a/src/ui.h b/src/ui.h index ff382a2..5e3b669 100644 --- a/src/ui.h +++ b/src/ui.h @@ -92,7 +92,7 @@ namespace VISEQ::APP::UI{ int s_nodes = s_signal + 70 + signal_configs*20; GuiLabel((Rectangle){20, (float)s_nodes + 30, 240, 20}, "NODES"); if(GuiButton((Rectangle){20, (float)s_nodes + 60, 240, 20}, "ADD RANDOM NODE")){ - gm->addMidiNode(Vec2Df{200.0f, 200.0f}); + gm->createMidiNode(Vec2Df{200.0f, 200.0f}); } DrawText(std::format("{}", gm->getNodesSize()).c_str(), 20, state->settings.height - 70, 15, VS_COLOR_WHITE); DrawFPS(20, state->settings.height - 30);