7
7
@touchstart =" startDrag"
8
8
@touchmove =" drag"
9
9
@touchend =" stopDrag"
10
+ @gesturestart =" startGesture"
11
+ @gesturechange =" gesture"
12
+ @gestureend =" stopGesture"
10
13
>
11
14
<slot ></slot >
12
15
</div >
@@ -30,6 +33,20 @@ import { clamp } from "@src/math";
30
33
import { angleUnits } from " @src/parsing/units" ;
31
34
import { get } from " http" ;
32
35
36
+ const normalizeAngle = (angle : number , unit : (typeof angleUnits )[number ]): number => {
37
+ switch (unit ) {
38
+ case " rad" :
39
+ return angle % (2 * Math .PI );
40
+ case " grad" :
41
+ return angle % 400 ;
42
+ case " turn" :
43
+ return angle % 1 ;
44
+ default :
45
+ case " deg" :
46
+ return angle % 360 ;
47
+ }
48
+ };
49
+
33
50
type PressedKeys = {
34
51
x: boolean ;
35
52
y: boolean ;
@@ -70,6 +87,16 @@ const getDefaultPreviousMousePosition = () => {
70
87
71
88
let previousMousePosition = $ref (getDefaultPreviousMousePosition ());
72
89
90
+ const getDefaultGestureState = () => {
91
+ return {
92
+ x: 0 ,
93
+ y: 0 ,
94
+ scale: 1 ,
95
+ };
96
+ };
97
+
98
+ let previousGestureState = $ref (getDefaultGestureState ());
99
+
73
100
let pressedKeys = $ref <PressedKeys >({
74
101
x: false ,
75
102
y: false ,
@@ -123,18 +150,20 @@ const stopDrag = (event: MouseEvent | TouchEvent) => {
123
150
isDragging = false ;
124
151
};
125
152
126
- const normalizeAngle = (angle : number , unit : (typeof angleUnits )[number ]): number => {
127
- switch (unit ) {
128
- case " rad" :
129
- return angle % (2 * Math .PI );
130
- case " grad" :
131
- return angle % 400 ;
132
- case " turn" :
133
- return angle % 1 ;
134
- default :
135
- case " deg" :
136
- return angle % 360 ;
137
- }
153
+ const startGesture = (event : any ) => {
154
+ event .preventDefault ();
155
+
156
+ isTouching = true ;
157
+
158
+ previousGestureState = {
159
+ x: event .screenX ,
160
+ y: event .screenY ,
161
+ scale: event .scale ?? 1 ,
162
+ };
163
+ };
164
+
165
+ const stopGesture = () => {
166
+ isTouching = false ;
138
167
};
139
168
140
169
const updateTransform = (
@@ -218,6 +247,32 @@ const drag = (event: MouseEvent | TouchEvent) => {
218
247
previousMousePosition = { x , y };
219
248
};
220
249
250
+ const gesture = (event : any ) => {
251
+ if (! isTouching ) return ;
252
+
253
+ const { screenX, screenY, scale } = event ;
254
+
255
+ const deltaX = screenX - previousGestureState .x ;
256
+ const deltaY = screenY - previousGestureState .y ;
257
+ const deltaScale = scale - previousGestureState .scale ;
258
+
259
+ if (
260
+ Math .abs (deltaX ) < 1e-4 &&
261
+ Math .abs (deltaY ) < 1e-4 &&
262
+ Math .abs (deltaScale ) < 1e-4
263
+ )
264
+ return ;
265
+
266
+ updateTranslation (" x" , deltaX );
267
+ updateTranslation (" y" , deltaY );
268
+
269
+ updateScale (" x" , deltaScale );
270
+ updateScale (" y" , deltaScale );
271
+ updateScale (" z" , deltaScale );
272
+
273
+ previousGestureState = { x: screenX , y: screenY , scale };
274
+ };
275
+
221
276
const handleAxisSpecificDrag = (deltaX : number , deltaY : number ) => {
222
277
const delta = Math .abs (deltaX ) > Math .abs (deltaY ) ? deltaX : deltaY ;
223
278
@@ -342,8 +397,12 @@ onMounted(() => {
342
397
useEventListener (window , " mouseleave" , stopDrag );
343
398
344
399
useEventListener (window , " touchmove" , drag );
345
- // useEventListener(window, "touchstart", startDrag);
346
- // useEventListener(window, "touchend", stopDrag);
400
+ useEventListener (window , " touchstart" , startDrag );
401
+ useEventListener (window , " touchend" , stopDrag );
402
+
403
+ useEventListener (window , " gestureStart" , startGesture );
404
+ useEventListener (window , " gestureChange" , gesture );
405
+ useEventListener (window , " gestureEnd" , stopGesture );
347
406
348
407
resume ();
349
408
});
@@ -366,6 +425,10 @@ onUnmounted(() => {
366
425
window .removeEventListener (" touchstart" , startDrag );
367
426
window .removeEventListener (" touchend" , stopDrag );
368
427
428
+ window .removeEventListener (" gestureStart" , startGesture );
429
+ window .removeEventListener (" gestureChange" , gesture );
430
+ window .removeEventListener (" gestureEnd" , stopGesture );
431
+
369
432
pause ();
370
433
});
371
434
0 commit comments