|
@@ -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>>(),
|
|
|
|
- visibleElementsMap = new Map<string, ExcalidrawElement>(),
|
|
|
|
|
|
+ shapesCache: Map<string, GeometricShape<GlobalPoint>>,
|
|
|
|
+ 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);
|
|
}
|
|
}
|
|
|
|
|