perf(line-snap): reuse scene elements while snapping linear points

This commit is contained in:
Ryan Di
2026-04-28 21:07:11 +10:00
parent 483a225eac
commit 8763bebb59
+30 -12
View File
@@ -322,13 +322,16 @@ export class LinearElementEditor {
LinearElementEditor._getSnappedPointForLinearElement({ LinearElementEditor._getSnappedPointForLinearElement({
app, app,
event, event,
elements,
elementsMap, elementsMap,
element, element,
pointIndex: idx, pointIndex: idx,
scenePointerX, scenePointerX,
scenePointerY, scenePointerY,
pointerOffset: linearElementEditor.pointerOffset, pointerOffset: linearElementEditor.pointerOffset,
referencePoint: shouldRotateWithDiscreteAngle(event) ? pivotPoint : null, referencePoint: shouldRotateWithDiscreteAngle(event)
? pivotPoint
: null,
selectedPointsIndices: [idx], selectedPointsIndices: [idx],
customLineAngle, customLineAngle,
}); });
@@ -510,6 +513,7 @@ export class LinearElementEditor {
LinearElementEditor._getSnappedPointForLinearElement({ LinearElementEditor._getSnappedPointForLinearElement({
app, app,
event, event,
elements,
elementsMap, elementsMap,
element, element,
pointIndex: lastClickedPoint, pointIndex: lastClickedPoint,
@@ -1209,10 +1213,12 @@ export class LinearElementEditor {
} }
const anchor = points[points.length - 2]; const anchor = points[points.length - 2];
const elements = app.scene.getNonDeletedElements();
const { point: newPoint, snapLines } = const { point: newPoint, snapLines } =
LinearElementEditor._getSnappedPointForLinearElement({ LinearElementEditor._getSnappedPointForLinearElement({
app, app,
event, event,
elements,
elementsMap, elementsMap,
element, element,
pointIndex: points.length - 1, pointIndex: points.length - 1,
@@ -1887,6 +1893,7 @@ export class LinearElementEditor {
private static _getSnappedPointForLinearElement({ private static _getSnappedPointForLinearElement({
app, app,
event, event,
elements,
elementsMap, elementsMap,
element, element,
pointIndex, pointIndex,
@@ -1899,7 +1906,8 @@ export class LinearElementEditor {
}: { }: {
app: AppClassProperties; app: AppClassProperties;
event: PointerEvent | React.PointerEvent<HTMLCanvasElement>; event: PointerEvent | React.PointerEvent<HTMLCanvasElement>;
elementsMap: ElementsMap; elements: readonly Ordered<NonDeletedExcalidrawElement>[];
elementsMap: NonDeletedSceneElementsMap;
element: NonDeleted<ExcalidrawLinearElement>; element: NonDeleted<ExcalidrawLinearElement>;
pointIndex: number; pointIndex: number;
scenePointerX: number; scenePointerX: number;
@@ -1919,12 +1927,17 @@ export class LinearElementEditor {
); );
if (referencePoint) { if (referencePoint) {
const referencePointCoords = LinearElementEditor.getPointGlobalCoordinates( const referencePointCoords =
element, LinearElementEditor.getPointGlobalCoordinates(
referencePoint, element,
elementsMap, referencePoint,
elementsMap,
);
const [gridX, gridY] = getGridPoint(
scenePointerX,
scenePointerY,
gridSize,
); );
const [gridX, gridY] = getGridPoint(scenePointerX, scenePointerY, gridSize);
let { width: dxFromReference, height: dyFromReference } = let { width: dxFromReference, height: dyFromReference } =
getLockedLinearCursorAlignSize( getLockedLinearCursorAlignSize(
@@ -1942,7 +1955,7 @@ export class LinearElementEditor {
if (!isElbowArrow(element)) { if (!isElbowArrow(element)) {
const { snapOffset, snapLines: nextSnapLines } = snapLinearElementPoint( const { snapOffset, snapLines: nextSnapLines } = snapLinearElementPoint(
app.scene.getNonDeletedElements(), elements,
element, element,
pointFrom<GlobalPoint>(effectiveGridX, effectiveGridY), pointFrom<GlobalPoint>(effectiveGridX, effectiveGridY),
app, app,
@@ -1972,8 +1985,10 @@ export class LinearElementEditor {
dyFromReference = result.dyFromReference; dyFromReference = result.dyFromReference;
snapLines = result.snapLines; snapLines = result.snapLines;
} else { } else {
dxFromReference = effectiveGridX + snapOffset.x - referencePointCoords[0]; dxFromReference =
dyFromReference = effectiveGridY + snapOffset.y - referencePointCoords[1]; effectiveGridX + snapOffset.x - referencePointCoords[0];
dyFromReference =
effectiveGridY + snapOffset.y - referencePointCoords[1];
} }
} }
} }
@@ -1985,7 +2000,10 @@ export class LinearElementEditor {
); );
return { return {
point: pointFrom(referencePoint[0] + rotatedX, referencePoint[1] + rotatedY), point: pointFrom(
referencePoint[0] + rotatedX,
referencePoint[1] + rotatedY,
),
snapLines, snapLines,
}; };
} }
@@ -1994,7 +2012,7 @@ export class LinearElementEditor {
const originalPointerY = scenePointerY - pointerOffset.y; const originalPointerY = scenePointerY - pointerOffset.y;
const { snapOffset, snapLines } = snapLinearElementPoint( const { snapOffset, snapLines } = snapLinearElementPoint(
app.scene.getNonDeletedElements(), elements,
element, element,
pointFrom(originalPointerX, originalPointerY), pointFrom(originalPointerX, originalPointerY),
app, app,