diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 62ae541..bbfaf27 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -241,27 +241,7 @@ void DrawingProgram::update() { else if(!unorderedObjectsExistTimePoint) unorderedObjectsExistTimePoint = std::chrono::steady_clock::now(); - if(world.main.input.pen.isEraser && !temporaryEraser) { - if(drawTool->get_type() == DrawingProgramToolType::BRUSH) - switch_to_tool(DrawingProgramToolType::ERASER); - temporaryEraser = true; - } - 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; - } + tool_temporary_switch_update(); controls.cursorHoveringOverCanvas = !world.main.toolbar.io->hoverObstructed; controls.leftClick = controls.cursorHoveringOverCanvas && world.main.input.mouse.leftClicks; @@ -346,6 +326,48 @@ void DrawingProgram::update() { rebuild_cache(); } +void DrawingProgram::tool_temporary_switch_update() { + switch(tempMoveToolSwitch) { + case TemporaryMoveToolSwitch::NONE: + if(world.main.input.key(InputManager::KEY_HOLD_TO_PAN).held) { + toolTypeAfterTempMove = drawTool->get_type(); + switch_to_tool(DrawingProgramToolType::PAN); + tempMoveToolSwitch = TemporaryMoveToolSwitch::PAN; + } + if(world.main.input.key(InputManager::KEY_HOLD_TO_ZOOM).held) { + toolTypeAfterTempMove = drawTool->get_type(); + switch_to_tool(DrawingProgramToolType::ZOOM); + tempMoveToolSwitch = TemporaryMoveToolSwitch::ZOOM; + } + break; + case TemporaryMoveToolSwitch::PAN: { + if(!world.main.input.key(InputManager::KEY_HOLD_TO_PAN).held) { + switch_to_tool(toolTypeAfterTempMove); + tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE; + } + break; + } + case TemporaryMoveToolSwitch::ZOOM: { + if(!world.main.input.key(InputManager::KEY_HOLD_TO_ZOOM).held) { + switch_to_tool(toolTypeAfterTempMove); + tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE; + } + break; + } + } + + if(world.main.input.pen.isEraser && !temporaryEraser && tempMoveToolSwitch == TemporaryMoveToolSwitch::NONE) { + if(drawTool->get_type() == DrawingProgramToolType::BRUSH) + switch_to_tool(DrawingProgramToolType::ERASER); + temporaryEraser = true; + } + else if(!world.main.input.pen.isEraser && temporaryEraser && tempMoveToolSwitch == TemporaryMoveToolSwitch::NONE) { + if(drawTool->get_type() == DrawingProgramToolType::ERASER) + switch_to_tool(DrawingProgramToolType::BRUSH); + temporaryEraser = false; + } +} + void DrawingProgram::invalidate_cache_at_component(CanvasComponentContainer::ObjInfo* objToCheck) { if(!selection.is_selected(objToCheck)) drawCache.invalidate_cache_at_aabb(objToCheck->obj->get_world_bounds()); diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 9cb0c78..ae94604 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -83,9 +83,15 @@ class DrawingProgram { std::unique_ptr toolToSwitchToAfterUpdate; std::unordered_set updateableComponents; + void tool_temporary_switch_update(); + enum class TemporaryMoveToolSwitch { + NONE, + PAN, + ZOOM + }; bool temporaryEraser = false; - bool temporaryPan = false; - DrawingProgramToolType toolTypeAfterTempPan; + TemporaryMoveToolSwitch tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE; + DrawingProgramToolType toolTypeAfterTempMove; struct GlobalControls { float relativeWidth = 15.0f; diff --git a/src/InputManager.cpp b/src/InputManager.cpp index 5f2ca75..6abfffd 100644 --- a/src/InputManager.cpp +++ b/src/InputManager.cpp @@ -35,7 +35,7 @@ InputManager::InputManager() { defaultKeyAssignments[{CTRL_MOD | SDL_KMOD_SHIFT, SDLK_V}] = KEY_PASTE_IMAGE; defaultKeyAssignments[{0, SDLK_B}] = KEY_DRAW_TOOL_BRUSH; defaultKeyAssignments[{0, SDLK_E}] = KEY_DRAW_TOOL_ERASER; - defaultKeyAssignments[{0, SDLK_Z}] = KEY_DRAW_TOOL_ZOOM; + defaultKeyAssignments[{0, SDLK_U}] = KEY_DRAW_TOOL_ZOOM; defaultKeyAssignments[{0, SDLK_L}] = KEY_DRAW_TOOL_LASSOSELECT; defaultKeyAssignments[{0, SDLK_H}] = KEY_DRAW_TOOL_PAN; defaultKeyAssignments[{0, SDLK_T}] = KEY_DRAW_TOOL_TEXTBOX; @@ -48,6 +48,7 @@ InputManager::InputManager() { defaultKeyAssignments[{0, SDLK_F3}] = KEY_SHOW_METRICS; defaultKeyAssignments[{0, SDLK_F2}] = KEY_SHOW_PLAYER_LIST; defaultKeyAssignments[{0, SDLK_SPACE}] = KEY_HOLD_TO_PAN; + defaultKeyAssignments[{0, SDLK_Z}] = KEY_HOLD_TO_ZOOM; #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 01323dd..9b0893c 100644 --- a/src/InputManager.hpp +++ b/src/InputManager.hpp @@ -165,6 +165,7 @@ struct InputManager { KEY_OPEN_CHAT, KEY_SHOW_PLAYER_LIST, KEY_HOLD_TO_PAN, + KEY_HOLD_TO_ZOOM, KEY_ASSIGNABLE_COUNT, // Not a real key @@ -256,5 +257,6 @@ NLOHMANN_JSON_SERIALIZE_ENUM(InputManager::KeyCodeEnum, { {InputManager::KEY_SHOW_METRICS, "Show Metrics"}, {InputManager::KEY_OPEN_CHAT, "Open Chat"}, {InputManager::KEY_SHOW_PLAYER_LIST, "Show Player List"}, - {InputManager::KEY_HOLD_TO_PAN, "Hold to Pan"} + {InputManager::KEY_HOLD_TO_PAN, "Hold to Pan"}, + {InputManager::KEY_HOLD_TO_ZOOM, "Hold to Zoom"} })