import { alignElements, Alignment } from "../align"; import { AlignBottomIcon, AlignLeftIcon, AlignRightIcon, AlignTopIcon, CenterHorizontallyIcon, CenterVerticallyIcon, } from "../components/icons"; import { ToolButton } from "../components/ToolButton"; import { getNonDeletedElements } from "../element"; import { isFrameLikeElement } from "../element/typeChecks"; import { ExcalidrawElement } from "../element/types"; import { updateFrameMembershipOfSelectedElements } from "../frame"; import { t } from "../i18n"; import { KEYS } from "../keys"; import { isSomeElementSelected } from "../scene"; import { AppClassProperties, AppState, UIAppState } from "../types"; import { arrayToMap, getShortcutKey } from "../utils"; import { register } from "./register"; const alignActionsPredicate = ( elements: readonly ExcalidrawElement[], appState: UIAppState, _: unknown, app: AppClassProperties, ) => { const selectedElements = app.scene.getSelectedElements(appState); return ( selectedElements.length > 1 && // TODO enable aligning frames when implemented properly !selectedElements.some((el) => isFrameLikeElement(el)) ); }; const alignSelectedElements = ( elements: readonly ExcalidrawElement[], appState: Readonly, app: AppClassProperties, alignment: Alignment, ) => { const selectedElements = app.scene.getSelectedElements(appState); const elementsMap = arrayToMap(elements); const updatedElements = alignElements( selectedElements, elementsMap, alignment, ); const updatedElementsMap = arrayToMap(updatedElements); return updateFrameMembershipOfSelectedElements( elements.map((element) => updatedElementsMap.get(element.id) || element), appState, app, ); }; export const actionAlignTop = register({ name: "alignTop", label: "labels.alignTop", icon: AlignTopIcon, trackEvent: { category: "element" }, predicate: alignActionsPredicate, perform: (elements, appState, _, app) => { return { appState, elements: alignSelectedElements(elements, appState, app, { position: "start", axis: "y", }), commitToHistory: true, }; }, keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.shiftKey && event.key === KEYS.ARROW_UP, PanelComponent: ({ elements, appState, updateData, app }) => (