summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--main/floormat-app.hpp2
-rw-r--r--main/floormat-events.cpp48
-rw-r--r--main/floormat-events.hpp51
-rw-r--r--main/floormat-main-impl.hpp1
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;