fix: bound text scaling when resizing

This commit is contained in:
Alex Kim 2023-02-16 21:03:46 +03:00
parent 61d86b88eb
commit 42002279e0
No known key found for this signature in database
GPG key ID: CEE74CFA44D238D7

View file

@ -697,7 +697,7 @@ export const resizeMultipleElements = (
points?: Point[]; points?: Point[];
fontSize?: number; fontSize?: number;
baseline?: number; baseline?: number;
scale?: [-1 | 1, -1 | 1]; scale?: [number, number];
} = { } = {
width, width,
height, height,
@ -709,56 +709,23 @@ export const resizeMultipleElements = (
if (isImageElement(element) && targetElements.length === 1) { if (isImageElement(element) && targetElements.length === 1) {
update.scale = [ update.scale = [
(element.scale[0] * flipFactorX) as -1 | 1, element.scale[0] * flipFactorX,
(element.scale[1] * flipFactorY) as -1 | 1, element.scale[1] * flipFactorY,
]; ];
} }
let boundTextUpdates: { if (isTextElement(element)) {
angle: number; const textMeasurements = measureFontSizeFromWH(element, width, height);
fontSize: number; update.fontSize = textMeasurements?.size ?? element.fontSize;
baseline: number; update.baseline = textMeasurements?.baseline ?? element.baseline;
} | null = null;
const boundTextElement = getBoundTextElement(latestElement);
if (boundTextElement || isTextElement(element)) {
const optionalPadding = getBoundTextElementOffset(boundTextElement) * 2;
const textMeasurements = measureFontSizeFromWH(
boundTextElement ?? (element as ExcalidrawTextElement),
width - optionalPadding,
height - optionalPadding,
);
if (!textMeasurements) {
return; // FIXME
}
if (isTextElement(element)) {
update.fontSize = textMeasurements.size;
update.baseline = textMeasurements.baseline;
}
if (boundTextElement) {
if (isArrowElement(element)) {
const { angle, fontSize, baseline } = boundTextElement;
boundTextUpdates = { angle, fontSize, baseline };
} else {
boundTextUpdates = {
angle,
fontSize: textMeasurements.size,
baseline: textMeasurements.baseline,
};
}
}
} }
updateBoundElements(latestElement, { newSize: { width, height } }); updateBoundElements(latestElement, { newSize: { width, height } });
mutateElement(latestElement, update); mutateElement(latestElement, update);
if (boundTextElement && boundTextUpdates) { const boundTextElement = getBoundTextElement(latestElement);
mutateElement(boundTextElement, boundTextUpdates); if (boundTextElement) {
mutateElement(boundTextElement, { angle });
handleBindTextResize(latestElement, transformHandleType); handleBindTextResize(latestElement, transformHandleType);
} }
}); });