summaryrefslogtreecommitdiffhomepage
path: root/editor/events.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'editor/events.cpp')
-rw-r--r--editor/events.cpp147
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();