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.
- package/dist/cjs/{default-text-tool.config-D10FksvZ.js → default-line-tool.config-D1Ns0NmM.js} +3156 -929
- package/dist/cjs/default-line-tool.config-D1Ns0NmM.js.map +1 -0
- package/dist/cjs/index.cjs.js +131 -126
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/cjs/kritzel-brush-style.cjs.entry.js +1 -1
- package/dist/cjs/kritzel-brush-style.entry.cjs.js.map +1 -1
- package/dist/cjs/kritzel-color_22.cjs.entry.js +538 -198
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/stencil.cjs.js +1 -1
- package/dist/collection/classes/core/core.class.js +140 -3
- package/dist/collection/classes/core/core.class.js.map +1 -1
- package/dist/collection/classes/core/reviver.class.js +8 -0
- package/dist/collection/classes/core/reviver.class.js.map +1 -1
- package/dist/collection/classes/core/store.class.js +8 -0
- package/dist/collection/classes/core/store.class.js.map +1 -1
- package/dist/collection/classes/handlers/line-handle.handler.js +383 -0
- package/dist/collection/classes/handlers/line-handle.handler.js.map +1 -0
- package/dist/collection/classes/handlers/move.handler.js +2 -2
- package/dist/collection/classes/handlers/move.handler.js.map +1 -1
- package/dist/collection/classes/handlers/resize.handler.js +42 -34
- package/dist/collection/classes/handlers/resize.handler.js.map +1 -1
- package/dist/collection/classes/handlers/rotation.handler.js +12 -8
- package/dist/collection/classes/handlers/rotation.handler.js.map +1 -1
- package/dist/collection/classes/managers/anchor.manager.js +874 -0
- package/dist/collection/classes/managers/anchor.manager.js.map +1 -0
- package/dist/collection/classes/managers/cursor.manager.js +117 -0
- package/dist/collection/classes/managers/cursor.manager.js.map +1 -0
- package/dist/collection/classes/objects/base-object.class.js +4 -2
- package/dist/collection/classes/objects/base-object.class.js.map +1 -1
- package/dist/collection/classes/objects/line.class.js +564 -0
- package/dist/collection/classes/objects/line.class.js.map +1 -0
- package/dist/collection/classes/objects/selection-group.class.js +4 -0
- package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
- package/dist/collection/classes/registries/icon-registry.class.js +7 -1
- package/dist/collection/classes/registries/icon-registry.class.js.map +1 -1
- package/dist/collection/classes/tools/line-tool.class.js +172 -0
- package/dist/collection/classes/tools/line-tool.class.js.map +1 -0
- package/dist/collection/classes/tools/selection-tool.class.js +41 -8
- package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
- package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -1
- package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +11 -2
- package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.css +0 -14
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +163 -21
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
- package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.css +0 -1
- package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
- package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +1 -1
- package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +1 -1
- package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.css +1 -1
- package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
- package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.css +1 -1
- package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +1 -1
- package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.css +1 -1
- package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
- package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -1
- package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.css +1 -2
- package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -2
- package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
- package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.css +1 -1
- package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -1
- package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +1 -1
- package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -1
- package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +4 -4
- package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.css +1 -2
- package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +1 -1
- package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.css +1 -1
- package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +2 -2
- package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.css +1 -1
- package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +2 -2
- package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +4 -4
- package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +3 -3
- package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.css +1 -1
- package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
- package/dist/collection/configs/default-engine-config.js +10 -0
- package/dist/collection/configs/default-engine-config.js.map +1 -1
- package/dist/collection/configs/default-line-tool.config.js +34 -0
- package/dist/collection/configs/default-line-tool.config.js.map +1 -0
- package/dist/collection/helpers/cursor.helper.js +58 -0
- package/dist/collection/helpers/cursor.helper.js.map +1 -0
- package/dist/collection/helpers/geometry.helper.js +42 -0
- package/dist/collection/helpers/geometry.helper.js.map +1 -1
- package/dist/collection/index.js +6 -0
- package/dist/collection/index.js.map +1 -1
- package/dist/collection/interfaces/anchor.interface.js +2 -0
- package/dist/collection/interfaces/anchor.interface.js.map +1 -0
- package/dist/collection/interfaces/arrow-head.interface.js +2 -0
- package/dist/collection/interfaces/arrow-head.interface.js.map +1 -0
- package/dist/collection/interfaces/engine-state.interface.js.map +1 -1
- package/dist/collection/interfaces/line-options.interface.js +2 -0
- package/dist/collection/interfaces/line-options.interface.js.map +1 -0
- package/dist/collection/interfaces/toolbar-control.interface.js.map +1 -1
- package/dist/components/index.js +4 -4
- package/dist/components/kritzel-brush-style.js +3 -3
- package/dist/components/kritzel-brush-style.js.map +1 -1
- package/dist/components/kritzel-color-palette.js +1 -1
- package/dist/components/kritzel-color.js +1 -1
- package/dist/components/kritzel-context-menu.js +1 -1
- package/dist/components/kritzel-control-brush-config.js +1 -1
- package/dist/components/kritzel-control-text-config.js +1 -1
- package/dist/components/kritzel-controls.js +1 -1
- package/dist/components/kritzel-cursor-trail.js +1 -1
- package/dist/components/kritzel-dropdown.js +1 -1
- package/dist/components/kritzel-editor.js +64 -23
- package/dist/components/kritzel-editor.js.map +1 -1
- package/dist/components/kritzel-engine.js +1 -1
- package/dist/components/kritzel-font-family.js +1 -1
- package/dist/components/kritzel-font-size.js +1 -1
- package/dist/components/kritzel-font.js +1 -1
- package/dist/components/kritzel-icon.js +1 -1
- package/dist/components/kritzel-menu-item.js +1 -1
- package/dist/components/kritzel-menu.js +1 -1
- package/dist/components/kritzel-portal.js +1 -1
- package/dist/components/kritzel-split-button.js +1 -1
- package/dist/components/kritzel-stroke-size.js +1 -1
- package/dist/components/kritzel-tooltip.js +1 -1
- package/dist/components/kritzel-utility-panel.js +1 -1
- package/dist/components/kritzel-workspace-manager.js +1 -1
- package/dist/components/{p-TdCTkEu0.js → p-7_lwv0zQ.js} +7 -7
- package/dist/components/p-7_lwv0zQ.js.map +1 -0
- package/dist/components/{p-CTP479Lf.js → p-9Fzdviju.js} +6 -6
- package/dist/components/{p-CTP479Lf.js.map → p-9Fzdviju.js.map} +1 -1
- package/dist/components/{p-DDmSxM5f.js → p-B6r22FSC.js} +5 -5
- package/dist/components/p-B6r22FSC.js.map +1 -0
- package/dist/components/{p-CLt3HMl6.js → p-B_3OZeom.js} +3 -3
- package/dist/components/{p-CLt3HMl6.js.map → p-B_3OZeom.js.map} +1 -1
- package/dist/components/{p-CIXPLjCu.js → p-BdwB-S9G.js} +3 -3
- package/dist/components/p-BdwB-S9G.js.map +1 -0
- package/dist/components/p-BixlbUD7.js +104 -0
- package/dist/components/p-BixlbUD7.js.map +1 -0
- package/dist/components/{p-D1uj4A4F.js → p-Brd9SxWS.js} +5 -5
- package/dist/components/p-Brd9SxWS.js.map +1 -0
- package/dist/components/{p-Ddh40W3x.js → p-CDteBYm9.js} +9 -9
- package/dist/components/p-CDteBYm9.js.map +1 -0
- package/dist/components/{p-BgznZoBH.js → p-CFH6XRL5.js} +5 -5
- package/dist/components/p-CFH6XRL5.js.map +1 -0
- package/dist/components/{p-B4kxkVe-.js → p-CRGwaUcp.js} +5 -5
- package/dist/components/p-CRGwaUcp.js.map +1 -0
- package/dist/components/{p-uuRJU2R1.js → p-Ck4lGnmt.js} +3 -3
- package/dist/components/{p-uuRJU2R1.js.map → p-Ck4lGnmt.js.map} +1 -1
- package/dist/components/{p-CK6no3mi.js → p-CkD1PQQX.js} +6 -6
- package/dist/components/{p-CK6no3mi.js.map → p-CkD1PQQX.js.map} +1 -1
- package/dist/components/{p-BQg4YML7.js → p-Cqr0Bah5.js} +12 -12
- package/dist/components/p-Cqr0Bah5.js.map +1 -0
- package/dist/components/{p-DTHqEUDc.js → p-CuhOrcET.js} +2861 -390
- package/dist/components/p-CuhOrcET.js.map +1 -0
- package/dist/components/{p-DAfkuR8U.js → p-CvLFRlQU.js} +5 -5
- package/dist/components/p-CvLFRlQU.js.map +1 -0
- package/dist/components/{p-1lIHoOlH.js → p-DKwJJuFb.js} +19 -19
- package/dist/components/p-DKwJJuFb.js.map +1 -0
- package/dist/components/{p-CsA9M6me.js → p-DZ7kxJUx.js} +8 -8
- package/dist/components/p-DZ7kxJUx.js.map +1 -0
- package/dist/components/{p-D4yvhd1d.js → p-LAsVgL2e.js} +4 -4
- package/dist/components/{p-D4yvhd1d.js.map → p-LAsVgL2e.js.map} +1 -1
- package/dist/components/{p-D5Wq4x4r.js → p-OFrACpZf.js} +3 -3
- package/dist/components/{p-D5Wq4x4r.js.map → p-OFrACpZf.js.map} +1 -1
- package/dist/components/{p-C2sWlNsJ.js → p-dMCB4tJA.js} +5 -5
- package/dist/components/p-dMCB4tJA.js.map +1 -0
- package/dist/components/{p-CBYBurdY.js → p-sokRZ7Vn.js} +49 -5
- package/dist/components/p-sokRZ7Vn.js.map +1 -0
- package/dist/esm/{default-text-tool.config-DzqpOikl.js → default-line-tool.config-C35m-d1Y.js} +3150 -930
- package/dist/esm/default-line-tool.config-C35m-d1Y.js.map +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/kritzel-brush-style.entry.js +1 -1
- package/dist/esm/kritzel-brush-style.entry.js.map +1 -1
- package/dist/esm/kritzel-color_22.entry.js +457 -117
- package/dist/esm/loader.js +1 -1
- package/dist/esm/stencil.js +1 -1
- package/dist/stencil/index.esm.js +1 -1
- package/dist/stencil/kritzel-brush-style.entry.esm.js.map +1 -1
- package/dist/stencil/p-385bab97.entry.js +2 -0
- package/dist/stencil/{p-d702c5af.entry.js.map → p-385bab97.entry.js.map} +1 -1
- package/dist/stencil/p-C35m-d1Y.js +2 -0
- package/dist/stencil/p-C35m-d1Y.js.map +1 -0
- package/dist/stencil/p-d142ef46.entry.js +10 -0
- package/dist/stencil/p-d142ef46.entry.js.map +1 -0
- package/dist/stencil/stencil.esm.js +1 -1
- package/dist/types/classes/core/core.class.d.ts +18 -0
- package/dist/types/classes/core/store.class.d.ts +3 -0
- package/dist/types/classes/handlers/line-handle.handler.d.ts +34 -0
- package/dist/types/classes/managers/anchor.manager.d.ts +160 -0
- package/dist/types/classes/managers/cursor.manager.d.ts +43 -0
- package/dist/types/classes/objects/line.class.d.ts +98 -0
- package/dist/types/classes/tools/line-tool.class.d.ts +17 -0
- package/dist/types/classes/tools/selection-tool.class.d.ts +4 -0
- package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +4 -2
- package/dist/types/components.d.ts +7 -5
- package/dist/types/configs/default-line-tool.config.d.ts +2 -0
- package/dist/types/helpers/cursor.helper.d.ts +22 -0
- package/dist/types/helpers/geometry.helper.d.ts +10 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/interfaces/anchor.interface.d.ts +137 -0
- package/dist/types/interfaces/arrow-head.interface.d.ts +26 -0
- package/dist/types/interfaces/engine-state.interface.d.ts +15 -0
- package/dist/types/interfaces/line-options.interface.d.ts +21 -0
- package/dist/types/interfaces/toolbar-control.interface.d.ts +17 -1
- package/package.json +1 -1
- package/dist/cjs/default-text-tool.config-D10FksvZ.js.map +0 -1
- package/dist/components/p-1lIHoOlH.js.map +0 -1
- package/dist/components/p-B4kxkVe-.js.map +0 -1
- package/dist/components/p-BQg4YML7.js.map +0 -1
- package/dist/components/p-BgznZoBH.js.map +0 -1
- package/dist/components/p-Bhtn9qay.js +0 -98
- package/dist/components/p-Bhtn9qay.js.map +0 -1
- package/dist/components/p-C2sWlNsJ.js.map +0 -1
- package/dist/components/p-CBYBurdY.js.map +0 -1
- package/dist/components/p-CIXPLjCu.js.map +0 -1
- package/dist/components/p-CsA9M6me.js.map +0 -1
- package/dist/components/p-D1uj4A4F.js.map +0 -1
- package/dist/components/p-DAfkuR8U.js.map +0 -1
- package/dist/components/p-DDmSxM5f.js.map +0 -1
- package/dist/components/p-DTHqEUDc.js.map +0 -1
- package/dist/components/p-Ddh40W3x.js.map +0 -1
- package/dist/components/p-TdCTkEu0.js.map +0 -1
- package/dist/esm/default-text-tool.config-DzqpOikl.js.map +0 -1
- package/dist/stencil/p-5475442e.entry.js +0 -10
- package/dist/stencil/p-5475442e.entry.js.map +0 -1
- package/dist/stencil/p-DzqpOikl.js +0 -2
- package/dist/stencil/p-DzqpOikl.js.map +0 -1
- 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"]}
|