#pragma once #include "clipboard.h" #include "datatypes.h" #include "draggable.h" #include "graph-item.h" #include "graph-manager.h" #include "interaction-event.h" #include "node.h" #include "raylib.h" #include "signal-manager.h" #include "state.h" #include "canvas.h" #include namespace VISEQ::INTERACTION{ class ScaleHandle : public BASE::Draggable, public GraphItem, public std::enable_shared_from_this{ public: ScaleHandle(){} float radius = 6; std::shared_ptr getPtr(){ return shared_from_this(); } virtual GRAPH::GraphItemType getType() override { return GraphItemType::HANDLE; } virtual bool hovering() override { return CheckCollisionPointCircle(SCREEN_MOUSE, position, radius); } virtual 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}); } virtual void draw() override { DrawCircleV(position, radius, VS_COLOR_SUN); } virtual bool select() override { return false; } }; class InteractionManager{ public: InteractionManager() {} InteractionManager(std::shared_ptr gm, std::shared_ptr sm, std::shared_ptr canvas) : canvas(canvas), gm(gm), sm(sm) {} std::shared_ptr canvas; std::shared_ptr gm; std::shared_ptr sm; VISEQ::APP::Clipboard cb; std::shared_ptr state = APP::State::get(); Vec2Df scale_start; std::shared_ptr scale_handle = std::make_shared(); void update(); void draw(); void removeNodes(VEC_SPTR_Node nodes); void scaleSelection(); void snapPolar(std::shared_ptr dragNode); void doInteraction(); }; }