From b8da5065fdc77a34d25ea149169f7bb90e46a892 Mon Sep 17 00:00:00 2001 From: Alplune Date: Sun, 26 Jan 2025 00:00:26 +0800 Subject: [PATCH] fix: update elbow arrow on font size change #8798 (#9002) --- .../excalidraw/actions/actionProperties.tsx | 64 ++++++++++++------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/packages/excalidraw/actions/actionProperties.tsx b/packages/excalidraw/actions/actionProperties.tsx index 17b53e3f5..5c4d7754f 100644 --- a/packages/excalidraw/actions/actionProperties.tsx +++ b/packages/excalidraw/actions/actionProperties.tsx @@ -89,6 +89,7 @@ import type { FontFamilyValues, TextAlign, VerticalAlign, + NonDeletedSceneElementsMap, } from "../element/types"; import { getLanguage, t } from "../i18n"; import { KEYS } from "../keys"; @@ -115,6 +116,7 @@ import { bindPointToSnapToElementOutline, calculateFixedPointForElbowArrowBinding, getHoveredElementForBinding, + updateBoundElements, } from "../element/binding"; import { LinearElementEditor } from "../element/linearElementEditor"; import type { LocalPoint } from "../../math"; @@ -218,33 +220,47 @@ const changeFontSize = ( ) => { const newFontSizes = new Set(); - return { - elements: changeProperty( - elements, - appState, - (oldElement) => { - if (isTextElement(oldElement)) { - const newFontSize = getNewFontSize(oldElement); - newFontSizes.add(newFontSize); - - let newElement: ExcalidrawTextElement = newElementWith(oldElement, { - fontSize: newFontSize, - }); - redrawTextBoundingBox( - newElement, - app.scene.getContainerElement(oldElement), - app.scene.getNonDeletedElementsMap(), - ); + const updatedElements = changeProperty( + elements, + appState, + (oldElement) => { + if (isTextElement(oldElement)) { + const newFontSize = getNewFontSize(oldElement); + newFontSizes.add(newFontSize); + + let newElement: ExcalidrawTextElement = newElementWith(oldElement, { + fontSize: newFontSize, + }); + redrawTextBoundingBox( + newElement, + app.scene.getContainerElement(oldElement), + app.scene.getNonDeletedElementsMap(), + ); - newElement = offsetElementAfterFontResize(oldElement, newElement); + newElement = offsetElementAfterFontResize(oldElement, newElement); - return newElement; - } + return newElement; + } + return oldElement; + }, + true, + ); - return oldElement; - }, - true, - ), + // Update arrow elements after text elements have been updated + const updatedElementsMap = arrayToMap(updatedElements); + getSelectedElements(elements, appState, { + includeBoundTextElement: true, + }).forEach((element) => { + if (isTextElement(element)) { + updateBoundElements( + element, + updatedElementsMap as NonDeletedSceneElementsMap, + ); + } + }); + + return { + elements: updatedElements, appState: { ...appState, // update state only if we've set all select text elements to