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.
56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
4 months ago
|
import { register } from "./register";
|
||
|
import { cropIcon } from "../components/icons";
|
||
|
import { StoreAction } 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,
|
||
|
},
|
||
|
storeAction: StoreAction.CAPTURE,
|
||
|
};
|
||
|
},
|
||
|
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)}
|
||
|
/>
|
||
|
);
|
||
|
},
|
||
|
});
|