From 4814780bec7c9b11c026460bec978d894906c973 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Tue, 3 Mar 2026 16:01:21 +0300 Subject: [PATCH] Pen events passed to tools --- src/DrawingProgram/DrawingProgram.cpp | 35 +++++++++++++++--- src/DrawingProgram/DrawingProgram.hpp | 8 ++++- .../Tools/DrawingProgramToolBase.cpp | 6 ++++ .../Tools/DrawingProgramToolBase.hpp | 6 ++++ src/InputManager.cpp | 22 ++++++++++++ src/InputManager.hpp | 7 ++++ src/MainProgram.cpp | 27 ++++++++++---- src/MainProgram.hpp | 5 +-- src/World.cpp | 36 ++++++++++++++++--- src/World.hpp | 6 ++++ 10 files changed, 141 insertions(+), 17 deletions(-) diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index cfbd34f..3506ad5 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -159,6 +159,7 @@ void DrawingProgram::input_key_callback(const InputManager::KeyCallbackArgs& key else if(!key.down && tempMoveToolSwitch == TemporaryMoveToolSwitch::PAN) { switch_to_tool(toolTypeAfterTempMove); tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE; + pen_tool_switch_check(); } break; } @@ -171,6 +172,7 @@ void DrawingProgram::input_key_callback(const InputManager::KeyCallbackArgs& key else if(!key.down && tempMoveToolSwitch == TemporaryMoveToolSwitch::ZOOM) { switch_to_tool(toolTypeAfterTempMove); tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE; + pen_tool_switch_check(); } break; } @@ -178,6 +180,34 @@ void DrawingProgram::input_key_callback(const InputManager::KeyCallbackArgs& key drawTool->input_key_callback(key); } +void DrawingProgram::input_pure_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) { + drawTool->input_pure_mouse_button_callback(button); +} + +void DrawingProgram::input_pure_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) { + drawTool->input_pure_mouse_motion_callback(motion); +} + +void DrawingProgram::input_pen_button_callback(const InputManager::PenButtonCallbackArgs& button) { + pen_tool_switch_check(); + drawTool->input_pen_button_callback(button); +} + +void DrawingProgram::input_pen_touch_callback(const InputManager::PenTouchCallbackArgs& touch) { + pen_tool_switch_check(); + drawTool->input_pen_touch_callback(touch); +} + +void DrawingProgram::input_pen_motion_callback(const InputManager::PenMotionCallbackArgs& motion) { + pen_tool_switch_check(); + drawTool->input_pen_motion_callback(motion); +} + +void DrawingProgram::input_pen_axis_callback(const InputManager::PenAxisCallbackArgs& axis) { + pen_tool_switch_check(); + drawTool->input_pen_axis_callback(axis); +} + void DrawingProgram::server_init_no_file() { layerMan.server_init_no_file(); } @@ -372,8 +402,6 @@ void DrawingProgram::modify_grid(const NetworkingObjects::NetObjWeakPtrtool_update(); @@ -400,7 +427,7 @@ void DrawingProgram::update() { rebuild_cache(); } -void DrawingProgram::tool_temporary_switch_update() { +void DrawingProgram::pen_tool_switch_check() { if(world.main.input.pen.isEraser && !temporaryEraser && tempMoveToolSwitch == TemporaryMoveToolSwitch::NONE) { if(drawTool->get_type() == DrawingProgramToolType::BRUSH) switch_to_tool(DrawingProgramToolType::ERASER); diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index f7f07e2..335ba08 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -61,6 +61,12 @@ class DrawingProgram { void input_key_callback(const InputManager::KeyCallbackArgs& key); void input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button); void input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion); + void input_pure_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button); + void input_pure_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion); + void input_pen_button_callback(const InputManager::PenButtonCallbackArgs& button); + void input_pen_touch_callback(const InputManager::PenTouchCallbackArgs& touch); + void input_pen_motion_callback(const InputManager::PenMotionCallbackArgs& motion); + void input_pen_axis_callback(const InputManager::PenAxisCallbackArgs& axis); private: void process_transform_message(const std::vector>& transforms); @@ -86,7 +92,7 @@ class DrawingProgram { std::unique_ptr toolToSwitchToAfterUpdate; std::unordered_set updateableComponents; - void tool_temporary_switch_update(); + void pen_tool_switch_check(); enum class TemporaryMoveToolSwitch { NONE, PAN, diff --git a/src/DrawingProgram/Tools/DrawingProgramToolBase.cpp b/src/DrawingProgram/Tools/DrawingProgramToolBase.cpp index 642efb0..39057e5 100644 --- a/src/DrawingProgram/Tools/DrawingProgramToolBase.cpp +++ b/src/DrawingProgram/Tools/DrawingProgramToolBase.cpp @@ -58,3 +58,9 @@ std::unique_ptr DrawingProgramToolBase::allocate_tool_ty void DrawingProgramToolBase::input_key_callback(const InputManager::KeyCallbackArgs& key) {} void DrawingProgramToolBase::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) {} void DrawingProgramToolBase::input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) {} +void DrawingProgramToolBase::input_pure_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) {} +void DrawingProgramToolBase::input_pure_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) {} +void DrawingProgramToolBase::input_pen_button_callback(const InputManager::PenButtonCallbackArgs& button) {} +void DrawingProgramToolBase::input_pen_touch_callback(const InputManager::PenTouchCallbackArgs& touch) {} +void DrawingProgramToolBase::input_pen_motion_callback(const InputManager::PenMotionCallbackArgs& motion) {} +void DrawingProgramToolBase::input_pen_axis_callback(const InputManager::PenAxisCallbackArgs& axis) {} diff --git a/src/DrawingProgram/Tools/DrawingProgramToolBase.hpp b/src/DrawingProgram/Tools/DrawingProgramToolBase.hpp index c7e18c6..0269cb5 100644 --- a/src/DrawingProgram/Tools/DrawingProgramToolBase.hpp +++ b/src/DrawingProgram/Tools/DrawingProgramToolBase.hpp @@ -39,6 +39,12 @@ class DrawingProgramToolBase { virtual void input_key_callback(const InputManager::KeyCallbackArgs& key); virtual void input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button); virtual void input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion); + virtual void input_pure_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button); + virtual void input_pure_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion); + virtual void input_pen_button_callback(const InputManager::PenButtonCallbackArgs& button); + virtual void input_pen_touch_callback(const InputManager::PenTouchCallbackArgs& touch); + virtual void input_pen_motion_callback(const InputManager::PenMotionCallbackArgs& motion); + virtual void input_pen_axis_callback(const InputManager::PenAxisCallbackArgs& axis); virtual ~DrawingProgramToolBase(); static std::unique_ptr allocate_tool_type(DrawingProgram& drawP, DrawingProgramToolType t); protected: diff --git a/src/InputManager.cpp b/src/InputManager.cpp index 43f26d8..170f9d7 100644 --- a/src/InputManager.cpp +++ b/src/InputManager.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -448,6 +449,7 @@ void InputManager::backend_pen_button_down_update(const SDL_PenButtonEvent& e) { pen.previousPos = mouseNewPos; pen.buttons[e.button].held = true; pen.buttons[e.button].pressed = true; + pen.isEraser = e.pen_state & SDL_PEN_INPUT_ERASER_TIP; if(e.button == main.toolbar.tabletOptions.middleClickButton) { main.input_mouse_button_callback({ @@ -479,6 +481,7 @@ void InputManager::backend_pen_button_up_update(const SDL_PenButtonEvent& e) { pen.previousPos = mouseNewPos; pen.buttons[e.button].held = false; + pen.isEraser = e.pen_state & SDL_PEN_INPUT_ERASER_TIP; if(e.button == main.toolbar.tabletOptions.middleClickButton) { main.input_mouse_button_callback({ @@ -560,6 +563,7 @@ void InputManager::backend_pen_motion_update(const SDL_PenMotionEvent& e) { Vector2f mouseRel = mouseNewPos - pen.previousPos; pen.previousPos = mouseNewPos; + pen.isEraser = e.pen_state & SDL_PEN_INPUT_ERASER_TIP; main.input_mouse_motion_callback({ .pos = mouseNewPos, @@ -571,6 +575,24 @@ void InputManager::backend_pen_motion_update(const SDL_PenMotionEvent& e) { }); } +void InputManager::backend_pen_axis_update(const SDL_PenAxisEvent& e) { + Vector2f mouseNewPos = {e.x * main.window.density, e.y * main.window.density}; + mouse.set_pos(mouseNewPos); + + pen.previousPos = mouseNewPos; + pen.isEraser = e.pen_state & SDL_PEN_INPUT_ERASER_TIP; + + // For now, only pass pressure axis + if(e.axis == SDL_PEN_AXIS_PRESSURE) { + pen.pressure = e.value; + main.input_pen_axis_callback({ + .pos = mouseNewPos, + .axis = e.axis, + .value = e.value + }); + } +} + void InputManager::backend_key_down_update(const SDL_KeyboardEvent& e) { auto kPress = e.key; auto kMod = e.mod; diff --git a/src/InputManager.hpp b/src/InputManager.hpp index 78895cf..513f516 100644 --- a/src/InputManager.hpp +++ b/src/InputManager.hpp @@ -224,6 +224,7 @@ struct InputManager { void backend_pen_touch_down_update(const SDL_PenTouchEvent& e); void backend_pen_touch_up_update(const SDL_PenTouchEvent& e); void backend_pen_motion_update(const SDL_PenMotionEvent& e); + void backend_pen_axis_update(const SDL_PenAxisEvent& e); void set_clipboard_str(std::string_view s); void set_clipboard_plain_and_richtext_pair(const std::pair& plainAndRichtextPair); @@ -290,6 +291,12 @@ struct InputManager { Vector2f move; }; + struct PenAxisCallbackArgs { + Vector2f pos; + SDL_PenAxis axis; + float value; + }; + MainProgram& main; }; diff --git a/src/MainProgram.cpp b/src/MainProgram.cpp index e00ef35..0657ec5 100755 --- a/src/MainProgram.cpp +++ b/src/MainProgram.cpp @@ -326,12 +326,6 @@ void MainProgram::input_key_callback(const InputManager::KeyCallbackArgs& key) { world->input_key_callback(key); } -void MainProgram::input_pure_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) { -} - -void MainProgram::input_pure_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) { -} - void MainProgram::input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) { if(world) world->input_mouse_button_callback(button); @@ -347,13 +341,34 @@ void MainProgram::input_mouse_wheel_callback(const InputManager::MouseWheelCallb world->input_mouse_wheel_callback(wheel); } +void MainProgram::input_pure_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) { + if(world) + world->input_pure_mouse_button_callback(button); +} + +void MainProgram::input_pure_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) { + if(world) + world->input_pure_mouse_motion_callback(motion); +} + void MainProgram::input_pen_button_callback(const InputManager::PenButtonCallbackArgs& button) { + if(world) + world->input_pen_button_callback(button); } void MainProgram::input_pen_touch_callback(const InputManager::PenTouchCallbackArgs& touch) { + if(world) + world->input_pen_touch_callback(touch); } void MainProgram::input_pen_motion_callback(const InputManager::PenMotionCallbackArgs& motion) { + if(world) + world->input_pen_motion_callback(motion); +} + +void MainProgram::input_pen_axis_callback(const InputManager::PenAxisCallbackArgs& axis) { + if(world) + world->input_pen_axis_callback(axis); } bool MainProgram::network_being_used() { diff --git a/src/MainProgram.hpp b/src/MainProgram.hpp index 652864a..b470dc7 100644 --- a/src/MainProgram.hpp +++ b/src/MainProgram.hpp @@ -121,14 +121,15 @@ class MainProgram { std::string displayName; void input_key_callback(const InputManager::KeyCallbackArgs& key); - void input_pure_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button); - void input_pure_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion); void input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button); void input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion); void input_mouse_wheel_callback(const InputManager::MouseWheelCallbackArgs& wheel); + void input_pure_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button); + void input_pure_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion); void input_pen_button_callback(const InputManager::PenButtonCallbackArgs& button); void input_pen_touch_callback(const InputManager::PenTouchCallbackArgs& touch); void input_pen_motion_callback(const InputManager::PenMotionCallbackArgs& motion); + void input_pen_axis_callback(const InputManager::PenAxisCallbackArgs& axis); ~MainProgram(); private: diff --git a/src/World.cpp b/src/World.cpp index d316487..0787f80 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -267,9 +267,8 @@ void World::input_key_callback(const InputManager::KeyCallbackArgs& key) { } void World::input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) { - if(!clientStillConnecting) { + if(!clientStillConnecting) drawProg.input_mouse_button_callback(button); - } } void World::input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) { @@ -280,9 +279,38 @@ void World::input_mouse_motion_callback(const InputManager::MouseMotionCallbackA } void World::input_mouse_wheel_callback(const InputManager::MouseWheelCallbackArgs& wheel) { - if(!clientStillConnecting) { + if(!clientStillConnecting) drawData.cam.input_mouse_wheel_callback(*this, wheel); - } +} + +void World::input_pure_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) { + if(!clientStillConnecting) + drawProg.input_pure_mouse_button_callback(button); +} + +void World::input_pure_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) { + if(!clientStillConnecting) + drawProg.input_pure_mouse_motion_callback(motion); +} + +void World::input_pen_button_callback(const InputManager::PenButtonCallbackArgs& button) { + if(!clientStillConnecting) + drawProg.input_pen_button_callback(button); +} + +void World::input_pen_touch_callback(const InputManager::PenTouchCallbackArgs& touch) { + if(!clientStillConnecting) + drawProg.input_pen_touch_callback(touch); +} + +void World::input_pen_motion_callback(const InputManager::PenMotionCallbackArgs& motion) { + if(!clientStillConnecting) + drawProg.input_pen_motion_callback(motion); +} + +void World::input_pen_axis_callback(const InputManager::PenAxisCallbackArgs& axis) { + if(!clientStillConnecting) + drawProg.input_pen_axis_callback(axis); } void World::send_chat_message(const std::string& message) { diff --git a/src/World.hpp b/src/World.hpp index db34387..ed22aad 100644 --- a/src/World.hpp +++ b/src/World.hpp @@ -105,6 +105,12 @@ class World { void input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button); void input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion); void input_mouse_wheel_callback(const InputManager::MouseWheelCallbackArgs& wheel); + void input_pure_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button); + void input_pure_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion); + void input_pen_button_callback(const InputManager::PenButtonCallbackArgs& button); + void input_pen_touch_callback(const InputManager::PenTouchCallbackArgs& touch); + void input_pen_motion_callback(const InputManager::PenMotionCallbackArgs& motion); + void input_pen_axis_callback(const InputManager::PenAxisCallbackArgs& axis); private: void load_empty_canvas();