From 9ce6e438e6e91ae8daf512a7b87e782552a0288a Mon Sep 17 00:00:00 2001 From: dwelle <5153846+dwelle@users.noreply.github.com> Date: Wed, 2 Apr 2025 22:56:35 +0200 Subject: [PATCH] fix: deselected hit element being duplicated + incorrect re-seeding --- packages/excalidraw/components/App.tsx | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index d5fb55e1d..5968d5aa1 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -99,6 +99,7 @@ import { isShallowEqual, arrayToMap, type EXPORT_IMAGE_TYPES, + randomInteger, } from "@excalidraw/common"; import { @@ -8485,20 +8486,26 @@ class App extends React.Component { }); if ( hitElement && + // hit element may not end up being selected + // if we're alt-dragging a common bounding box + // over the hit element + pointerDownState.hit.wasAddedToSelection && !selectedElements.find((el) => el.id === hitElement.id) ) { selectedElements.push(hitElement); } + const idsOfElementsToDuplicate = new Map( + selectedElements.map((el) => [el.id, el]), + ); + const { newElements: clonedElements, elementsWithClones } = duplicateElements({ type: "in-place", elements, appState: this.state, randomizeSeed: true, - idsOfElementsToDuplicate: new Map( - selectedElements.map((el) => [el.id, el]), - ), + idsOfElementsToDuplicate, overrides: (el) => { const origEl = pointerDownState.originalElements.get(el.id); @@ -8506,6 +8513,7 @@ class App extends React.Component { return { x: origEl.x, y: origEl.y, + seed: origEl.seed, }; } @@ -8525,7 +8533,14 @@ class App extends React.Component { const nextSceneElements = syncMovedIndices( mappedNewSceneElements || elementsWithClones, arrayToMap(clonedElements), - ); + ).map((el) => { + if (idsOfElementsToDuplicate.has(el.id)) { + return newElementWith(el, { + seed: randomInteger(), + }); + } + return el; + }); this.scene.replaceAllElements(nextSceneElements); this.maybeCacheVisibleGaps(event, selectedElements, true);