#pragma once #include #include #include "connector.h" #include "datatypes.h" #include "draggable.h" #include "graph-item.h" #include "interaction-event.h" #include "state.h" #include "vmath.h" namespace VISEQ::GRAPH::EDGES{ class Edge; } namespace VISEQ::GRAPH::NODES { class Node : public BASE::Draggable, public GraphItem, public std::enable_shared_from_this { public: Node() {} Node(float x, float y) : Draggable(Vec2Df(x, y)) {} Node(Vec2Df p) : Draggable(p) {} NodeType nodeType; std::vector> neighbors; std::vector> connections; std::vector> connectors; Distribution distributionMode = Distribution::GEOMETRIC; float radius = 15.0f; bool config = false; std::shared_ptr getPtr(){ return shared_from_this(); } virtual bool hovering() override { return CheckCollisionPointCircle(SCREEN_MOUSE, position, radius); } void addConnector() { connectors.emplace_back(std::make_shared(getPtr(), position, radius + 5.0f)); } void removeConnector(std::weak_ptr connector){ std::erase(connectors, connector.lock()); } virtual NodeType getNodeType() const {return nodeType;} virtual void SMode(int mode) {}; virtual void trigger() {}; void deselect() override { selected = false; } GraphItemType getType() override{ return GraphItemType::NODE; } void clearConnectors(){ connectors.clear(); update(); } void update() override{ if(hovering()) state->pushEvent({getPtr(), APP::Interaction::HOVER}); 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(hovering() && MOUSE_RIGHT.clicked) { selected = true; config = true; state->pushEvent({getPtr(), APP::Interaction::RIGHTCLICK}); } int free_connectors = 0; for(auto c : connectors){ if(c->partner.expired()) free_connectors++; c->setPosition(position); c->update(); } if(free_connectors == 0) addConnector(); } void draw(Vec2Df mp, Camera2D cam) override {} void draw() override{ for(auto c : connectors){ c->draw(); } } }; typedef std::shared_ptr SPTR_Node; typedef std::weak_ptr WPTR_Node; typedef std::vector VEC_SPTR_Node; typedef std::vector VEC_WPTR_Node; }