Add hold to zoom button

This commit is contained in:
Yousef Khadadeh 2026-01-07 10:34:51 +03:00
parent 777a5a6d03
commit 850882c8ed
4 changed files with 56 additions and 25 deletions

View file

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

View file

@ -83,9 +83,15 @@ class DrawingProgram {
std::unique_ptr<DrawingProgramToolBase> toolToSwitchToAfterUpdate;
std::unordered_set<CanvasComponentContainer::ObjInfo*> 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;

View file

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

View file

@ -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"}
})