mirror of
				https://github.com/excalidraw/excalidraw.git
				synced 2025-11-04 12:54:23 +01:00 
			
		
		
		
	fix: erasing locked elements (#9400)
* fix: erasing locked elements * signature tweaks
This commit is contained in:
		@@ -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);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user