actionStyles.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import {
  2. isTextElement,
  3. isExcalidrawElement,
  4. redrawTextBoundingBox,
  5. } from "../element";
  6. import { KEYS } from "../keys";
  7. import { DEFAULT_FONT } from "../appState";
  8. import { register } from "./register";
  9. let copiedStyles: string = "{}";
  10. export const actionCopyStyles = register({
  11. name: "copyStyles",
  12. perform: (elements, appState) => {
  13. const element = elements.find(el => appState.selectedElementIds[el.id]);
  14. if (element) {
  15. copiedStyles = JSON.stringify(element);
  16. }
  17. return {};
  18. },
  19. contextItemLabel: "labels.copyStyles",
  20. keyTest: event => event[KEYS.META] && event.shiftKey && event.key === "C",
  21. contextMenuOrder: 0,
  22. });
  23. export const actionPasteStyles = register({
  24. name: "pasteStyles",
  25. perform: (elements, appState) => {
  26. const pastedElement = JSON.parse(copiedStyles);
  27. if (!isExcalidrawElement(pastedElement)) {
  28. return { elements };
  29. }
  30. return {
  31. elements: elements.map(element => {
  32. if (appState.selectedElementIds[element.id]) {
  33. const newElement = {
  34. ...element,
  35. backgroundColor: pastedElement?.backgroundColor,
  36. strokeWidth: pastedElement?.strokeWidth,
  37. strokeColor: pastedElement?.strokeColor,
  38. fillStyle: pastedElement?.fillStyle,
  39. opacity: pastedElement?.opacity,
  40. roughness: pastedElement?.roughness,
  41. };
  42. if (isTextElement(newElement)) {
  43. newElement.font = pastedElement?.font || DEFAULT_FONT;
  44. redrawTextBoundingBox(newElement);
  45. }
  46. return newElement;
  47. }
  48. return element;
  49. }),
  50. };
  51. },
  52. commitToHistory: () => true,
  53. contextItemLabel: "labels.pasteStyles",
  54. keyTest: event => event[KEYS.META] && event.shiftKey && event.key === "V",
  55. contextMenuOrder: 1,
  56. });