diff --git a/liblava/frame/input.cpp b/liblava/frame/input.cpp index c4b8dc5681f27947e086402bf6f71ea905bb5cf1..3d4b4c9b51b638f056ecb26d5cc37b48407a5ec1 100644 --- a/liblava/frame/input.cpp +++ b/liblava/frame/input.cpp @@ -87,6 +87,16 @@ void input::handle_events() { return false; }); + + _handle_events<path_drop_event>(path_drop, [&](auto& event) { + + for (auto& callback : callbacks) + if (callback->on_path_drop_event) + if (callback->on_path_drop_event(event)) + return true; + + return false; + }); } gamepad::gamepad(gamepad_id id) : id(id) { diff --git a/liblava/frame/input.hpp b/liblava/frame/input.hpp index 44fe22b9d7ebe42d4c3c833d712630e532a93ac2..bcff0b988cbd1f770e35282576d858753013df36 100644 --- a/liblava/frame/input.hpp +++ b/liblava/frame/input.hpp @@ -22,14 +22,14 @@ enum class key : i32 { period = 46, /* . */ slash = 47, /* / */ - _0 = 48, + _0 = 48, _1, _2, _3, _4, _5, _6, _7, _8, _9, semicolon = 59, /* ; */ equal = 61, /* = */ a = 65, - b, c, d, e, f, g, h, i, j, k, l, m, n, + b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, left_bracket = 91, /* [ */ @@ -46,14 +46,14 @@ enum class key : i32 { enter, tab, backspace, insert, del, /* delete */ right, left, down, up, - + page_up, page_down, home, end, caps_lock = 280, scroll_lock, num_lock, print_screen, pause, f1 = 290, - f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, + f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, kp_0 = 320, @@ -150,7 +150,7 @@ struct mouse_move_event { enum class mouse_button : type { _1 = 0, _2, _3, _4, _5, _6, _7, _8, - + last = _8, left = _1, right = _2, middle = _3, @@ -166,7 +166,7 @@ struct mouse_button_event { id sender; mouse_button button; - + lava::action action; lava::mod mod; @@ -174,6 +174,17 @@ struct mouse_button_event { bool released(mouse_button b) const { return action == action::release && button == b; } }; +struct path_drop_event{ + using ref = path_drop_event const&; + using func = std::function<bool(ref)>; + using listeners = std::map<id, func>; + using list = std::vector<path_drop_event>; + + id sender; + + std::vector<std::string> files; +}; + struct mouse_active_event { using ref = mouse_active_event const&; @@ -199,6 +210,7 @@ struct input_callback { mouse_move_event::func on_mouse_move_event; mouse_button_event::func on_mouse_button_event; mouse_active_event::func on_mouse_active_event; + path_drop_event::func on_path_drop_event; }; template <typename T> @@ -215,8 +227,9 @@ struct input : id_obj { input_events<scroll_event> scroll; input_events<mouse_move_event> mouse_move; - input_events<mouse_button_event> mouse_button; + input_events<mouse_button_event> mouse_button; input_events<mouse_active_event> mouse_active; + input_events<path_drop_event> path_drop; void handle_events(); @@ -234,7 +247,7 @@ private: enum class gamepad_id : ui32 { - _1 = 0, _2, _3, _4, _5, _6, _7, _8, _9, + _1 = 0, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, last = _16, @@ -243,17 +256,17 @@ enum class gamepad_id : ui32 { enum class gamepad_button : type { a = 0, b, x, y, - + left_bumper, right_bumper, - + back, start, guide, - + left_thumb, right_thumb, - + dpad_up, dpad_right, dpad_down, dpad_left, last = dpad_left, - + cross = a, circle = b, square = x, triangle = y, }; @@ -261,9 +274,9 @@ enum class gamepad_button : type { enum class gamepad_axis : type { left_x = 0, left_y, - + right_x, right_y, - + left_trigger, right_trigger, last = right_trigger, diff --git a/liblava/frame/window.cpp b/liblava/frame/window.cpp index 6950a2102800e7f38bec6fd912b6d696aba704ea..b7feb305267a6e648423518418a631936e528887 100644 --- a/liblava/frame/window.cpp +++ b/liblava/frame/window.cpp @@ -228,6 +228,15 @@ void window::handle_message() { if (window->input) window->input->mouse_active.add({ window->get_id(), entered > 0 }); }); + + glfwSetDropCallback(handle, [](GLFWwindow* handle, i32 amt, const char** paths){ + auto window = get_window(handle); + if(!window) + return; + + if(window->input) + window->input->path_drop.add({window->get_id(), {paths, paths+amt}}); + }); } template <int attr>