Pen events passed to tools

This commit is contained in:
Yousef Khadadeh 2026-03-03 16:01:21 +03:00
parent 5b6316bd15
commit 4814780bec
10 changed files with 141 additions and 17 deletions

View file

@ -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::NetObjWeakPtr<WorldGri
}
void DrawingProgram::update() {
tool_temporary_switch_update();
controls.cursorHoveringOverCanvas = world.main.toolbar.check_if_position_isnt_obstructed(world.main.input.mouse.pos);
controls.previousMouseWorldPos = controls.currentMouseWorldPos;
@ -386,7 +414,6 @@ void DrawingProgram::update() {
drag_drop_update();
selection.update();
drawTool->tool_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);

View file

@ -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<std::pair<NetworkingObjects::NetObjID, CoordSpaceHelper>>& transforms);
@ -86,7 +92,7 @@ class DrawingProgram {
std::unique_ptr<DrawingProgramToolBase> toolToSwitchToAfterUpdate;
std::unordered_set<CanvasComponentContainer::ObjInfo*> updateableComponents;
void tool_temporary_switch_update();
void pen_tool_switch_check();
enum class TemporaryMoveToolSwitch {
NONE,
PAN,

View file

@ -58,3 +58,9 @@ std::unique_ptr<DrawingProgramToolBase> 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) {}

View file

@ -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<DrawingProgramToolBase> allocate_tool_type(DrawingProgram& drawP, DrawingProgramToolType t);
protected:

View file

@ -4,6 +4,7 @@
#include <SDL3/SDL_keyboard.h>
#include <SDL3/SDL_keycode.h>
#include <SDL3/SDL_pen.h>
#include <optional>
#include <Helpers/Logger.hpp>
@ -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;

View file

@ -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<std::string, RichText::TextData>& plainAndRichtextPair);
@ -290,6 +291,12 @@ struct InputManager {
Vector2f move;
};
struct PenAxisCallbackArgs {
Vector2f pos;
SDL_PenAxis axis;
float value;
};
MainProgram& main;
};

View file

@ -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() {

View file

@ -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:

View file

@ -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) {

View file

@ -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();