fix: erasing locked elements (#9400)

* fix: erasing locked elements

* signature tweaks
This commit is contained in:
David Luzar 2025-04-16 10:28:56 +02:00 committed by GitHub
parent 58f7d33d80
commit 0cf36d6b30
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -23,7 +23,7 @@ import type {
GlobalPoint, GlobalPoint,
LineSegment, LineSegment,
} from "@excalidraw/math/types"; } from "@excalidraw/math/types";
import type { ExcalidrawElement } from "@excalidraw/element/types"; import type { ElementsMap, ExcalidrawElement } from "@excalidraw/element/types";
import { AnimatedTrail } from "../animated-trail"; import { AnimatedTrail } from "../animated-trail";
@ -91,7 +91,11 @@ export class EraserTrail extends AnimatedTrail {
// take only POINTS_ON_TRAIL points to form some number of segments // take only POINTS_ON_TRAIL points to form some number of segments
eraserPath = eraserPath?.slice(eraserPath.length - POINTS_ON_TRAIL); eraserPath = eraserPath?.slice(eraserPath.length - POINTS_ON_TRAIL);
const visibleElementsMap = arrayToMap(this.app.visibleElements); const candidateElements = this.app.visibleElements.filter(
(el) => !el.locked,
);
const candidateElementsMap = arrayToMap(candidateElements);
const pathSegments = eraserPath.reduce((acc, point, index) => { const pathSegments = eraserPath.reduce((acc, point, index) => {
if (index === 0) { if (index === 0) {
@ -105,7 +109,7 @@ export class EraserTrail extends AnimatedTrail {
return []; return [];
} }
for (const element of this.app.visibleElements) { for (const element of candidateElements) {
// restore only if already added to the to-be-erased set // restore only if already added to the to-be-erased set
if (restoreToErase && this.elementsToErase.has(element.id)) { if (restoreToErase && this.elementsToErase.has(element.id)) {
const intersects = eraserTest( const intersects = eraserTest(
@ -113,7 +117,7 @@ export class EraserTrail extends AnimatedTrail {
element, element,
this.segmentsCache, this.segmentsCache,
this.geometricShapesCache, this.geometricShapesCache,
visibleElementsMap, candidateElementsMap,
this.app, this.app,
); );
@ -151,7 +155,7 @@ export class EraserTrail extends AnimatedTrail {
element, element,
this.segmentsCache, this.segmentsCache,
this.geometricShapesCache, this.geometricShapesCache,
visibleElementsMap, candidateElementsMap,
this.app, this.app,
); );
@ -203,14 +207,14 @@ const eraserTest = (
pathSegments: LineSegment<GlobalPoint>[], pathSegments: LineSegment<GlobalPoint>[],
element: ExcalidrawElement, element: ExcalidrawElement,
elementsSegments: ElementsSegmentsMap, elementsSegments: ElementsSegmentsMap,
shapesCache = new Map<string, GeometricShape<GlobalPoint>>(), shapesCache: Map<string, GeometricShape<GlobalPoint>>,
visibleElementsMap = new Map<string, ExcalidrawElement>(), elementsMap: ElementsMap,
app: App, app: App,
): boolean => { ): boolean => {
let shape = shapesCache.get(element.id); let shape = shapesCache.get(element.id);
if (!shape) { if (!shape) {
shape = getElementShape<GlobalPoint>(element, visibleElementsMap); shape = getElementShape<GlobalPoint>(element, elementsMap);
shapesCache.set(element.id, shape); shapesCache.set(element.id, shape);
} }
@ -222,7 +226,7 @@ const eraserTest = (
let elementSegments = elementsSegments.get(element.id); let elementSegments = elementsSegments.get(element.id);
if (!elementSegments) { if (!elementSegments) {
elementSegments = getElementLineSegments(element, visibleElementsMap); elementSegments = getElementLineSegments(element, elementsMap);
elementsSegments.set(element.id, elementSegments); elementsSegments.set(element.id, elementSegments);
} }