diff options
Diffstat (limited to 'editor/events.cpp')
| -rw-r--r-- | editor/events.cpp | 147 |
1 files changed, 86 insertions, 61 deletions
diff --git a/editor/events.cpp b/editor/events.cpp index 1a259d0e..b25cdb7e 100644 --- a/editor/events.cpp +++ b/editor/events.cpp @@ -2,6 +2,7 @@ #include "floormat/main.hpp" #include "floormat/events.hpp" +#include "main/sdl-fwd.inl" #include "src/world.hpp" #include "keys.hpp" #include "editor.hpp" @@ -12,19 +13,14 @@ namespace floormat { -void app::on_focus_in() noexcept {} -void app::on_mouse_enter() noexcept {} -void app::on_any_event(const any_event&) noexcept {} - -#define accessor(type, name) \ - type m_##name = {}; auto name() const noexcept { return m_##name; } +namespace { -static constexpr int fixup_mods_(int mods, int value, int mask) +constexpr int fixup_mods_(int mods, int value, int mask) { return !!(mods & mask) * value; } -static constexpr int fixup_mods(int mods) +constexpr int fixup_mods(int mods) { int ret = 0; ret |= fixup_mods_(mods, kmod_ctrl, KMOD_CTRL); @@ -34,11 +30,49 @@ static constexpr int fixup_mods(int mods) return ret; } +} // namespace + + +using PointerButtons = Platform::Sdl2Application::Pointer; +using PointerEvent = Platform::Sdl2Application::PointerEvent; +using PointerMoveEvent = Platform::Sdl2Application::PointerMoveEvent; + +void app::on_focus_in() noexcept {} +void app::on_mouse_enter() noexcept {} +void app::on_any_event(const any_event&) noexcept {} + +#define accessor(type, name) \ + type m_##name = {}; auto name() const noexcept { return m_##name; } + +bool app::do_imgui_key(const sdl2::EvKey& ev, bool is_down) +{ + if (is_down) + return _imgui->handleKeyPressEvent(ev.val); + else + return _imgui->handleKeyReleaseEvent(ev.val); +} + +bool app::do_imgui_click(const sdl2::EvClick& ev, bool is_down) +{ + if (is_down) + return _imgui->handlePointerPressEvent(ev.val); + else + return _imgui->handlePointerReleaseEvent(ev.val); +} + +bool app::do_tests_key(const key_event& ev, bool is_down) +{ + bool ret = _editor->mode() == editor_mode::tests; + if (ret) + return tests_handle_key(ev, is_down); + return ret; +} + void app::clear_keys(key min_inclusive, key max_exclusive) { auto& keys = *keys_; using key_type = std::decay_t<decltype(keys)>::value_type; - for (key_type i = key_type(min_inclusive); i < key_type(max_exclusive); i++) + for (auto i = key_type(min_inclusive); i < key_type(max_exclusive); i++) { const auto idx = key(i); keys[idx] = false; @@ -52,58 +86,59 @@ void app::clear_keys() key_modifiers = {}; } -void app::on_mouse_move(const mouse_move_event& event) noexcept +void app::on_mouse_move(const mouse_move_event& event, const sdl2::EvMove& ev) noexcept { - if (!(event.position >= Vector2i() && event.position < M->window_size())) - return; + do + { + cursor.in_imgui = _imgui->handlePointerMoveEvent(ev.val); + if (cursor.in_imgui) + break; + if (_editor->mode() == editor_mode::tests) + { + (void)tests_handle_mouse_move(event); + break; + } + } + while (false); - struct { - accessor(Vector2i, position) - } e = {event.position}; - - if ((cursor.in_imgui = _imgui->handleMouseMoveEvent(e))) - void(); - else if (_editor->mode() == editor_mode::tests && tests_handle_mouse_move(event)) - void(); - update_cursor_tile(event.position); + update_cursor_tile(Vector2i(event.position)); do_mouse_move(fixup_mods(event.mods)); } -void app::on_mouse_up_down(const mouse_button_event& event, bool is_down) noexcept +void app::on_mouse_up_down(const mouse_button_event& event, bool is_down, const sdl2::EvClick& ev) noexcept { - if (!(event.position >= Vector2i() && event.position < M->window_size())) + const auto p = Vector2i(event.position); + + if (!(p >= Vector2i{} && p < M->window_size())) return; - struct ev { - enum class Button : std::underlying_type_t<mouse_button> { - Left = mouse_button_left, - Right = mouse_button_right, - Middle = mouse_button_middle, - }; - accessor(Vector2i, position) - accessor(Button, button) - } e = {event.position, ev::Button(event.button)}; - - if ((cursor.in_imgui = is_down ? _imgui->handleMousePressEvent(e) : _imgui->handleMouseReleaseEvent(e))) - void(); - else if (_editor->mode() == editor_mode::tests && tests_handle_mouse_click(event, is_down)) - void(); - else + do + { + cursor.in_imgui = do_imgui_click(ev, is_down); + if (cursor.in_imgui) + break; + if (_editor->mode() == editor_mode::tests) + if (tests_handle_mouse_click(event, is_down)) + break; do_mouse_up_down(event.button, is_down, fixup_mods(event.mods)); + } + while(false); } -void app::on_mouse_scroll(const mouse_scroll_event& event) noexcept +void app::on_mouse_scroll(const mouse_scroll_event& event, const sdl2::EvScroll& ev) noexcept { - if (!(event.position >= Vector2i() && event.position < M->window_size())) - return; + const auto p = Vector2i(event.position); - struct { - accessor(Vector2, offset) - accessor(Vector2i, position) - } e = {event.offset, event.position}; - - if (!(cursor.in_imgui = _imgui->handleMouseScrollEvent(e))) - do_mouse_scroll((int)e.offset()[1]); + do + { + if (p >= Vector2i() && p < M->window_size()) + break; + cursor.in_imgui = _imgui->handleScrollEvent(ev.val); + if (cursor.in_imgui) + break; + do_mouse_scroll((int)ev.val.offset()[1]); + } + while (false); } auto app::resolve_keybinding(int k_, int mods_) -> std::tuple<key, int> @@ -190,23 +225,13 @@ auto app::resolve_keybinding(int k_, int mods_) -> std::tuple<key, int> void app::clear_non_global_keys() { clear_keys(key_MIN, key_GLOBAL); } void app::clear_non_repeated_keys() { clear_keys(key_NO_REPEAT, key_COUNT); } -void app::on_key_up_down(const key_event& event, bool is_down) noexcept +void app::on_key_up_down(const key_event& event, bool is_down, const sdl2::EvKey& ev) noexcept { - using KeyEvent = Platform::Sdl2Application::KeyEvent; - struct Ev - { - using Key = KeyEvent::Key; - using Modifier = KeyEvent::Modifier; - using Modifiers = KeyEvent::Modifiers; - accessor(Key, key) - accessor(Modifiers, modifiers) - } e = {Ev::Key(event.key), Ev::Modifier(event.mods)}; - auto [x, mods] = resolve_keybinding(event.key, event.mods); static_assert(key_GLOBAL >= key_NO_REPEAT); - if ((x == key_COUNT || x < key_GLOBAL) && (is_down ? _imgui->handleKeyPressEvent(e) : _imgui->handleKeyReleaseEvent(e)) || - (x == key_COUNT || x == key_escape) && _editor->mode() == editor_mode::tests && tests_handle_key(event, is_down)) + if ((x == key_COUNT || x < key_GLOBAL) && do_imgui_key(ev, is_down) || + (x == key_COUNT || x == key_escape) && do_tests_key(event, is_down)) clear_non_global_keys(); else if (x >= key_NO_REPEAT) is_down && !event.is_repeated ? do_key(x, mods, event.key & ~SDLK_SCANCODE_MASK) : void(); |
