From 8763bebb59dfd8803a06e73adb1ee17c3eec13be Mon Sep 17 00:00:00 2001 From: Ryan Di Date: Tue, 28 Apr 2026 21:07:11 +1000 Subject: [PATCH] perf(line-snap): reuse scene elements while snapping linear points --- packages/element/src/linearElementEditor.ts | 42 +++++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/packages/element/src/linearElementEditor.ts b/packages/element/src/linearElementEditor.ts index 40bbb9409f..e873cc7754 100644 --- a/packages/element/src/linearElementEditor.ts +++ b/packages/element/src/linearElementEditor.ts @@ -322,13 +322,16 @@ export class LinearElementEditor { LinearElementEditor._getSnappedPointForLinearElement({ app, event, + elements, elementsMap, element, pointIndex: idx, scenePointerX, scenePointerY, pointerOffset: linearElementEditor.pointerOffset, - referencePoint: shouldRotateWithDiscreteAngle(event) ? pivotPoint : null, + referencePoint: shouldRotateWithDiscreteAngle(event) + ? pivotPoint + : null, selectedPointsIndices: [idx], customLineAngle, }); @@ -510,6 +513,7 @@ export class LinearElementEditor { LinearElementEditor._getSnappedPointForLinearElement({ app, event, + elements, elementsMap, element, pointIndex: lastClickedPoint, @@ -1209,10 +1213,12 @@ export class LinearElementEditor { } const anchor = points[points.length - 2]; + const elements = app.scene.getNonDeletedElements(); const { point: newPoint, snapLines } = LinearElementEditor._getSnappedPointForLinearElement({ app, event, + elements, elementsMap, element, pointIndex: points.length - 1, @@ -1887,6 +1893,7 @@ export class LinearElementEditor { private static _getSnappedPointForLinearElement({ app, event, + elements, elementsMap, element, pointIndex, @@ -1899,7 +1906,8 @@ export class LinearElementEditor { }: { app: AppClassProperties; event: PointerEvent | React.PointerEvent; - elementsMap: ElementsMap; + elements: readonly Ordered[]; + elementsMap: NonDeletedSceneElementsMap; element: NonDeleted; pointIndex: number; scenePointerX: number; @@ -1919,12 +1927,17 @@ export class LinearElementEditor { ); if (referencePoint) { - const referencePointCoords = LinearElementEditor.getPointGlobalCoordinates( - element, - referencePoint, - elementsMap, + const referencePointCoords = + LinearElementEditor.getPointGlobalCoordinates( + element, + referencePoint, + elementsMap, + ); + const [gridX, gridY] = getGridPoint( + scenePointerX, + scenePointerY, + gridSize, ); - const [gridX, gridY] = getGridPoint(scenePointerX, scenePointerY, gridSize); let { width: dxFromReference, height: dyFromReference } = getLockedLinearCursorAlignSize( @@ -1942,7 +1955,7 @@ export class LinearElementEditor { if (!isElbowArrow(element)) { const { snapOffset, snapLines: nextSnapLines } = snapLinearElementPoint( - app.scene.getNonDeletedElements(), + elements, element, pointFrom(effectiveGridX, effectiveGridY), app, @@ -1972,8 +1985,10 @@ export class LinearElementEditor { dyFromReference = result.dyFromReference; snapLines = result.snapLines; } else { - dxFromReference = effectiveGridX + snapOffset.x - referencePointCoords[0]; - dyFromReference = effectiveGridY + snapOffset.y - referencePointCoords[1]; + dxFromReference = + effectiveGridX + snapOffset.x - referencePointCoords[0]; + dyFromReference = + effectiveGridY + snapOffset.y - referencePointCoords[1]; } } } @@ -1985,7 +2000,10 @@ export class LinearElementEditor { ); return { - point: pointFrom(referencePoint[0] + rotatedX, referencePoint[1] + rotatedY), + point: pointFrom( + referencePoint[0] + rotatedX, + referencePoint[1] + rotatedY, + ), snapLines, }; } @@ -1994,7 +2012,7 @@ export class LinearElementEditor { const originalPointerY = scenePointerY - pointerOffset.y; const { snapOffset, snapLines } = snapLinearElementPoint( - app.scene.getNonDeletedElements(), + elements, element, pointFrom(originalPointerX, originalPointerY), app,