diff options
Diffstat (limited to 'packages/excalidraw/actions/actionCropEditor.tsx')
| -rw-r--r-- | packages/excalidraw/actions/actionCropEditor.tsx | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/packages/excalidraw/actions/actionCropEditor.tsx b/packages/excalidraw/actions/actionCropEditor.tsx new file mode 100644 index 0000000..643f666 --- /dev/null +++ b/packages/excalidraw/actions/actionCropEditor.tsx @@ -0,0 +1,55 @@ +import { register } from "./register"; +import { cropIcon } from "../components/icons"; +import { CaptureUpdateAction } from "../store"; +import { ToolButton } from "../components/ToolButton"; +import { t } from "../i18n"; +import { isImageElement } from "../element/typeChecks"; +import type { ExcalidrawImageElement } from "../element/types"; + +export const actionToggleCropEditor = register({ + name: "cropEditor", + label: "helpDialog.cropStart", + icon: cropIcon, + viewMode: true, + trackEvent: { category: "menu" }, + keywords: ["image", "crop"], + perform(elements, appState, _, app) { + const selectedElement = app.scene.getSelectedElements({ + selectedElementIds: appState.selectedElementIds, + includeBoundTextElement: true, + })[0] as ExcalidrawImageElement; + + return { + appState: { + ...appState, + isCropping: false, + croppingElementId: selectedElement.id, + }, + captureUpdate: CaptureUpdateAction.IMMEDIATELY, + }; + }, + predicate: (elements, appState, _, app) => { + const selectedElements = app.scene.getSelectedElements(appState); + if ( + !appState.croppingElementId && + selectedElements.length === 1 && + isImageElement(selectedElements[0]) + ) { + return true; + } + return false; + }, + PanelComponent: ({ appState, updateData, app }) => { + const label = t("helpDialog.cropStart"); + + return ( + <ToolButton + type="button" + icon={cropIcon} + title={label} + aria-label={label} + onClick={() => updateData(null)} + /> + ); + }, +}); |
