You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
9 months ago
|
import { isTextElement } from "../element";
|
||
|
import { newElementWith } from "../element/mutateElement";
|
||
|
import { measureText } from "../element/textElement";
|
||
|
import { getSelectedElements } from "../scene";
|
||
|
import { StoreAction } from "../store";
|
||
|
import type { AppClassProperties } from "../types";
|
||
|
import { getFontString } from "../utils";
|
||
|
import { register } from "./register";
|
||
|
|
||
|
export const actionTextAutoResize = register({
|
||
|
name: "autoResize",
|
||
|
label: "labels.autoResize",
|
||
|
icon: null,
|
||
|
trackEvent: { category: "element" },
|
||
|
predicate: (elements, appState, _: unknown, app: AppClassProperties) => {
|
||
|
const selectedElements = getSelectedElements(elements, appState);
|
||
|
return (
|
||
|
selectedElements.length === 1 &&
|
||
|
isTextElement(selectedElements[0]) &&
|
||
|
!selectedElements[0].autoResize
|
||
|
);
|
||
|
},
|
||
|
perform: (elements, appState, _, app) => {
|
||
|
const selectedElements = getSelectedElements(elements, appState);
|
||
|
|
||
|
return {
|
||
|
appState,
|
||
|
elements: elements.map((element) => {
|
||
|
if (element.id === selectedElements[0].id && isTextElement(element)) {
|
||
|
const metrics = measureText(
|
||
|
element.originalText,
|
||
|
getFontString(element),
|
||
|
element.lineHeight,
|
||
|
);
|
||
|
|
||
|
return newElementWith(element, {
|
||
|
autoResize: true,
|
||
|
width: metrics.width,
|
||
|
height: metrics.height,
|
||
|
text: element.originalText,
|
||
|
});
|
||
|
}
|
||
|
return element;
|
||
|
}),
|
||
|
storeAction: StoreAction.CAPTURE,
|
||
|
};
|
||
|
},
|
||
|
});
|