diff --git a/src/components/App.tsx b/src/components/App.tsx index feb6d6a8..cd4f7ed2 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -2754,6 +2754,27 @@ class App extends React.Component { points: points.slice(0, -1), }); } else { + const [gridX, gridY] = getGridPoint( + scenePointerX, + scenePointerY, + this.state.gridSize, + ); + + const [lastCommittedX, lastCommittedY] = + multiElement?.lastCommittedPoint ?? [0, 0]; + + let dxFromLastCommitted = gridX - rx - lastCommittedX; + let dyFromLastCommitted = gridY - ry - lastCommittedY; + + if (shouldRotateWithDiscreteAngle(event)) { + ({ width: dxFromLastCommitted, height: dyFromLastCommitted } = + getPerfectElementSize( + this.state.activeTool.type, + dxFromLastCommitted, + dyFromLastCommitted, + )); + } + if (isPathALoop(points, this.state.zoom.value)) { setCursor(this.canvas, CURSOR_TYPE.POINTER); } @@ -2761,7 +2782,10 @@ class App extends React.Component { mutateElement(multiElement, { points: [ ...points.slice(0, -1), - [scenePointerX - rx, scenePointerY - ry], + [ + lastCommittedX + dxFromLastCommitted, + lastCommittedY + dyFromLastCommitted, + ], ], }); } diff --git a/src/keys.ts b/src/keys.ts index fc495437..7704f4e2 100644 --- a/src/keys.ts +++ b/src/keys.ts @@ -80,5 +80,5 @@ export const shouldMaintainAspectRatio = (event: MouseEvent | KeyboardEvent) => event.shiftKey; export const shouldRotateWithDiscreteAngle = ( - event: MouseEvent | KeyboardEvent, + event: MouseEvent | KeyboardEvent | React.PointerEvent, ) => event.shiftKey;