diff options
-rw-r--r-- | main/floormat-app.hpp | 2 | ||||
-rw-r--r-- | main/floormat-events.cpp | 48 | ||||
-rw-r--r-- | main/floormat-events.hpp | 51 | ||||
-rw-r--r-- | main/floormat-main-impl.hpp | 1 |
4 files changed, 79 insertions, 23 deletions
diff --git a/main/floormat-app.hpp b/main/floormat-app.hpp index 31cffaed..dac9f077 100644 --- a/main/floormat-app.hpp +++ b/main/floormat-app.hpp @@ -10,6 +10,7 @@ struct mouse_button_event; struct mouse_scroll_event; struct key_event; struct text_input_event; +struct text_editing_event; struct any_event; struct floormat_app @@ -31,6 +32,7 @@ struct floormat_app virtual bool on_key_down(const key_event& event) noexcept = 0; virtual bool on_key_up(const key_event& event) noexcept = 0; virtual bool on_text_input_event(const text_input_event& event) noexcept = 0; + virtual bool on_text_editing_event(const text_editing_event& event) noexcept = 0; virtual void on_viewport_event(const Magnum::Math::Vector2<int>& size) noexcept = 0; virtual bool on_any_event(const any_event& event) noexcept = 0; virtual void on_focus_in() noexcept = 0; diff --git a/main/floormat-events.cpp b/main/floormat-events.cpp index 8d5fa61a..527a979a 100644 --- a/main/floormat-events.cpp +++ b/main/floormat-events.cpp @@ -17,53 +17,55 @@ void main_impl::viewportEvent(Platform::Sdl2Application::ViewportEvent& event) void main_impl::mousePressEvent(Platform::Sdl2Application::MouseEvent& event) { - event. - if (app.on_mouse_down()) + if (app.on_mouse_down(mouse_button_event{event.position(), + (SDL_Keymod)(std::uint16_t)event.modifiers(), + mouse_button(event.button()), + std::uint8_t(std::min(255, event.clickCount()))})) return event.setAccepted(); } void main_impl::mouseReleaseEvent(Platform::Sdl2Application::MouseEvent& event) { - if (_imgui.handleMouseReleaseEvent(event)) + if (app.on_mouse_down({event.position(), + (SDL_Keymod)(std::uint16_t)event.modifiers(), + mouse_button(event.button()), + std::uint8_t(std::min(255, event.clickCount()))})) return event.setAccepted(); - do_mouse_release((int)event.button()); } void main_impl::mouseMoveEvent(Platform::Sdl2Application::MouseMoveEvent& event) { - _cursor_in_imgui = _imgui.handleMouseMoveEvent(event); - if (_cursor_in_imgui) - _cursor_pixel = std::nullopt; - else - _cursor_pixel = event.position(); - recalc_cursor_tile(); - if (_cursor_tile) - do_mouse_move(*_cursor_tile); + if (app.on_mouse_move({event.position(), event.relativePosition(), + (mouse_button)(std::uint8_t)(std::uint32_t)event.buttons(), + (SDL_Keymod)(std::uint16_t)event.modifiers()})) + return event.setAccepted(); } void main_impl::mouseScrollEvent(Platform::Sdl2Application::MouseScrollEvent& event) { - if (_imgui.handleMouseScrollEvent(event)) + if (app.on_mouse_scroll(mouse_scroll_event{event.offset(), event.position(), + (SDL_Keymod)(std::uint16_t)event.modifiers()})) return event.setAccepted(); } void main_impl::textInputEvent(Platform::Sdl2Application::TextInputEvent& event) { - if (_imgui.handleTextInputEvent(event)) - { - keys = {}; - event.setAccepted(); - } + if (app.on_text_input_event({event.text()})) + return event.setAccepted(); +} + +void main_impl::textEditingEvent(Platform::Sdl2Application::TextEditingEvent& event) +{ + if (app.on_text_editing_event({event.text(), event.start(), event.length()})) + return event.setAccepted(); } void main_impl::keyPressEvent(Platform::Sdl2Application::KeyEvent& event) { - if (_imgui.handleKeyPressEvent(event)) - { - keys = {}; + if (app.on_key_down({(SDL_Keycode)(std::uint32_t)event.key(), + (SDL_Keymod)(std::uint16_t)event.modifiers(), + event.isRepeated()})) return event.setAccepted(); - } - do_key(event.key(), event.modifiers(), true, event.isRepeated()); } void main_impl::keyReleaseEvent(Platform::Sdl2Application::KeyEvent& event) diff --git a/main/floormat-events.hpp b/main/floormat-events.hpp new file mode 100644 index 00000000..ba10ee9a --- /dev/null +++ b/main/floormat-events.hpp @@ -0,0 +1,51 @@ +#pragma once +#include <Magnum/Math/Vector2.h> +#include <SDL_keycode.h> +#include <SDL_mouse.h> + +namespace floormat { + +enum mouse_button : std::uint8_t { + mouse_button_none = 0, + mouse_button_left = SDL_BUTTON_LMASK, + mouse_button_middle = SDL_BUTTON_MMASK, + mouse_button_right = SDL_BUTTON_RMASK, + mouse_button_x1 = SDL_BUTTON_X1MASK, + mouse_button_x2 = SDL_BUTTON_X2MASK, +}; + +struct mouse_button_event final { + Vector2i position; + SDL_Keymod mods = KMOD_NONE; + mouse_button button = mouse_button_none; + std::uint8_t click_count = 0; +}; + +struct mouse_move_event final { + Vector2i position, relative_position; + mouse_button buttons = mouse_button_none; + SDL_Keymod mods = KMOD_NONE; +}; + +struct mouse_scroll_event final { + Magnum::Vector2 offset; + Vector2i position; + SDL_Keymod mods = KMOD_NONE; +}; + +struct text_input_event final { + Containers::StringView text; +}; + +struct text_editing_event final { + Containers::StringView text; + std::int32_t start = 0, length = 0; +}; + +struct key_event final { + SDL_Keycode key = SDLK_UNKNOWN; + SDL_Keymod mods = KMOD_NONE; + bool is_repeated = false; +}; + +} // namespace floormat diff --git a/main/floormat-main-impl.hpp b/main/floormat-main-impl.hpp index 8541d095..e84a0527 100644 --- a/main/floormat-main-impl.hpp +++ b/main/floormat-main-impl.hpp @@ -37,6 +37,7 @@ struct main_impl final : Platform::Sdl2Application, floormat_main [[maybe_unused]] void mouseMoveEvent(MouseMoveEvent& event) override; [[maybe_unused]] void mouseScrollEvent(MouseScrollEvent& event) override; [[maybe_unused]] void textInputEvent(TextInputEvent& event) override; + [[maybe_unused]] void textEditingEvent(TextEditingEvent& event) override; [[maybe_unused]] void keyPressEvent(KeyEvent& event) override; [[maybe_unused]] void keyReleaseEvent(KeyEvent& event) override; [[maybe_unused]] void anyEvent(SDL_Event& event) override; |