react-native-gesture-handler 2.6.0 → 2.6.1
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/android/build.gradle +2 -2
- package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
- package/lib/commonjs/EnableExperimentalWebImplementation.js +7 -0
- package/lib/commonjs/EnableExperimentalWebImplementation.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.js +1 -1
- package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.macos.js +20 -9
- package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.web.js +23 -10
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.web.js +1 -1
- package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
- package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
- package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -5
- package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/commonjs/handlers/gestures/eventReceiver.js +14 -20
- package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gestureStateManager.web.js +32 -0
- package/lib/commonjs/handlers/gestures/gestureStateManager.web.js.map +1 -0
- package/lib/commonjs/web/detectors/RotationGestureDetector.js +13 -17
- package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -1
- package/lib/commonjs/web/detectors/ScaleGestureDetector.js +3 -14
- package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -1
- package/lib/commonjs/web/handlers/FlingGestureHandler.js +37 -12
- package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +282 -79
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js +23 -18
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/ManualGestureHandler.js +51 -0
- package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +81 -22
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js +57 -40
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PinchGestureHandler.js +43 -34
- package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/RotationGestureHandler.js +45 -39
- package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/TapGestureHandler.js +52 -50
- package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
- package/lib/commonjs/web/interfaces.js +22 -1
- package/lib/commonjs/web/interfaces.js.map +1 -1
- package/lib/commonjs/web/tools/EventManager.js +40 -96
- package/lib/commonjs/web/tools/EventManager.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +109 -30
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
- package/lib/commonjs/web/tools/InteractionManager.js +24 -10
- package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
- package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
- package/lib/commonjs/web/tools/PointerEventManager.js +130 -0
- package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -0
- package/lib/commonjs/web/tools/PointerTracker.js +97 -7
- package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
- package/lib/commonjs/web/tools/TouchEventManager.js +138 -0
- package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -0
- package/lib/commonjs/web/utils.js +15 -0
- package/lib/commonjs/web/utils.js.map +1 -0
- package/lib/module/EnableExperimentalWebImplementation.js +5 -0
- package/lib/module/EnableExperimentalWebImplementation.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.js +1 -1
- package/lib/module/RNGestureHandlerModule.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.macos.js +19 -10
- package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.web.js +22 -11
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/components/GestureComponents.web.js +1 -1
- package/lib/module/components/GestureComponents.web.js.map +1 -1
- package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
- package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -4
- package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/module/handlers/gestures/eventReceiver.js +14 -20
- package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
- package/lib/module/handlers/gestures/gestureStateManager.web.js +21 -0
- package/lib/module/handlers/gestures/gestureStateManager.web.js.map +1 -0
- package/lib/module/web/detectors/RotationGestureDetector.js +13 -17
- package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -1
- package/lib/module/web/detectors/ScaleGestureDetector.js +3 -14
- package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -1
- package/lib/module/web/handlers/FlingGestureHandler.js +37 -12
- package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +276 -79
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/handlers/LongPressGestureHandler.js +23 -18
- package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/ManualGestureHandler.js +39 -0
- package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/NativeViewGestureHandler.js +80 -22
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PanGestureHandler.js +57 -41
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PinchGestureHandler.js +43 -33
- package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/RotationGestureHandler.js +45 -38
- package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/TapGestureHandler.js +52 -50
- package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
- package/lib/module/web/interfaces.js +19 -0
- package/lib/module/web/interfaces.js.map +1 -1
- package/lib/module/web/tools/EventManager.js +39 -95
- package/lib/module/web/tools/EventManager.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerOrchestrator.js +107 -30
- package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
- package/lib/module/web/tools/InteractionManager.js +24 -10
- package/lib/module/web/tools/InteractionManager.js.map +1 -1
- package/lib/module/web/tools/NodeManager.js.map +1 -1
- package/lib/module/web/tools/PointerEventManager.js +116 -0
- package/lib/module/web/tools/PointerEventManager.js.map +1 -0
- package/lib/module/web/tools/PointerTracker.js +97 -7
- package/lib/module/web/tools/PointerTracker.js.map +1 -1
- package/lib/module/web/tools/TouchEventManager.js +124 -0
- package/lib/module/web/tools/TouchEventManager.js.map +1 -0
- package/lib/module/web/utils.js +8 -0
- package/lib/module/web/utils.js.map +1 -0
- package/lib/typescript/RNGestureHandlerModule.macos.d.ts +5 -2
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +5 -2
- package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +1 -1
- package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +3 -3
- package/lib/typescript/fabric/RNGestureHandlerRootViewNativeComponent.d.ts +3 -2
- package/lib/typescript/handlers/gestures/gestureStateManager.web.d.ts +4 -0
- package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +7 -7
- package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +6 -7
- package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +12 -10
- package/lib/typescript/web/handlers/GestureHandler.d.ts +41 -32
- package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +6 -9
- package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +11 -0
- package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +15 -6
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +15 -23
- package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +11 -12
- package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +12 -12
- package/lib/typescript/web/handlers/TapGestureHandler.d.ts +11 -14
- package/lib/typescript/web/interfaces.d.ts +50 -10
- package/lib/typescript/web/tools/EventManager.d.ts +28 -26
- package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +4 -2
- package/lib/typescript/web/tools/InteractionManager.d.ts +3 -0
- package/lib/typescript/web/tools/NodeManager.d.ts +3 -3
- package/lib/typescript/web/tools/PointerEventManager.d.ts +6 -0
- package/lib/typescript/web/tools/PointerTracker.d.ts +29 -5
- package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -0
- package/lib/typescript/web/utils.d.ts +4 -0
- package/package.json +2 -2
- package/src/EnableExperimentalWebImplementation.ts +9 -0
- package/src/RNGestureHandlerModule.macos.ts +25 -10
- package/src/RNGestureHandlerModule.ts +4 -1
- package/src/RNGestureHandlerModule.web.ts +20 -7
- package/src/components/GestureComponents.web.tsx +1 -1
- package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +2 -12
- package/src/fabric/RNGestureHandlerRootViewNativeComponent.ts +2 -8
- package/src/handlers/gestures/GestureDetector.tsx +0 -1
- package/src/handlers/gestures/eventReceiver.ts +23 -24
- package/src/handlers/gestures/gestureStateManager.web.ts +24 -0
- package/src/web/detectors/RotationGestureDetector.ts +20 -52
- package/src/web/detectors/ScaleGestureDetector.ts +9 -45
- package/src/web/handlers/FlingGestureHandler.ts +45 -22
- package/src/web/handlers/GestureHandler.ts +306 -97
- package/src/web/handlers/LongPressGestureHandler.ts +30 -24
- package/src/web/handlers/ManualGestureHandler.ts +39 -0
- package/src/web/handlers/NativeViewGestureHandler.ts +81 -24
- package/src/web/handlers/PanGestureHandler.ts +68 -53
- package/src/web/handlers/PinchGestureHandler.ts +47 -44
- package/src/web/handlers/RotationGestureHandler.ts +52 -51
- package/src/web/handlers/TapGestureHandler.ts +74 -56
- package/src/web/interfaces.ts +57 -10
- package/src/web/tools/EventManager.ts +58 -148
- package/src/web/tools/GestureHandlerOrchestrator.ts +115 -47
- package/src/web/tools/InteractionManager.ts +25 -9
- package/src/web/tools/NodeManager.ts +6 -6
- package/src/web/tools/PointerEventManager.ts +134 -0
- package/src/web/tools/PointerTracker.ts +120 -10
- package/src/web/tools/TouchEventManager.ts +167 -0
- package/src/web/utils.ts +8 -0
package/src/web/interfaces.ts
CHANGED
|
@@ -30,7 +30,17 @@ export interface Config extends Record<string, ConfigArgs> {
|
|
|
30
30
|
simultaneousHandlers?: Handler[] | null;
|
|
31
31
|
waitFor?: Handler[] | null;
|
|
32
32
|
hitSlop?: HitSlop;
|
|
33
|
+
shouldCancelWhenOutside?: boolean;
|
|
33
34
|
|
|
35
|
+
activateAfterLongPress?: number;
|
|
36
|
+
failOffsetXStart?: number;
|
|
37
|
+
failOffsetYStart?: number;
|
|
38
|
+
failOffsetXEnd?: number;
|
|
39
|
+
failOffsetYEnd?: number;
|
|
40
|
+
activeOffsetXStart?: number;
|
|
41
|
+
activeOffsetXEnd?: number;
|
|
42
|
+
activeOffsetYStart?: number;
|
|
43
|
+
activeOffsetYEnd?: number;
|
|
34
44
|
minPointers?: number;
|
|
35
45
|
maxPointers?: number;
|
|
36
46
|
minDist?: number;
|
|
@@ -41,14 +51,6 @@ export interface Config extends Record<string, ConfigArgs> {
|
|
|
41
51
|
minVelocitySq?: number;
|
|
42
52
|
maxDist?: number;
|
|
43
53
|
maxDistSq?: number;
|
|
44
|
-
failOffsetXStart?: number;
|
|
45
|
-
failOffsetYStart?: number;
|
|
46
|
-
failOffsetXEnd?: number;
|
|
47
|
-
failOffsetYEnd?: number;
|
|
48
|
-
activeOffsetXStart?: number;
|
|
49
|
-
activeOffsetXEnd?: number;
|
|
50
|
-
activeOffsetYStart?: number;
|
|
51
|
-
activeOffsetYEnd?: number;
|
|
52
54
|
numberOfPointers?: number;
|
|
53
55
|
minDurationMs?: number;
|
|
54
56
|
numberOfTaps?: number;
|
|
@@ -56,6 +58,8 @@ export interface Config extends Record<string, ConfigArgs> {
|
|
|
56
58
|
maxDelayMs?: number;
|
|
57
59
|
maxDeltaX?: number;
|
|
58
60
|
maxDeltaY?: number;
|
|
61
|
+
shouldActivateOnStart?: boolean;
|
|
62
|
+
disallowInterruption?: boolean;
|
|
59
63
|
direction?: Directions;
|
|
60
64
|
}
|
|
61
65
|
|
|
@@ -69,26 +73,54 @@ interface NativeEvent extends Record<string, NativeEventArgs> {
|
|
|
69
73
|
oldState?: State;
|
|
70
74
|
}
|
|
71
75
|
|
|
76
|
+
export interface PointerData {
|
|
77
|
+
id: number;
|
|
78
|
+
x: number;
|
|
79
|
+
y: number;
|
|
80
|
+
absoluteX: number;
|
|
81
|
+
absoluteY: number;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
type TouchNativeArgs = number | State | TouchEventType | PointerData[];
|
|
85
|
+
|
|
86
|
+
interface NativeTouchEvent extends Record<string, TouchNativeArgs> {
|
|
87
|
+
handlerTag: number;
|
|
88
|
+
state: State;
|
|
89
|
+
eventType: TouchEventType;
|
|
90
|
+
changedTouches: PointerData[];
|
|
91
|
+
allTouches: PointerData[];
|
|
92
|
+
numberOfTouches: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
72
95
|
export interface ResultEvent extends Record<string, NativeEvent | number> {
|
|
73
96
|
nativeEvent: NativeEvent;
|
|
74
97
|
timeStamp: number;
|
|
75
98
|
}
|
|
76
99
|
|
|
100
|
+
export interface ResultTouchEvent
|
|
101
|
+
extends Record<string, NativeTouchEvent | number> {
|
|
102
|
+
nativeEvent: NativeTouchEvent;
|
|
103
|
+
timeStamp: number;
|
|
104
|
+
}
|
|
105
|
+
|
|
77
106
|
export interface PropsRef {
|
|
78
107
|
onGestureHandlerEvent: () => void;
|
|
79
108
|
onGestureHandlerStateChange: () => void;
|
|
80
109
|
}
|
|
81
110
|
|
|
82
|
-
export interface
|
|
111
|
+
export interface AdaptedEvent {
|
|
83
112
|
x: number;
|
|
84
113
|
y: number;
|
|
85
114
|
offsetX: number;
|
|
86
115
|
offsetY: number;
|
|
87
116
|
pointerId: number;
|
|
88
117
|
eventType: EventTypes;
|
|
89
|
-
pointerType:
|
|
118
|
+
pointerType: PointerType;
|
|
90
119
|
buttons: number;
|
|
91
120
|
time: number;
|
|
121
|
+
allTouches?: TouchList;
|
|
122
|
+
changedTouches?: TouchList;
|
|
123
|
+
touchEventType?: TouchEventType;
|
|
92
124
|
}
|
|
93
125
|
|
|
94
126
|
export enum MouseButtons {
|
|
@@ -112,3 +144,18 @@ export enum EventTypes {
|
|
|
112
144
|
OUT,
|
|
113
145
|
CANCEL,
|
|
114
146
|
}
|
|
147
|
+
|
|
148
|
+
export enum TouchEventType {
|
|
149
|
+
UNDETERMINED,
|
|
150
|
+
DOWN,
|
|
151
|
+
MOVE,
|
|
152
|
+
UP,
|
|
153
|
+
CANCELLED,
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export enum PointerType {
|
|
157
|
+
NONE = 'none',
|
|
158
|
+
MOUSE = 'mouse',
|
|
159
|
+
TOUCH = 'touch',
|
|
160
|
+
PEN = 'pen',
|
|
161
|
+
}
|
|
@@ -1,186 +1,96 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
2
|
+
import { AdaptedEvent, EventTypes, TouchEventType } from '../interfaces';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
private readonly view: HTMLElement;
|
|
4
|
+
export default abstract class EventManager {
|
|
5
|
+
protected readonly view: HTMLElement;
|
|
6
|
+
protected pointersInBounds: number[] = [];
|
|
7
|
+
protected activePointersCounter: number;
|
|
8
8
|
|
|
9
9
|
constructor(view: HTMLElement) {
|
|
10
10
|
this.view = view;
|
|
11
|
+
this.activePointersCounter = 0;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
public setListeners()
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
this.view.addEventListener('pointerup', (event: PointerEvent): void => {
|
|
36
|
-
const adaptedEvent: AdaptedPointerEvent = this.mapEvent(
|
|
37
|
-
event,
|
|
38
|
-
EventTypes.UP
|
|
39
|
-
);
|
|
40
|
-
const target = event.target as HTMLElement;
|
|
41
|
-
|
|
42
|
-
this.onPointerUp(adaptedEvent);
|
|
43
|
-
target.releasePointerCapture(adaptedEvent.pointerId);
|
|
44
|
-
this.removeActivePointer(adaptedEvent.pointerId);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
this.view.addEventListener('pointermove', (event: PointerEvent): void => {
|
|
48
|
-
if (
|
|
49
|
-
event.pointerType === 'mouse' &&
|
|
50
|
-
event.buttons !== MouseButtons.LEFT
|
|
51
|
-
) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const adaptedEvent: AdaptedPointerEvent = this.mapEvent(
|
|
56
|
-
event,
|
|
57
|
-
EventTypes.MOVE
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
const inBounds: boolean = this.isPointerInBounds({
|
|
61
|
-
x: adaptedEvent.x,
|
|
62
|
-
y: adaptedEvent.y,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
const pointerIndex: number = this.activePointers.indexOf(
|
|
66
|
-
adaptedEvent.pointerId
|
|
67
|
-
);
|
|
68
|
-
|
|
69
|
-
if (inBounds) {
|
|
70
|
-
if (pointerIndex < 0) {
|
|
71
|
-
adaptedEvent.eventType = EventTypes.ENTER;
|
|
72
|
-
this.onPointerEnter(adaptedEvent);
|
|
73
|
-
this.addActivePointer(adaptedEvent.pointerId);
|
|
74
|
-
} else {
|
|
75
|
-
this.onPointerMove(adaptedEvent);
|
|
76
|
-
}
|
|
77
|
-
} else {
|
|
78
|
-
if (pointerIndex >= 0) {
|
|
79
|
-
adaptedEvent.eventType = EventTypes.OUT;
|
|
80
|
-
this.onPointerOut(adaptedEvent);
|
|
81
|
-
this.removeActivePointer(adaptedEvent.pointerId);
|
|
82
|
-
} else {
|
|
83
|
-
this.onPointerOutOfBounds(adaptedEvent);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
this.view.addEventListener('pointercancel', (event: PointerEvent): void => {
|
|
89
|
-
event.preventDefault();
|
|
90
|
-
|
|
91
|
-
const adaptedEvent: AdaptedPointerEvent = this.mapEvent(
|
|
92
|
-
event,
|
|
93
|
-
EventTypes.CANCEL
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
this.onPointerCancel(adaptedEvent);
|
|
97
|
-
});
|
|
14
|
+
public abstract setListeners(): void;
|
|
15
|
+
protected abstract mapEvent(
|
|
16
|
+
event: Event,
|
|
17
|
+
eventType: EventTypes,
|
|
18
|
+
index?: number,
|
|
19
|
+
touchEventType?: TouchEventType
|
|
20
|
+
): AdaptedEvent;
|
|
21
|
+
|
|
22
|
+
protected onPointerDown(_event: AdaptedEvent): void {}
|
|
23
|
+
protected onPointerAdd(_event: AdaptedEvent): void {}
|
|
24
|
+
protected onPointerUp(_event: AdaptedEvent): void {}
|
|
25
|
+
protected onPointerRemove(_event: AdaptedEvent): void {}
|
|
26
|
+
protected onPointerMove(_event: AdaptedEvent): void {}
|
|
27
|
+
protected onPointerOut(_event: AdaptedEvent): void {}
|
|
28
|
+
protected onPointerEnter(_event: AdaptedEvent): void {}
|
|
29
|
+
protected onPointerCancel(_event: AdaptedEvent): void {
|
|
30
|
+
// When pointer cancel is triggered and there are more pointers on the view, only one pointer is cancelled
|
|
31
|
+
// Because we want all pointers to be cancelled by that event, we are doing it manually by reseting handler and changing activePointersCounter to 0
|
|
32
|
+
// Events that correspond to removing the pointer (pointerup, touchend) have condition, that they don't perform any action when activePointersCounter
|
|
33
|
+
// is equal to 0. This prevents counter from going to negative values, when pointers are removed from view after one of them has been cancelled
|
|
98
34
|
}
|
|
35
|
+
protected onPointerOutOfBounds(_event: AdaptedEvent): void {}
|
|
99
36
|
|
|
100
|
-
|
|
101
|
-
private onPointerUp(_event: AdaptedPointerEvent): void {}
|
|
102
|
-
private onPointerMove(_event: AdaptedPointerEvent): void {}
|
|
103
|
-
private onPointerOut(_event: AdaptedPointerEvent): void {}
|
|
104
|
-
private onPointerEnter(_event: AdaptedPointerEvent): void {}
|
|
105
|
-
private onPointerCancel(_event: AdaptedPointerEvent): void {}
|
|
106
|
-
private onPointerOutOfBounds(_event: AdaptedPointerEvent): void {}
|
|
107
|
-
|
|
108
|
-
public setOnPointerDown(
|
|
109
|
-
callback: (event: AdaptedPointerEvent) => void
|
|
110
|
-
): void {
|
|
37
|
+
public setOnPointerDown(callback: (event: AdaptedEvent) => void): void {
|
|
111
38
|
this.onPointerDown = callback;
|
|
112
39
|
}
|
|
113
|
-
public
|
|
40
|
+
public setOnPointerAdd(callback: (event: AdaptedEvent) => void): void {
|
|
41
|
+
this.onPointerAdd = callback;
|
|
42
|
+
}
|
|
43
|
+
public setOnPointerUp(callback: (event: AdaptedEvent) => void): void {
|
|
114
44
|
this.onPointerUp = callback;
|
|
115
45
|
}
|
|
116
|
-
public
|
|
117
|
-
|
|
118
|
-
|
|
46
|
+
public setOnPointerRemove(callback: (event: AdaptedEvent) => void): void {
|
|
47
|
+
this.onPointerRemove = callback;
|
|
48
|
+
}
|
|
49
|
+
public setOnPointerMove(callback: (event: AdaptedEvent) => void): void {
|
|
119
50
|
this.onPointerMove = callback;
|
|
120
51
|
}
|
|
121
|
-
public setOnPointerOut(callback: (event:
|
|
52
|
+
public setOnPointerOut(callback: (event: AdaptedEvent) => void): void {
|
|
122
53
|
this.onPointerOut = callback;
|
|
123
54
|
}
|
|
124
|
-
public setOnPointerEnter(
|
|
125
|
-
callback: (event: AdaptedPointerEvent) => void
|
|
126
|
-
): void {
|
|
55
|
+
public setOnPointerEnter(callback: (event: AdaptedEvent) => void): void {
|
|
127
56
|
this.onPointerEnter = callback;
|
|
128
57
|
}
|
|
129
|
-
public setOnPointerCancel(
|
|
130
|
-
callback: (event: AdaptedPointerEvent) => void
|
|
131
|
-
): void {
|
|
58
|
+
public setOnPointerCancel(callback: (event: AdaptedEvent) => void): void {
|
|
132
59
|
this.onPointerCancel = callback;
|
|
133
60
|
}
|
|
134
61
|
public setOnPointerOutOfBounds(
|
|
135
|
-
callback: (event:
|
|
62
|
+
callback: (event: AdaptedEvent) => void
|
|
136
63
|
): void {
|
|
137
64
|
this.onPointerOutOfBounds = callback;
|
|
138
65
|
}
|
|
139
66
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
eventType: EventTypes
|
|
143
|
-
): AdaptedPointerEvent {
|
|
144
|
-
return {
|
|
145
|
-
x: event.clientX,
|
|
146
|
-
y: event.clientY,
|
|
147
|
-
offsetX: event.offsetX,
|
|
148
|
-
offsetY: event.offsetY,
|
|
149
|
-
pointerId: event.pointerId,
|
|
150
|
-
eventType: eventType,
|
|
151
|
-
pointerType: event.pointerType,
|
|
152
|
-
buttons: event.buttons,
|
|
153
|
-
time: event.timeStamp,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
public isPointerInBounds({ x, y }: { x: number; y: number }): boolean {
|
|
158
|
-
if (!this.view) {
|
|
159
|
-
return false;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const rect: DOMRect = this.view.getBoundingClientRect();
|
|
163
|
-
|
|
164
|
-
return (
|
|
165
|
-
x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
private addActivePointer(pointerId: number): void {
|
|
170
|
-
if (this.activePointers.indexOf(pointerId) >= 0) {
|
|
67
|
+
protected markAsInBounds(pointerId: number): void {
|
|
68
|
+
if (this.pointersInBounds.indexOf(pointerId) >= 0) {
|
|
171
69
|
return;
|
|
172
70
|
}
|
|
173
71
|
|
|
174
|
-
this.
|
|
72
|
+
this.pointersInBounds.push(pointerId);
|
|
175
73
|
}
|
|
176
74
|
|
|
177
|
-
|
|
178
|
-
const index: number = this.
|
|
75
|
+
protected markAsOutOfBounds(pointerId: number): void {
|
|
76
|
+
const index: number = this.pointersInBounds.indexOf(pointerId);
|
|
179
77
|
|
|
180
78
|
if (index < 0) {
|
|
181
79
|
return;
|
|
182
80
|
}
|
|
183
81
|
|
|
184
|
-
this.
|
|
82
|
+
this.pointersInBounds.splice(index, 1);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public resetManager(): void {
|
|
86
|
+
// Reseting activePointersCounter is necessary to make gestures such as pinch work properly
|
|
87
|
+
// There are gestures that end when there is still one active pointer (like pinch/rotation)
|
|
88
|
+
// When these gestures end, they are reset, but they still receive events from pointer that is active
|
|
89
|
+
// This causes trouble, since only onPointerDown registers gesture in orchestrator, and while gestures receive
|
|
90
|
+
// Events from active pointer after they finished, next pointerdown event will be registered as additional pointer, not the first one
|
|
91
|
+
// This casues trouble like gestures getting stuck in END state, even though they should have gone to UNDETERMINED
|
|
92
|
+
|
|
93
|
+
this.activePointersCounter = 0;
|
|
94
|
+
this.pointersInBounds = [];
|
|
185
95
|
}
|
|
186
96
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { State } from '../../State';
|
|
2
|
-
import {
|
|
2
|
+
import { PointerType } from '../interfaces';
|
|
3
3
|
|
|
4
4
|
import GestureHandler from '../handlers/GestureHandler';
|
|
5
5
|
import PointerTracker from './PointerTracker';
|
|
6
|
+
import { isPointerInBounds } from '../utils';
|
|
6
7
|
|
|
7
8
|
export default class GestureHandlerOrchestrator {
|
|
8
9
|
private static instance: GestureHandlerOrchestrator;
|
|
@@ -31,13 +32,19 @@ export default class GestureHandlerOrchestrator {
|
|
|
31
32
|
handler.setActivationIndex(Number.MAX_VALUE);
|
|
32
33
|
}
|
|
33
34
|
|
|
35
|
+
public removeHandlerFromOrchestrator(handler: GestureHandler): void {
|
|
36
|
+
this.gestureHandlers.splice(this.gestureHandlers.indexOf(handler), 1);
|
|
37
|
+
this.awaitingHandlers.splice(this.awaitingHandlers.indexOf(handler), 1);
|
|
38
|
+
this.handlersToCancel.splice(this.handlersToCancel.indexOf(handler), 1);
|
|
39
|
+
}
|
|
40
|
+
|
|
34
41
|
private cleanupFinishedHandlers(): void {
|
|
35
42
|
for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {
|
|
36
43
|
const handler = this.gestureHandlers[i];
|
|
44
|
+
|
|
37
45
|
if (!handler) {
|
|
38
46
|
continue;
|
|
39
47
|
}
|
|
40
|
-
|
|
41
48
|
if (this.isFinished(handler.getState()) && !handler.isAwaiting()) {
|
|
42
49
|
this.gestureHandlers.splice(i, 1);
|
|
43
50
|
|
|
@@ -62,15 +69,35 @@ export default class GestureHandlerOrchestrator {
|
|
|
62
69
|
return hasToWait;
|
|
63
70
|
}
|
|
64
71
|
|
|
65
|
-
private tryActivate(
|
|
66
|
-
handler: GestureHandler,
|
|
67
|
-
event: AdaptedPointerEvent
|
|
68
|
-
): void {
|
|
72
|
+
private tryActivate(handler: GestureHandler): void {
|
|
69
73
|
if (this.hasOtherHandlerToWaitFor(handler)) {
|
|
70
74
|
this.addAwaitingHandler(handler);
|
|
71
|
-
} else
|
|
72
|
-
|
|
75
|
+
} else if (
|
|
76
|
+
handler.getState() !== State.CANCELLED &&
|
|
77
|
+
handler.getState() !== State.FAILED
|
|
78
|
+
) {
|
|
79
|
+
if (this.shouldActivate(handler)) {
|
|
80
|
+
this.makeActive(handler);
|
|
81
|
+
} else {
|
|
82
|
+
switch (handler.getState()) {
|
|
83
|
+
case State.ACTIVE:
|
|
84
|
+
handler.fail();
|
|
85
|
+
break;
|
|
86
|
+
case State.BEGAN:
|
|
87
|
+
handler.cancel();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private shouldActivate(handler: GestureHandler): boolean {
|
|
94
|
+
for (const otherHandler of this.gestureHandlers) {
|
|
95
|
+
if (this.shouldHandlerBeCancelledBy(handler, otherHandler)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
73
98
|
}
|
|
99
|
+
|
|
100
|
+
return true;
|
|
74
101
|
}
|
|
75
102
|
|
|
76
103
|
private cleanupAwaitingHandlers(handler: GestureHandler): void {
|
|
@@ -89,36 +116,50 @@ export default class GestureHandlerOrchestrator {
|
|
|
89
116
|
handler: GestureHandler,
|
|
90
117
|
newState: State,
|
|
91
118
|
oldState: State,
|
|
92
|
-
|
|
119
|
+
sendIfDisabled?: boolean
|
|
93
120
|
): void {
|
|
121
|
+
if (!handler.isEnabled() && !sendIfDisabled) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
94
125
|
this.handlingChangeSemaphore += 1;
|
|
95
126
|
|
|
96
127
|
if (this.isFinished(newState)) {
|
|
97
128
|
this.awaitingHandlers.forEach((otherHandler) => {
|
|
98
129
|
if (this.shouldHandlerWaitForOther(otherHandler, handler)) {
|
|
99
130
|
if (newState === State.END) {
|
|
100
|
-
otherHandler?.cancel(
|
|
131
|
+
otherHandler?.cancel();
|
|
132
|
+
if (otherHandler.getState() === State.END) {
|
|
133
|
+
// Handle edge case, where discrete gestures end immediately after activation thus
|
|
134
|
+
// their state is set to END and when the gesture they are waiting for activates they
|
|
135
|
+
// should be cancelled, however `cancel` was never sent as gestures were already in the END state.
|
|
136
|
+
// Send synthetic BEGAN -> CANCELLED to properly handle JS logic
|
|
137
|
+
otherHandler.sendEvent(State.CANCELLED, State.BEGAN);
|
|
138
|
+
}
|
|
101
139
|
otherHandler?.setAwaiting(false);
|
|
102
140
|
} else {
|
|
103
|
-
this.tryActivate(otherHandler
|
|
141
|
+
this.tryActivate(otherHandler);
|
|
104
142
|
}
|
|
105
143
|
}
|
|
106
144
|
});
|
|
107
145
|
}
|
|
108
146
|
|
|
109
147
|
if (newState === State.ACTIVE) {
|
|
110
|
-
this.tryActivate(handler
|
|
148
|
+
this.tryActivate(handler);
|
|
111
149
|
} else if (oldState === State.ACTIVE || oldState === State.END) {
|
|
112
150
|
if (handler.isActive()) {
|
|
113
|
-
handler.sendEvent(
|
|
114
|
-
} else if (
|
|
115
|
-
|
|
151
|
+
handler.sendEvent(newState, oldState);
|
|
152
|
+
} else if (
|
|
153
|
+
oldState === State.ACTIVE &&
|
|
154
|
+
(newState === State.CANCELLED || newState === State.FAILED)
|
|
155
|
+
) {
|
|
156
|
+
handler.sendEvent(newState, State.BEGAN);
|
|
116
157
|
}
|
|
117
158
|
} else if (
|
|
118
159
|
oldState !== State.UNDETERMINED ||
|
|
119
160
|
newState !== State.CANCELLED
|
|
120
161
|
) {
|
|
121
|
-
handler.sendEvent(
|
|
162
|
+
handler.sendEvent(newState, oldState);
|
|
122
163
|
}
|
|
123
164
|
|
|
124
165
|
this.handlingChangeSemaphore -= 1;
|
|
@@ -130,10 +171,7 @@ export default class GestureHandlerOrchestrator {
|
|
|
130
171
|
}
|
|
131
172
|
}
|
|
132
173
|
|
|
133
|
-
private makeActive(
|
|
134
|
-
handler: GestureHandler,
|
|
135
|
-
event: AdaptedPointerEvent
|
|
136
|
-
): void {
|
|
174
|
+
private makeActive(handler: GestureHandler): void {
|
|
137
175
|
const currentState = handler.getState();
|
|
138
176
|
|
|
139
177
|
handler.setActive(true);
|
|
@@ -142,33 +180,38 @@ export default class GestureHandlerOrchestrator {
|
|
|
142
180
|
|
|
143
181
|
this.gestureHandlers.forEach((otherHandler) => {
|
|
144
182
|
// Order of arguments is correct - we check whether current handler should cancel existing handlers
|
|
183
|
+
|
|
145
184
|
if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {
|
|
146
185
|
this.handlersToCancel.push(otherHandler);
|
|
147
186
|
}
|
|
148
187
|
});
|
|
149
188
|
|
|
150
189
|
for (let i = this.handlersToCancel.length - 1; i >= 0; --i) {
|
|
151
|
-
this.handlersToCancel[i]?.cancel(
|
|
190
|
+
this.handlersToCancel[i]?.cancel();
|
|
152
191
|
}
|
|
153
192
|
this.awaitingHandlers.forEach((otherHandler) => {
|
|
154
193
|
if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {
|
|
155
|
-
otherHandler?.cancel(
|
|
194
|
+
otherHandler?.cancel();
|
|
156
195
|
otherHandler?.setAwaiting(true);
|
|
157
196
|
}
|
|
158
197
|
});
|
|
159
198
|
|
|
160
|
-
handler.sendEvent(
|
|
199
|
+
handler.sendEvent(State.ACTIVE, State.BEGAN);
|
|
161
200
|
|
|
162
201
|
if (currentState !== State.ACTIVE) {
|
|
163
|
-
handler.sendEvent(
|
|
202
|
+
handler.sendEvent(State.END, State.ACTIVE);
|
|
164
203
|
if (currentState !== State.END) {
|
|
165
|
-
handler.sendEvent(
|
|
204
|
+
handler.sendEvent(State.UNDETERMINED, State.END);
|
|
166
205
|
}
|
|
167
206
|
}
|
|
168
207
|
|
|
169
208
|
if (handler.isAwaiting()) {
|
|
170
209
|
handler.setAwaiting(false);
|
|
171
|
-
|
|
210
|
+
for (let i = 0; i < this.awaitingHandlers.length; ++i) {
|
|
211
|
+
if (this.awaitingHandlers[i] === handler) {
|
|
212
|
+
this.awaitingHandlers.splice(i, 1);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
172
215
|
}
|
|
173
216
|
|
|
174
217
|
this.handlersToCancel = [];
|
|
@@ -241,16 +284,6 @@ export default class GestureHandlerOrchestrator {
|
|
|
241
284
|
handler: GestureHandler,
|
|
242
285
|
otherHandler: GestureHandler
|
|
243
286
|
): boolean {
|
|
244
|
-
const handlerPointers: number[] = handler.getTrackedPointersID();
|
|
245
|
-
const otherPointers: number[] = otherHandler.getTrackedPointersID();
|
|
246
|
-
|
|
247
|
-
if (
|
|
248
|
-
!PointerTracker.shareCommonPointers(handlerPointers, otherPointers) &&
|
|
249
|
-
handler.getView() !== otherHandler.getView()
|
|
250
|
-
) {
|
|
251
|
-
return this.checkOverlap(handler, otherHandler);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
287
|
if (this.canRunSimultaneously(handler, otherHandler)) {
|
|
255
288
|
return false;
|
|
256
289
|
}
|
|
@@ -263,6 +296,16 @@ export default class GestureHandlerOrchestrator {
|
|
|
263
296
|
return handler.shouldBeCancelledByOther(otherHandler);
|
|
264
297
|
}
|
|
265
298
|
|
|
299
|
+
const handlerPointers: number[] = handler.getTrackedPointersID();
|
|
300
|
+
const otherPointers: number[] = otherHandler.getTrackedPointersID();
|
|
301
|
+
|
|
302
|
+
if (
|
|
303
|
+
!PointerTracker.shareCommonPointers(handlerPointers, otherPointers) &&
|
|
304
|
+
handler.getView() !== otherHandler.getView()
|
|
305
|
+
) {
|
|
306
|
+
return this.checkOverlap(handler, otherHandler);
|
|
307
|
+
}
|
|
308
|
+
|
|
266
309
|
return true;
|
|
267
310
|
}
|
|
268
311
|
|
|
@@ -286,12 +329,8 @@ export default class GestureHandlerOrchestrator {
|
|
|
286
329
|
const handlerY: number = handler.getTracker().getLastY(pointer);
|
|
287
330
|
|
|
288
331
|
if (
|
|
289
|
-
handler
|
|
290
|
-
|
|
291
|
-
.isPointerInBounds({ x: handlerX, y: handlerY }) &&
|
|
292
|
-
otherHandler
|
|
293
|
-
.getEventManager()
|
|
294
|
-
.isPointerInBounds({ x: handlerX, y: handlerY })
|
|
332
|
+
isPointerInBounds(handler.getView(), { x: handlerX, y: handlerY }) &&
|
|
333
|
+
isPointerInBounds(otherHandler.getView(), { x: handlerX, y: handlerY })
|
|
295
334
|
) {
|
|
296
335
|
overlap = true;
|
|
297
336
|
}
|
|
@@ -302,10 +341,8 @@ export default class GestureHandlerOrchestrator {
|
|
|
302
341
|
const otherY: number = otherHandler.getTracker().getLastY(pointer);
|
|
303
342
|
|
|
304
343
|
if (
|
|
305
|
-
handler.
|
|
306
|
-
otherHandler
|
|
307
|
-
.getEventManager()
|
|
308
|
-
.isPointerInBounds({ x: otherX, y: otherY })
|
|
344
|
+
isPointerInBounds(handler.getView(), { x: otherX, y: otherY }) &&
|
|
345
|
+
isPointerInBounds(otherHandler.getView(), { x: otherX, y: otherY })
|
|
309
346
|
) {
|
|
310
347
|
overlap = true;
|
|
311
348
|
}
|
|
@@ -320,9 +357,40 @@ export default class GestureHandlerOrchestrator {
|
|
|
320
357
|
);
|
|
321
358
|
}
|
|
322
359
|
|
|
360
|
+
// This function is called when handler receives touchdown event
|
|
361
|
+
// If handler is using mouse or pen as a pointer and any handler receives touch event,
|
|
362
|
+
// mouse/pen event dissappears - it doesn't send onPointerCancel nor onPointerUp (and others)
|
|
363
|
+
// This became a problem because handler was left at active state without any signal to end or fail
|
|
364
|
+
// To handle this, when new touch event is received, we loop through active handlers and check which type of
|
|
365
|
+
// pointer they're using. If there are any handler with mouse/pen as a pointer, we cancel them
|
|
366
|
+
public cancelMouseAndPenGestures(currentHandler: GestureHandler): void {
|
|
367
|
+
this.gestureHandlers.forEach((handler: GestureHandler) => {
|
|
368
|
+
if (
|
|
369
|
+
handler.getPointerType() !== PointerType.MOUSE &&
|
|
370
|
+
handler.getPointerType() !== PointerType.PEN
|
|
371
|
+
) {
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (handler !== currentHandler) {
|
|
376
|
+
handler.cancel();
|
|
377
|
+
} else {
|
|
378
|
+
// Handler that received touch event should have its pointer tracker reset
|
|
379
|
+
// This allows handler to smoothly change from mouse/pen to touch
|
|
380
|
+
// The drawback is, that when we try to use mouse/pen one more time, it doesn't send onPointerDown at the first time
|
|
381
|
+
// so it is required to click two times to get handler to work
|
|
382
|
+
//
|
|
383
|
+
// However, handler will receive manually created onPointerEnter that is triggered in EventManager in onPointerMove method.
|
|
384
|
+
// There may be possibility to use that fact to make handler respond properly to first mouse click
|
|
385
|
+
handler.getTracker().resetTracker();
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
|
|
323
390
|
public static getInstance(): GestureHandlerOrchestrator {
|
|
324
|
-
if (!GestureHandlerOrchestrator.instance)
|
|
391
|
+
if (!GestureHandlerOrchestrator.instance) {
|
|
325
392
|
GestureHandlerOrchestrator.instance = new GestureHandlerOrchestrator();
|
|
393
|
+
}
|
|
326
394
|
|
|
327
395
|
return GestureHandlerOrchestrator.instance;
|
|
328
396
|
}
|