react-native-gesture-handler 2.6.0 → 2.6.2
Sign up to get free protection for your applications and to get access to all the features.
- 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 +22 -13
- 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.js +6 -4
- package/lib/commonjs/components/GestureComponents.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/components/Swipeable.js +4 -4
- package/lib/commonjs/components/Swipeable.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 +4 -2
- 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/utils.js +10 -6
- package/lib/commonjs/utils.js.map +1 -1
- 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 +330 -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 +21 -14
- 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.js +6 -4
- package/lib/module/components/GestureComponents.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/components/Swipeable.js +4 -4
- package/lib/module/components/Swipeable.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 +5 -3
- 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/utils.js +7 -6
- package/lib/module/utils.js.map +1 -1
- 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 +324 -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 +6 -3
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +5 -2
- package/lib/typescript/components/Swipeable.d.ts +3 -3
- 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/utils.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 +42 -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 +28 -13
- package/src/RNGestureHandlerModule.ts +4 -1
- package/src/RNGestureHandlerModule.web.ts +20 -7
- package/src/components/GestureComponents.tsx +12 -16
- package/src/components/GestureComponents.web.tsx +1 -1
- package/src/components/Swipeable.tsx +11 -7
- package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +2 -12
- package/src/fabric/RNGestureHandlerRootViewNativeComponent.ts +2 -8
- package/src/handlers/gestures/GestureDetector.tsx +8 -4
- package/src/handlers/gestures/eventReceiver.ts +23 -24
- package/src/handlers/gestures/gestureStateManager.web.ts +24 -0
- package/src/utils.ts +6 -6
- 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 +365 -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
@@ -5,89 +5,40 @@ Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
7
|
|
8
|
-
var _interfaces = require("../interfaces");
|
9
|
-
|
10
8
|
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; }
|
11
9
|
|
10
|
+
/* eslint-disable @typescript-eslint/no-empty-function */
|
12
11
|
class EventManager {
|
13
12
|
constructor(view) {
|
14
|
-
_defineProperty(this, "activePointers", []);
|
15
|
-
|
16
13
|
_defineProperty(this, "view", void 0);
|
17
14
|
|
18
|
-
this
|
19
|
-
|
15
|
+
_defineProperty(this, "pointersInBounds", []);
|
16
|
+
|
17
|
+
_defineProperty(this, "activePointersCounter", void 0);
|
20
18
|
|
21
|
-
|
22
|
-
this.
|
23
|
-
if (!this.isPointerInBounds({
|
24
|
-
x: event.clientX,
|
25
|
-
y: event.clientY
|
26
|
-
})) {
|
27
|
-
return;
|
28
|
-
}
|
29
|
-
|
30
|
-
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.DOWN);
|
31
|
-
const target = event.target;
|
32
|
-
target.setPointerCapture(adaptedEvent.pointerId);
|
33
|
-
this.addActivePointer(adaptedEvent.pointerId);
|
34
|
-
this.onPointerDown(adaptedEvent);
|
35
|
-
});
|
36
|
-
this.view.addEventListener('pointerup', event => {
|
37
|
-
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.UP);
|
38
|
-
const target = event.target;
|
39
|
-
this.onPointerUp(adaptedEvent);
|
40
|
-
target.releasePointerCapture(adaptedEvent.pointerId);
|
41
|
-
this.removeActivePointer(adaptedEvent.pointerId);
|
42
|
-
});
|
43
|
-
this.view.addEventListener('pointermove', event => {
|
44
|
-
if (event.pointerType === 'mouse' && event.buttons !== _interfaces.MouseButtons.LEFT) {
|
45
|
-
return;
|
46
|
-
}
|
47
|
-
|
48
|
-
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.MOVE);
|
49
|
-
const inBounds = this.isPointerInBounds({
|
50
|
-
x: adaptedEvent.x,
|
51
|
-
y: adaptedEvent.y
|
52
|
-
});
|
53
|
-
const pointerIndex = this.activePointers.indexOf(adaptedEvent.pointerId);
|
54
|
-
|
55
|
-
if (inBounds) {
|
56
|
-
if (pointerIndex < 0) {
|
57
|
-
adaptedEvent.eventType = _interfaces.EventTypes.ENTER;
|
58
|
-
this.onPointerEnter(adaptedEvent);
|
59
|
-
this.addActivePointer(adaptedEvent.pointerId);
|
60
|
-
} else {
|
61
|
-
this.onPointerMove(adaptedEvent);
|
62
|
-
}
|
63
|
-
} else {
|
64
|
-
if (pointerIndex >= 0) {
|
65
|
-
adaptedEvent.eventType = _interfaces.EventTypes.OUT;
|
66
|
-
this.onPointerOut(adaptedEvent);
|
67
|
-
this.removeActivePointer(adaptedEvent.pointerId);
|
68
|
-
} else {
|
69
|
-
this.onPointerOutOfBounds(adaptedEvent);
|
70
|
-
}
|
71
|
-
}
|
72
|
-
});
|
73
|
-
this.view.addEventListener('pointercancel', event => {
|
74
|
-
event.preventDefault();
|
75
|
-
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.CANCEL);
|
76
|
-
this.onPointerCancel(adaptedEvent);
|
77
|
-
});
|
19
|
+
this.view = view;
|
20
|
+
this.activePointersCounter = 0;
|
78
21
|
}
|
79
22
|
|
80
23
|
onPointerDown(_event) {}
|
81
24
|
|
25
|
+
onPointerAdd(_event) {}
|
26
|
+
|
82
27
|
onPointerUp(_event) {}
|
83
28
|
|
29
|
+
onPointerRemove(_event) {}
|
30
|
+
|
84
31
|
onPointerMove(_event) {}
|
85
32
|
|
86
33
|
onPointerOut(_event) {}
|
87
34
|
|
88
35
|
onPointerEnter(_event) {}
|
89
36
|
|
90
|
-
onPointerCancel(_event) {
|
37
|
+
onPointerCancel(_event) {// When pointer cancel is triggered and there are more pointers on the view, only one pointer is cancelled
|
38
|
+
// Because we want all pointers to be cancelled by that event, we are doing it manually by reseting handler and changing activePointersCounter to 0
|
39
|
+
// Events that correspond to removing the pointer (pointerup, touchend) have condition, that they don't perform any action when activePointersCounter
|
40
|
+
// 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
|
41
|
+
}
|
91
42
|
|
92
43
|
onPointerOutOfBounds(_event) {}
|
93
44
|
|
@@ -95,10 +46,18 @@ class EventManager {
|
|
95
46
|
this.onPointerDown = callback;
|
96
47
|
}
|
97
48
|
|
49
|
+
setOnPointerAdd(callback) {
|
50
|
+
this.onPointerAdd = callback;
|
51
|
+
}
|
52
|
+
|
98
53
|
setOnPointerUp(callback) {
|
99
54
|
this.onPointerUp = callback;
|
100
55
|
}
|
101
56
|
|
57
|
+
setOnPointerRemove(callback) {
|
58
|
+
this.onPointerRemove = callback;
|
59
|
+
}
|
60
|
+
|
102
61
|
setOnPointerMove(callback) {
|
103
62
|
this.onPointerMove = callback;
|
104
63
|
}
|
@@ -119,48 +78,33 @@ class EventManager {
|
|
119
78
|
this.onPointerOutOfBounds = callback;
|
120
79
|
}
|
121
80
|
|
122
|
-
|
123
|
-
|
124
|
-
x: event.clientX,
|
125
|
-
y: event.clientY,
|
126
|
-
offsetX: event.offsetX,
|
127
|
-
offsetY: event.offsetY,
|
128
|
-
pointerId: event.pointerId,
|
129
|
-
eventType: eventType,
|
130
|
-
pointerType: event.pointerType,
|
131
|
-
buttons: event.buttons,
|
132
|
-
time: event.timeStamp
|
133
|
-
};
|
134
|
-
}
|
135
|
-
|
136
|
-
isPointerInBounds({
|
137
|
-
x,
|
138
|
-
y
|
139
|
-
}) {
|
140
|
-
if (!this.view) {
|
141
|
-
return false;
|
142
|
-
}
|
143
|
-
|
144
|
-
const rect = this.view.getBoundingClientRect();
|
145
|
-
return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;
|
146
|
-
}
|
147
|
-
|
148
|
-
addActivePointer(pointerId) {
|
149
|
-
if (this.activePointers.indexOf(pointerId) >= 0) {
|
81
|
+
markAsInBounds(pointerId) {
|
82
|
+
if (this.pointersInBounds.indexOf(pointerId) >= 0) {
|
150
83
|
return;
|
151
84
|
}
|
152
85
|
|
153
|
-
this.
|
86
|
+
this.pointersInBounds.push(pointerId);
|
154
87
|
}
|
155
88
|
|
156
|
-
|
157
|
-
const index = this.
|
89
|
+
markAsOutOfBounds(pointerId) {
|
90
|
+
const index = this.pointersInBounds.indexOf(pointerId);
|
158
91
|
|
159
92
|
if (index < 0) {
|
160
93
|
return;
|
161
94
|
}
|
162
95
|
|
163
|
-
this.
|
96
|
+
this.pointersInBounds.splice(index, 1);
|
97
|
+
}
|
98
|
+
|
99
|
+
resetManager() {
|
100
|
+
// Reseting activePointersCounter is necessary to make gestures such as pinch work properly
|
101
|
+
// There are gestures that end when there is still one active pointer (like pinch/rotation)
|
102
|
+
// When these gestures end, they are reset, but they still receive events from pointer that is active
|
103
|
+
// This causes trouble, since only onPointerDown registers gesture in orchestrator, and while gestures receive
|
104
|
+
// Events from active pointer after they finished, next pointerdown event will be registered as additional pointer, not the first one
|
105
|
+
// This casues trouble like gestures getting stuck in END state, even though they should have gone to UNDETERMINED
|
106
|
+
this.activePointersCounter = 0;
|
107
|
+
this.pointersInBounds = [];
|
164
108
|
}
|
165
109
|
|
166
110
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["EventManager.ts"],"names":["EventManager","constructor","view","setListeners","addEventListener","event","isPointerInBounds","x","clientX","y","clientY","adaptedEvent","mapEvent","EventTypes","DOWN","target","setPointerCapture","pointerId","addActivePointer","onPointerDown","UP","onPointerUp","releasePointerCapture","removeActivePointer","pointerType","buttons","MouseButtons","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;AAGe,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"]}
|
@@ -7,8 +7,12 @@ exports.default = void 0;
|
|
7
7
|
|
8
8
|
var _State = require("../../State");
|
9
9
|
|
10
|
+
var _interfaces = require("../interfaces");
|
11
|
+
|
10
12
|
var _PointerTracker = _interopRequireDefault(require("./PointerTracker"));
|
11
13
|
|
14
|
+
var _utils = require("../utils");
|
15
|
+
|
12
16
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13
17
|
|
14
18
|
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; }
|
@@ -41,6 +45,12 @@ class GestureHandlerOrchestrator {
|
|
41
45
|
handler.setActivationIndex(Number.MAX_VALUE);
|
42
46
|
}
|
43
47
|
|
48
|
+
removeHandlerFromOrchestrator(handler) {
|
49
|
+
this.gestureHandlers.splice(this.gestureHandlers.indexOf(handler), 1);
|
50
|
+
this.awaitingHandlers.splice(this.awaitingHandlers.indexOf(handler), 1);
|
51
|
+
this.handlersToCancel.splice(this.handlersToCancel.indexOf(handler), 1);
|
52
|
+
}
|
53
|
+
|
44
54
|
cleanupFinishedHandlers() {
|
45
55
|
for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {
|
46
56
|
const handler = this.gestureHandlers[i];
|
@@ -67,14 +77,35 @@ class GestureHandlerOrchestrator {
|
|
67
77
|
return hasToWait;
|
68
78
|
}
|
69
79
|
|
70
|
-
tryActivate(handler
|
80
|
+
tryActivate(handler) {
|
71
81
|
if (this.hasOtherHandlerToWaitFor(handler)) {
|
72
82
|
this.addAwaitingHandler(handler);
|
73
|
-
} else {
|
74
|
-
this.
|
83
|
+
} else if (handler.getState() !== _State.State.CANCELLED && handler.getState() !== _State.State.FAILED) {
|
84
|
+
if (this.shouldActivate(handler)) {
|
85
|
+
this.makeActive(handler);
|
86
|
+
} else {
|
87
|
+
switch (handler.getState()) {
|
88
|
+
case _State.State.ACTIVE:
|
89
|
+
handler.fail();
|
90
|
+
break;
|
91
|
+
|
92
|
+
case _State.State.BEGAN:
|
93
|
+
handler.cancel();
|
94
|
+
}
|
95
|
+
}
|
75
96
|
}
|
76
97
|
}
|
77
98
|
|
99
|
+
shouldActivate(handler) {
|
100
|
+
for (const otherHandler of this.gestureHandlers) {
|
101
|
+
if (this.shouldHandlerBeCancelledBy(handler, otherHandler)) {
|
102
|
+
return false;
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
return true;
|
107
|
+
}
|
108
|
+
|
78
109
|
cleanupAwaitingHandlers(handler) {
|
79
110
|
for (let i = 0; i < this.awaitingHandlers.length; ++i) {
|
80
111
|
if (!this.awaitingHandlers[i].isAwaiting() && this.shouldHandlerWaitForOther(this.awaitingHandlers[i], handler)) {
|
@@ -84,32 +115,45 @@ class GestureHandlerOrchestrator {
|
|
84
115
|
}
|
85
116
|
}
|
86
117
|
|
87
|
-
onHandlerStateChange(handler, newState, oldState,
|
118
|
+
onHandlerStateChange(handler, newState, oldState, sendIfDisabled) {
|
119
|
+
if (!handler.isEnabled() && !sendIfDisabled) {
|
120
|
+
return;
|
121
|
+
}
|
122
|
+
|
88
123
|
this.handlingChangeSemaphore += 1;
|
89
124
|
|
90
125
|
if (this.isFinished(newState)) {
|
91
126
|
this.awaitingHandlers.forEach(otherHandler => {
|
92
127
|
if (this.shouldHandlerWaitForOther(otherHandler, handler)) {
|
93
128
|
if (newState === _State.State.END) {
|
94
|
-
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel(
|
129
|
+
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel();
|
130
|
+
|
131
|
+
if (otherHandler.getState() === _State.State.END) {
|
132
|
+
// Handle edge case, where discrete gestures end immediately after activation thus
|
133
|
+
// their state is set to END and when the gesture they are waiting for activates they
|
134
|
+
// should be cancelled, however `cancel` was never sent as gestures were already in the END state.
|
135
|
+
// Send synthetic BEGAN -> CANCELLED to properly handle JS logic
|
136
|
+
otherHandler.sendEvent(_State.State.CANCELLED, _State.State.BEGAN);
|
137
|
+
}
|
138
|
+
|
95
139
|
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.setAwaiting(false);
|
96
140
|
} else {
|
97
|
-
this.tryActivate(otherHandler
|
141
|
+
this.tryActivate(otherHandler);
|
98
142
|
}
|
99
143
|
}
|
100
144
|
});
|
101
145
|
}
|
102
146
|
|
103
147
|
if (newState === _State.State.ACTIVE) {
|
104
|
-
this.tryActivate(handler
|
148
|
+
this.tryActivate(handler);
|
105
149
|
} else if (oldState === _State.State.ACTIVE || oldState === _State.State.END) {
|
106
150
|
if (handler.isActive()) {
|
107
|
-
handler.sendEvent(
|
108
|
-
} else if (oldState === _State.State.ACTIVE) {
|
109
|
-
handler.sendEvent(
|
151
|
+
handler.sendEvent(newState, oldState);
|
152
|
+
} else if (oldState === _State.State.ACTIVE && (newState === _State.State.CANCELLED || newState === _State.State.FAILED)) {
|
153
|
+
handler.sendEvent(newState, _State.State.BEGAN);
|
110
154
|
}
|
111
155
|
} else if (oldState !== _State.State.UNDETERMINED || newState !== _State.State.CANCELLED) {
|
112
|
-
handler.sendEvent(
|
156
|
+
handler.sendEvent(newState, oldState);
|
113
157
|
}
|
114
158
|
|
115
159
|
this.handlingChangeSemaphore -= 1;
|
@@ -120,7 +164,7 @@ class GestureHandlerOrchestrator {
|
|
120
164
|
}
|
121
165
|
}
|
122
166
|
|
123
|
-
makeActive(handler
|
167
|
+
makeActive(handler) {
|
124
168
|
const currentState = handler.getState();
|
125
169
|
handler.setActive(true);
|
126
170
|
handler.setShouldResetProgress(true);
|
@@ -135,28 +179,33 @@ class GestureHandlerOrchestrator {
|
|
135
179
|
for (let i = this.handlersToCancel.length - 1; i >= 0; --i) {
|
136
180
|
var _this$handlersToCance;
|
137
181
|
|
138
|
-
(_this$handlersToCance = this.handlersToCancel[i]) === null || _this$handlersToCance === void 0 ? void 0 : _this$handlersToCance.cancel(
|
182
|
+
(_this$handlersToCance = this.handlersToCancel[i]) === null || _this$handlersToCance === void 0 ? void 0 : _this$handlersToCance.cancel();
|
139
183
|
}
|
140
184
|
|
141
185
|
this.awaitingHandlers.forEach(otherHandler => {
|
142
186
|
if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {
|
143
|
-
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel(
|
187
|
+
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel();
|
144
188
|
otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.setAwaiting(true);
|
145
189
|
}
|
146
190
|
});
|
147
|
-
handler.sendEvent(
|
191
|
+
handler.sendEvent(_State.State.ACTIVE, _State.State.BEGAN);
|
148
192
|
|
149
193
|
if (currentState !== _State.State.ACTIVE) {
|
150
|
-
handler.sendEvent(
|
194
|
+
handler.sendEvent(_State.State.END, _State.State.ACTIVE);
|
151
195
|
|
152
196
|
if (currentState !== _State.State.END) {
|
153
|
-
handler.sendEvent(
|
197
|
+
handler.sendEvent(_State.State.UNDETERMINED, _State.State.END);
|
154
198
|
}
|
155
199
|
}
|
156
200
|
|
157
201
|
if (handler.isAwaiting()) {
|
158
202
|
handler.setAwaiting(false);
|
159
|
-
|
203
|
+
|
204
|
+
for (let i = 0; i < this.awaitingHandlers.length; ++i) {
|
205
|
+
if (this.awaitingHandlers[i] === handler) {
|
206
|
+
this.awaitingHandlers.splice(i, 1);
|
207
|
+
}
|
208
|
+
}
|
160
209
|
}
|
161
210
|
|
162
211
|
this.handlersToCancel = [];
|
@@ -208,13 +257,6 @@ class GestureHandlerOrchestrator {
|
|
208
257
|
}
|
209
258
|
|
210
259
|
shouldHandlerBeCancelledBy(handler, otherHandler) {
|
211
|
-
const handlerPointers = handler.getTrackedPointersID();
|
212
|
-
const otherPointers = otherHandler.getTrackedPointersID();
|
213
|
-
|
214
|
-
if (!_PointerTracker.default.shareCommonPointers(handlerPointers, otherPointers) && handler.getView() !== otherHandler.getView()) {
|
215
|
-
return this.checkOverlap(handler, otherHandler);
|
216
|
-
}
|
217
|
-
|
218
260
|
if (this.canRunSimultaneously(handler, otherHandler)) {
|
219
261
|
return false;
|
220
262
|
}
|
@@ -224,6 +266,13 @@ class GestureHandlerOrchestrator {
|
|
224
266
|
return handler.shouldBeCancelledByOther(otherHandler);
|
225
267
|
}
|
226
268
|
|
269
|
+
const handlerPointers = handler.getTrackedPointersID();
|
270
|
+
const otherPointers = otherHandler.getTrackedPointersID();
|
271
|
+
|
272
|
+
if (!_PointerTracker.default.shareCommonPointers(handlerPointers, otherPointers) && handler.getView() !== otherHandler.getView()) {
|
273
|
+
return this.checkOverlap(handler, otherHandler);
|
274
|
+
}
|
275
|
+
|
227
276
|
return true;
|
228
277
|
}
|
229
278
|
|
@@ -239,10 +288,10 @@ class GestureHandlerOrchestrator {
|
|
239
288
|
const handlerX = handler.getTracker().getLastX(pointer);
|
240
289
|
const handlerY = handler.getTracker().getLastY(pointer);
|
241
290
|
|
242
|
-
if (handler.
|
291
|
+
if ((0, _utils.isPointerInBounds)(handler.getView(), {
|
243
292
|
x: handlerX,
|
244
293
|
y: handlerY
|
245
|
-
}) && otherHandler.
|
294
|
+
}) && (0, _utils.isPointerInBounds)(otherHandler.getView(), {
|
246
295
|
x: handlerX,
|
247
296
|
y: handlerY
|
248
297
|
})) {
|
@@ -253,10 +302,10 @@ class GestureHandlerOrchestrator {
|
|
253
302
|
const otherX = otherHandler.getTracker().getLastX(pointer);
|
254
303
|
const otherY = otherHandler.getTracker().getLastY(pointer);
|
255
304
|
|
256
|
-
if (handler.
|
305
|
+
if ((0, _utils.isPointerInBounds)(handler.getView(), {
|
257
306
|
x: otherX,
|
258
307
|
y: otherY
|
259
|
-
}) && otherHandler.
|
308
|
+
}) && (0, _utils.isPointerInBounds)(otherHandler.getView(), {
|
260
309
|
x: otherX,
|
261
310
|
y: otherY
|
262
311
|
})) {
|
@@ -268,10 +317,40 @@ class GestureHandlerOrchestrator {
|
|
268
317
|
|
269
318
|
isFinished(state) {
|
270
319
|
return state === _State.State.END || state === _State.State.FAILED || state === _State.State.CANCELLED;
|
320
|
+
} // This function is called when handler receives touchdown event
|
321
|
+
// If handler is using mouse or pen as a pointer and any handler receives touch event,
|
322
|
+
// mouse/pen event dissappears - it doesn't send onPointerCancel nor onPointerUp (and others)
|
323
|
+
// This became a problem because handler was left at active state without any signal to end or fail
|
324
|
+
// To handle this, when new touch event is received, we loop through active handlers and check which type of
|
325
|
+
// pointer they're using. If there are any handler with mouse/pen as a pointer, we cancel them
|
326
|
+
|
327
|
+
|
328
|
+
cancelMouseAndPenGestures(currentHandler) {
|
329
|
+
this.gestureHandlers.forEach(handler => {
|
330
|
+
if (handler.getPointerType() !== _interfaces.PointerType.MOUSE && handler.getPointerType() !== _interfaces.PointerType.PEN) {
|
331
|
+
return;
|
332
|
+
}
|
333
|
+
|
334
|
+
if (handler !== currentHandler) {
|
335
|
+
handler.cancel();
|
336
|
+
} else {
|
337
|
+
// Handler that received touch event should have its pointer tracker reset
|
338
|
+
// This allows handler to smoothly change from mouse/pen to touch
|
339
|
+
// The drawback is, that when we try to use mouse/pen one more time, it doesn't send onPointerDown at the first time
|
340
|
+
// so it is required to click two times to get handler to work
|
341
|
+
//
|
342
|
+
// However, handler will receive manually created onPointerEnter that is triggered in EventManager in onPointerMove method.
|
343
|
+
// There may be possibility to use that fact to make handler respond properly to first mouse click
|
344
|
+
handler.getTracker().resetTracker();
|
345
|
+
}
|
346
|
+
});
|
271
347
|
}
|
272
348
|
|
273
349
|
static getInstance() {
|
274
|
-
if (!GestureHandlerOrchestrator.instance)
|
350
|
+
if (!GestureHandlerOrchestrator.instance) {
|
351
|
+
GestureHandlerOrchestrator.instance = new GestureHandlerOrchestrator();
|
352
|
+
}
|
353
|
+
|
275
354
|
return GestureHandlerOrchestrator.instance;
|
276
355
|
}
|
277
356
|
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["GestureHandlerOrchestrator.ts"],"names":["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","State","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","PointerTracker","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":["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","State","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","PointerTracker","shareCommonPointers","getView","checkOverlap","overlap","pointer","handlerX","getTracker","getLastX","handlerY","getLastY","x","y","otherX","otherY","state","cancelMouseAndPenGestures","currentHandler","getPointerType","PointerType","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"]}
|