Files
viseq/src/draggable.h
T

60 lines
1.5 KiB
C++
Raw Normal View History

#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 == APP::InteractionState::HOVER_NODE || state->istate == APP::InteractionState::DRAG_NODE)) {
picked_up = true;
2024-11-14 23:21:04 +01:00
drag_offset = position - state->screen_mouse;
}
return picked_up;
}
virtual void drag() {
if(state->keys_down.ctrl){
position = state->mod_mouse;
} else {
position = state->mod_mouse + drag_offset;
}
}
virtual void putDown(){
picked_up = false;
}
virtual void select() override {
selected = (state->keys_down.shift && selected) || CheckCollisionPointRec(position, state->selection);
}
virtual void update() override {
if((held() && !picked_up) || (clicked() && !state->keys_down.shift)) select();
if(entered()) state->istate = APP::InteractionState::HOVER_NODE;
if(exited()) state->istate = APP::InteractionState::HOVER_CANVAS;
if(pickedUp()){
drag();
state->istate = APP::InteractionState::DRAG_NODE;
}
if(released() && picked_up){
putDown();
state->istate = APP::InteractionState::HOVER_CANVAS;
}
}
};
}