Browse Source

fix: erasing locked elements (#9400)

* fix: erasing locked elements

* signature tweaks
David Luzar 3 months ago
parent
commit
0cf36d6b30
1 changed files with 13 additions and 9 deletions
  1. 13 9
      packages/excalidraw/eraser/index.ts

+ 13 - 9
packages/excalidraw/eraser/index.ts

@@ -23,7 +23,7 @@ import type {
   GlobalPoint,
   LineSegment,
 } from "@excalidraw/math/types";
-import type { ExcalidrawElement } from "@excalidraw/element/types";
+import type { ElementsMap, ExcalidrawElement } from "@excalidraw/element/types";
 
 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
     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) => {
       if (index === 0) {
@@ -105,7 +109,7 @@ export class EraserTrail extends AnimatedTrail {
       return [];
     }
 
-    for (const element of this.app.visibleElements) {
+    for (const element of candidateElements) {
       // restore only if already added to the to-be-erased set
       if (restoreToErase && this.elementsToErase.has(element.id)) {
         const intersects = eraserTest(
@@ -113,7 +117,7 @@ export class EraserTrail extends AnimatedTrail {
           element,
           this.segmentsCache,
           this.geometricShapesCache,
-          visibleElementsMap,
+          candidateElementsMap,
           this.app,
         );
 
@@ -151,7 +155,7 @@ export class EraserTrail extends AnimatedTrail {
           element,
           this.segmentsCache,
           this.geometricShapesCache,
-          visibleElementsMap,
+          candidateElementsMap,
           this.app,
         );
 
@@ -203,14 +207,14 @@ const eraserTest = (
   pathSegments: LineSegment<GlobalPoint>[],
   element: ExcalidrawElement,
   elementsSegments: ElementsSegmentsMap,
-  shapesCache = new Map<string, GeometricShape<GlobalPoint>>(),
-  visibleElementsMap = new Map<string, ExcalidrawElement>(),
+  shapesCache: Map<string, GeometricShape<GlobalPoint>>,
+  elementsMap: ElementsMap,
   app: App,
 ): boolean => {
   let shape = shapesCache.get(element.id);
 
   if (!shape) {
-    shape = getElementShape<GlobalPoint>(element, visibleElementsMap);
+    shape = getElementShape<GlobalPoint>(element, elementsMap);
     shapesCache.set(element.id, shape);
   }
 
@@ -222,7 +226,7 @@ const eraserTest = (
   let elementSegments = elementsSegments.get(element.id);
 
   if (!elementSegments) {
-    elementSegments = getElementLineSegments(element, visibleElementsMap);
+    elementSegments = getElementLineSegments(element, elementsMap);
     elementsSegments.set(element.id, elementSegments);
   }