|
|
|
@ -92,71 +92,69 @@ export const bindTextToShapeAfterDuplication = (
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const handleBindTextResize = (
|
|
|
|
|
elements: readonly NonDeletedExcalidrawElement[],
|
|
|
|
|
element: NonDeletedExcalidrawElement,
|
|
|
|
|
transformHandleType: MaybeTransformHandleType,
|
|
|
|
|
) => {
|
|
|
|
|
elements.forEach((element) => {
|
|
|
|
|
const boundTextElementId = getBoundTextElementId(element);
|
|
|
|
|
if (boundTextElementId) {
|
|
|
|
|
const textElement = Scene.getScene(element)!.getElement(
|
|
|
|
|
boundTextElementId,
|
|
|
|
|
) as ExcalidrawTextElement;
|
|
|
|
|
if (textElement && textElement.text) {
|
|
|
|
|
if (!element) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
let text = textElement.text;
|
|
|
|
|
let nextHeight = textElement.height;
|
|
|
|
|
let containerHeight = element.height;
|
|
|
|
|
let nextBaseLine = textElement.baseline;
|
|
|
|
|
if (transformHandleType !== "n" && transformHandleType !== "s") {
|
|
|
|
|
if (text) {
|
|
|
|
|
text = wrapText(
|
|
|
|
|
textElement.originalText,
|
|
|
|
|
getFontString(textElement),
|
|
|
|
|
element.width,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const dimensions = measureText(
|
|
|
|
|
text,
|
|
|
|
|
const boundTextElementId = getBoundTextElementId(element);
|
|
|
|
|
if (boundTextElementId) {
|
|
|
|
|
const textElement = Scene.getScene(element)!.getElement(
|
|
|
|
|
boundTextElementId,
|
|
|
|
|
) as ExcalidrawTextElement;
|
|
|
|
|
if (textElement && textElement.text) {
|
|
|
|
|
if (!element) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
let text = textElement.text;
|
|
|
|
|
let nextHeight = textElement.height;
|
|
|
|
|
let containerHeight = element.height;
|
|
|
|
|
let nextBaseLine = textElement.baseline;
|
|
|
|
|
if (transformHandleType !== "n" && transformHandleType !== "s") {
|
|
|
|
|
if (text) {
|
|
|
|
|
text = wrapText(
|
|
|
|
|
textElement.originalText,
|
|
|
|
|
getFontString(textElement),
|
|
|
|
|
element.width,
|
|
|
|
|
);
|
|
|
|
|
nextHeight = dimensions.height;
|
|
|
|
|
nextBaseLine = dimensions.baseline;
|
|
|
|
|
}
|
|
|
|
|
// increase height in case text element height exceeds
|
|
|
|
|
if (nextHeight > element.height - BOUND_TEXT_PADDING * 2) {
|
|
|
|
|
containerHeight = nextHeight + BOUND_TEXT_PADDING * 2;
|
|
|
|
|
const diff = containerHeight - element.height;
|
|
|
|
|
// fix the y coord when resizing from ne/nw/n
|
|
|
|
|
const updatedY =
|
|
|
|
|
transformHandleType === "ne" ||
|
|
|
|
|
transformHandleType === "nw" ||
|
|
|
|
|
transformHandleType === "n"
|
|
|
|
|
? element.y - diff
|
|
|
|
|
: element.y;
|
|
|
|
|
mutateElement(element, {
|
|
|
|
|
height: containerHeight,
|
|
|
|
|
y: updatedY,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const updatedY = element.y + containerHeight / 2 - nextHeight / 2;
|
|
|
|
|
|
|
|
|
|
mutateElement(textElement, {
|
|
|
|
|
const dimensions = measureText(
|
|
|
|
|
text,
|
|
|
|
|
// preserve padding and set width correctly
|
|
|
|
|
width: element.width - BOUND_TEXT_PADDING * 2,
|
|
|
|
|
height: nextHeight,
|
|
|
|
|
x: element.x + BOUND_TEXT_PADDING,
|
|
|
|
|
getFontString(textElement),
|
|
|
|
|
element.width,
|
|
|
|
|
);
|
|
|
|
|
nextHeight = dimensions.height;
|
|
|
|
|
nextBaseLine = dimensions.baseline;
|
|
|
|
|
}
|
|
|
|
|
// increase height in case text element height exceeds
|
|
|
|
|
if (nextHeight > element.height - BOUND_TEXT_PADDING * 2) {
|
|
|
|
|
containerHeight = nextHeight + BOUND_TEXT_PADDING * 2;
|
|
|
|
|
const diff = containerHeight - element.height;
|
|
|
|
|
// fix the y coord when resizing from ne/nw/n
|
|
|
|
|
const updatedY =
|
|
|
|
|
transformHandleType === "ne" ||
|
|
|
|
|
transformHandleType === "nw" ||
|
|
|
|
|
transformHandleType === "n"
|
|
|
|
|
? element.y - diff
|
|
|
|
|
: element.y;
|
|
|
|
|
mutateElement(element, {
|
|
|
|
|
height: containerHeight,
|
|
|
|
|
y: updatedY,
|
|
|
|
|
baseline: nextBaseLine,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const updatedY = element.y + containerHeight / 2 - nextHeight / 2;
|
|
|
|
|
|
|
|
|
|
mutateElement(textElement, {
|
|
|
|
|
text,
|
|
|
|
|
// preserve padding and set width correctly
|
|
|
|
|
width: element.width - BOUND_TEXT_PADDING * 2,
|
|
|
|
|
height: nextHeight,
|
|
|
|
|
x: element.x + BOUND_TEXT_PADDING,
|
|
|
|
|
y: updatedY,
|
|
|
|
|
baseline: nextBaseLine,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js
|
|
|
|
|