From 8dd7fa684e3eb1f854c0af864b33a53fc3af6f20 Mon Sep 17 00:00:00 2001 From: trafficlunar Date: Wed, 29 Jan 2025 20:55:18 +0000 Subject: [PATCH] feat: hold shift to create square selection in rectangle-select tool --- src/components/canvas/Canvas.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/components/canvas/Canvas.tsx b/src/components/canvas/Canvas.tsx index bd8ff15..050642d 100644 --- a/src/components/canvas/Canvas.tsx +++ b/src/components/canvas/Canvas.tsx @@ -265,14 +265,25 @@ function Canvas() { const newSelection: CoordinateArray = []; const startX = Math.min(dragStartCoords.x, mouseCoords.x); - const endX = Math.max(dragStartCoords.x, mouseCoords.x); + let endX = Math.max(dragStartCoords.x, mouseCoords.x); const startY = Math.min(dragStartCoords.y, mouseCoords.y); - const endY = Math.max(dragStartCoords.y, mouseCoords.y); + let endY = Math.max(dragStartCoords.y, mouseCoords.y); const isRadiusEven = radius == 1 || radius % 2 == 0; + const radiusOffset = isRadiusEven ? radius : radius - 1; - for (let x = startX; x < endX + (isRadiusEven ? radius : radius - 1); x++) { - for (let y = startY; y < endY + (isRadiusEven ? radius : radius - 1); y++) { + // If holding shift, create a square selection + if (holdingShiftRef.current) { + const width = Math.abs(endX - startX); + const height = Math.abs(endY - startY); + const size = Math.max(width, height); + + endX = startX + (endX < startX ? -size : size); + endY = startY + (endY < startY ? -size : size); + } + + for (let x = startX; x < endX + radiusOffset; x++) { + for (let y = startY; y < endY + radiusOffset; y++) { newSelection.push([x, y]); } }