#pragma once #include "raylib.h" #include "vmath.h" #include namespace VISEQ::APP{ struct AppSettings{ int width; int height; float grid; float bpm; float fps; float speed = 16.0f; int gui_selected_midi_out; }; NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(AppSettings, width, height, grid, bpm, fps, speed, gui_selected_midi_out) enum InteractionState {HOVER_CANVAS, HOVER_NODE, HOVER_CONNECTOR, ADD_NODES_MENU, DRAG_NODE, CONNECT_NODE, DRAW_SELECTION, SCALE_SELECTION, DELETE_SELECTED_NODES, COPY_SELECTED_NODES, PASTE_SELECTED_NODES}; struct MouseState{ bool down = false; bool clicked = false; bool released = false; }; struct ModifierKeys{ bool ctrl = false; bool shift = false; bool alt = false; }; class State{ public: State(){} State(State &state) = delete; void operator=(const State &) = delete; AppSettings settings; Vec2Df raw_mouse; Vec2Df screen_mouse; Vec2Df mod_mouse; InteractionState istate = HOVER_CANVAS; int node_mode = 0; MouseState mouse_left; MouseState mouse_right; MouseState mouse_middle; ModifierKeys keys_down; ModifierKeys keys_pressed; ModifierKeys keys_released; Vec2Df mouse_delta; void update(Camera2D camera){ mouse_delta = {GetMouseDelta().x, GetMouseDelta().y}; settings.speed = (settings.grid * 16.0f) * (settings.bpm / 120.f); Vector2 mp = GetScreenToWorld2D(GetMousePosition(), camera); Vec2Df mouse_pos = {(float)mp.x, (float)mp.y}; mouse_left.down = IsMouseButtonDown(MOUSE_BUTTON_LEFT); mouse_left.clicked = IsMouseButtonPressed(MOUSE_BUTTON_LEFT); mouse_left.released = IsMouseButtonReleased(MOUSE_BUTTON_LEFT); mouse_right.down = IsMouseButtonDown(MOUSE_BUTTON_RIGHT); mouse_right.clicked = IsMouseButtonPressed(MOUSE_BUTTON_RIGHT); mouse_right.released = IsMouseButtonReleased(MOUSE_BUTTON_RIGHT); keys_down.ctrl = IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_RIGHT_CONTROL); keys_down.shift = IsKeyDown(KEY_LEFT_SHIFT) || IsKeyDown(KEY_RIGHT_SHIFT); keys_down.alt = IsKeyDown(KEY_LEFT_ALT) || IsKeyDown(KEY_RIGHT_ALT); keys_pressed.ctrl = IsKeyPressed(KEY_LEFT_CONTROL) || IsKeyPressed(KEY_RIGHT_CONTROL); keys_pressed.shift = IsKeyPressed(KEY_LEFT_SHIFT) || IsKeyPressed(KEY_RIGHT_SHIFT); keys_pressed.alt = IsKeyPressed(KEY_LEFT_ALT) || IsKeyPressed(KEY_RIGHT_ALT); keys_released.ctrl = IsKeyReleased(KEY_LEFT_CONTROL) || IsKeyReleased(KEY_RIGHT_CONTROL); keys_released.shift = IsKeyReleased(KEY_LEFT_SHIFT) || IsKeyReleased(KEY_RIGHT_SHIFT); keys_released.alt = IsKeyReleased(KEY_LEFT_ALT) || IsKeyReleased(KEY_RIGHT_ALT); screen_mouse = mouse_pos; raw_mouse = {GetMousePosition().x, GetMousePosition().y}; mod_mouse = mouse_pos; if(keys_down.ctrl) { mod_mouse.x = round(mouse_pos.x / settings.grid) * settings.grid; mod_mouse.y = round(mouse_pos.y / settings.grid) * settings.grid; } } inline static std::shared_ptr instance; static std::shared_ptr get() { if(!instance){ instance.reset(new State()); } return instance; } }; }