From 198106e297ff463a21325f4859a0508b3650c0d4 Mon Sep 17 00:00:00 2001 From: Steve Ruiz Date: Mon, 23 Nov 2020 18:16:23 +0000 Subject: [PATCH] Add distribute actions. (#2395) --- src/actions/actionDistribute.tsx | 95 ++++++++++++++++++++++++++++++++ src/actions/index.ts | 5 ++ src/actions/types.ts | 4 +- src/components/Actions.tsx | 13 +++-- src/components/icons.tsx | 52 +++++++++++++++++ src/css/styles.scss | 25 ++++++++- src/disitrubte.ts | 87 +++++++++++++++++++++++++++++ src/keys.ts | 1 + src/locales/en.json | 4 +- 9 files changed, 278 insertions(+), 8 deletions(-) create mode 100644 src/actions/actionDistribute.tsx create mode 100644 src/disitrubte.ts diff --git a/src/actions/actionDistribute.tsx b/src/actions/actionDistribute.tsx new file mode 100644 index 00000000..66bcd448 --- /dev/null +++ b/src/actions/actionDistribute.tsx @@ -0,0 +1,95 @@ +import React from "react"; +import { KEYS } from "../keys"; +import { t } from "../i18n"; +import { register } from "./register"; +import { + DistributeHorizontallyIcon, + DistributeVerticallyIcon, +} from "../components/icons"; +import { getSelectedElements, isSomeElementSelected } from "../scene"; +import { getElementMap, getNonDeletedElements } from "../element"; +import { ToolButton } from "../components/ToolButton"; +import { ExcalidrawElement } from "../element/types"; +import { AppState } from "../types"; +import { distributeElements, Distribution } from "../disitrubte"; +import { getShortcutKey } from "../utils"; + +const enableActionGroup = ( + elements: readonly ExcalidrawElement[], + appState: AppState, +) => getSelectedElements(getNonDeletedElements(elements), appState).length > 1; + +const distributeSelectedElements = ( + elements: readonly ExcalidrawElement[], + appState: Readonly, + distribution: Distribution, +) => { + const selectedElements = getSelectedElements( + getNonDeletedElements(elements), + appState, + ); + + const updatedElements = distributeElements(selectedElements, distribution); + + const updatedElementsMap = getElementMap(updatedElements); + + return elements.map((element) => updatedElementsMap[element.id] || element); +}; + +export const distributeHorizontally = register({ + name: "distributeHorizontally", + perform: (elements, appState) => { + return { + appState, + elements: distributeSelectedElements(elements, appState, { + space: "between", + axis: "x", + }), + commitToHistory: true, + }; + }, + keyTest: (event) => { + return event.altKey && event.keyCode === KEYS.H_KEY_CODE; + }, + PanelComponent: ({ elements, appState, updateData }) => ( +