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
|
@@ -1,86 +1,37 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
2
|
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
4
|
-
import { EventTypes, MouseButtons } from '../interfaces';
|
|
5
4
|
export default class EventManager {
|
|
6
5
|
constructor(view) {
|
|
7
|
-
_defineProperty(this, "activePointers", []);
|
|
8
|
-
|
|
9
6
|
_defineProperty(this, "view", void 0);
|
|
10
7
|
|
|
11
|
-
this
|
|
12
|
-
}
|
|
8
|
+
_defineProperty(this, "pointersInBounds", []);
|
|
13
9
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
y: event.clientY
|
|
19
|
-
})) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const adaptedEvent = this.mapEvent(event, EventTypes.DOWN);
|
|
24
|
-
const target = event.target;
|
|
25
|
-
target.setPointerCapture(adaptedEvent.pointerId);
|
|
26
|
-
this.addActivePointer(adaptedEvent.pointerId);
|
|
27
|
-
this.onPointerDown(adaptedEvent);
|
|
28
|
-
});
|
|
29
|
-
this.view.addEventListener('pointerup', event => {
|
|
30
|
-
const adaptedEvent = this.mapEvent(event, EventTypes.UP);
|
|
31
|
-
const target = event.target;
|
|
32
|
-
this.onPointerUp(adaptedEvent);
|
|
33
|
-
target.releasePointerCapture(adaptedEvent.pointerId);
|
|
34
|
-
this.removeActivePointer(adaptedEvent.pointerId);
|
|
35
|
-
});
|
|
36
|
-
this.view.addEventListener('pointermove', event => {
|
|
37
|
-
if (event.pointerType === 'mouse' && event.buttons !== MouseButtons.LEFT) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const adaptedEvent = this.mapEvent(event, EventTypes.MOVE);
|
|
42
|
-
const inBounds = this.isPointerInBounds({
|
|
43
|
-
x: adaptedEvent.x,
|
|
44
|
-
y: adaptedEvent.y
|
|
45
|
-
});
|
|
46
|
-
const pointerIndex = this.activePointers.indexOf(adaptedEvent.pointerId);
|
|
47
|
-
|
|
48
|
-
if (inBounds) {
|
|
49
|
-
if (pointerIndex < 0) {
|
|
50
|
-
adaptedEvent.eventType = EventTypes.ENTER;
|
|
51
|
-
this.onPointerEnter(adaptedEvent);
|
|
52
|
-
this.addActivePointer(adaptedEvent.pointerId);
|
|
53
|
-
} else {
|
|
54
|
-
this.onPointerMove(adaptedEvent);
|
|
55
|
-
}
|
|
56
|
-
} else {
|
|
57
|
-
if (pointerIndex >= 0) {
|
|
58
|
-
adaptedEvent.eventType = EventTypes.OUT;
|
|
59
|
-
this.onPointerOut(adaptedEvent);
|
|
60
|
-
this.removeActivePointer(adaptedEvent.pointerId);
|
|
61
|
-
} else {
|
|
62
|
-
this.onPointerOutOfBounds(adaptedEvent);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
this.view.addEventListener('pointercancel', event => {
|
|
67
|
-
event.preventDefault();
|
|
68
|
-
const adaptedEvent = this.mapEvent(event, EventTypes.CANCEL);
|
|
69
|
-
this.onPointerCancel(adaptedEvent);
|
|
70
|
-
});
|
|
10
|
+
_defineProperty(this, "activePointersCounter", void 0);
|
|
11
|
+
|
|
12
|
+
this.view = view;
|
|
13
|
+
this.activePointersCounter = 0;
|
|
71
14
|
}
|
|
72
15
|
|
|
73
16
|
onPointerDown(_event) {}
|
|
74
17
|
|
|
18
|
+
onPointerAdd(_event) {}
|
|
19
|
+
|
|
75
20
|
onPointerUp(_event) {}
|
|
76
21
|
|
|
22
|
+
onPointerRemove(_event) {}
|
|
23
|
+
|
|
77
24
|
onPointerMove(_event) {}
|
|
78
25
|
|
|
79
26
|
onPointerOut(_event) {}
|
|
80
27
|
|
|
81
28
|
onPointerEnter(_event) {}
|
|
82
29
|
|
|
83
|
-
onPointerCancel(_event) {
|
|
30
|
+
onPointerCancel(_event) {// 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
|
|
34
|
+
}
|
|
84
35
|
|
|
85
36
|
onPointerOutOfBounds(_event) {}
|
|
86
37
|
|
|
@@ -88,10 +39,18 @@ export default class EventManager {
|
|
|
88
39
|
this.onPointerDown = callback;
|
|
89
40
|
}
|
|
90
41
|
|
|
42
|
+
setOnPointerAdd(callback) {
|
|
43
|
+
this.onPointerAdd = callback;
|
|
44
|
+
}
|
|
45
|
+
|
|
91
46
|
setOnPointerUp(callback) {
|
|
92
47
|
this.onPointerUp = callback;
|
|
93
48
|
}
|
|
94
49
|
|
|
50
|
+
setOnPointerRemove(callback) {
|
|
51
|
+
this.onPointerRemove = callback;
|
|
52
|
+
}
|
|
53
|
+
|
|
95
54
|
setOnPointerMove(callback) {
|
|
96
55
|
this.onPointerMove = callback;
|
|
97
56
|
}
|
|
@@ -112,48 +71,33 @@ export default class EventManager {
|
|
|
112
71
|
this.onPointerOutOfBounds = callback;
|
|
113
72
|
}
|
|
114
73
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
x: event.clientX,
|
|
118
|
-
y: event.clientY,
|
|
119
|
-
offsetX: event.offsetX,
|
|
120
|
-
offsetY: event.offsetY,
|
|
121
|
-
pointerId: event.pointerId,
|
|
122
|
-
eventType: eventType,
|
|
123
|
-
pointerType: event.pointerType,
|
|
124
|
-
buttons: event.buttons,
|
|
125
|
-
time: event.timeStamp
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
isPointerInBounds({
|
|
130
|
-
x,
|
|
131
|
-
y
|
|
132
|
-
}) {
|
|
133
|
-
if (!this.view) {
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const rect = this.view.getBoundingClientRect();
|
|
138
|
-
return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
addActivePointer(pointerId) {
|
|
142
|
-
if (this.activePointers.indexOf(pointerId) >= 0) {
|
|
74
|
+
markAsInBounds(pointerId) {
|
|
75
|
+
if (this.pointersInBounds.indexOf(pointerId) >= 0) {
|
|
143
76
|
return;
|
|
144
77
|
}
|
|
145
78
|
|
|
146
|
-
this.
|
|
79
|
+
this.pointersInBounds.push(pointerId);
|
|
147
80
|
}
|
|
148
81
|
|
|
149
|
-
|
|
150
|
-
const index = this.
|
|
82
|
+
markAsOutOfBounds(pointerId) {
|
|
83
|
+
const index = this.pointersInBounds.indexOf(pointerId);
|
|
151
84
|
|
|
152
85
|
if (index < 0) {
|
|
153
86
|
return;
|
|
154
87
|
}
|
|
155
88
|
|
|
156
|
-
this.
|
|
89
|
+
this.pointersInBounds.splice(index, 1);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
resetManager() {
|
|
93
|
+
// Reseting activePointersCounter is necessary to make gestures such as pinch work properly
|
|
94
|
+
// There are gestures that end when there is still one active pointer (like pinch/rotation)
|
|
95
|
+
// When these gestures end, they are reset, but they still receive events from pointer that is active
|
|
96
|
+
// This causes trouble, since only onPointerDown registers gesture in orchestrator, and while gestures receive
|
|
97
|
+
// Events from active pointer after they finished, next pointerdown event will be registered as additional pointer, not the first one
|
|
98
|
+
// This casues trouble like gestures getting stuck in END state, even though they should have gone to UNDETERMINED
|
|
99
|
+
this.activePointersCounter = 0;
|
|
100
|
+
this.pointersInBounds = [];
|
|
157
101
|
}
|
|
158
102
|
|
|
159
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["EventManager.ts"],"names":["EventTypes","MouseButtons","EventManager","constructor","view","setListeners","addEventListener","event","isPointerInBounds","x","clientX","y","clientY","adaptedEvent","mapEvent","DOWN","target","setPointerCapture","pointerId","addActivePointer","onPointerDown","UP","onPointerUp","releasePointerCapture","removeActivePointer","pointerType","buttons","LEFT","MOVE","inBounds","pointerIndex","activePointers","indexOf","eventType","ENTER","onPointerEnter","onPointerMove","OUT","onPointerOut","onPointerOutOfBounds","preventDefault","CANCEL","onPointerCancel","_event","setOnPointerDown","callback","setOnPointerUp","setOnPointerMove","setOnPointerOut","setOnPointerEnter","setOnPointerCancel","setOnPointerOutOfBounds","offsetX","offsetY","time","timeStamp","rect","getBoundingClientRect","left","right","top","bottom","push","index","splice"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-empty-function */\n\nimport { EventTypes, AdaptedPointerEvent, MouseButtons } from '../interfaces';\n\nexport default class EventManager {\n private activePointers: number[] = [];\n private readonly view: HTMLElement;\n\n constructor(view: HTMLElement) {\n this.view = view;\n }\n\n public setListeners() {\n this.view.addEventListener('pointerdown', (event: PointerEvent): void => {\n if (\n !this.isPointerInBounds({\n x: event.clientX,\n y: event.clientY,\n })\n ) {\n return;\n }\n\n const adaptedEvent: AdaptedPointerEvent = this.mapEvent(\n event,\n EventTypes.DOWN\n );\n const target = event.target as HTMLElement;\n\n target.setPointerCapture(adaptedEvent.pointerId);\n this.addActivePointer(adaptedEvent.pointerId);\n this.onPointerDown(adaptedEvent);\n });\n\n this.view.addEventListener('pointerup', (event: PointerEvent): void => {\n const adaptedEvent: AdaptedPointerEvent = this.mapEvent(\n event,\n EventTypes.UP\n );\n const target = event.target as HTMLElement;\n\n this.onPointerUp(adaptedEvent);\n target.releasePointerCapture(adaptedEvent.pointerId);\n this.removeActivePointer(adaptedEvent.pointerId);\n });\n\n this.view.addEventListener('pointermove', (event: PointerEvent): void => {\n if (\n event.pointerType === 'mouse' &&\n event.buttons !== MouseButtons.LEFT\n ) {\n return;\n }\n\n const adaptedEvent: AdaptedPointerEvent = this.mapEvent(\n event,\n EventTypes.MOVE\n );\n\n const inBounds: boolean = this.isPointerInBounds({\n x: adaptedEvent.x,\n y: adaptedEvent.y,\n });\n\n const pointerIndex: number = this.activePointers.indexOf(\n adaptedEvent.pointerId\n );\n\n if (inBounds) {\n if (pointerIndex < 0) {\n adaptedEvent.eventType = EventTypes.ENTER;\n this.onPointerEnter(adaptedEvent);\n this.addActivePointer(adaptedEvent.pointerId);\n } else {\n this.onPointerMove(adaptedEvent);\n }\n } else {\n if (pointerIndex >= 0) {\n adaptedEvent.eventType = EventTypes.OUT;\n this.onPointerOut(adaptedEvent);\n this.removeActivePointer(adaptedEvent.pointerId);\n } else {\n this.onPointerOutOfBounds(adaptedEvent);\n }\n }\n });\n\n this.view.addEventListener('pointercancel', (event: PointerEvent): void => {\n event.preventDefault();\n\n const adaptedEvent: AdaptedPointerEvent = this.mapEvent(\n event,\n EventTypes.CANCEL\n );\n\n this.onPointerCancel(adaptedEvent);\n });\n }\n\n private onPointerDown(_event: AdaptedPointerEvent): void {}\n private onPointerUp(_event: AdaptedPointerEvent): void {}\n private onPointerMove(_event: AdaptedPointerEvent): void {}\n private onPointerOut(_event: AdaptedPointerEvent): void {}\n private onPointerEnter(_event: AdaptedPointerEvent): void {}\n private onPointerCancel(_event: AdaptedPointerEvent): void {}\n private onPointerOutOfBounds(_event: AdaptedPointerEvent): void {}\n\n public setOnPointerDown(\n callback: (event: AdaptedPointerEvent) => void\n ): void {\n this.onPointerDown = callback;\n }\n public setOnPointerUp(callback: (event: AdaptedPointerEvent) => void): void {\n this.onPointerUp = callback;\n }\n public setOnPointerMove(\n callback: (event: AdaptedPointerEvent) => void\n ): void {\n this.onPointerMove = callback;\n }\n public setOnPointerOut(callback: (event: AdaptedPointerEvent) => void): void {\n this.onPointerOut = callback;\n }\n public setOnPointerEnter(\n callback: (event: AdaptedPointerEvent) => void\n ): void {\n this.onPointerEnter = callback;\n }\n public setOnPointerCancel(\n callback: (event: AdaptedPointerEvent) => void\n ): void {\n this.onPointerCancel = callback;\n }\n public setOnPointerOutOfBounds(\n callback: (event: AdaptedPointerEvent) => void\n ): void {\n this.onPointerOutOfBounds = callback;\n }\n\n private mapEvent(\n event: PointerEvent,\n eventType: EventTypes\n ): AdaptedPointerEvent {\n return {\n x: event.clientX,\n y: event.clientY,\n offsetX: event.offsetX,\n offsetY: event.offsetY,\n pointerId: event.pointerId,\n eventType: eventType,\n pointerType: event.pointerType,\n buttons: event.buttons,\n time: event.timeStamp,\n };\n }\n\n public isPointerInBounds({ x, y }: { x: number; y: number }): boolean {\n if (!this.view) {\n return false;\n }\n\n const rect: DOMRect = this.view.getBoundingClientRect();\n\n return (\n x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom\n );\n }\n\n private addActivePointer(pointerId: number): void {\n if (this.activePointers.indexOf(pointerId) >= 0) {\n return;\n }\n\n this.activePointers.push(pointerId);\n }\n\n private removeActivePointer(pointerId: number): void {\n const index: number = this.activePointers.indexOf(pointerId);\n\n if (index < 0) {\n return;\n }\n\n this.activePointers.splice(index, 1);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["EventManager.ts"],"names":["EventManager","constructor","view","activePointersCounter","onPointerDown","_event","onPointerAdd","onPointerUp","onPointerRemove","onPointerMove","onPointerOut","onPointerEnter","onPointerCancel","onPointerOutOfBounds","setOnPointerDown","callback","setOnPointerAdd","setOnPointerUp","setOnPointerRemove","setOnPointerMove","setOnPointerOut","setOnPointerEnter","setOnPointerCancel","setOnPointerOutOfBounds","markAsInBounds","pointerId","pointersInBounds","indexOf","push","markAsOutOfBounds","index","splice","resetManager"],"mappings":";;AAAA;AAGA,eAAe,MAAeA,YAAf,CAA4B;AAKzCC,EAAAA,WAAW,CAACC,IAAD,EAAoB;AAAA;;AAAA,8CAHQ,EAGR;;AAAA;;AAC7B,SAAKA,IAAL,GAAYA,IAAZ;AACA,SAAKC,qBAAL,GAA6B,CAA7B;AACD;;AAUSC,EAAAA,aAAa,CAACC,MAAD,EAA6B,CAAE;;AAC5CC,EAAAA,YAAY,CAACD,MAAD,EAA6B,CAAE;;AAC3CE,EAAAA,WAAW,CAACF,MAAD,EAA6B,CAAE;;AAC1CG,EAAAA,eAAe,CAACH,MAAD,EAA6B,CAAE;;AAC9CI,EAAAA,aAAa,CAACJ,MAAD,EAA6B,CAAE;;AAC5CK,EAAAA,YAAY,CAACL,MAAD,EAA6B,CAAE;;AAC3CM,EAAAA,cAAc,CAACN,MAAD,EAA6B,CAAE;;AAC7CO,EAAAA,eAAe,CAACP,MAAD,EAA6B,CACpD;AACA;AACA;AACA;AACD;;AACSQ,EAAAA,oBAAoB,CAACR,MAAD,EAA6B,CAAE;;AAEtDS,EAAAA,gBAAgB,CAACC,QAAD,EAAgD;AACrE,SAAKX,aAAL,GAAqBW,QAArB;AACD;;AACMC,EAAAA,eAAe,CAACD,QAAD,EAAgD;AACpE,SAAKT,YAAL,GAAoBS,QAApB;AACD;;AACME,EAAAA,cAAc,CAACF,QAAD,EAAgD;AACnE,SAAKR,WAAL,GAAmBQ,QAAnB;AACD;;AACMG,EAAAA,kBAAkB,CAACH,QAAD,EAAgD;AACvE,SAAKP,eAAL,GAAuBO,QAAvB;AACD;;AACMI,EAAAA,gBAAgB,CAACJ,QAAD,EAAgD;AACrE,SAAKN,aAAL,GAAqBM,QAArB;AACD;;AACMK,EAAAA,eAAe,CAACL,QAAD,EAAgD;AACpE,SAAKL,YAAL,GAAoBK,QAApB;AACD;;AACMM,EAAAA,iBAAiB,CAACN,QAAD,EAAgD;AACtE,SAAKJ,cAAL,GAAsBI,QAAtB;AACD;;AACMO,EAAAA,kBAAkB,CAACP,QAAD,EAAgD;AACvE,SAAKH,eAAL,GAAuBG,QAAvB;AACD;;AACMQ,EAAAA,uBAAuB,CAC5BR,QAD4B,EAEtB;AACN,SAAKF,oBAAL,GAA4BE,QAA5B;AACD;;AAESS,EAAAA,cAAc,CAACC,SAAD,EAA0B;AAChD,QAAI,KAAKC,gBAAL,CAAsBC,OAAtB,CAA8BF,SAA9B,KAA4C,CAAhD,EAAmD;AACjD;AACD;;AAED,SAAKC,gBAAL,CAAsBE,IAAtB,CAA2BH,SAA3B;AACD;;AAESI,EAAAA,iBAAiB,CAACJ,SAAD,EAA0B;AACnD,UAAMK,KAAa,GAAG,KAAKJ,gBAAL,CAAsBC,OAAtB,CAA8BF,SAA9B,CAAtB;;AAEA,QAAIK,KAAK,GAAG,CAAZ,EAAe;AACb;AACD;;AAED,SAAKJ,gBAAL,CAAsBK,MAAtB,CAA6BD,KAA7B,EAAoC,CAApC;AACD;;AAEME,EAAAA,YAAY,GAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AAEA,SAAK7B,qBAAL,GAA6B,CAA7B;AACA,SAAKuB,gBAAL,GAAwB,EAAxB;AACD;;AA3FwC","sourcesContent":["/* eslint-disable @typescript-eslint/no-empty-function */\nimport { AdaptedEvent, EventTypes, TouchEventType } from '../interfaces';\n\nexport default abstract class EventManager {\n protected readonly view: HTMLElement;\n protected pointersInBounds: number[] = [];\n protected activePointersCounter: number;\n\n constructor(view: HTMLElement) {\n this.view = view;\n this.activePointersCounter = 0;\n }\n\n public abstract setListeners(): void;\n protected abstract mapEvent(\n event: Event,\n eventType: EventTypes,\n index?: number,\n touchEventType?: TouchEventType\n ): AdaptedEvent;\n\n protected onPointerDown(_event: AdaptedEvent): void {}\n protected onPointerAdd(_event: AdaptedEvent): void {}\n protected onPointerUp(_event: AdaptedEvent): void {}\n protected onPointerRemove(_event: AdaptedEvent): void {}\n protected onPointerMove(_event: AdaptedEvent): void {}\n protected onPointerOut(_event: AdaptedEvent): void {}\n protected onPointerEnter(_event: AdaptedEvent): void {}\n protected onPointerCancel(_event: AdaptedEvent): void {\n // When pointer cancel is triggered and there are more pointers on the view, only one pointer is cancelled\n // Because we want all pointers to be cancelled by that event, we are doing it manually by reseting handler and changing activePointersCounter to 0\n // Events that correspond to removing the pointer (pointerup, touchend) have condition, that they don't perform any action when activePointersCounter\n // 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\n }\n protected onPointerOutOfBounds(_event: AdaptedEvent): void {}\n\n public setOnPointerDown(callback: (event: AdaptedEvent) => void): void {\n this.onPointerDown = callback;\n }\n public setOnPointerAdd(callback: (event: AdaptedEvent) => void): void {\n this.onPointerAdd = callback;\n }\n public setOnPointerUp(callback: (event: AdaptedEvent) => void): void {\n this.onPointerUp = callback;\n }\n public setOnPointerRemove(callback: (event: AdaptedEvent) => void): void {\n this.onPointerRemove = callback;\n }\n public setOnPointerMove(callback: (event: AdaptedEvent) => void): void {\n this.onPointerMove = callback;\n }\n public setOnPointerOut(callback: (event: AdaptedEvent) => void): void {\n this.onPointerOut = callback;\n }\n public setOnPointerEnter(callback: (event: AdaptedEvent) => void): void {\n this.onPointerEnter = callback;\n }\n public setOnPointerCancel(callback: (event: AdaptedEvent) => void): void {\n this.onPointerCancel = callback;\n }\n public setOnPointerOutOfBounds(\n callback: (event: AdaptedEvent) => void\n ): void {\n this.onPointerOutOfBounds = callback;\n }\n\n protected markAsInBounds(pointerId: number): void {\n if (this.pointersInBounds.indexOf(pointerId) >= 0) {\n return;\n }\n\n this.pointersInBounds.push(pointerId);\n }\n\n protected markAsOutOfBounds(pointerId: number): void {\n const index: number = this.pointersInBounds.indexOf(pointerId);\n\n if (index < 0) {\n return;\n }\n\n this.pointersInBounds.splice(index, 1);\n }\n\n public resetManager(): void {\n // Reseting activePointersCounter is necessary to make gestures such as pinch work properly\n // There are gestures that end when there is still one active pointer (like pinch/rotation)\n // When these gestures end, they are reset, but they still receive events from pointer that is active\n // This causes trouble, since only onPointerDown registers gesture in orchestrator, and while gestures receive\n // Events from active pointer after they finished, next pointerdown event will be registered as additional pointer, not the first one\n // This casues trouble like gestures getting stuck in END state, even though they should have gone to UNDETERMINED\n\n this.activePointersCounter = 0;\n this.pointersInBounds = [];\n }\n}\n"]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
2
|
|
|
3
3
|
import { State } from '../../State';
|
|
4
|
+
import { PointerType } from '../interfaces';
|
|
4
5
|
import PointerTracker from './PointerTracker';
|
|
6
|
+
import { isPointerInBounds } from '../utils';
|
|
5
7
|
export default class GestureHandlerOrchestrator {
|
|
6
8
|
// Private beacuse of Singleton
|
|
7
9
|
// eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function
|
|
@@ -30,6 +32,12 @@ export default class GestureHandlerOrchestrator {
|
|
|
30
32
|
handler.setActivationIndex(Number.MAX_VALUE);
|
|
31
33
|
}
|
|
32
34
|
|
|
35
|
+
removeHandlerFromOrchestrator(handler) {
|
|
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
|
+
|
|
33
41
|
cleanupFinishedHandlers() {
|
|
34
42
|
for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {
|
|
35
43
|
const handler = this.gestureHandlers[i];
|
|
@@ -56,14 +64,35 @@ export default class GestureHandlerOrchestrator {
|
|
|
56
64
|
return hasToWait;
|
|
57
65
|
}
|
|
58
66
|
|
|
59
|
-
tryActivate(handler
|
|
67
|
+
tryActivate(handler) {
|
|
60
68
|
if (this.hasOtherHandlerToWaitFor(handler)) {
|
|
61
69
|
this.addAwaitingHandler(handler);
|
|
62
|
-
} else {
|
|
63
|
-
this.
|
|
70
|
+
} else if (handler.getState() !== State.CANCELLED && handler.getState() !== State.FAILED) {
|
|
71
|
+
if (this.shouldActivate(handler)) {
|
|
72
|
+
this.makeActive(handler);
|
|
73
|
+
} else {
|
|
74
|
+
switch (handler.getState()) {
|
|
75
|
+
case State.ACTIVE:
|
|
76
|
+
handler.fail();
|
|
77
|
+
break;
|
|
78
|
+
|
|
79
|
+
case State.BEGAN:
|
|
80
|
+
handler.cancel();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
64
83
|
}
|
|
65
84
|
}
|
|
66
85
|
|
|
86
|
+
shouldActivate(handler) {
|
|
87
|
+
for (const otherHandler of this.gestureHandlers) {
|
|
88
|
+
if (this.shouldHandlerBeCancelledBy(handler, otherHandler)) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
|
|
67
96
|
cleanupAwaitingHandlers(handler) {
|
|
68
97
|
for (let i = 0; i < this.awaitingHandlers.length; ++i) {
|
|
69
98
|
if (!this.awaitingHandlers[i].isAwaiting() && this.shouldHandlerWaitForOther(this.awaitingHandlers[i], handler)) {
|
|
@@ -73,32 +102,45 @@ export default class GestureHandlerOrchestrator {
|
|
|
73
102
|
}
|
|
74
103
|
}
|
|
75
104
|
|
|
76
|
-
onHandlerStateChange(handler, newState, oldState,
|
|
105
|
+
onHandlerStateChange(handler, newState, oldState, sendIfDisabled) {
|
|
106
|
+
if (!handler.isEnabled() && !sendIfDisabled) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
77
110
|
this.handlingChangeSemaphore += 1;
|
|
78
111
|
|
|
79
112
|
if (this.isFinished(newState)) {
|
|
80
113
|
this.awaitingHandlers.forEach(otherHandler => {
|
|
81
114
|
if (this.shouldHandlerWaitForOther(otherHandler, handler)) {
|
|
82
115
|
if (newState === State.END) {
|
|
83
|
-
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel(
|
|
116
|
+
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel();
|
|
117
|
+
|
|
118
|
+
if (otherHandler.getState() === State.END) {
|
|
119
|
+
// Handle edge case, where discrete gestures end immediately after activation thus
|
|
120
|
+
// their state is set to END and when the gesture they are waiting for activates they
|
|
121
|
+
// should be cancelled, however `cancel` was never sent as gestures were already in the END state.
|
|
122
|
+
// Send synthetic BEGAN -> CANCELLED to properly handle JS logic
|
|
123
|
+
otherHandler.sendEvent(State.CANCELLED, State.BEGAN);
|
|
124
|
+
}
|
|
125
|
+
|
|
84
126
|
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.setAwaiting(false);
|
|
85
127
|
} else {
|
|
86
|
-
this.tryActivate(otherHandler
|
|
128
|
+
this.tryActivate(otherHandler);
|
|
87
129
|
}
|
|
88
130
|
}
|
|
89
131
|
});
|
|
90
132
|
}
|
|
91
133
|
|
|
92
134
|
if (newState === State.ACTIVE) {
|
|
93
|
-
this.tryActivate(handler
|
|
135
|
+
this.tryActivate(handler);
|
|
94
136
|
} else if (oldState === State.ACTIVE || oldState === State.END) {
|
|
95
137
|
if (handler.isActive()) {
|
|
96
|
-
handler.sendEvent(
|
|
97
|
-
} else if (oldState === State.ACTIVE) {
|
|
98
|
-
handler.sendEvent(
|
|
138
|
+
handler.sendEvent(newState, oldState);
|
|
139
|
+
} else if (oldState === State.ACTIVE && (newState === State.CANCELLED || newState === State.FAILED)) {
|
|
140
|
+
handler.sendEvent(newState, State.BEGAN);
|
|
99
141
|
}
|
|
100
142
|
} else if (oldState !== State.UNDETERMINED || newState !== State.CANCELLED) {
|
|
101
|
-
handler.sendEvent(
|
|
143
|
+
handler.sendEvent(newState, oldState);
|
|
102
144
|
}
|
|
103
145
|
|
|
104
146
|
this.handlingChangeSemaphore -= 1;
|
|
@@ -109,7 +151,7 @@ export default class GestureHandlerOrchestrator {
|
|
|
109
151
|
}
|
|
110
152
|
}
|
|
111
153
|
|
|
112
|
-
makeActive(handler
|
|
154
|
+
makeActive(handler) {
|
|
113
155
|
const currentState = handler.getState();
|
|
114
156
|
handler.setActive(true);
|
|
115
157
|
handler.setShouldResetProgress(true);
|
|
@@ -124,28 +166,33 @@ export default class GestureHandlerOrchestrator {
|
|
|
124
166
|
for (let i = this.handlersToCancel.length - 1; i >= 0; --i) {
|
|
125
167
|
var _this$handlersToCance;
|
|
126
168
|
|
|
127
|
-
(_this$handlersToCance = this.handlersToCancel[i]) === null || _this$handlersToCance === void 0 ? void 0 : _this$handlersToCance.cancel(
|
|
169
|
+
(_this$handlersToCance = this.handlersToCancel[i]) === null || _this$handlersToCance === void 0 ? void 0 : _this$handlersToCance.cancel();
|
|
128
170
|
}
|
|
129
171
|
|
|
130
172
|
this.awaitingHandlers.forEach(otherHandler => {
|
|
131
173
|
if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {
|
|
132
|
-
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel(
|
|
174
|
+
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel();
|
|
133
175
|
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.setAwaiting(true);
|
|
134
176
|
}
|
|
135
177
|
});
|
|
136
|
-
handler.sendEvent(
|
|
178
|
+
handler.sendEvent(State.ACTIVE, State.BEGAN);
|
|
137
179
|
|
|
138
180
|
if (currentState !== State.ACTIVE) {
|
|
139
|
-
handler.sendEvent(
|
|
181
|
+
handler.sendEvent(State.END, State.ACTIVE);
|
|
140
182
|
|
|
141
183
|
if (currentState !== State.END) {
|
|
142
|
-
handler.sendEvent(
|
|
184
|
+
handler.sendEvent(State.UNDETERMINED, State.END);
|
|
143
185
|
}
|
|
144
186
|
}
|
|
145
187
|
|
|
146
188
|
if (handler.isAwaiting()) {
|
|
147
189
|
handler.setAwaiting(false);
|
|
148
|
-
|
|
190
|
+
|
|
191
|
+
for (let i = 0; i < this.awaitingHandlers.length; ++i) {
|
|
192
|
+
if (this.awaitingHandlers[i] === handler) {
|
|
193
|
+
this.awaitingHandlers.splice(i, 1);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
149
196
|
}
|
|
150
197
|
|
|
151
198
|
this.handlersToCancel = [];
|
|
@@ -197,13 +244,6 @@ export default class GestureHandlerOrchestrator {
|
|
|
197
244
|
}
|
|
198
245
|
|
|
199
246
|
shouldHandlerBeCancelledBy(handler, otherHandler) {
|
|
200
|
-
const handlerPointers = handler.getTrackedPointersID();
|
|
201
|
-
const otherPointers = otherHandler.getTrackedPointersID();
|
|
202
|
-
|
|
203
|
-
if (!PointerTracker.shareCommonPointers(handlerPointers, otherPointers) && handler.getView() !== otherHandler.getView()) {
|
|
204
|
-
return this.checkOverlap(handler, otherHandler);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
247
|
if (this.canRunSimultaneously(handler, otherHandler)) {
|
|
208
248
|
return false;
|
|
209
249
|
}
|
|
@@ -213,6 +253,13 @@ export default class GestureHandlerOrchestrator {
|
|
|
213
253
|
return handler.shouldBeCancelledByOther(otherHandler);
|
|
214
254
|
}
|
|
215
255
|
|
|
256
|
+
const handlerPointers = handler.getTrackedPointersID();
|
|
257
|
+
const otherPointers = otherHandler.getTrackedPointersID();
|
|
258
|
+
|
|
259
|
+
if (!PointerTracker.shareCommonPointers(handlerPointers, otherPointers) && handler.getView() !== otherHandler.getView()) {
|
|
260
|
+
return this.checkOverlap(handler, otherHandler);
|
|
261
|
+
}
|
|
262
|
+
|
|
216
263
|
return true;
|
|
217
264
|
}
|
|
218
265
|
|
|
@@ -228,10 +275,10 @@ export default class GestureHandlerOrchestrator {
|
|
|
228
275
|
const handlerX = handler.getTracker().getLastX(pointer);
|
|
229
276
|
const handlerY = handler.getTracker().getLastY(pointer);
|
|
230
277
|
|
|
231
|
-
if (handler.
|
|
278
|
+
if (isPointerInBounds(handler.getView(), {
|
|
232
279
|
x: handlerX,
|
|
233
280
|
y: handlerY
|
|
234
|
-
}) && otherHandler.
|
|
281
|
+
}) && isPointerInBounds(otherHandler.getView(), {
|
|
235
282
|
x: handlerX,
|
|
236
283
|
y: handlerY
|
|
237
284
|
})) {
|
|
@@ -242,10 +289,10 @@ export default class GestureHandlerOrchestrator {
|
|
|
242
289
|
const otherX = otherHandler.getTracker().getLastX(pointer);
|
|
243
290
|
const otherY = otherHandler.getTracker().getLastY(pointer);
|
|
244
291
|
|
|
245
|
-
if (handler.
|
|
292
|
+
if (isPointerInBounds(handler.getView(), {
|
|
246
293
|
x: otherX,
|
|
247
294
|
y: otherY
|
|
248
|
-
}) && otherHandler.
|
|
295
|
+
}) && isPointerInBounds(otherHandler.getView(), {
|
|
249
296
|
x: otherX,
|
|
250
297
|
y: otherY
|
|
251
298
|
})) {
|
|
@@ -257,10 +304,40 @@ export default class GestureHandlerOrchestrator {
|
|
|
257
304
|
|
|
258
305
|
isFinished(state) {
|
|
259
306
|
return state === State.END || state === State.FAILED || state === State.CANCELLED;
|
|
307
|
+
} // This function is called when handler receives touchdown event
|
|
308
|
+
// If handler is using mouse or pen as a pointer and any handler receives touch event,
|
|
309
|
+
// mouse/pen event dissappears - it doesn't send onPointerCancel nor onPointerUp (and others)
|
|
310
|
+
// This became a problem because handler was left at active state without any signal to end or fail
|
|
311
|
+
// To handle this, when new touch event is received, we loop through active handlers and check which type of
|
|
312
|
+
// pointer they're using. If there are any handler with mouse/pen as a pointer, we cancel them
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
cancelMouseAndPenGestures(currentHandler) {
|
|
316
|
+
this.gestureHandlers.forEach(handler => {
|
|
317
|
+
if (handler.getPointerType() !== PointerType.MOUSE && handler.getPointerType() !== PointerType.PEN) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (handler !== currentHandler) {
|
|
322
|
+
handler.cancel();
|
|
323
|
+
} else {
|
|
324
|
+
// Handler that received touch event should have its pointer tracker reset
|
|
325
|
+
// This allows handler to smoothly change from mouse/pen to touch
|
|
326
|
+
// The drawback is, that when we try to use mouse/pen one more time, it doesn't send onPointerDown at the first time
|
|
327
|
+
// so it is required to click two times to get handler to work
|
|
328
|
+
//
|
|
329
|
+
// However, handler will receive manually created onPointerEnter that is triggered in EventManager in onPointerMove method.
|
|
330
|
+
// There may be possibility to use that fact to make handler respond properly to first mouse click
|
|
331
|
+
handler.getTracker().resetTracker();
|
|
332
|
+
}
|
|
333
|
+
});
|
|
260
334
|
}
|
|
261
335
|
|
|
262
336
|
static getInstance() {
|
|
263
|
-
if (!GestureHandlerOrchestrator.instance)
|
|
337
|
+
if (!GestureHandlerOrchestrator.instance) {
|
|
338
|
+
GestureHandlerOrchestrator.instance = new GestureHandlerOrchestrator();
|
|
339
|
+
}
|
|
340
|
+
|
|
264
341
|
return GestureHandlerOrchestrator.instance;
|
|
265
342
|
}
|
|
266
343
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["GestureHandlerOrchestrator.ts"],"names":["State","PointerTracker","GestureHandlerOrchestrator","constructor","scheduleFinishedHandlersCleanup","handlingChangeSemaphore","cleanupFinishedHandlers","cleanHandler","handler","reset","setActive","setAwaiting","setActivationIndex","Number","MAX_VALUE","i","gestureHandlers","length","isFinished","getState","isAwaiting","splice","hasOtherHandlerToWaitFor","hasToWait","forEach","otherHandler","shouldHandlerWaitForOther","tryActivate","event","addAwaitingHandler","makeActive","cleanupAwaitingHandlers","awaitingHandlers","onHandlerStateChange","newState","oldState","END","cancel","ACTIVE","isActive","sendEvent","BEGAN","UNDETERMINED","CANCELLED","indexOf","currentState","setShouldResetProgress","activationIndex","shouldHandlerBeCancelledBy","handlersToCancel","push","end","alreadyExists","recordHandlerIfNotPresent","MAX_SAFE_INTEGER","shouldWaitForHandlerFailure","shouldRequireToWaitForFailure","canRunSimultaneously","gh1","gh2","shouldRecognizeSimultaneously","handlerPointers","getTrackedPointersID","otherPointers","shareCommonPointers","getView","checkOverlap","shouldBeCancelledByOther","overlap","pointer","handlerX","getTracker","getLastX","handlerY","getLastY","getEventManager","isPointerInBounds","x","y","otherX","otherY","state","FAILED","getInstance","instance"],"mappings":"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","sourcesContent":["import { State } from '../../State';\nimport { AdaptedPointerEvent } from '../interfaces';\n\nimport GestureHandler from '../handlers/GestureHandler';\nimport PointerTracker from './PointerTracker';\n\nexport default class GestureHandlerOrchestrator {\n private static instance: GestureHandlerOrchestrator;\n\n private gestureHandlers: GestureHandler[] = [];\n private awaitingHandlers: GestureHandler[] = [];\n private handlersToCancel: GestureHandler[] = [];\n\n private handlingChangeSemaphore = 0;\n private activationIndex = 0;\n\n // Private beacuse of Singleton\n // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function\n private constructor() {}\n\n private scheduleFinishedHandlersCleanup(): void {\n if (this.handlingChangeSemaphore === 0) {\n this.cleanupFinishedHandlers();\n }\n }\n\n private cleanHandler(handler: GestureHandler): void {\n handler.reset();\n handler.setActive(false);\n handler.setAwaiting(false);\n handler.setActivationIndex(Number.MAX_VALUE);\n }\n\n private cleanupFinishedHandlers(): void {\n for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {\n const handler = this.gestureHandlers[i];\n if (!handler) {\n continue;\n }\n\n if (this.isFinished(handler.getState()) && !handler.isAwaiting()) {\n this.gestureHandlers.splice(i, 1);\n\n this.cleanHandler(handler);\n }\n }\n }\n\n private hasOtherHandlerToWaitFor(handler: GestureHandler): boolean {\n let hasToWait = false;\n this.gestureHandlers.forEach((otherHandler) => {\n if (\n otherHandler &&\n !this.isFinished(otherHandler.getState()) &&\n this.shouldHandlerWaitForOther(handler, otherHandler)\n ) {\n hasToWait = true;\n return;\n }\n });\n\n return hasToWait;\n }\n\n private tryActivate(\n handler: GestureHandler,\n event: AdaptedPointerEvent\n ): void {\n if (this.hasOtherHandlerToWaitFor(handler)) {\n this.addAwaitingHandler(handler);\n } else {\n this.makeActive(handler, event);\n }\n }\n\n private cleanupAwaitingHandlers(handler: GestureHandler): void {\n for (let i = 0; i < this.awaitingHandlers.length; ++i) {\n if (\n !this.awaitingHandlers[i].isAwaiting() &&\n this.shouldHandlerWaitForOther(this.awaitingHandlers[i], handler)\n ) {\n this.cleanHandler(this.awaitingHandlers[i]);\n this.awaitingHandlers.splice(i, 1);\n }\n }\n }\n\n public onHandlerStateChange(\n handler: GestureHandler,\n newState: State,\n oldState: State,\n event: AdaptedPointerEvent\n ): void {\n this.handlingChangeSemaphore += 1;\n\n if (this.isFinished(newState)) {\n this.awaitingHandlers.forEach((otherHandler) => {\n if (this.shouldHandlerWaitForOther(otherHandler, handler)) {\n if (newState === State.END) {\n otherHandler?.cancel(event);\n otherHandler?.setAwaiting(false);\n } else {\n this.tryActivate(otherHandler, event);\n }\n }\n });\n }\n\n if (newState === State.ACTIVE) {\n this.tryActivate(handler, event);\n } else if (oldState === State.ACTIVE || oldState === State.END) {\n if (handler.isActive()) {\n handler.sendEvent(event, newState, oldState);\n } else if (oldState === State.ACTIVE) {\n handler.sendEvent(event, newState, State.BEGAN);\n }\n } else if (\n oldState !== State.UNDETERMINED ||\n newState !== State.CANCELLED\n ) {\n handler.sendEvent(event, newState, oldState);\n }\n\n this.handlingChangeSemaphore -= 1;\n\n this.scheduleFinishedHandlersCleanup();\n\n if (this.awaitingHandlers.indexOf(handler) < 0) {\n this.cleanupAwaitingHandlers(handler);\n }\n }\n\n private makeActive(\n handler: GestureHandler,\n event: AdaptedPointerEvent\n ): void {\n const currentState = handler.getState();\n\n handler.setActive(true);\n handler.setShouldResetProgress(true);\n handler.setActivationIndex(this.activationIndex++);\n\n this.gestureHandlers.forEach((otherHandler) => {\n // Order of arguments is correct - we check whether current handler should cancel existing handlers\n if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {\n this.handlersToCancel.push(otherHandler);\n }\n });\n\n for (let i = this.handlersToCancel.length - 1; i >= 0; --i) {\n this.handlersToCancel[i]?.cancel(event);\n }\n this.awaitingHandlers.forEach((otherHandler) => {\n if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {\n otherHandler?.cancel(event);\n otherHandler?.setAwaiting(true);\n }\n });\n\n handler.sendEvent(event, State.ACTIVE, State.BEGAN);\n\n if (currentState !== State.ACTIVE) {\n handler.sendEvent(event, State.END, State.ACTIVE);\n if (currentState !== State.END) {\n handler.sendEvent(event, State.UNDETERMINED, State.END);\n }\n }\n\n if (handler.isAwaiting()) {\n handler.setAwaiting(false);\n handler.end(event);\n }\n\n this.handlersToCancel = [];\n }\n\n private addAwaitingHandler(handler: GestureHandler): void {\n let alreadyExists = false;\n\n this.awaitingHandlers.forEach((otherHandler) => {\n if (otherHandler === handler) {\n alreadyExists = true;\n return;\n }\n });\n\n if (alreadyExists) {\n return;\n }\n\n this.awaitingHandlers.push(handler);\n\n handler.setAwaiting(true);\n handler.setActivationIndex(this.activationIndex++);\n }\n\n public recordHandlerIfNotPresent(handler: GestureHandler): void {\n let alreadyExists = false;\n\n this.gestureHandlers.forEach((otherHandler) => {\n if (otherHandler === handler) {\n alreadyExists = true;\n return;\n }\n });\n\n if (alreadyExists) {\n return;\n }\n\n this.gestureHandlers.push(handler);\n\n handler.setActive(false);\n handler.setAwaiting(false);\n handler.setActivationIndex(Number.MAX_SAFE_INTEGER);\n }\n\n private shouldHandlerWaitForOther(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n return (\n handler !== otherHandler &&\n (handler.shouldWaitForHandlerFailure(otherHandler) ||\n otherHandler.shouldRequireToWaitForFailure(handler))\n );\n }\n\n private canRunSimultaneously(\n gh1: GestureHandler,\n gh2: GestureHandler\n ): boolean {\n return (\n gh1 === gh2 ||\n gh1.shouldRecognizeSimultaneously(gh2) ||\n gh2.shouldRecognizeSimultaneously(gh1)\n );\n }\n\n private shouldHandlerBeCancelledBy(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n const handlerPointers: number[] = handler.getTrackedPointersID();\n const otherPointers: number[] = otherHandler.getTrackedPointersID();\n\n if (\n !PointerTracker.shareCommonPointers(handlerPointers, otherPointers) &&\n handler.getView() !== otherHandler.getView()\n ) {\n return this.checkOverlap(handler, otherHandler);\n }\n\n if (this.canRunSimultaneously(handler, otherHandler)) {\n return false;\n }\n\n if (\n handler !== otherHandler &&\n (handler.isAwaiting() || handler.getState() === State.ACTIVE)\n ) {\n // For now it always returns false\n return handler.shouldBeCancelledByOther(otherHandler);\n }\n\n return true;\n }\n\n private checkOverlap(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n // If handlers don't have common pointers, default return value is false.\n // However, if at least on pointer overlaps with both handlers, we return true\n // This solves issue in overlapping parents example\n\n // TODO: Find better way to handle that issue, for example by activation order and handler cancelling\n\n const handlerPointers: number[] = handler.getTrackedPointersID();\n const otherPointers: number[] = otherHandler.getTrackedPointersID();\n\n let overlap = false;\n\n handlerPointers.forEach((pointer: number) => {\n const handlerX: number = handler.getTracker().getLastX(pointer);\n const handlerY: number = handler.getTracker().getLastY(pointer);\n\n if (\n handler\n .getEventManager()\n .isPointerInBounds({ x: handlerX, y: handlerY }) &&\n otherHandler\n .getEventManager()\n .isPointerInBounds({ x: handlerX, y: handlerY })\n ) {\n overlap = true;\n }\n });\n\n otherPointers.forEach((pointer: number) => {\n const otherX: number = otherHandler.getTracker().getLastX(pointer);\n const otherY: number = otherHandler.getTracker().getLastY(pointer);\n\n if (\n handler.getEventManager().isPointerInBounds({ x: otherX, y: otherY }) &&\n otherHandler\n .getEventManager()\n .isPointerInBounds({ x: otherX, y: otherY })\n ) {\n overlap = true;\n }\n });\n\n return overlap;\n }\n\n private isFinished(state: State): boolean {\n return (\n state === State.END || state === State.FAILED || state === State.CANCELLED\n );\n }\n\n public static getInstance(): GestureHandlerOrchestrator {\n if (!GestureHandlerOrchestrator.instance)\n GestureHandlerOrchestrator.instance = new GestureHandlerOrchestrator();\n\n return GestureHandlerOrchestrator.instance;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["GestureHandlerOrchestrator.ts"],"names":["State","PointerType","PointerTracker","isPointerInBounds","GestureHandlerOrchestrator","constructor","scheduleFinishedHandlersCleanup","handlingChangeSemaphore","cleanupFinishedHandlers","cleanHandler","handler","reset","setActive","setAwaiting","setActivationIndex","Number","MAX_VALUE","removeHandlerFromOrchestrator","gestureHandlers","splice","indexOf","awaitingHandlers","handlersToCancel","i","length","isFinished","getState","isAwaiting","hasOtherHandlerToWaitFor","hasToWait","forEach","otherHandler","shouldHandlerWaitForOther","tryActivate","addAwaitingHandler","CANCELLED","FAILED","shouldActivate","makeActive","ACTIVE","fail","BEGAN","cancel","shouldHandlerBeCancelledBy","cleanupAwaitingHandlers","onHandlerStateChange","newState","oldState","sendIfDisabled","isEnabled","END","sendEvent","isActive","UNDETERMINED","currentState","setShouldResetProgress","activationIndex","push","alreadyExists","recordHandlerIfNotPresent","MAX_SAFE_INTEGER","shouldWaitForHandlerFailure","shouldRequireToWaitForFailure","canRunSimultaneously","gh1","gh2","shouldRecognizeSimultaneously","shouldBeCancelledByOther","handlerPointers","getTrackedPointersID","otherPointers","shareCommonPointers","getView","checkOverlap","overlap","pointer","handlerX","getTracker","getLastX","handlerY","getLastY","x","y","otherX","otherY","state","cancelMouseAndPenGestures","currentHandler","getPointerType","MOUSE","PEN","resetTracker","getInstance","instance"],"mappings":"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","sourcesContent":["import { State } from '../../State';\nimport { PointerType } from '../interfaces';\n\nimport GestureHandler from '../handlers/GestureHandler';\nimport PointerTracker from './PointerTracker';\nimport { isPointerInBounds } from '../utils';\n\nexport default class GestureHandlerOrchestrator {\n private static instance: GestureHandlerOrchestrator;\n\n private gestureHandlers: GestureHandler[] = [];\n private awaitingHandlers: GestureHandler[] = [];\n private handlersToCancel: GestureHandler[] = [];\n\n private handlingChangeSemaphore = 0;\n private activationIndex = 0;\n\n // Private beacuse of Singleton\n // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function\n private constructor() {}\n\n private scheduleFinishedHandlersCleanup(): void {\n if (this.handlingChangeSemaphore === 0) {\n this.cleanupFinishedHandlers();\n }\n }\n\n private cleanHandler(handler: GestureHandler): void {\n handler.reset();\n handler.setActive(false);\n handler.setAwaiting(false);\n handler.setActivationIndex(Number.MAX_VALUE);\n }\n\n public removeHandlerFromOrchestrator(handler: GestureHandler): void {\n this.gestureHandlers.splice(this.gestureHandlers.indexOf(handler), 1);\n this.awaitingHandlers.splice(this.awaitingHandlers.indexOf(handler), 1);\n this.handlersToCancel.splice(this.handlersToCancel.indexOf(handler), 1);\n }\n\n private cleanupFinishedHandlers(): void {\n for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {\n const handler = this.gestureHandlers[i];\n\n if (!handler) {\n continue;\n }\n if (this.isFinished(handler.getState()) && !handler.isAwaiting()) {\n this.gestureHandlers.splice(i, 1);\n\n this.cleanHandler(handler);\n }\n }\n }\n\n private hasOtherHandlerToWaitFor(handler: GestureHandler): boolean {\n let hasToWait = false;\n this.gestureHandlers.forEach((otherHandler) => {\n if (\n otherHandler &&\n !this.isFinished(otherHandler.getState()) &&\n this.shouldHandlerWaitForOther(handler, otherHandler)\n ) {\n hasToWait = true;\n return;\n }\n });\n\n return hasToWait;\n }\n\n private tryActivate(handler: GestureHandler): void {\n if (this.hasOtherHandlerToWaitFor(handler)) {\n this.addAwaitingHandler(handler);\n } else if (\n handler.getState() !== State.CANCELLED &&\n handler.getState() !== State.FAILED\n ) {\n if (this.shouldActivate(handler)) {\n this.makeActive(handler);\n } else {\n switch (handler.getState()) {\n case State.ACTIVE:\n handler.fail();\n break;\n case State.BEGAN:\n handler.cancel();\n }\n }\n }\n }\n\n private shouldActivate(handler: GestureHandler): boolean {\n for (const otherHandler of this.gestureHandlers) {\n if (this.shouldHandlerBeCancelledBy(handler, otherHandler)) {\n return false;\n }\n }\n\n return true;\n }\n\n private cleanupAwaitingHandlers(handler: GestureHandler): void {\n for (let i = 0; i < this.awaitingHandlers.length; ++i) {\n if (\n !this.awaitingHandlers[i].isAwaiting() &&\n this.shouldHandlerWaitForOther(this.awaitingHandlers[i], handler)\n ) {\n this.cleanHandler(this.awaitingHandlers[i]);\n this.awaitingHandlers.splice(i, 1);\n }\n }\n }\n\n public onHandlerStateChange(\n handler: GestureHandler,\n newState: State,\n oldState: State,\n sendIfDisabled?: boolean\n ): void {\n if (!handler.isEnabled() && !sendIfDisabled) {\n return;\n }\n\n this.handlingChangeSemaphore += 1;\n\n if (this.isFinished(newState)) {\n this.awaitingHandlers.forEach((otherHandler) => {\n if (this.shouldHandlerWaitForOther(otherHandler, handler)) {\n if (newState === State.END) {\n otherHandler?.cancel();\n if (otherHandler.getState() === State.END) {\n // Handle edge case, where discrete gestures end immediately after activation thus\n // their state is set to END and when the gesture they are waiting for activates they\n // should be cancelled, however `cancel` was never sent as gestures were already in the END state.\n // Send synthetic BEGAN -> CANCELLED to properly handle JS logic\n otherHandler.sendEvent(State.CANCELLED, State.BEGAN);\n }\n otherHandler?.setAwaiting(false);\n } else {\n this.tryActivate(otherHandler);\n }\n }\n });\n }\n\n if (newState === State.ACTIVE) {\n this.tryActivate(handler);\n } else if (oldState === State.ACTIVE || oldState === State.END) {\n if (handler.isActive()) {\n handler.sendEvent(newState, oldState);\n } else if (\n oldState === State.ACTIVE &&\n (newState === State.CANCELLED || newState === State.FAILED)\n ) {\n handler.sendEvent(newState, State.BEGAN);\n }\n } else if (\n oldState !== State.UNDETERMINED ||\n newState !== State.CANCELLED\n ) {\n handler.sendEvent(newState, oldState);\n }\n\n this.handlingChangeSemaphore -= 1;\n\n this.scheduleFinishedHandlersCleanup();\n\n if (this.awaitingHandlers.indexOf(handler) < 0) {\n this.cleanupAwaitingHandlers(handler);\n }\n }\n\n private makeActive(handler: GestureHandler): void {\n const currentState = handler.getState();\n\n handler.setActive(true);\n handler.setShouldResetProgress(true);\n handler.setActivationIndex(this.activationIndex++);\n\n this.gestureHandlers.forEach((otherHandler) => {\n // Order of arguments is correct - we check whether current handler should cancel existing handlers\n\n if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {\n this.handlersToCancel.push(otherHandler);\n }\n });\n\n for (let i = this.handlersToCancel.length - 1; i >= 0; --i) {\n this.handlersToCancel[i]?.cancel();\n }\n this.awaitingHandlers.forEach((otherHandler) => {\n if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {\n otherHandler?.cancel();\n otherHandler?.setAwaiting(true);\n }\n });\n\n handler.sendEvent(State.ACTIVE, State.BEGAN);\n\n if (currentState !== State.ACTIVE) {\n handler.sendEvent(State.END, State.ACTIVE);\n if (currentState !== State.END) {\n handler.sendEvent(State.UNDETERMINED, State.END);\n }\n }\n\n if (handler.isAwaiting()) {\n handler.setAwaiting(false);\n for (let i = 0; i < this.awaitingHandlers.length; ++i) {\n if (this.awaitingHandlers[i] === handler) {\n this.awaitingHandlers.splice(i, 1);\n }\n }\n }\n\n this.handlersToCancel = [];\n }\n\n private addAwaitingHandler(handler: GestureHandler): void {\n let alreadyExists = false;\n\n this.awaitingHandlers.forEach((otherHandler) => {\n if (otherHandler === handler) {\n alreadyExists = true;\n return;\n }\n });\n\n if (alreadyExists) {\n return;\n }\n\n this.awaitingHandlers.push(handler);\n\n handler.setAwaiting(true);\n handler.setActivationIndex(this.activationIndex++);\n }\n\n public recordHandlerIfNotPresent(handler: GestureHandler): void {\n let alreadyExists = false;\n\n this.gestureHandlers.forEach((otherHandler) => {\n if (otherHandler === handler) {\n alreadyExists = true;\n return;\n }\n });\n\n if (alreadyExists) {\n return;\n }\n\n this.gestureHandlers.push(handler);\n\n handler.setActive(false);\n handler.setAwaiting(false);\n handler.setActivationIndex(Number.MAX_SAFE_INTEGER);\n }\n\n private shouldHandlerWaitForOther(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n return (\n handler !== otherHandler &&\n (handler.shouldWaitForHandlerFailure(otherHandler) ||\n otherHandler.shouldRequireToWaitForFailure(handler))\n );\n }\n\n private canRunSimultaneously(\n gh1: GestureHandler,\n gh2: GestureHandler\n ): boolean {\n return (\n gh1 === gh2 ||\n gh1.shouldRecognizeSimultaneously(gh2) ||\n gh2.shouldRecognizeSimultaneously(gh1)\n );\n }\n\n private shouldHandlerBeCancelledBy(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n if (this.canRunSimultaneously(handler, otherHandler)) {\n return false;\n }\n\n if (\n handler !== otherHandler &&\n (handler.isAwaiting() || handler.getState() === State.ACTIVE)\n ) {\n // For now it always returns false\n return handler.shouldBeCancelledByOther(otherHandler);\n }\n\n const handlerPointers: number[] = handler.getTrackedPointersID();\n const otherPointers: number[] = otherHandler.getTrackedPointersID();\n\n if (\n !PointerTracker.shareCommonPointers(handlerPointers, otherPointers) &&\n handler.getView() !== otherHandler.getView()\n ) {\n return this.checkOverlap(handler, otherHandler);\n }\n\n return true;\n }\n\n private checkOverlap(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n // If handlers don't have common pointers, default return value is false.\n // However, if at least on pointer overlaps with both handlers, we return true\n // This solves issue in overlapping parents example\n\n // TODO: Find better way to handle that issue, for example by activation order and handler cancelling\n\n const handlerPointers: number[] = handler.getTrackedPointersID();\n const otherPointers: number[] = otherHandler.getTrackedPointersID();\n\n let overlap = false;\n\n handlerPointers.forEach((pointer: number) => {\n const handlerX: number = handler.getTracker().getLastX(pointer);\n const handlerY: number = handler.getTracker().getLastY(pointer);\n\n if (\n isPointerInBounds(handler.getView(), { x: handlerX, y: handlerY }) &&\n isPointerInBounds(otherHandler.getView(), { x: handlerX, y: handlerY })\n ) {\n overlap = true;\n }\n });\n\n otherPointers.forEach((pointer: number) => {\n const otherX: number = otherHandler.getTracker().getLastX(pointer);\n const otherY: number = otherHandler.getTracker().getLastY(pointer);\n\n if (\n isPointerInBounds(handler.getView(), { x: otherX, y: otherY }) &&\n isPointerInBounds(otherHandler.getView(), { x: otherX, y: otherY })\n ) {\n overlap = true;\n }\n });\n\n return overlap;\n }\n\n private isFinished(state: State): boolean {\n return (\n state === State.END || state === State.FAILED || state === State.CANCELLED\n );\n }\n\n // This function is called when handler receives touchdown event\n // If handler is using mouse or pen as a pointer and any handler receives touch event,\n // mouse/pen event dissappears - it doesn't send onPointerCancel nor onPointerUp (and others)\n // This became a problem because handler was left at active state without any signal to end or fail\n // To handle this, when new touch event is received, we loop through active handlers and check which type of\n // pointer they're using. If there are any handler with mouse/pen as a pointer, we cancel them\n public cancelMouseAndPenGestures(currentHandler: GestureHandler): void {\n this.gestureHandlers.forEach((handler: GestureHandler) => {\n if (\n handler.getPointerType() !== PointerType.MOUSE &&\n handler.getPointerType() !== PointerType.PEN\n ) {\n return;\n }\n\n if (handler !== currentHandler) {\n handler.cancel();\n } else {\n // Handler that received touch event should have its pointer tracker reset\n // This allows handler to smoothly change from mouse/pen to touch\n // The drawback is, that when we try to use mouse/pen one more time, it doesn't send onPointerDown at the first time\n // so it is required to click two times to get handler to work\n //\n // However, handler will receive manually created onPointerEnter that is triggered in EventManager in onPointerMove method.\n // There may be possibility to use that fact to make handler respond properly to first mouse click\n handler.getTracker().resetTracker();\n }\n });\n }\n\n public static getInstance(): GestureHandlerOrchestrator {\n if (!GestureHandlerOrchestrator.instance) {\n GestureHandlerOrchestrator.instance = new GestureHandlerOrchestrator();\n }\n\n return GestureHandlerOrchestrator.instance;\n }\n}\n"]}
|