actionDuplicateSelection.ts 1014 B

123456789101112131415161718192021222324252627282930
  1. import { KEYS } from "../keys";
  2. import { register } from "./register";
  3. import { ExcalidrawElement } from "../element/types";
  4. import { duplicateElement } from "../element";
  5. export const actionDuplicateSelection = register({
  6. name: "duplicateSelection",
  7. perform: (elements, appState) => {
  8. return {
  9. appState,
  10. elements: elements.reduce(
  11. (acc: Array<ExcalidrawElement>, element: ExcalidrawElement) => {
  12. if (appState.selectedElementIds[element.id]) {
  13. const newElement = duplicateElement(element, {
  14. x: element.x + 10,
  15. y: element.y + 10,
  16. });
  17. appState.selectedElementIds[newElement.id] = true;
  18. delete appState.selectedElementIds[element.id];
  19. return acc.concat([element, newElement]);
  20. }
  21. return acc.concat(element);
  22. },
  23. [],
  24. ),
  25. };
  26. },
  27. contextItemLabel: "labels.duplicateSelection",
  28. keyTest: event => event[KEYS.CTRL_OR_CMD] && event.key === "d",
  29. });