|
@@ -38,6 +38,7 @@ import {
|
|
|
loadFromBlob,
|
|
|
SOCKET_SERVER,
|
|
|
SocketUpdateDataSource,
|
|
|
+ exportCanvas,
|
|
|
} from "../data";
|
|
|
import { restore } from "../data/restore";
|
|
|
|
|
@@ -72,7 +73,11 @@ import { ActionResult } from "../actions/types";
|
|
|
import { getDefaultAppState } from "../appState";
|
|
|
import { t, getLanguage } from "../i18n";
|
|
|
|
|
|
-import { copyToAppClipboard, getClipboardContent } from "../clipboard";
|
|
|
+import {
|
|
|
+ copyToAppClipboard,
|
|
|
+ getClipboardContent,
|
|
|
+ probablySupportsClipboardBlob,
|
|
|
+} from "../clipboard";
|
|
|
import { normalizeScroll } from "../scene";
|
|
|
import { getCenter, getDistance } from "../gesture";
|
|
|
import { createUndoAction, createRedoAction } from "../actions/actionHistory";
|
|
@@ -582,6 +587,12 @@ export class App extends React.Component<any, AppState> {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ if (event.code === "KeyC" && event.altKey && event.shiftKey) {
|
|
|
+ this.copyToClipboardAsPng();
|
|
|
+ event.preventDefault();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (this.actionManager.handleKeyDown(event)) {
|
|
|
return;
|
|
|
}
|
|
@@ -643,6 +654,17 @@ export class App extends React.Component<any, AppState> {
|
|
|
copyToAppClipboard(elements, this.state);
|
|
|
};
|
|
|
|
|
|
+ private copyToClipboardAsPng = () => {
|
|
|
+ const selectedElements = getSelectedElements(elements, this.state);
|
|
|
+ exportCanvas(
|
|
|
+ "clipboard",
|
|
|
+ selectedElements.length ? selectedElements : elements,
|
|
|
+ this.state,
|
|
|
+ this.canvas!,
|
|
|
+ this.state,
|
|
|
+ );
|
|
|
+ };
|
|
|
+
|
|
|
private pasteFromClipboard = async (event: ClipboardEvent | null) => {
|
|
|
// #686
|
|
|
const target = document.activeElement;
|
|
@@ -817,6 +839,11 @@ export class App extends React.Component<any, AppState> {
|
|
|
label: t("labels.paste"),
|
|
|
action: () => this.pasteFromClipboard(null),
|
|
|
},
|
|
|
+ probablySupportsClipboardBlob &&
|
|
|
+ elements.length > 0 && {
|
|
|
+ label: t("labels.copyAsPng"),
|
|
|
+ action: this.copyToClipboardAsPng,
|
|
|
+ },
|
|
|
...this.actionManager.getContextMenuItems(action =>
|
|
|
this.canvasOnlyActions.includes(action.name),
|
|
|
),
|
|
@@ -841,6 +868,10 @@ export class App extends React.Component<any, AppState> {
|
|
|
label: t("labels.paste"),
|
|
|
action: () => this.pasteFromClipboard(null),
|
|
|
},
|
|
|
+ probablySupportsClipboardBlob && {
|
|
|
+ label: t("labels.copyAsPng"),
|
|
|
+ action: this.copyToClipboardAsPng,
|
|
|
+ },
|
|
|
...this.actionManager.getContextMenuItems(
|
|
|
action => !this.canvasOnlyActions.includes(action.name),
|
|
|
),
|