#pragma once #include "moveable.h" #include "raylib.h" #include "selectable.h" #include "state.h" #include "vmath.h" namespace VISEQ::BASE { class Draggable : public Movable, public Selectable{ public: Draggable() {} Draggable(float x, float y) : Movable(Vec2Df(x, y), 960.0f) {} Draggable(Vec2Df p) : Movable(p, 960.0f) {} virtual ~Draggable() {} Vec2Df drag_offset; bool picked_up = false; virtual bool pickedUp() { if(clicked() && held() && (STATE == IState::HOVER_NODE || STATE == IState::DRAG_NODE)) { picked_up = true; drag_offset = position - SCREEN_MOUSE; } return picked_up; } virtual void drag() { if(KEYS_PRESSED.ctrl){ selection_offset = position - state->hover_position; } if(KEYS_DOWN.ctrl){ position = MOD_MOUSE + selection_offset; } else { position = MOD_MOUSE + drag_offset; } } virtual void putDown(){ picked_up = false; } virtual void select() override { if(STATE == IState::DRAW_SELECTION) in_selection_rect = CheckCollisionPointRec(position, state->selection); if(MOUSE_LEFT.released) selected = (KEYS_DOWN.shift && selected) || in_selection_rect; } virtual void update() override { if(STATE != IState::HOVER_NODE) select(); if(entered()){ STATE = IState::HOVER_NODE; } if(exited()) STATE = IState::HOVER_CANVAS; if(pickedUp()){ drag(); STATE = IState::DRAG_NODE; } if(released() && picked_up){ putDown(); STATE = IState::HOVER_CANVAS; } } }; }