From 42acd426a3feb42ce4a9904da2ee06ef6c9c3ef5 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Thu, 21 Aug 2025 14:46:02 +0200 Subject: [PATCH] fix: Direct binding manipulation --- .../excalidraw/actions/actionBoundText.tsx | 32 +++++++------------ .../actions/actionDeleteSelected.tsx | 21 ++++++------ 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/packages/excalidraw/actions/actionBoundText.tsx b/packages/excalidraw/actions/actionBoundText.tsx index 606770dde..10500c5b6 100644 --- a/packages/excalidraw/actions/actionBoundText.tsx +++ b/packages/excalidraw/actions/actionBoundText.tsx @@ -7,6 +7,7 @@ import { getFontString, } from "@excalidraw/common"; import { + bindOrUnbindLinearElement, getOriginalContainerHeightFromCache, resetOriginalContainerCache, updateOriginalContainerCache, @@ -36,6 +37,7 @@ import { newElement } from "@excalidraw/element"; import { CaptureUpdateAction } from "@excalidraw/element"; import type { + ExcalidrawBindableElement, ExcalidrawElement, ExcalidrawLinearElement, ExcalidrawTextContainer, @@ -270,7 +272,7 @@ export const actionWrapTextInContainer = register({ ), groupIds: textElement.groupIds, frameId: textElement.frameId, - }); + }) as ExcalidrawBindableElement; // update bindings if (textElement.boundElements?.length) { @@ -281,26 +283,14 @@ export const actionWrapTextInContainer = register({ linearElementIds.includes(ele.id), ) as ExcalidrawLinearElement[]; linearElements.forEach((ele) => { - let startBinding = ele.startBinding; - let endBinding = ele.endBinding; - - if (startBinding?.elementId === textElement.id) { - startBinding = { - ...startBinding, - elementId: container.id, - }; - } - - if (endBinding?.elementId === textElement.id) { - endBinding = { ...endBinding, elementId: container.id }; - } - - if (startBinding || endBinding) { - app.scene.mutateElement(ele, { - startBinding, - endBinding, - }); - } + bindOrUnbindLinearElement( + ele, + ele.startBinding?.elementId === textElement.id + ? container + : "keep", + ele.endBinding?.elementId === textElement.id ? container : "keep", + app.scene, + ); }); } diff --git a/packages/excalidraw/actions/actionDeleteSelected.tsx b/packages/excalidraw/actions/actionDeleteSelected.tsx index 78a346568..7b526284a 100644 --- a/packages/excalidraw/actions/actionDeleteSelected.tsx +++ b/packages/excalidraw/actions/actionDeleteSelected.tsx @@ -1,6 +1,9 @@ import { KEYS, updateActiveTool } from "@excalidraw/common"; -import { getNonDeletedElements } from "@excalidraw/element"; +import { + bindOrUnbindLinearElement, + getNonDeletedElements, +} from "@excalidraw/element"; import { fixBindingsAfterDeletion } from "@excalidraw/element"; import { LinearElementEditor } from "@excalidraw/element"; import { newElementWith } from "@excalidraw/element"; @@ -92,14 +95,14 @@ const deleteSelectedElements = ( el.boundElements.forEach((candidate) => { const bound = app.scene.getNonDeletedElementsMap().get(candidate.id); if (bound && isElbowArrow(bound)) { - app.scene.mutateElement(bound, { - startBinding: - el.id === bound.startBinding?.elementId - ? null - : bound.startBinding, - endBinding: - el.id === bound.endBinding?.elementId ? null : bound.endBinding, - }); + if (el.id === bound.startBinding?.elementId) { + bindOrUnbindLinearElement( + bound, + el.id === bound.startBinding?.elementId ? null : "keep", + el.id === bound.endBinding?.elementId ? null : "keep", + app.scene, + ); + } } }); }