From d52fe2ded2ac20606ecbc199839980449c71c753 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sun, 28 Sep 2025 18:25:46 +0300 Subject: [PATCH] Hold space to temporary switch to pan tool --- src/DrawingProgram/DrawingProgram.cpp | 21 +++++++++++++++++---- src/DrawingProgram/DrawingProgram.hpp | 2 ++ src/InputManager.cpp | 1 + src/InputManager.hpp | 4 +++- src/Toolbar.cpp | 2 +- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 4244adc..4076548 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -265,15 +265,28 @@ void DrawingProgram::update() { unorderedObjectsExistTimePoint = std::chrono::steady_clock::now(); } - if(drawTool->get_type() == DrawingProgramToolType::BRUSH && world.main.input.pen.isEraser && !temporaryEraser) { - switch_to_tool(DrawingProgramToolType::ERASER); + if(world.main.input.pen.isEraser && !temporaryEraser) { + if(drawTool->get_type() == DrawingProgramToolType::BRUSH) + switch_to_tool(DrawingProgramToolType::ERASER); temporaryEraser = true; } - else if(drawTool->get_type() == DrawingProgramToolType::ERASER && !world.main.input.pen.isEraser && temporaryEraser) { - switch_to_tool(DrawingProgramToolType::BRUSH); + else if(!world.main.input.pen.isEraser && temporaryEraser) { + if(drawTool->get_type() == DrawingProgramToolType::ERASER) + switch_to_tool(DrawingProgramToolType::BRUSH); temporaryEraser = false; } + if(world.main.input.key(InputManager::KEY_HOLD_TO_PAN).held && !temporaryPan) { + toolTypeAfterTempPan = drawTool->get_type(); + switch_to_tool(DrawingProgramToolType::PAN); + temporaryPan = true; + } + + if(!world.main.input.key(InputManager::KEY_HOLD_TO_PAN).held && temporaryPan) { + switch_to_tool(toolTypeAfterTempPan); + temporaryPan = false; + } + controls.cursorHoveringOverCanvas = !world.main.toolbar.io->hoverObstructed; controls.leftClick = controls.cursorHoveringOverCanvas && world.main.input.mouse.leftClicks; if(controls.leftClick) { diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index d5da572..4553eaa 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -92,6 +92,8 @@ class DrawingProgram { DrawingProgramSelection selection; bool temporaryEraser = false; + bool temporaryPan = false; + DrawingProgramToolType toolTypeAfterTempPan; struct GlobalControls { float relativeWidth = 15.0f; diff --git a/src/InputManager.cpp b/src/InputManager.cpp index 6783d99..203a017 100644 --- a/src/InputManager.cpp +++ b/src/InputManager.cpp @@ -45,6 +45,7 @@ InputManager::InputManager() { defaultKeyAssignments[{0, SDLK_F1}] = KEY_OPEN_CHAT; defaultKeyAssignments[{0, SDLK_F3}] = KEY_SHOW_METRICS; defaultKeyAssignments[{0, SDLK_F2}] = KEY_SHOW_PLAYER_LIST; + defaultKeyAssignments[{0, SDLK_SPACE}] = KEY_HOLD_TO_PAN; #ifdef __EMSCRIPTEN__ // Without this, SDL eats the CTRL-V event that initiates the paste event diff --git a/src/InputManager.hpp b/src/InputManager.hpp index 152ac34..8917e5f 100644 --- a/src/InputManager.hpp +++ b/src/InputManager.hpp @@ -135,6 +135,7 @@ struct InputManager { KEY_SHOW_METRICS, KEY_OPEN_CHAT, KEY_SHOW_PLAYER_LIST, + KEY_HOLD_TO_PAN, KEY_ASSIGNABLE_COUNT, // Not a real key @@ -216,5 +217,6 @@ NLOHMANN_JSON_SERIALIZE_ENUM(InputManager::KeyCodeEnum, { {InputManager::KEY_DRAW_TOOL_SCREENSHOT, "Screenshot Tool"}, {InputManager::KEY_SHOW_METRICS, "Show Metrics"}, {InputManager::KEY_OPEN_CHAT, "Open Chat"}, - {InputManager::KEY_SHOW_PLAYER_LIST, "Show Player List"} + {InputManager::KEY_SHOW_PLAYER_LIST, "Show Player List"}, + {InputManager::KEY_HOLD_TO_PAN, "Hold to Pan"} }) diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index 9d17be9..93662f3 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -1823,7 +1823,7 @@ float Toolbar::final_gui_scale() { } void Toolbar::calculate_final_gui_scale() { - Vector2f maxWindowSizeBeforeForcedFit = final_gui_scale_not_fit() * Vector2f{800.0f, 800.0f}; + Vector2f maxWindowSizeBeforeForcedFit = final_gui_scale_not_fit() * Vector2f{800.0f, 880.0f}; Vector2f fitRatio = {main.window.size.x() / maxWindowSizeBeforeForcedFit.x(), main.window.size.y() / maxWindowSizeBeforeForcedFit.y()}; finalCalculatedGuiScale = final_gui_scale_not_fit() * std::min(std::min(fitRatio.x(), fitRatio.y()), 1.0f); }