import { DistributeHorizontallyIcon, DistributeVerticallyIcon, } from "../components/icons"; import { ToolButton } from "../components/ToolButton"; import { distributeElements, Distribution } from "../distribute"; import { getNonDeletedElements } from "../element"; import { isFrameLikeElement } from "../element/typeChecks"; import { ExcalidrawElement } from "../element/types"; import { updateFrameMembershipOfSelectedElements } from "../frame"; import { t } from "../i18n"; import { CODES, KEYS } from "../keys"; import { isSomeElementSelected } from "../scene"; import { AppClassProperties, AppState } from "../types"; import { arrayToMap, getShortcutKey } from "../utils"; import { register } from "./register"; const enableActionGroup = (appState: AppState, app: AppClassProperties) => { const selectedElements = app.scene.getSelectedElements(appState); return ( selectedElements.length > 1 && // TODO enable distributing frames when implemented properly !selectedElements.some((el) => isFrameLikeElement(el)) ); }; const distributeSelectedElements = ( elements: readonly ExcalidrawElement[], appState: Readonly, app: AppClassProperties, distribution: Distribution, ) => { const selectedElements = app.scene.getSelectedElements(appState); const updatedElements = distributeElements( selectedElements, app.scene.getNonDeletedElementsMap(), distribution, ); const updatedElementsMap = arrayToMap(updatedElements); return updateFrameMembershipOfSelectedElements( elements.map((element) => updatedElementsMap.get(element.id) || element), appState, app, ); }; export const distributeHorizontally = register({ name: "distributeHorizontally", trackEvent: { category: "element" }, perform: (elements, appState, _, app) => { return { appState, elements: distributeSelectedElements(elements, appState, app, { space: "between", axis: "x", }), commitToHistory: true, }; }, keyTest: (event) => !event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.H, PanelComponent: ({ elements, appState, updateData, app }) => (