mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-05-03 10:00:07 -04:00
fix: erasing locked elements (#9400)
* fix: erasing locked elements * signature tweaks
This commit is contained in:
parent
58f7d33d80
commit
0cf36d6b30
1 changed files with 13 additions and 9 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue