actionDuplicateSelection.ts 1023 B

1234567891011121314151617181920212223242526272829
  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. newElement.x = newElement.x + 10;
  15. newElement.y = newElement.y + 10;
  16. appState.selectedElementIds[newElement.id] = true;
  17. delete appState.selectedElementIds[element.id];
  18. return acc.concat([element, newElement]);
  19. }
  20. return acc.concat(element);
  21. },
  22. [],
  23. ),
  24. };
  25. },
  26. contextItemLabel: "labels.duplicateSelection",
  27. keyTest: event => event[KEYS.CTRL_OR_CMD] && event.key === "d",
  28. });