From 643e8d54abb60dde02a196e4b85e899c906ea3b4 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Fri, 16 Jan 2026 17:42:00 +0300 Subject: [PATCH] Add zoom method that only uses the pen --- src/DrawCamera.cpp | 4 +++- src/DrawingProgram/DrawingProgram.cpp | 22 ++++++++++++---------- src/Toolbar.cpp | 3 +++ src/Toolbar.hpp | 1 + 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/DrawCamera.cpp b/src/DrawCamera.cpp index a1a9f10..90fb47d 100755 --- a/src/DrawCamera.cpp +++ b/src/DrawCamera.cpp @@ -111,7 +111,9 @@ void DrawCamera::update_main(World& w) { } else { - bool newIsAccurateZooming = (w.drawProg.controls.middleClickHeld && w.main.input.key(InputManager::KEY_GENERIC_LCTRL).held) || (w.drawProg.controls.leftClickHeld && w.drawProg.drawTool->get_type() == DrawingProgramToolType::ZOOM); + bool newIsAccurateZooming = (w.drawProg.controls.middleClickHeld && w.main.input.pen.isDown && w.main.input.pen.buttons[w.main.toolbar.tabletOptions.middleClickButton].held && w.main.toolbar.tabletOptions.zoomWhilePenDownAndButtonHeld) || // Hold middle click (pen button assigned to middle click) while pen is down + (w.drawProg.controls.middleClickHeld && w.main.input.key(InputManager::KEY_GENERIC_LCTRL).held) || // Hold middle click/pen button while holding control + (w.drawProg.controls.leftClickHeld && w.drawProg.drawTool->get_type() == DrawingProgramToolType::ZOOM); // Hold left click while on zoom tool if(newIsAccurateZooming && !isAccurateZooming) { startZoomMousePos = w.get_mouse_world_pos(); diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 1e873f6..31093f3 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -245,16 +245,6 @@ void DrawingProgram::update() { tool_temporary_switch_update(); controls.cursorHoveringOverCanvas = !world.main.toolbar.io->hoverObstructed; - controls.leftClick = controls.cursorHoveringOverCanvas && world.main.input.mouse.leftClicks; - if(controls.leftClick) { - controls.leftClickHeld = true; - world.main.toolbar.rightClickPopupLocation = std::nullopt; - } - if(controls.leftClickHeld && !world.main.input.mouse.leftDown) { - controls.leftClick = false; - controls.leftClickHeld = false; - controls.leftClickReleased = true; - } controls.middleClick = controls.cursorHoveringOverCanvas && (world.main.input.mouse.middleClicks || world.main.input.pen.buttons[world.main.toolbar.tabletOptions.middleClickButton].pressed); bool middleHeld = world.main.input.mouse.middleDown || world.main.input.pen.buttons[world.main.toolbar.tabletOptions.middleClickButton].held; @@ -268,6 +258,18 @@ void DrawingProgram::update() { controls.middleClickReleased = true; } + // Left click will be ignored if middle click is held (and left click held state will be gone once middle click is pressed) + controls.leftClick = controls.cursorHoveringOverCanvas && world.main.input.mouse.leftClicks && !controls.middleClickHeld; + if(controls.leftClick) { + controls.leftClickHeld = true; + world.main.toolbar.rightClickPopupLocation = std::nullopt; + } + if(controls.leftClickHeld && (!world.main.input.mouse.leftDown || controls.middleClickHeld)) { + controls.leftClick = false; + controls.leftClickHeld = false; + controls.leftClickReleased = true; + } + if(controls.cursorHoveringOverCanvas && (world.main.input.mouse.rightClicks || world.main.input.pen.buttons[world.main.toolbar.tabletOptions.rightClickButton].pressed)) { if(world.main.toolbar.rightClickPopupLocation) world.main.toolbar.rightClickPopupLocation = std::nullopt; diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index 0c2e981..7ab53b9 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -276,6 +276,7 @@ nlohmann::json Toolbar::get_config_json() { tablet["rightClickButton"] = tabletOptions.rightClickButton; tablet["ignoreMouseMovementWhenPenInProximity"] = tabletOptions.ignoreMouseMovementWhenPenInProximity; tablet["brushMinimumSize"] = tabletOptions.brushMinimumSize; + tablet["zoomWhilePenDownAndButtonHeld"] = tabletOptions.zoomWhilePenDownAndButtonHeld; toRet["tablet"] = tablet; @@ -338,6 +339,7 @@ void Toolbar::set_config_json(const nlohmann::json& j, VersionNumber version) { try{j.at("tablet").at("rightClickButton").get_to(tabletOptions.rightClickButton);} catch(...) {} try{j.at("tablet").at("ignoreMouseMovementWhenPenInProximity").get_to(tabletOptions.ignoreMouseMovementWhenPenInProximity);} catch(...) {} try{j.at("tablet").at("brushMinimumSize").get_to(tabletOptions.brushMinimumSize);} catch(...) {} + try{j.at("tablet").at("zoomWhilePenDownAndButtonHeld").get_to(tabletOptions.zoomWhilePenDownAndButtonHeld);} catch(...) {} main.update_display_names(); } @@ -1583,6 +1585,7 @@ void Toolbar::options_menu() { gui.input_scalar_field("middle click", "Middle click pen button", &tabletOptions.middleClickButton, 1, 255); gui.input_scalar_field("right click", "Right click pen button", &tabletOptions.rightClickButton, 1, 255); gui.slider_scalar_field("tablet brush minimum size", "Brush relative minimum size", &tabletOptions.brushMinimumSize, 0.0f, 1.0f, 3); + gui.checkbox_field("tablet zoom with button method", "Zoom when pen touching tablet and pen button assigned to middle click is held", &tabletOptions.zoomWhilePenDownAndButtonHeld); #ifdef _WIN32 gui.checkbox_field("mouse ignore when pen proximity", "Ignore mouse movement when pen in proximity", &tabletOptions.ignoreMouseMovementWhenPenInProximity); #endif diff --git a/src/Toolbar.hpp b/src/Toolbar.hpp index 2f6231a..bea1907 100644 --- a/src/Toolbar.hpp +++ b/src/Toolbar.hpp @@ -77,6 +77,7 @@ class Toolbar { uint8_t rightClickButton = 2; bool ignoreMouseMovementWhenPenInProximity = false; float brushMinimumSize = 0.0f; + bool zoomWhilePenDownAndButtonHeld = true; } tabletOptions; Vector4f* colorLeft = nullptr;