From 35bb449a4bb66911a2e0d4b3a3a56d54b300f7ec Mon Sep 17 00:00:00 2001 From: Ryan Di Date: Mon, 12 May 2025 23:55:36 +1000 Subject: [PATCH] fix: update cached segments when visible area changes (#9512) --- packages/excalidraw/lasso/index.ts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/excalidraw/lasso/index.ts b/packages/excalidraw/lasso/index.ts index 41e6b2080..163a8b7a9 100644 --- a/packages/excalidraw/lasso/index.ts +++ b/packages/excalidraw/lasso/index.ts @@ -17,7 +17,7 @@ import { selectGroupsForSelectedElements } from "@excalidraw/element"; import { getContainerElement } from "@excalidraw/element"; -import { arrayToMap, easeOut } from "@excalidraw/common"; +import { arrayToMap, easeOut, isShallowEqual } from "@excalidraw/common"; import type { ExcalidrawElement, @@ -33,11 +33,18 @@ import { getLassoSelectedElementIds } from "./utils"; import type App from "../components/App"; +type CanvasTranslate = { + scrollX: number; + scrollY: number; + zoom: number; +}; + export class LassoTrail extends AnimatedTrail { private intersectedElements: Set = new Set(); private enclosedElements: Set = new Set(); private elementsSegments: Map[]> | null = null; + private canvasTranslate: CanvasTranslate | null = null; private keepPreviousSelection: boolean = false; constructor(animationFrameHandler: AnimationFrameHandler, app: App) { @@ -169,7 +176,17 @@ export class LassoTrail extends AnimatedTrail { .getCurrentTrail() ?.originalPoints?.map((p) => pointFrom(p[0], p[1])); - if (!this.elementsSegments) { + const currentCanvasTranslate: CanvasTranslate = { + scrollX: this.app.state.scrollX, + scrollY: this.app.state.scrollY, + zoom: this.app.state.zoom.value, + }; + + if ( + !this.elementsSegments || + !isShallowEqual(currentCanvasTranslate, this.canvasTranslate ?? {}) + ) { + this.canvasTranslate = currentCanvasTranslate; this.elementsSegments = new Map(); const visibleElementsMap = arrayToMap(this.app.visibleElements); for (const element of this.app.visibleElements) {