kritzel-stencil 0.0.160 → 0.0.162

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/dist/cjs/{default-text-tool.config-D10FksvZ.js → default-line-tool.config-D1Ns0NmM.js} +3156 -929
  2. package/dist/cjs/default-line-tool.config-D1Ns0NmM.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +131 -126
  4. package/dist/cjs/index.cjs.js.map +1 -1
  5. package/dist/cjs/kritzel-brush-style.cjs.entry.js +1 -1
  6. package/dist/cjs/kritzel-brush-style.entry.cjs.js.map +1 -1
  7. package/dist/cjs/kritzel-color_22.cjs.entry.js +538 -198
  8. package/dist/cjs/loader.cjs.js +1 -1
  9. package/dist/cjs/stencil.cjs.js +1 -1
  10. package/dist/collection/classes/core/core.class.js +140 -3
  11. package/dist/collection/classes/core/core.class.js.map +1 -1
  12. package/dist/collection/classes/core/reviver.class.js +8 -0
  13. package/dist/collection/classes/core/reviver.class.js.map +1 -1
  14. package/dist/collection/classes/core/store.class.js +8 -0
  15. package/dist/collection/classes/core/store.class.js.map +1 -1
  16. package/dist/collection/classes/handlers/line-handle.handler.js +383 -0
  17. package/dist/collection/classes/handlers/line-handle.handler.js.map +1 -0
  18. package/dist/collection/classes/handlers/move.handler.js +2 -2
  19. package/dist/collection/classes/handlers/move.handler.js.map +1 -1
  20. package/dist/collection/classes/handlers/resize.handler.js +42 -34
  21. package/dist/collection/classes/handlers/resize.handler.js.map +1 -1
  22. package/dist/collection/classes/handlers/rotation.handler.js +12 -8
  23. package/dist/collection/classes/handlers/rotation.handler.js.map +1 -1
  24. package/dist/collection/classes/managers/anchor.manager.js +874 -0
  25. package/dist/collection/classes/managers/anchor.manager.js.map +1 -0
  26. package/dist/collection/classes/managers/cursor.manager.js +117 -0
  27. package/dist/collection/classes/managers/cursor.manager.js.map +1 -0
  28. package/dist/collection/classes/objects/base-object.class.js +4 -2
  29. package/dist/collection/classes/objects/base-object.class.js.map +1 -1
  30. package/dist/collection/classes/objects/line.class.js +564 -0
  31. package/dist/collection/classes/objects/line.class.js.map +1 -0
  32. package/dist/collection/classes/objects/selection-group.class.js +4 -0
  33. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  34. package/dist/collection/classes/registries/icon-registry.class.js +7 -1
  35. package/dist/collection/classes/registries/icon-registry.class.js.map +1 -1
  36. package/dist/collection/classes/tools/line-tool.class.js +172 -0
  37. package/dist/collection/classes/tools/line-tool.class.js.map +1 -0
  38. package/dist/collection/classes/tools/selection-tool.class.js +41 -8
  39. package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
  40. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -1
  41. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +11 -2
  42. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
  43. package/dist/collection/components/core/kritzel-engine/kritzel-engine.css +0 -14
  44. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +163 -21
  45. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  46. package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.css +0 -1
  47. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
  48. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +1 -1
  49. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +1 -1
  50. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.css +1 -1
  51. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
  52. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.css +1 -1
  53. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +1 -1
  54. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.css +1 -1
  55. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
  56. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -1
  57. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.css +1 -2
  58. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -2
  59. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
  60. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.css +1 -1
  61. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -1
  62. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +1 -1
  63. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -1
  64. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +4 -4
  65. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.css +1 -2
  66. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +1 -1
  67. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.css +1 -1
  68. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +2 -2
  69. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.css +1 -1
  70. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +2 -2
  71. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +4 -4
  72. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +3 -3
  73. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.css +1 -1
  74. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  75. package/dist/collection/configs/default-engine-config.js +10 -0
  76. package/dist/collection/configs/default-engine-config.js.map +1 -1
  77. package/dist/collection/configs/default-line-tool.config.js +34 -0
  78. package/dist/collection/configs/default-line-tool.config.js.map +1 -0
  79. package/dist/collection/helpers/cursor.helper.js +58 -0
  80. package/dist/collection/helpers/cursor.helper.js.map +1 -0
  81. package/dist/collection/helpers/geometry.helper.js +42 -0
  82. package/dist/collection/helpers/geometry.helper.js.map +1 -1
  83. package/dist/collection/index.js +6 -0
  84. package/dist/collection/index.js.map +1 -1
  85. package/dist/collection/interfaces/anchor.interface.js +2 -0
  86. package/dist/collection/interfaces/anchor.interface.js.map +1 -0
  87. package/dist/collection/interfaces/arrow-head.interface.js +2 -0
  88. package/dist/collection/interfaces/arrow-head.interface.js.map +1 -0
  89. package/dist/collection/interfaces/engine-state.interface.js.map +1 -1
  90. package/dist/collection/interfaces/line-options.interface.js +2 -0
  91. package/dist/collection/interfaces/line-options.interface.js.map +1 -0
  92. package/dist/collection/interfaces/toolbar-control.interface.js.map +1 -1
  93. package/dist/components/index.js +4 -4
  94. package/dist/components/kritzel-brush-style.js +3 -3
  95. package/dist/components/kritzel-brush-style.js.map +1 -1
  96. package/dist/components/kritzel-color-palette.js +1 -1
  97. package/dist/components/kritzel-color.js +1 -1
  98. package/dist/components/kritzel-context-menu.js +1 -1
  99. package/dist/components/kritzel-control-brush-config.js +1 -1
  100. package/dist/components/kritzel-control-text-config.js +1 -1
  101. package/dist/components/kritzel-controls.js +1 -1
  102. package/dist/components/kritzel-cursor-trail.js +1 -1
  103. package/dist/components/kritzel-dropdown.js +1 -1
  104. package/dist/components/kritzel-editor.js +64 -23
  105. package/dist/components/kritzel-editor.js.map +1 -1
  106. package/dist/components/kritzel-engine.js +1 -1
  107. package/dist/components/kritzel-font-family.js +1 -1
  108. package/dist/components/kritzel-font-size.js +1 -1
  109. package/dist/components/kritzel-font.js +1 -1
  110. package/dist/components/kritzel-icon.js +1 -1
  111. package/dist/components/kritzel-menu-item.js +1 -1
  112. package/dist/components/kritzel-menu.js +1 -1
  113. package/dist/components/kritzel-portal.js +1 -1
  114. package/dist/components/kritzel-split-button.js +1 -1
  115. package/dist/components/kritzel-stroke-size.js +1 -1
  116. package/dist/components/kritzel-tooltip.js +1 -1
  117. package/dist/components/kritzel-utility-panel.js +1 -1
  118. package/dist/components/kritzel-workspace-manager.js +1 -1
  119. package/dist/components/{p-TdCTkEu0.js → p-7_lwv0zQ.js} +7 -7
  120. package/dist/components/p-7_lwv0zQ.js.map +1 -0
  121. package/dist/components/{p-CTP479Lf.js → p-9Fzdviju.js} +6 -6
  122. package/dist/components/{p-CTP479Lf.js.map → p-9Fzdviju.js.map} +1 -1
  123. package/dist/components/{p-DDmSxM5f.js → p-B6r22FSC.js} +5 -5
  124. package/dist/components/p-B6r22FSC.js.map +1 -0
  125. package/dist/components/{p-CLt3HMl6.js → p-B_3OZeom.js} +3 -3
  126. package/dist/components/{p-CLt3HMl6.js.map → p-B_3OZeom.js.map} +1 -1
  127. package/dist/components/{p-CIXPLjCu.js → p-BdwB-S9G.js} +3 -3
  128. package/dist/components/p-BdwB-S9G.js.map +1 -0
  129. package/dist/components/p-BixlbUD7.js +104 -0
  130. package/dist/components/p-BixlbUD7.js.map +1 -0
  131. package/dist/components/{p-D1uj4A4F.js → p-Brd9SxWS.js} +5 -5
  132. package/dist/components/p-Brd9SxWS.js.map +1 -0
  133. package/dist/components/{p-Ddh40W3x.js → p-CDteBYm9.js} +9 -9
  134. package/dist/components/p-CDteBYm9.js.map +1 -0
  135. package/dist/components/{p-BgznZoBH.js → p-CFH6XRL5.js} +5 -5
  136. package/dist/components/p-CFH6XRL5.js.map +1 -0
  137. package/dist/components/{p-B4kxkVe-.js → p-CRGwaUcp.js} +5 -5
  138. package/dist/components/p-CRGwaUcp.js.map +1 -0
  139. package/dist/components/{p-uuRJU2R1.js → p-Ck4lGnmt.js} +3 -3
  140. package/dist/components/{p-uuRJU2R1.js.map → p-Ck4lGnmt.js.map} +1 -1
  141. package/dist/components/{p-CK6no3mi.js → p-CkD1PQQX.js} +6 -6
  142. package/dist/components/{p-CK6no3mi.js.map → p-CkD1PQQX.js.map} +1 -1
  143. package/dist/components/{p-BQg4YML7.js → p-Cqr0Bah5.js} +12 -12
  144. package/dist/components/p-Cqr0Bah5.js.map +1 -0
  145. package/dist/components/{p-DTHqEUDc.js → p-CuhOrcET.js} +2861 -390
  146. package/dist/components/p-CuhOrcET.js.map +1 -0
  147. package/dist/components/{p-DAfkuR8U.js → p-CvLFRlQU.js} +5 -5
  148. package/dist/components/p-CvLFRlQU.js.map +1 -0
  149. package/dist/components/{p-1lIHoOlH.js → p-DKwJJuFb.js} +19 -19
  150. package/dist/components/p-DKwJJuFb.js.map +1 -0
  151. package/dist/components/{p-CsA9M6me.js → p-DZ7kxJUx.js} +8 -8
  152. package/dist/components/p-DZ7kxJUx.js.map +1 -0
  153. package/dist/components/{p-D4yvhd1d.js → p-LAsVgL2e.js} +4 -4
  154. package/dist/components/{p-D4yvhd1d.js.map → p-LAsVgL2e.js.map} +1 -1
  155. package/dist/components/{p-D5Wq4x4r.js → p-OFrACpZf.js} +3 -3
  156. package/dist/components/{p-D5Wq4x4r.js.map → p-OFrACpZf.js.map} +1 -1
  157. package/dist/components/{p-C2sWlNsJ.js → p-dMCB4tJA.js} +5 -5
  158. package/dist/components/p-dMCB4tJA.js.map +1 -0
  159. package/dist/components/{p-CBYBurdY.js → p-sokRZ7Vn.js} +49 -5
  160. package/dist/components/p-sokRZ7Vn.js.map +1 -0
  161. package/dist/esm/{default-text-tool.config-DzqpOikl.js → default-line-tool.config-C35m-d1Y.js} +3150 -930
  162. package/dist/esm/default-line-tool.config-C35m-d1Y.js.map +1 -0
  163. package/dist/esm/index.js +2 -2
  164. package/dist/esm/kritzel-brush-style.entry.js +1 -1
  165. package/dist/esm/kritzel-brush-style.entry.js.map +1 -1
  166. package/dist/esm/kritzel-color_22.entry.js +457 -117
  167. package/dist/esm/loader.js +1 -1
  168. package/dist/esm/stencil.js +1 -1
  169. package/dist/stencil/index.esm.js +1 -1
  170. package/dist/stencil/kritzel-brush-style.entry.esm.js.map +1 -1
  171. package/dist/stencil/p-385bab97.entry.js +2 -0
  172. package/dist/stencil/{p-d702c5af.entry.js.map → p-385bab97.entry.js.map} +1 -1
  173. package/dist/stencil/p-C35m-d1Y.js +2 -0
  174. package/dist/stencil/p-C35m-d1Y.js.map +1 -0
  175. package/dist/stencil/p-d142ef46.entry.js +10 -0
  176. package/dist/stencil/p-d142ef46.entry.js.map +1 -0
  177. package/dist/stencil/stencil.esm.js +1 -1
  178. package/dist/types/classes/core/core.class.d.ts +18 -0
  179. package/dist/types/classes/core/store.class.d.ts +3 -0
  180. package/dist/types/classes/handlers/line-handle.handler.d.ts +34 -0
  181. package/dist/types/classes/managers/anchor.manager.d.ts +160 -0
  182. package/dist/types/classes/managers/cursor.manager.d.ts +43 -0
  183. package/dist/types/classes/objects/line.class.d.ts +98 -0
  184. package/dist/types/classes/tools/line-tool.class.d.ts +17 -0
  185. package/dist/types/classes/tools/selection-tool.class.d.ts +4 -0
  186. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +4 -2
  187. package/dist/types/components.d.ts +7 -5
  188. package/dist/types/configs/default-line-tool.config.d.ts +2 -0
  189. package/dist/types/helpers/cursor.helper.d.ts +22 -0
  190. package/dist/types/helpers/geometry.helper.d.ts +10 -0
  191. package/dist/types/index.d.ts +6 -0
  192. package/dist/types/interfaces/anchor.interface.d.ts +137 -0
  193. package/dist/types/interfaces/arrow-head.interface.d.ts +26 -0
  194. package/dist/types/interfaces/engine-state.interface.d.ts +15 -0
  195. package/dist/types/interfaces/line-options.interface.d.ts +21 -0
  196. package/dist/types/interfaces/toolbar-control.interface.d.ts +17 -1
  197. package/package.json +1 -1
  198. package/dist/cjs/default-text-tool.config-D10FksvZ.js.map +0 -1
  199. package/dist/components/p-1lIHoOlH.js.map +0 -1
  200. package/dist/components/p-B4kxkVe-.js.map +0 -1
  201. package/dist/components/p-BQg4YML7.js.map +0 -1
  202. package/dist/components/p-BgznZoBH.js.map +0 -1
  203. package/dist/components/p-Bhtn9qay.js +0 -98
  204. package/dist/components/p-Bhtn9qay.js.map +0 -1
  205. package/dist/components/p-C2sWlNsJ.js.map +0 -1
  206. package/dist/components/p-CBYBurdY.js.map +0 -1
  207. package/dist/components/p-CIXPLjCu.js.map +0 -1
  208. package/dist/components/p-CsA9M6me.js.map +0 -1
  209. package/dist/components/p-D1uj4A4F.js.map +0 -1
  210. package/dist/components/p-DAfkuR8U.js.map +0 -1
  211. package/dist/components/p-DDmSxM5f.js.map +0 -1
  212. package/dist/components/p-DTHqEUDc.js.map +0 -1
  213. package/dist/components/p-Ddh40W3x.js.map +0 -1
  214. package/dist/components/p-TdCTkEu0.js.map +0 -1
  215. package/dist/esm/default-text-tool.config-DzqpOikl.js.map +0 -1
  216. package/dist/stencil/p-5475442e.entry.js +0 -10
  217. package/dist/stencil/p-5475442e.entry.js.map +0 -1
  218. package/dist/stencil/p-DzqpOikl.js +0 -2
  219. package/dist/stencil/p-DzqpOikl.js.map +0 -1
  220. package/dist/stencil/p-d702c5af.entry.js +0 -2
@@ -2,6 +2,7 @@ import { KritzelSelectionGroup } from "../objects/selection-group.class";
2
2
  import { KritzelSelectionBox } from "../objects/selection-box.class";
3
3
  import { KritzelText } from "../objects/text.class";
4
4
  import { KritzelPath } from "../objects/path.class";
5
+ import { KritzelLine } from "../objects/line.class";
5
6
  import { KritzelObjectMap } from "../structures/object-map.structure";
6
7
  export class KritzelStore {
7
8
  _state;
@@ -37,6 +38,10 @@ export class KritzelStore {
37
38
  const drawingPaths = this._state.objects.filter(o => o instanceof KritzelPath && o.isCompleted === false);
38
39
  return drawingPaths.length > 0 ? drawingPaths[0] : null;
39
40
  }
41
+ get currentLine() {
42
+ const drawingLines = this._state.objects.filter(o => o instanceof KritzelLine && o.isCompleted === false);
43
+ return drawingLines.length > 0 ? drawingLines[0] : null;
44
+ }
40
45
  get offsetX() {
41
46
  return this._state.host.getBoundingClientRect().left;
42
47
  }
@@ -46,6 +51,9 @@ export class KritzelStore {
46
51
  get isDisabled() {
47
52
  return this._state.isEnabled === false || this._state.isReady === false || this._state.activeWorkspace === null;
48
53
  }
54
+ get isPointerDown() {
55
+ return this._state.pointers.size > 0;
56
+ }
49
57
  constructor(state) {
50
58
  this._state = state;
51
59
  this._state.objects = new KritzelObjectMap();
@@ -1 +1 @@
1
- {"version":3,"file":"store.class.js","sourceRoot":"","sources":["../../../src/classes/core/store.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelEngineState } from '../../interfaces/engine-state.interface';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelText } from '../objects/text.class';\r\nimport { KritzelPath } from '../objects/path.class';\r\nimport { StateChangeListener, StatePropertyKey } from '../../types/state.types';\r\nimport { KritzelObjectMap } from '../structures/object-map.structure';\r\nimport { KritzelBaseObject } from '../..';\r\n\r\nexport class KritzelStore {\r\n private readonly _state: KritzelEngineState;\r\n private readonly _listeners: Map<StatePropertyKey, Set<StateChangeListener<any>>> = new Map();\r\n\r\n get state(): KritzelEngineState {\r\n return this._state;\r\n }\r\n\r\n get currentZIndex() {\r\n return Math.max(0, ...this._state.objects.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox)).map(o => o.zIndex)) + 1;\r\n }\r\n\r\n get allObjects(): KritzelBaseObject<Element>[] {\r\n return this._state.objects.allObjects();\r\n }\r\n\r\n get allNonSelectionObjects(): KritzelBaseObject<Element>[] {\r\n return this._state.objects.allObjects().filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox));\r\n }\r\n\r\n get selectedObjects(): KritzelBaseObject<Element>[] {\r\n return this.allObjects.filter(o => !(o instanceof KritzelSelectionGroup)).filter(o => o.isSelected);\r\n }\r\n\r\n get selectionBox(): KritzelSelectionBox | null {\r\n const selectionBoxes = this._state.objects.filter(o => o instanceof KritzelSelectionBox);\r\n return selectionBoxes.length > 0 ? (selectionBoxes[0] as KritzelSelectionBox) : null;\r\n }\r\n\r\n get selectionGroup(): KritzelSelectionGroup | null {\r\n const selectionGroups = this._state.objects.filter(o => o instanceof KritzelSelectionGroup);\r\n return selectionGroups.length > 0 ? (selectionGroups[0] as KritzelSelectionGroup) : null;\r\n }\r\n\r\n get activeText(): KritzelText | null {\r\n const activeTexts = this._state.objects.filter(o => o instanceof KritzelText && (o as KritzelText).isEditing);\r\n return activeTexts.length > 0 ? (activeTexts[0] as KritzelText) : null;\r\n }\r\n\r\n get currentPath(): KritzelPath | null {\r\n const drawingPaths = this._state.objects.filter(o => o instanceof KritzelPath && (o as KritzelPath).isCompleted === false);\r\n return drawingPaths.length > 0 ? (drawingPaths[0] as KritzelPath) : null;\r\n }\r\n\r\n get offsetX() {\r\n return this._state.host.getBoundingClientRect().left;\r\n }\r\n\r\n get offsetY() {\r\n return this._state.host.getBoundingClientRect().top;\r\n }\r\n\r\n get isDisabled() {\r\n return this._state.isEnabled === false || this._state.isReady === false || this._state.activeWorkspace === null;\r\n }\r\n\r\n constructor(state: KritzelEngineState) {\r\n this._state = state;\r\n this._state.objects = new KritzelObjectMap();\r\n }\r\n\r\n onStateChange<K extends StatePropertyKey>(property: K, listener: StateChangeListener<KritzelEngineState[K]>): void {\r\n if (!this._listeners.has(property)) {\r\n this._listeners.set(property, new Set());\r\n }\r\n this._listeners.get(property).add(listener);\r\n }\r\n\r\n getState<K extends StatePropertyKey>(property: K): Readonly<KritzelEngineState[K]> {\r\n return this._state[property];\r\n }\r\n\r\n setState<K extends StatePropertyKey>(property: K, value: KritzelEngineState[K]): void {\r\n const oldValue = this._state[property];\r\n\r\n if (oldValue !== value) {\r\n this._state[property] = value;\r\n\r\n if (this._listeners.has(property)) {\r\n this._listeners.get(property).forEach(listener => listener(value, oldValue, String(property)));\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"store.class.js","sourceRoot":"","sources":["../../../src/classes/core/store.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelEngineState } from '../../interfaces/engine-state.interface';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelText } from '../objects/text.class';\r\nimport { KritzelPath } from '../objects/path.class';\r\nimport { KritzelLine } from '../objects/line.class';\r\nimport { StateChangeListener, StatePropertyKey } from '../../types/state.types';\r\nimport { KritzelObjectMap } from '../structures/object-map.structure';\r\nimport { KritzelBaseObject } from '../..';\r\n\r\nexport class KritzelStore {\r\n private readonly _state: KritzelEngineState;\r\n private readonly _listeners: Map<StatePropertyKey, Set<StateChangeListener<any>>> = new Map();\r\n\r\n get state(): KritzelEngineState {\r\n return this._state;\r\n }\r\n\r\n get currentZIndex() {\r\n return Math.max(0, ...this._state.objects.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox)).map(o => o.zIndex)) + 1;\r\n }\r\n\r\n get allObjects(): KritzelBaseObject<Element>[] {\r\n return this._state.objects.allObjects();\r\n }\r\n\r\n get allNonSelectionObjects(): KritzelBaseObject<Element>[] {\r\n return this._state.objects.allObjects().filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox));\r\n }\r\n\r\n get selectedObjects(): KritzelBaseObject<Element>[] {\r\n return this.allObjects.filter(o => !(o instanceof KritzelSelectionGroup)).filter(o => o.isSelected);\r\n }\r\n\r\n get selectionBox(): KritzelSelectionBox | null {\r\n const selectionBoxes = this._state.objects.filter(o => o instanceof KritzelSelectionBox);\r\n return selectionBoxes.length > 0 ? (selectionBoxes[0] as KritzelSelectionBox) : null;\r\n }\r\n\r\n get selectionGroup(): KritzelSelectionGroup | null {\r\n const selectionGroups = this._state.objects.filter(o => o instanceof KritzelSelectionGroup);\r\n return selectionGroups.length > 0 ? (selectionGroups[0] as KritzelSelectionGroup) : null;\r\n }\r\n\r\n get activeText(): KritzelText | null {\r\n const activeTexts = this._state.objects.filter(o => o instanceof KritzelText && (o as KritzelText).isEditing);\r\n return activeTexts.length > 0 ? (activeTexts[0] as KritzelText) : null;\r\n }\r\n\r\n get currentPath(): KritzelPath | null {\r\n const drawingPaths = this._state.objects.filter(o => o instanceof KritzelPath && (o as KritzelPath).isCompleted === false);\r\n return drawingPaths.length > 0 ? (drawingPaths[0] as KritzelPath) : null;\r\n }\r\n\r\n get currentLine(): KritzelLine | null {\r\n const drawingLines = this._state.objects.filter(o => o instanceof KritzelLine && (o as KritzelLine).isCompleted === false);\r\n return drawingLines.length > 0 ? (drawingLines[0] as KritzelLine) : null;\r\n }\r\n\r\n get offsetX() {\r\n return this._state.host.getBoundingClientRect().left;\r\n }\r\n\r\n get offsetY() {\r\n return this._state.host.getBoundingClientRect().top;\r\n }\r\n\r\n get isDisabled() {\r\n return this._state.isEnabled === false || this._state.isReady === false || this._state.activeWorkspace === null;\r\n }\r\n\r\n get isPointerDown() {\r\n return this._state.pointers.size > 0;\r\n }\r\n\r\n constructor(state: KritzelEngineState) {\r\n this._state = state;\r\n this._state.objects = new KritzelObjectMap();\r\n }\r\n\r\n onStateChange<K extends StatePropertyKey>(property: K, listener: StateChangeListener<KritzelEngineState[K]>): void {\r\n if (!this._listeners.has(property)) {\r\n this._listeners.set(property, new Set());\r\n }\r\n this._listeners.get(property).add(listener);\r\n }\r\n\r\n getState<K extends StatePropertyKey>(property: K): Readonly<KritzelEngineState[K]> {\r\n return this._state[property];\r\n }\r\n\r\n setState<K extends StatePropertyKey>(property: K, value: KritzelEngineState[K]): void {\r\n const oldValue = this._state[property];\r\n\r\n if (oldValue !== value) {\r\n this._state[property] = value;\r\n\r\n if (this._listeners.has(property)) {\r\n this._listeners.get(property).forEach(listener => listener(value, oldValue, String(property)));\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -0,0 +1,383 @@
1
+ import { KritzelEventHelper } from "../../helpers/event.helper";
2
+ import { KritzelLine } from "../objects/line.class";
3
+ import { KritzelBaseHandler } from "./base.handler";
4
+ export class KritzelLineHandleHandler extends KritzelBaseHandler {
5
+ initialMouseX = 0;
6
+ initialMouseY = 0;
7
+ initialStartX = 0;
8
+ initialStartY = 0;
9
+ initialEndX = 0;
10
+ initialEndY = 0;
11
+ initialControlX;
12
+ initialControlY;
13
+ initialTranslateX = 0;
14
+ initialTranslateY = 0;
15
+ hasMoved = false;
16
+ /** Current snap target during drag, if any */
17
+ currentSnapTarget = null;
18
+ constructor(core) {
19
+ super(core);
20
+ }
21
+ reset() {
22
+ this.initialMouseX = 0;
23
+ this.initialMouseY = 0;
24
+ this.initialStartX = 0;
25
+ this.initialStartY = 0;
26
+ this.initialEndX = 0;
27
+ this.initialEndY = 0;
28
+ this.initialControlX = undefined;
29
+ this.initialControlY = undefined;
30
+ this.initialTranslateX = 0;
31
+ this.initialTranslateY = 0;
32
+ this.hasMoved = false;
33
+ this.currentSnapTarget = null;
34
+ this._core.anchorManager.clearSnapCandidate();
35
+ }
36
+ handlePointerDown(event) {
37
+ if (event.pointerType === 'mouse') {
38
+ if (KritzelEventHelper.isLeftClick(event)) {
39
+ this.startHandleDrag(event);
40
+ }
41
+ }
42
+ if (event.pointerType === 'touch') {
43
+ const activePointers = Array.from(this._core.store.state.pointers.values());
44
+ if (activePointers.length === 1) {
45
+ this.startHandleDrag(event);
46
+ }
47
+ }
48
+ }
49
+ startHandleDrag(event) {
50
+ const line = this.getSelectedLine();
51
+ if (!line || !this._core.store.state.isLineHandleSelected) {
52
+ return;
53
+ }
54
+ const clientX = event.clientX - this._core.store.offsetX;
55
+ const clientY = event.clientY - this._core.store.offsetY;
56
+ this._core.store.state.isLineHandleDragging = true;
57
+ this.initialMouseX = clientX;
58
+ this.initialMouseY = clientY;
59
+ // Store initial line state
60
+ this.initialStartX = line.startX;
61
+ this.initialStartY = line.startY;
62
+ this.initialEndX = line.endX;
63
+ this.initialEndY = line.endY;
64
+ this.initialControlX = line.controlX;
65
+ this.initialControlY = line.controlY;
66
+ this.initialTranslateX = line.translateX;
67
+ this.initialTranslateY = line.translateY;
68
+ // Remove existing anchor for this endpoint when starting to drag
69
+ const handleType = this._core.store.state.lineHandleType;
70
+ if (handleType === 'start' || handleType === 'end') {
71
+ this._core.anchorManager.removeAnchor(line.id, handleType);
72
+ }
73
+ clearTimeout(this._core.store.state.longTouchTimeout);
74
+ }
75
+ handlePointerMove(event) {
76
+ const line = this.getSelectedLine();
77
+ if (!line || !this._core.store.state.isLineHandleDragging) {
78
+ return;
79
+ }
80
+ const clientX = event.clientX - this._core.store.offsetX;
81
+ const clientY = event.clientY - this._core.store.offsetY;
82
+ const dx = clientX - this.initialMouseX;
83
+ const dy = clientY - this.initialMouseY;
84
+ const moveThreshold = 3;
85
+ if (Math.abs(dx) > moveThreshold || Math.abs(dy) > moveThreshold) {
86
+ this.hasMoved = true;
87
+ }
88
+ if (!this.hasMoved) {
89
+ return;
90
+ }
91
+ const viewportScale = this._core.store.state.scale;
92
+ const objectScale = line.scale || 1;
93
+ const rotation = line.rotation;
94
+ // Convert mouse delta to world coordinates
95
+ const worldDx = dx / viewportScale;
96
+ const worldDy = dy / viewportScale;
97
+ // Rotate the delta into the line's local coordinate system
98
+ const cos = Math.cos(-rotation);
99
+ const sin = Math.sin(-rotation);
100
+ const localDx = (worldDx * cos - worldDy * sin) * objectScale;
101
+ const localDy = (worldDx * sin + worldDy * cos) * objectScale;
102
+ const handleType = this._core.store.state.lineHandleType;
103
+ if (handleType === 'start') {
104
+ // Calculate world position directly from mouse position for snap detection
105
+ const worldX = (clientX - this._core.store.state.translateX) / viewportScale;
106
+ const worldY = (clientY - this._core.store.state.translateY) / viewportScale;
107
+ // Get other endpoint's anchor to prevent anchoring both to same object
108
+ const otherAnchorId = line.endAnchor?.objectId;
109
+ // Check for snap target
110
+ const snapTarget = this._core.anchorManager.findSnapTarget(worldX, worldY, line.id, otherAnchorId);
111
+ this.currentSnapTarget = snapTarget;
112
+ if (snapTarget) {
113
+ // Snap to target center - convert world coords to local
114
+ const localCoords = this.worldToLineLocal(line, snapTarget.centerX, snapTarget.centerY);
115
+ this.updateLineEndpoint(line, localCoords.x, localCoords.y, this.initialEndX, this.initialEndY);
116
+ // Get the other endpoint's world position for edge intersection calculation
117
+ const otherEndpointWorld = this.lineLocalToWorld(line, this.initialEndX, this.initialEndY);
118
+ // Calculate edge intersection point using AnchorManager to support curves
119
+ const targetObject = this._core.store.allNonSelectionObjects.find(obj => obj.id === snapTarget.objectId);
120
+ let edgeX;
121
+ let edgeY;
122
+ let t;
123
+ if (targetObject) {
124
+ const clipInfo = this._core.anchorManager.computeAnchorClipInfo(line, 'start', targetObject);
125
+ if (clipInfo) {
126
+ edgeX = clipInfo.worldX;
127
+ edgeY = clipInfo.worldY;
128
+ t = clipInfo.t;
129
+ }
130
+ }
131
+ // Calculate control point in world coordinates if it exists
132
+ let controlWorld = undefined;
133
+ if (line.controlX !== undefined && line.controlY !== undefined) {
134
+ controlWorld = this.lineLocalToWorld(line, line.controlX, line.controlY);
135
+ }
136
+ // Update snap indicator
137
+ this._core.anchorManager.setSnapCandidate({
138
+ objectId: snapTarget.objectId,
139
+ endpoint: 'start',
140
+ centerX: snapTarget.centerX,
141
+ centerY: snapTarget.centerY,
142
+ lineEndpointX: otherEndpointWorld.x,
143
+ lineEndpointY: otherEndpointWorld.y,
144
+ controlX: controlWorld?.x,
145
+ controlY: controlWorld?.y,
146
+ t,
147
+ edgeX,
148
+ edgeY,
149
+ lineStroke: line.stroke,
150
+ lineStrokeWidth: line.strokeWidth / line.scale,
151
+ arrowOffset: line.hasStartArrow ? line.getArrowSize('start') / line.scale : undefined,
152
+ arrowStyle: line.hasStartArrow ? line.arrows?.start?.style : undefined,
153
+ arrowFill: line.hasStartArrow ? line.getArrowFill('start') : undefined,
154
+ });
155
+ }
156
+ else {
157
+ // No snap - use regular position
158
+ const newStartX = this.initialStartX + localDx;
159
+ const newStartY = this.initialStartY + localDy;
160
+ this.updateLineEndpoint(line, newStartX, newStartY, this.initialEndX, this.initialEndY);
161
+ // Clear snap indicator
162
+ this._core.anchorManager.clearSnapCandidate();
163
+ }
164
+ }
165
+ else if (handleType === 'end') {
166
+ // Calculate world position directly from mouse position for snap detection
167
+ const worldX = (clientX - this._core.store.state.translateX) / viewportScale;
168
+ const worldY = (clientY - this._core.store.state.translateY) / viewportScale;
169
+ // Get other endpoint's anchor to prevent anchoring both to same object
170
+ const otherAnchorId = line.startAnchor?.objectId;
171
+ // Check for snap target
172
+ const snapTarget = this._core.anchorManager.findSnapTarget(worldX, worldY, line.id, otherAnchorId);
173
+ this.currentSnapTarget = snapTarget;
174
+ if (snapTarget) {
175
+ // Snap to target center - convert world coords to local
176
+ const localCoords = this.worldToLineLocal(line, snapTarget.centerX, snapTarget.centerY);
177
+ this.updateLineEndpoint(line, this.initialStartX, this.initialStartY, localCoords.x, localCoords.y);
178
+ // Get the other endpoint's world position for edge intersection calculation
179
+ const otherEndpointWorld = this.lineLocalToWorld(line, this.initialStartX, this.initialStartY);
180
+ // Calculate edge intersection point using AnchorManager to support curves
181
+ const targetObject = this._core.store.allNonSelectionObjects.find(obj => obj.id === snapTarget.objectId);
182
+ let edgeX;
183
+ let edgeY;
184
+ let t;
185
+ if (targetObject) {
186
+ const clipInfo = this._core.anchorManager.computeAnchorClipInfo(line, 'end', targetObject);
187
+ if (clipInfo) {
188
+ edgeX = clipInfo.worldX;
189
+ edgeY = clipInfo.worldY;
190
+ t = clipInfo.t;
191
+ }
192
+ }
193
+ // Calculate control point in world coordinates if it exists
194
+ let controlWorld = undefined;
195
+ if (line.controlX !== undefined && line.controlY !== undefined) {
196
+ controlWorld = this.lineLocalToWorld(line, line.controlX, line.controlY);
197
+ }
198
+ // Update snap indicator
199
+ this._core.anchorManager.setSnapCandidate({
200
+ objectId: snapTarget.objectId,
201
+ endpoint: 'end',
202
+ centerX: snapTarget.centerX,
203
+ centerY: snapTarget.centerY,
204
+ lineEndpointX: otherEndpointWorld.x,
205
+ lineEndpointY: otherEndpointWorld.y,
206
+ controlX: controlWorld?.x,
207
+ controlY: controlWorld?.y,
208
+ t,
209
+ edgeX,
210
+ edgeY,
211
+ lineStroke: line.stroke,
212
+ lineStrokeWidth: line.strokeWidth / line.scale,
213
+ arrowOffset: line.hasEndArrow ? line.getArrowSize('end') / line.scale : undefined,
214
+ arrowStyle: line.hasEndArrow ? line.arrows?.end?.style : undefined,
215
+ arrowFill: line.hasEndArrow ? line.getArrowFill('end') : undefined,
216
+ });
217
+ }
218
+ else {
219
+ // No snap - use regular position
220
+ const newEndX = this.initialEndX + localDx;
221
+ const newEndY = this.initialEndY + localDy;
222
+ this.updateLineEndpoint(line, this.initialStartX, this.initialStartY, newEndX, newEndY);
223
+ // Clear snap indicator
224
+ this._core.anchorManager.clearSnapCandidate();
225
+ }
226
+ }
227
+ else if (handleType === 'center') {
228
+ const startControlX = this.initialControlX ?? (this.initialStartX + this.initialEndX) / 2;
229
+ const startControlY = this.initialControlY ?? (this.initialStartY + this.initialEndY) / 2;
230
+ const newControlX = startControlX + localDx * 2;
231
+ const newControlY = startControlY + localDy * 2;
232
+ // Check distance to line segment for snapping back to straight
233
+ const x1 = line.startX;
234
+ const y1 = line.startY;
235
+ const x2 = line.endX;
236
+ const y2 = line.endY;
237
+ const A = newControlX - x1;
238
+ const B = newControlY - y1;
239
+ const C = x2 - x1;
240
+ const D = y2 - y1;
241
+ const dot = A * C + B * D;
242
+ const len_sq = C * C + D * D;
243
+ let param = -1;
244
+ if (len_sq !== 0) {
245
+ param = dot / len_sq;
246
+ }
247
+ let xx, yy;
248
+ if (param < 0) {
249
+ xx = x1;
250
+ yy = y1;
251
+ }
252
+ else if (param > 1) {
253
+ xx = x2;
254
+ yy = y2;
255
+ }
256
+ else {
257
+ xx = x1 + param * C;
258
+ yy = y1 + param * D;
259
+ }
260
+ const dx = newControlX - xx;
261
+ const dy = newControlY - yy;
262
+ const distance = Math.sqrt(dx * dx + dy * dy);
263
+ // Threshold for snapping back to straight line
264
+ const snapToStraightThreshold = 15;
265
+ if (distance < snapToStraightThreshold) {
266
+ line.updateControlPoint(undefined, undefined);
267
+ }
268
+ else {
269
+ line.updateControlPoint(newControlX, newControlY);
270
+ }
271
+ }
272
+ this._core.rerender();
273
+ }
274
+ /**
275
+ * Converts world coordinates to a line's local coordinate system.
276
+ */
277
+ worldToLineLocal(line, worldX, worldY) {
278
+ const dx = (worldX - line.translateX) * line.scale;
279
+ const dy = (worldY - line.translateY) * line.scale;
280
+ const cx = line.totalWidth / 2;
281
+ const cy = line.totalHeight / 2;
282
+ const cos = Math.cos(-line.rotation);
283
+ const sin = Math.sin(-line.rotation);
284
+ const rotatedX = (dx - cx) * cos - (dy - cy) * sin + cx;
285
+ const rotatedY = (dx - cx) * sin + (dy - cy) * cos + cy;
286
+ return {
287
+ x: rotatedX + line.x,
288
+ y: rotatedY + line.y,
289
+ };
290
+ }
291
+ /**
292
+ * Converts a line's local coordinate system to world coordinates.
293
+ */
294
+ lineLocalToWorld(line, localX, localY) {
295
+ const px = localX - line.x;
296
+ const py = localY - line.y;
297
+ const cx = line.totalWidth / 2;
298
+ const cy = line.totalHeight / 2;
299
+ const cos = Math.cos(line.rotation);
300
+ const sin = Math.sin(line.rotation);
301
+ const rotatedX = (px - cx) * cos - (py - cy) * sin + cx;
302
+ const rotatedY = (px - cx) * sin + (py - cy) * cos + cy;
303
+ return {
304
+ x: rotatedX / line.scale + line.translateX,
305
+ y: rotatedY / line.scale + line.translateY,
306
+ };
307
+ }
308
+ updateLineEndpoint(line, startX, startY, endX, endY) {
309
+ // Calculate new bounding box using the static method that accounts for curve extrema
310
+ const { minX, minY, maxX, maxY } = KritzelLine.calculateBoundingBox(startX, startY, endX, endY, line.controlX, line.controlY, line.strokeWidth);
311
+ const newWidth = maxX - minX;
312
+ const newHeight = maxY - minY;
313
+ // Calculate old bounding box
314
+ const { minX: oldMinX, minY: oldMinY, maxX: oldMaxX, maxY: oldMaxY, } = KritzelLine.calculateBoundingBox(this.initialStartX, this.initialStartY, this.initialEndX, this.initialEndY, this.initialControlX, this.initialControlY, line.strokeWidth);
315
+ const oldWidth = oldMaxX - oldMinX;
316
+ const oldHeight = oldMaxY - oldMinY;
317
+ // Calculate center shift in local space
318
+ const shiftX = minX - oldMinX;
319
+ const shiftY = minY - oldMinY;
320
+ const deltaCx = shiftX + (newWidth - oldWidth) / 2;
321
+ const deltaCy = shiftY + (newHeight - oldHeight) / 2;
322
+ // Convert the center shift to world coordinates
323
+ const rotation = line.rotation;
324
+ const cos = Math.cos(rotation);
325
+ const sin = Math.sin(rotation);
326
+ const scale = 1 / line.scale;
327
+ const rotatedDeltaCx = deltaCx * cos - deltaCy * sin;
328
+ const rotatedDeltaCy = deltaCx * sin + deltaCy * cos;
329
+ // Calculate new translate
330
+ const newTranslateX = this.initialTranslateX + scale * (oldWidth - newWidth) / 2 + scale * rotatedDeltaCx;
331
+ const newTranslateY = this.initialTranslateY + scale * (oldHeight - newHeight) / 2 + scale * rotatedDeltaCy;
332
+ // Update the line properties
333
+ line.startX = startX;
334
+ line.startY = startY;
335
+ line.endX = endX;
336
+ line.endY = endY;
337
+ line.x = minX;
338
+ line.y = minY;
339
+ line.width = newWidth;
340
+ line.height = newHeight;
341
+ // Adjust translateX/Y to compensate for the bounding box shift
342
+ line.translateX = newTranslateX;
343
+ line.translateY = newTranslateY;
344
+ // Clear cached adjusted points
345
+ line._adjustedPoints = null;
346
+ this._core.store.state.objects.update(line);
347
+ }
348
+ handlePointerUp(_event) {
349
+ if (this._core.store.state.isLineHandleDragging) {
350
+ const line = this.getSelectedLine();
351
+ const handleType = this._core.store.state.lineHandleType;
352
+ if (line && this.hasMoved) {
353
+ // If we were snapped to a target, create the anchor
354
+ if (this.currentSnapTarget && (handleType === 'start' || handleType === 'end')) {
355
+ this._core.anchorManager.setAnchor(line.id, handleType, this.currentSnapTarget.objectId);
356
+ }
357
+ // Refresh the selection group dimensions after line endpoint change
358
+ const selectionGroup = this._core.store.selectionGroup;
359
+ if (selectionGroup) {
360
+ selectionGroup.refreshObjectDimensions();
361
+ selectionGroup.update();
362
+ this._core.engine.emitObjectsChange();
363
+ this._core.store.state.hasObjectsChanged = true;
364
+ }
365
+ }
366
+ this._core.store.state.isLineHandleDragging = false;
367
+ this.reset();
368
+ this._core.rerender();
369
+ }
370
+ }
371
+ getSelectedLine() {
372
+ const selectionGroup = this._core.store.selectionGroup;
373
+ if (!selectionGroup || selectionGroup.objects.length !== 1) {
374
+ return null;
375
+ }
376
+ const object = selectionGroup.objects[0];
377
+ if (object instanceof KritzelLine) {
378
+ return object;
379
+ }
380
+ return null;
381
+ }
382
+ }
383
+ //# sourceMappingURL=line-handle.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-handle.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/line-handle.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEventHelper } from '../../helpers/event.helper';\r\n\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelLine } from '../objects/line.class';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { SnapTarget } from '../../interfaces/anchor.interface';\r\n\r\nexport type LineHandleType = 'start' | 'end' | 'center';\r\n\r\nexport class KritzelLineHandleHandler extends KritzelBaseHandler {\r\n initialMouseX = 0;\r\n initialMouseY = 0;\r\n\r\n initialStartX = 0;\r\n initialStartY = 0;\r\n initialEndX = 0;\r\n initialEndY = 0;\r\n initialControlX: number | undefined;\r\n initialControlY: number | undefined;\r\n initialTranslateX = 0;\r\n initialTranslateY = 0;\r\n\r\n hasMoved = false;\r\n\r\n /** Current snap target during drag, if any */\r\n private currentSnapTarget: SnapTarget | null = null;\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private reset(): void {\r\n this.initialMouseX = 0;\r\n this.initialMouseY = 0;\r\n this.initialStartX = 0;\r\n this.initialStartY = 0;\r\n this.initialEndX = 0;\r\n this.initialEndY = 0;\r\n this.initialControlX = undefined;\r\n this.initialControlY = undefined;\r\n this.initialTranslateX = 0;\r\n this.initialTranslateY = 0;\r\n this.hasMoved = false;\r\n this.currentSnapTarget = null;\r\n this._core.anchorManager.clearSnapCandidate();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event)) {\r\n this.startHandleDrag(event);\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n if (activePointers.length === 1) {\r\n this.startHandleDrag(event);\r\n }\r\n }\r\n }\r\n\r\n private startHandleDrag(event: PointerEvent): void {\r\n const line = this.getSelectedLine();\r\n if (!line || !this._core.store.state.isLineHandleSelected) {\r\n return;\r\n }\r\n\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this._core.store.state.isLineHandleDragging = true;\r\n this.initialMouseX = clientX;\r\n this.initialMouseY = clientY;\r\n\r\n // Store initial line state\r\n this.initialStartX = line.startX;\r\n this.initialStartY = line.startY;\r\n this.initialEndX = line.endX;\r\n this.initialEndY = line.endY;\r\n this.initialControlX = line.controlX;\r\n this.initialControlY = line.controlY;\r\n this.initialTranslateX = line.translateX;\r\n this.initialTranslateY = line.translateY;\r\n\r\n // Remove existing anchor for this endpoint when starting to drag\r\n const handleType = this._core.store.state.lineHandleType;\r\n if (handleType === 'start' || handleType === 'end') {\r\n this._core.anchorManager.removeAnchor(line.id, handleType);\r\n }\r\n\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n }\r\n\r\n handlePointerMove(event: PointerEvent): void {\r\n const line = this.getSelectedLine();\r\n if (!line || !this._core.store.state.isLineHandleDragging) {\r\n return;\r\n }\r\n\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n const dx = clientX - this.initialMouseX;\r\n const dy = clientY - this.initialMouseY;\r\n\r\n const moveThreshold = 3;\r\n if (Math.abs(dx) > moveThreshold || Math.abs(dy) > moveThreshold) {\r\n this.hasMoved = true;\r\n }\r\n\r\n if (!this.hasMoved) {\r\n return;\r\n }\r\n\r\n const viewportScale = this._core.store.state.scale;\r\n const objectScale = line.scale || 1;\r\n const rotation = line.rotation;\r\n\r\n // Convert mouse delta to world coordinates\r\n const worldDx = dx / viewportScale;\r\n const worldDy = dy / viewportScale;\r\n\r\n // Rotate the delta into the line's local coordinate system\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n const localDx = (worldDx * cos - worldDy * sin) * objectScale;\r\n const localDy = (worldDx * sin + worldDy * cos) * objectScale;\r\n\r\n const handleType = this._core.store.state.lineHandleType;\r\n\r\n if (handleType === 'start') {\r\n // Calculate world position directly from mouse position for snap detection\r\n const worldX = (clientX - this._core.store.state.translateX) / viewportScale;\r\n const worldY = (clientY - this._core.store.state.translateY) / viewportScale;\r\n\r\n // Get other endpoint's anchor to prevent anchoring both to same object\r\n const otherAnchorId = line.endAnchor?.objectId;\r\n\r\n // Check for snap target\r\n const snapTarget = this._core.anchorManager.findSnapTarget(worldX, worldY, line.id, otherAnchorId);\r\n this.currentSnapTarget = snapTarget;\r\n\r\n if (snapTarget) {\r\n // Snap to target center - convert world coords to local\r\n const localCoords = this.worldToLineLocal(line, snapTarget.centerX, snapTarget.centerY);\r\n this.updateLineEndpoint(line, localCoords.x, localCoords.y, this.initialEndX, this.initialEndY);\r\n\r\n // Get the other endpoint's world position for edge intersection calculation\r\n const otherEndpointWorld = this.lineLocalToWorld(line, this.initialEndX, this.initialEndY);\r\n\r\n // Calculate edge intersection point using AnchorManager to support curves\r\n const targetObject = this._core.store.allNonSelectionObjects.find(obj => obj.id === snapTarget.objectId);\r\n let edgeX: number | undefined;\r\n let edgeY: number | undefined;\r\n let t: number | undefined;\r\n\r\n if (targetObject) {\r\n const clipInfo = this._core.anchorManager.computeAnchorClipInfo(line, 'start', targetObject);\r\n if (clipInfo) {\r\n edgeX = clipInfo.worldX;\r\n edgeY = clipInfo.worldY;\r\n t = clipInfo.t;\r\n }\r\n }\r\n\r\n // Calculate control point in world coordinates if it exists\r\n let controlWorld = undefined;\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n controlWorld = this.lineLocalToWorld(line, line.controlX, line.controlY);\r\n }\r\n\r\n // Update snap indicator\r\n this._core.anchorManager.setSnapCandidate({\r\n objectId: snapTarget.objectId,\r\n endpoint: 'start',\r\n centerX: snapTarget.centerX,\r\n centerY: snapTarget.centerY,\r\n lineEndpointX: otherEndpointWorld.x,\r\n lineEndpointY: otherEndpointWorld.y,\r\n controlX: controlWorld?.x,\r\n controlY: controlWorld?.y,\r\n t,\r\n edgeX,\r\n edgeY,\r\n lineStroke: line.stroke,\r\n lineStrokeWidth: line.strokeWidth / line.scale,\r\n arrowOffset: line.hasStartArrow ? line.getArrowSize('start') / line.scale : undefined,\r\n arrowStyle: line.hasStartArrow ? line.arrows?.start?.style : undefined,\r\n arrowFill: line.hasStartArrow ? line.getArrowFill('start') : undefined,\r\n });\r\n } else {\r\n // No snap - use regular position\r\n const newStartX = this.initialStartX + localDx;\r\n const newStartY = this.initialStartY + localDy;\r\n this.updateLineEndpoint(line, newStartX, newStartY, this.initialEndX, this.initialEndY);\r\n\r\n // Clear snap indicator\r\n this._core.anchorManager.clearSnapCandidate();\r\n }\r\n } else if (handleType === 'end') {\r\n // Calculate world position directly from mouse position for snap detection\r\n const worldX = (clientX - this._core.store.state.translateX) / viewportScale;\r\n const worldY = (clientY - this._core.store.state.translateY) / viewportScale;\r\n\r\n // Get other endpoint's anchor to prevent anchoring both to same object\r\n const otherAnchorId = line.startAnchor?.objectId;\r\n\r\n // Check for snap target\r\n const snapTarget = this._core.anchorManager.findSnapTarget(worldX, worldY, line.id, otherAnchorId);\r\n this.currentSnapTarget = snapTarget;\r\n\r\n if (snapTarget) {\r\n // Snap to target center - convert world coords to local\r\n const localCoords = this.worldToLineLocal(line, snapTarget.centerX, snapTarget.centerY);\r\n this.updateLineEndpoint(line, this.initialStartX, this.initialStartY, localCoords.x, localCoords.y);\r\n\r\n // Get the other endpoint's world position for edge intersection calculation\r\n const otherEndpointWorld = this.lineLocalToWorld(line, this.initialStartX, this.initialStartY);\r\n\r\n // Calculate edge intersection point using AnchorManager to support curves\r\n const targetObject = this._core.store.allNonSelectionObjects.find(obj => obj.id === snapTarget.objectId);\r\n let edgeX: number | undefined;\r\n let edgeY: number | undefined;\r\n let t: number | undefined;\r\n\r\n if (targetObject) {\r\n const clipInfo = this._core.anchorManager.computeAnchorClipInfo(line, 'end', targetObject);\r\n if (clipInfo) {\r\n edgeX = clipInfo.worldX;\r\n edgeY = clipInfo.worldY;\r\n t = clipInfo.t;\r\n }\r\n }\r\n\r\n // Calculate control point in world coordinates if it exists\r\n let controlWorld = undefined;\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n controlWorld = this.lineLocalToWorld(line, line.controlX, line.controlY);\r\n }\r\n\r\n // Update snap indicator\r\n this._core.anchorManager.setSnapCandidate({\r\n objectId: snapTarget.objectId,\r\n endpoint: 'end',\r\n centerX: snapTarget.centerX,\r\n centerY: snapTarget.centerY,\r\n lineEndpointX: otherEndpointWorld.x,\r\n lineEndpointY: otherEndpointWorld.y,\r\n controlX: controlWorld?.x,\r\n controlY: controlWorld?.y,\r\n t,\r\n edgeX,\r\n edgeY,\r\n lineStroke: line.stroke,\r\n lineStrokeWidth: line.strokeWidth / line.scale,\r\n arrowOffset: line.hasEndArrow ? line.getArrowSize('end') / line.scale : undefined,\r\n arrowStyle: line.hasEndArrow ? line.arrows?.end?.style : undefined,\r\n arrowFill: line.hasEndArrow ? line.getArrowFill('end') : undefined,\r\n });\r\n } else {\r\n // No snap - use regular position\r\n const newEndX = this.initialEndX + localDx;\r\n const newEndY = this.initialEndY + localDy;\r\n this.updateLineEndpoint(line, this.initialStartX, this.initialStartY, newEndX, newEndY);\r\n\r\n // Clear snap indicator\r\n this._core.anchorManager.clearSnapCandidate();\r\n }\r\n } else if (handleType === 'center') {\r\n const startControlX = this.initialControlX ?? (this.initialStartX + this.initialEndX) / 2;\r\n const startControlY = this.initialControlY ?? (this.initialStartY + this.initialEndY) / 2;\r\n const newControlX = startControlX + localDx * 2;\r\n const newControlY = startControlY + localDy * 2;\r\n\r\n // Check distance to line segment for snapping back to straight\r\n const x1 = line.startX;\r\n const y1 = line.startY;\r\n const x2 = line.endX;\r\n const y2 = line.endY;\r\n\r\n const A = newControlX - x1;\r\n const B = newControlY - y1;\r\n const C = x2 - x1;\r\n const D = y2 - y1;\r\n\r\n const dot = A * C + B * D;\r\n const len_sq = C * C + D * D;\r\n let param = -1;\r\n\r\n if (len_sq !== 0) {\r\n param = dot / len_sq;\r\n }\r\n\r\n let xx, yy;\r\n\r\n if (param < 0) {\r\n xx = x1;\r\n yy = y1;\r\n } else if (param > 1) {\r\n xx = x2;\r\n yy = y2;\r\n } else {\r\n xx = x1 + param * C;\r\n yy = y1 + param * D;\r\n }\r\n\r\n const dx = newControlX - xx;\r\n const dy = newControlY - yy;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n // Threshold for snapping back to straight line\r\n const snapToStraightThreshold = 15;\r\n\r\n if (distance < snapToStraightThreshold) {\r\n line.updateControlPoint(undefined, undefined);\r\n } else {\r\n line.updateControlPoint(newControlX, newControlY);\r\n }\r\n }\r\n\r\n this._core.rerender();\r\n }\r\n\r\n /**\r\n * Converts world coordinates to a line's local coordinate system.\r\n */\r\n private worldToLineLocal(line: KritzelLine, worldX: number, worldY: number): { x: number; y: number } {\r\n const dx = (worldX - line.translateX) * line.scale;\r\n const dy = (worldY - line.translateY) * line.scale;\r\n\r\n const cx = line.totalWidth / 2;\r\n const cy = line.totalHeight / 2;\r\n\r\n const cos = Math.cos(-line.rotation);\r\n const sin = Math.sin(-line.rotation);\r\n\r\n const rotatedX = (dx - cx) * cos - (dy - cy) * sin + cx;\r\n const rotatedY = (dx - cx) * sin + (dy - cy) * cos + cy;\r\n\r\n return {\r\n x: rotatedX + line.x,\r\n y: rotatedY + line.y,\r\n };\r\n }\r\n\r\n /**\r\n * Converts a line's local coordinate system to world coordinates.\r\n */\r\n private lineLocalToWorld(line: KritzelLine, localX: number, localY: number): { x: number; y: number } {\r\n const px = localX - line.x;\r\n const py = localY - line.y;\r\n\r\n const cx = line.totalWidth / 2;\r\n const cy = line.totalHeight / 2;\r\n\r\n const cos = Math.cos(line.rotation);\r\n const sin = Math.sin(line.rotation);\r\n\r\n const rotatedX = (px - cx) * cos - (py - cy) * sin + cx;\r\n const rotatedY = (px - cx) * sin + (py - cy) * cos + cy;\r\n\r\n return {\r\n x: rotatedX / line.scale + line.translateX,\r\n y: rotatedY / line.scale + line.translateY,\r\n };\r\n }\r\n\r\n private updateLineEndpoint(line: KritzelLine, startX: number, startY: number, endX: number, endY: number): void {\r\n // Calculate new bounding box using the static method that accounts for curve extrema\r\n const { minX, minY, maxX, maxY } = KritzelLine.calculateBoundingBox(\r\n startX,\r\n startY,\r\n endX,\r\n endY,\r\n line.controlX,\r\n line.controlY,\r\n line.strokeWidth,\r\n );\r\n\r\n const newWidth = maxX - minX;\r\n const newHeight = maxY - minY;\r\n\r\n // Calculate old bounding box\r\n const {\r\n minX: oldMinX,\r\n minY: oldMinY,\r\n maxX: oldMaxX,\r\n maxY: oldMaxY,\r\n } = KritzelLine.calculateBoundingBox(\r\n this.initialStartX,\r\n this.initialStartY,\r\n this.initialEndX,\r\n this.initialEndY,\r\n this.initialControlX,\r\n this.initialControlY,\r\n line.strokeWidth,\r\n );\r\n\r\n const oldWidth = oldMaxX - oldMinX;\r\n const oldHeight = oldMaxY - oldMinY;\r\n\r\n // Calculate center shift in local space\r\n const shiftX = minX - oldMinX;\r\n const shiftY = minY - oldMinY;\r\n\r\n const deltaCx = shiftX + (newWidth - oldWidth) / 2;\r\n const deltaCy = shiftY + (newHeight - oldHeight) / 2;\r\n\r\n // Convert the center shift to world coordinates\r\n const rotation = line.rotation;\r\n const cos = Math.cos(rotation);\r\n const sin = Math.sin(rotation);\r\n const scale = 1 / line.scale;\r\n\r\n const rotatedDeltaCx = deltaCx * cos - deltaCy * sin;\r\n const rotatedDeltaCy = deltaCx * sin + deltaCy * cos;\r\n\r\n // Calculate new translate\r\n const newTranslateX = this.initialTranslateX + scale * (oldWidth - newWidth) / 2 + scale * rotatedDeltaCx;\r\n const newTranslateY = this.initialTranslateY + scale * (oldHeight - newHeight) / 2 + scale * rotatedDeltaCy;\r\n\r\n // Update the line properties\r\n line.startX = startX;\r\n line.startY = startY;\r\n line.endX = endX;\r\n line.endY = endY;\r\n line.x = minX;\r\n line.y = minY;\r\n line.width = newWidth;\r\n line.height = newHeight;\r\n\r\n // Adjust translateX/Y to compensate for the bounding box shift\r\n line.translateX = newTranslateX;\r\n line.translateY = newTranslateY;\r\n\r\n // Clear cached adjusted points\r\n (line as unknown as { _adjustedPoints: number[][] | null })._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(line);\r\n }\r\n\r\n handlePointerUp(_event: PointerEvent): void {\r\n if (this._core.store.state.isLineHandleDragging) {\r\n const line = this.getSelectedLine();\r\n const handleType = this._core.store.state.lineHandleType;\r\n\r\n if (line && this.hasMoved) {\r\n // If we were snapped to a target, create the anchor\r\n if (this.currentSnapTarget && (handleType === 'start' || handleType === 'end')) {\r\n this._core.anchorManager.setAnchor(line.id, handleType, this.currentSnapTarget.objectId);\r\n }\r\n\r\n // Refresh the selection group dimensions after line endpoint change\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup) {\r\n selectionGroup.refreshObjectDimensions();\r\n selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n\r\n this._core.store.state.isLineHandleDragging = false;\r\n this.reset();\r\n this._core.rerender();\r\n }\r\n }\r\n\r\n private getSelectedLine(): KritzelLine | null {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (!selectionGroup || selectionGroup.objects.length !== 1) {\r\n return null;\r\n }\r\n\r\n const object = selectionGroup.objects[0];\r\n if (object instanceof KritzelLine) {\r\n return object;\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n"]}
@@ -30,7 +30,7 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
30
30
  if (event.pointerType === 'mouse') {
31
31
  if (KritzelEventHelper.isLeftClick(event)) {
32
32
  const selectionGroup = this._core.store.selectionGroup;
33
- if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected) {
33
+ if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected && !this._core.store.state.isLineHandleSelected) {
34
34
  const clientX = event.clientX - this._core.store.offsetX;
35
35
  const clientY = event.clientY - this._core.store.offsetY;
36
36
  this._core.store.state.isDragging = true;
@@ -56,7 +56,7 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
56
56
  return;
57
57
  }
58
58
  const selectionGroup = this._core.store.selectionGroup;
59
- if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected) {
59
+ if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected && !this._core.store.state.isLineHandleSelected) {
60
60
  const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);
61
61
  const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);
62
62
  this.dragStartX = x;
@@ -1 +1 @@
1
- {"version":3,"file":"move.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/move.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEventHelper } from '../../helpers/event.helper';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { KritzelCore } from '../core/core.class';\r\nexport class KritzelMoveHandler extends KritzelBaseHandler {\r\n dragStartX: number;\r\n dragStartY: number;\r\n\r\n startX: number;\r\n startY: number;\r\n\r\n endX: number;\r\n endY: number;\r\n\r\n hasMoved: boolean = false;\r\n private trackedPointerId: number | null = null;\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private reset() {\r\n this.dragStartX = 0;\r\n this.dragStartY = 0;\r\n this.startX = 0;\r\n this.startY = 0;\r\n this.endX = 0;\r\n this.endY = 0;\r\n this.hasMoved = false;\r\n this.trackedPointerId = null;\r\n }\r\n\r\n cancelPendingDrag(): void {\r\n this._core.store.state.isDragging = false;\r\n this.reset();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent) {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event)) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this._core.store.state.isDragging = true;\r\n this.dragStartX = clientX;\r\n this.dragStartY = clientY;\r\n this.startX = this.dragStartX;\r\n this.startY = this.dragStartY;\r\n this.trackedPointerId = event.pointerId;\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (this._core.store.state.pointers.size === 1) {\r\n if (this._core.store.state.isScaling) {\r\n this.trackedPointerId = null;\r\n return;\r\n }\r\n\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected) {\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n this.dragStartX = x;\r\n this.dragStartY = y;\r\n this.startX = x;\r\n this.startY = y;\r\n this.trackedPointerId = event.pointerId;\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent) {\r\n if (this.trackedPointerId === null || this.trackedPointerId !== event.pointerId) {\r\n return;\r\n }\r\n\r\n if (event.pointerType === 'mouse') {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (this._core.store.state.isDragging && selectionGroup) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this.endX = clientX;\r\n this.endY = clientY;\r\n\r\n const moveDeltaX = Math.abs(clientX - this.startX);\r\n const moveDeltaY = Math.abs(clientY - this.startY);\r\n const moveThreshold = 5;\r\n\r\n if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {\r\n\r\n selectionGroup.move(clientX, clientY, this.dragStartX, this.dragStartY);\r\n\r\n this.dragStartX = clientX;\r\n this.dragStartY = clientY;\r\n this.hasMoved = true;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const selectionGroup = this._core.store.selectionGroup;\r\n\r\n if (\r\n this._core.store.state.pointers.size === 1 &&\r\n selectionGroup &&\r\n !this._core.store.state.isResizeHandleSelected &&\r\n !this._core.store.state.isRotationHandleSelected &&\r\n !this._core.store.state.isScaling\r\n ) {\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n this._core.store.state.isDragging = true;\r\n this.endX = x;\r\n this.endY = y;\r\n\r\n const moveDeltaX = Math.abs(x - this.startX);\r\n const moveDeltaY = Math.abs(y - this.startY);\r\n const moveThreshold = 5;\r\n\r\n if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n\r\n selectionGroup.move(x, y, this.dragStartX, this.dragStartY);\r\n\r\n this.dragStartX = x;\r\n this.dragStartY = y;\r\n this.hasMoved = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent) {\r\n if (this.trackedPointerId === null || this.trackedPointerId !== event.pointerId) {\r\n return;\r\n }\r\n\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isDragging) {\r\n this._core.store.state.isDragging = false;\r\n\r\n if (this.hasMoved) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n if (this._core.store.state.isDragging) {\r\n this._core.store.state.isDragging = false;\r\n\r\n if (this.hasMoved) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n }\r\n\r\n this.reset();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"move.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/move.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEventHelper } from '../../helpers/event.helper';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { KritzelCore } from '../core/core.class';\r\nexport class KritzelMoveHandler extends KritzelBaseHandler {\r\n dragStartX: number;\r\n dragStartY: number;\r\n\r\n startX: number;\r\n startY: number;\r\n\r\n endX: number;\r\n endY: number;\r\n\r\n hasMoved: boolean = false;\r\n private trackedPointerId: number | null = null;\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private reset() {\r\n this.dragStartX = 0;\r\n this.dragStartY = 0;\r\n this.startX = 0;\r\n this.startY = 0;\r\n this.endX = 0;\r\n this.endY = 0;\r\n this.hasMoved = false;\r\n this.trackedPointerId = null;\r\n }\r\n\r\n cancelPendingDrag(): void {\r\n this._core.store.state.isDragging = false;\r\n this.reset();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent) {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event)) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected && !this._core.store.state.isLineHandleSelected) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this._core.store.state.isDragging = true;\r\n this.dragStartX = clientX;\r\n this.dragStartY = clientY;\r\n this.startX = this.dragStartX;\r\n this.startY = this.dragStartY;\r\n this.trackedPointerId = event.pointerId;\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (this._core.store.state.pointers.size === 1) {\r\n if (this._core.store.state.isScaling) {\r\n this.trackedPointerId = null;\r\n return;\r\n }\r\n\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected && !this._core.store.state.isLineHandleSelected) {\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n this.dragStartX = x;\r\n this.dragStartY = y;\r\n this.startX = x;\r\n this.startY = y;\r\n this.trackedPointerId = event.pointerId;\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent) {\r\n if (this.trackedPointerId === null || this.trackedPointerId !== event.pointerId) {\r\n return;\r\n }\r\n\r\n if (event.pointerType === 'mouse') {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (this._core.store.state.isDragging && selectionGroup) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this.endX = clientX;\r\n this.endY = clientY;\r\n\r\n const moveDeltaX = Math.abs(clientX - this.startX);\r\n const moveDeltaY = Math.abs(clientY - this.startY);\r\n const moveThreshold = 5;\r\n\r\n if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {\r\n\r\n selectionGroup.move(clientX, clientY, this.dragStartX, this.dragStartY);\r\n\r\n this.dragStartX = clientX;\r\n this.dragStartY = clientY;\r\n this.hasMoved = true;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const selectionGroup = this._core.store.selectionGroup;\r\n\r\n if (\r\n this._core.store.state.pointers.size === 1 &&\r\n selectionGroup &&\r\n !this._core.store.state.isResizeHandleSelected &&\r\n !this._core.store.state.isRotationHandleSelected &&\r\n !this._core.store.state.isScaling\r\n ) {\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n this._core.store.state.isDragging = true;\r\n this.endX = x;\r\n this.endY = y;\r\n\r\n const moveDeltaX = Math.abs(x - this.startX);\r\n const moveDeltaY = Math.abs(y - this.startY);\r\n const moveThreshold = 5;\r\n\r\n if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n\r\n selectionGroup.move(x, y, this.dragStartX, this.dragStartY);\r\n\r\n this.dragStartX = x;\r\n this.dragStartY = y;\r\n this.hasMoved = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent) {\r\n if (this.trackedPointerId === null || this.trackedPointerId !== event.pointerId) {\r\n return;\r\n }\r\n\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isDragging) {\r\n this._core.store.state.isDragging = false;\r\n\r\n if (this.hasMoved) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n if (this._core.store.state.isDragging) {\r\n this._core.store.state.isDragging = false;\r\n\r\n if (this.hasMoved) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n }\r\n\r\n this.reset();\r\n }\r\n}\r\n"]}