dragElements.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { SHAPES } from "../shapes";
  2. import { updateBoundElements } from "./binding";
  3. import { getCommonBounds } from "./bounds";
  4. import { mutateElement } from "./mutateElement";
  5. import { getPerfectElementSize } from "./sizeHelpers";
  6. import Scene from "../scene/Scene";
  7. import { NonDeletedExcalidrawElement } from "./types";
  8. import { PointerDownState } from "../components/App";
  9. export const dragSelectedElements = (
  10. pointerDownState: PointerDownState,
  11. selectedElements: NonDeletedExcalidrawElement[],
  12. pointerX: number,
  13. pointerY: number,
  14. scene: Scene,
  15. lockDirection: boolean = false,
  16. distanceX: number = 0,
  17. distanceY: number = 0,
  18. ) => {
  19. const [x1, y1] = getCommonBounds(selectedElements);
  20. const offset = { x: pointerX - x1, y: pointerY - y1 };
  21. selectedElements.forEach((element) => {
  22. let x: number;
  23. let y: number;
  24. if (lockDirection) {
  25. const lockX = lockDirection && distanceX < distanceY;
  26. const lockY = lockDirection && distanceX > distanceY;
  27. const original = pointerDownState.originalElements.get(element.id);
  28. x = lockX && original ? original.x : element.x + offset.x;
  29. y = lockY && original ? original.y : element.y + offset.y;
  30. } else {
  31. x = element.x + offset.x;
  32. y = element.y + offset.y;
  33. }
  34. mutateElement(element, {
  35. x,
  36. y,
  37. });
  38. updateBoundElements(element, {
  39. simultaneouslyUpdated: selectedElements,
  40. });
  41. });
  42. };
  43. export const getDragOffsetXY = (
  44. selectedElements: NonDeletedExcalidrawElement[],
  45. x: number,
  46. y: number,
  47. ): [number, number] => {
  48. const [x1, y1] = getCommonBounds(selectedElements);
  49. return [x - x1, y - y1];
  50. };
  51. export const dragNewElement = (
  52. draggingElement: NonDeletedExcalidrawElement,
  53. elementType: typeof SHAPES[number]["value"],
  54. originX: number,
  55. originY: number,
  56. x: number,
  57. y: number,
  58. width: number,
  59. height: number,
  60. isResizeWithSidesSameLength: boolean,
  61. isResizeCenterPoint: boolean,
  62. ) => {
  63. if (isResizeWithSidesSameLength) {
  64. ({ width, height } = getPerfectElementSize(
  65. elementType,
  66. width,
  67. y < originY ? -height : height,
  68. ));
  69. if (height < 0) {
  70. height = -height;
  71. }
  72. }
  73. let newX = x < originX ? originX - width : originX;
  74. let newY = y < originY ? originY - height : originY;
  75. if (isResizeCenterPoint) {
  76. width += width;
  77. height += height;
  78. newX = originX - width / 2;
  79. newY = originY - height / 2;
  80. }
  81. if (width !== 0 && height !== 0) {
  82. mutateElement(draggingElement, {
  83. x: newX,
  84. y: newY,
  85. width,
  86. height,
  87. });
  88. }
  89. };