Files
viseq/src/draggable.h
T

86 lines
2.0 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;
2024-11-20 11:13:13 +01:00
virtual bool entered() override {
return !is_hovering && hovering();
}
virtual bool exited() override {
return is_hovering && !hovering();
}
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((pickedUp() || hovering()) && z_hovering == -1) z_hovering = z_index;
if(z_index == z_hovering || selected){
if(pickedUp()){
drag();
STATE = IState::DRAG_NODE;
}
}
if(STATE != IState::DRAG_NODE){
if(entered()){
STATE = IState::HOVER_NODE;
std::cout << "z_index=" << z_index << " z_hovering=" << z_hovering << std::endl;
is_hovering = true;
}
if(exited()){
STATE = IState::HOVER_CANVAS;
is_hovering = false;
}
}
if(released() && picked_up){
putDown();
STATE = IState::HOVER_CANVAS;
if(hovering()) STATE = IState::HOVER_NODE;
}
}
};
}