Refactor mouse and keyboard events

This commit is contained in:
Jan Mrna 2025-10-05 20:17:24 +02:00 committed by Mrna
parent 4a9498a520
commit d924e7dbca
2 changed files with 55 additions and 35 deletions

View File

@ -19,21 +19,43 @@ UserInput::~UserInput() { LOG_DEBUG("."); };
std::expected<void, std::string> UserInput::Init() { return {}; } std::expected<void, std::string> UserInput::Init() { return {}; }
const std::vector<UserAction> &UserInput::GetActions() { void UserInput::GetActions_mouse(const SDL_Event& event)
m_Actions.clear(); {
SDL_Event event;
static WindowPos mouse_pan_start;
static bool mouse_pan = false; static bool mouse_pan = false;
while (SDL_PollEvent(&event)) { if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
// TODO refactor mouse / kbd handling into separate functions SDL_MouseButtonEvent mouse_event = event.button;
if (event.type == SDL_EVENT_KEY_DOWN || event.type == SDL_EVENT_KEY_UP) { MouseButton button = static_cast<MouseButton>(mouse_event.button);
if (button == MouseButton::LEFT) {
LOG_DEBUG("Mouse down: ", mouse_event.x, ", ", mouse_event.y);
m_Actions.emplace_back(UserAction::Type::SET_MOVE_TARGET,
WindowPos{mouse_event.x, mouse_event.y});
} else if (button == MouseButton::MIDDLE) {
mouse_pan = true;
}
} else if (event.type == SDL_EVENT_MOUSE_BUTTON_UP) {
SDL_MouseButtonEvent mouse_event = event.button;
MouseButton button = static_cast<MouseButton>(mouse_event.button);
if (button == MouseButton::MIDDLE) {
mouse_pan = false;
}
} else if (event.type == SDL_EVENT_MOUSE_MOTION) {
SDL_MouseMotionEvent motion_event = event.motion;
if (mouse_pan) {
m_Actions.emplace_back(UserAction::Type::CAMERA_PAN,
WindowPos{motion_event.xrel, motion_event.yrel});
}
}
}
void UserInput::GetActions_kbd(const SDL_Event& event)
{
bool key_down = event.type == SDL_EVENT_KEY_DOWN ? true : false; bool key_down = event.type == SDL_EVENT_KEY_DOWN ? true : false;
SDL_KeyboardEvent kbd_event = event.key; SDL_KeyboardEvent kbd_event = event.key;
if (kbd_event.repeat) { if (kbd_event.repeat) {
// SDL repeats KEY_DOWN if key is held down, we ignore that // SDL repeats KEY_DOWN if key is held down, we ignore that
continue; return;
} }
LOG_DEBUG("Key '", static_cast<char>(kbd_event.key), LOG_DEBUG("Key '", static_cast<char>(kbd_event.key),
key_down ? "' down" : "' up"); key_down ? "' down" : "' up");
@ -41,8 +63,7 @@ const std::vector<UserAction> &UserInput::GetActions() {
switch (kbd_event.key) { switch (kbd_event.key) {
case 'q': case 'q':
m_Actions.emplace_back(UserAction::Type::EXIT); m_Actions.emplace_back(UserAction::Type::EXIT);
// further processing of inputs is not needed return;
return m_Actions;
case '1': case '1':
case '2': case '2':
case '3': case '3':
@ -57,30 +78,26 @@ const std::vector<UserAction> &UserInput::GetActions() {
LOG_INFO("Key '", static_cast<char>(kbd_event.key), "' not mapped"); LOG_INFO("Key '", static_cast<char>(kbd_event.key), "' not mapped");
break; break;
} }
} else if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) { }
SDL_MouseButtonEvent mouse_event = event.button;
MouseButton button = static_cast<MouseButton>(mouse_event.button); const std::vector<UserAction>& UserInput::GetActions() {
if (button == MouseButton::LEFT) { m_Actions.clear();
LOG_DEBUG("Mouse down: ", mouse_event.x, ", ", mouse_event.y); SDL_Event event;
m_Actions.emplace_back(UserAction::Type::SET_MOVE_TARGET,
WindowPos{mouse_event.x, mouse_event.y}); while (SDL_PollEvent(&event)) {
} else if (button == MouseButton::MIDDLE) { if (event.type == SDL_EVENT_KEY_DOWN
mouse_pan = true; || event.type == SDL_EVENT_KEY_UP)
} {
} else if (event.type == SDL_EVENT_MOUSE_BUTTON_UP) { GetActions_kbd(event);
SDL_MouseButtonEvent mouse_event = event.button; }
MouseButton button = static_cast<MouseButton>(mouse_event.button); else if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN
if (button == MouseButton::MIDDLE) { || event.type == SDL_EVENT_MOUSE_BUTTON_UP
mouse_pan = false; || event.type == SDL_EVENT_MOUSE_MOTION)
} {
} else if (event.type == SDL_EVENT_MOUSE_MOTION) { GetActions_mouse(event);
SDL_MouseMotionEvent motion_event = event.motion; }
if (mouse_pan) { else
m_Actions.emplace_back(UserAction::Type::CAMERA_PAN, {
WindowPos{motion_event.xrel, motion_event.yrel});
}
} else {
// TODO uncomment, for now too much noise // TODO uncomment, for now too much noise
// LOG_WARNING("Action not processed"); // LOG_WARNING("Action not processed");
} }

View File

@ -49,4 +49,7 @@ public:
private: private:
std::vector<UserAction> m_Actions; std::vector<UserAction> m_Actions;
void GetActions_kbd(const SDL_Event&);
void GetActions_mouse(const SDL_Event&);
}; };