51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
|
import { Action } from "./types";
|
||
|
import { isTextElement, redrawTextBoundingBox } from "../element";
|
||
|
import { META_KEY } from "../keys";
|
||
|
|
||
|
let copiedStyles: string = "{}";
|
||
|
|
||
|
export const actionCopyStyles: Action = {
|
||
|
name: "copyStyles",
|
||
|
perform: elements => {
|
||
|
const element = elements.find(el => el.isSelected);
|
||
|
if (element) {
|
||
|
copiedStyles = JSON.stringify(element);
|
||
|
}
|
||
|
return {};
|
||
|
},
|
||
|
contextItemLabel: "Copy Styles",
|
||
|
keyTest: event => event[META_KEY] && event.shiftKey && event.code === "KeyC",
|
||
|
contextMenuOrder: 0
|
||
|
};
|
||
|
|
||
|
export const actionPasteStyles: Action = {
|
||
|
name: "pasteStyles",
|
||
|
perform: elements => {
|
||
|
const pastedElement = JSON.parse(copiedStyles);
|
||
|
return {
|
||
|
elements: elements.map(element => {
|
||
|
if (element.isSelected) {
|
||
|
const newElement = {
|
||
|
...element,
|
||
|
backgroundColor: pastedElement?.backgroundColor,
|
||
|
strokeWidth: pastedElement?.strokeWidth,
|
||
|
strokeColor: pastedElement?.strokeColor,
|
||
|
fillStyle: pastedElement?.fillStyle,
|
||
|
opacity: pastedElement?.opacity,
|
||
|
roughness: pastedElement?.roughness
|
||
|
};
|
||
|
if (isTextElement(newElement)) {
|
||
|
newElement.font = pastedElement?.font;
|
||
|
redrawTextBoundingBox(newElement);
|
||
|
}
|
||
|
return newElement;
|
||
|
}
|
||
|
return element;
|
||
|
})
|
||
|
};
|
||
|
},
|
||
|
contextItemLabel: "Paste Styles",
|
||
|
keyTest: event => event[META_KEY] && event.shiftKey && event.code === "KeyV",
|
||
|
contextMenuOrder: 1
|
||
|
};
|