react-native-gesture-handler 2.12.1 → 2.13.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/RNGestureHandler.podspec +0 -15
- package/android/build.gradle +5 -76
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +16 -1
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +43 -18
- package/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt +120 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/NativeViewGestureHandler.kt +7 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/Extensions.kt +5 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +43 -16
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +21 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +9 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +10 -0
- package/ios/Handlers/RNHoverHandler.h +12 -0
- package/ios/Handlers/RNHoverHandler.m +152 -0
- package/ios/RNGestureHandlerButtonComponentView.mm +2 -0
- package/ios/RNGestureHandlerEvents.h +1 -0
- package/ios/RNGestureHandlerEvents.m +10 -0
- package/ios/RNGestureHandlerManager.mm +2 -0
- package/ios/RNManualActivationRecognizer.m +2 -1
- package/ios/RNRootViewGestureRecognizer.m +7 -2
- package/lib/commonjs/RNGestureHandlerModule.macos.js +3 -1
- package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.web.js +7 -2
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.windows.js +3 -1
- package/lib/commonjs/RNGestureHandlerModule.windows.js.map +1 -1
- package/lib/commonjs/components/DrawerLayout.js +1 -0
- package/lib/commonjs/components/DrawerLayout.js.map +1 -1
- package/lib/commonjs/components/touchables/GenericTouchable.js +1 -2
- package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/commonjs/components/touchables/TouchableHighlight.js.map +1 -1
- package/lib/commonjs/components/touchables/TouchableNativeFeedback.android.js.map +1 -1
- package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
- package/lib/commonjs/components/touchables/TouchableWithoutFeedback.js.map +1 -1
- package/lib/commonjs/components/touchables/index.js.map +1 -1
- package/lib/commonjs/handlers/createHandler.js +3 -3
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestureHandlerCommon.js +1 -1
- package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector.js +3 -1
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gesture.js +5 -0
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gestureObjects.js +5 -0
- package/lib/commonjs/handlers/gestures/gestureObjects.js.map +1 -1
- package/lib/commonjs/handlers/gestures/hoverGesture.js +74 -0
- package/lib/commonjs/handlers/gestures/hoverGesture.js.map +1 -0
- package/lib/commonjs/index.js +8 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/web/handlers/FlingGestureHandler.js +0 -10
- package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +61 -88
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/HoverGestureHandler.js +62 -0
- package/lib/commonjs/web/handlers/HoverGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js +6 -7
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +12 -4
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js +2 -7
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/TapGestureHandler.js +0 -10
- package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
- package/lib/commonjs/web/interfaces.js +1 -1
- package/lib/commonjs/web/interfaces.js.map +1 -1
- package/lib/commonjs/web/tools/EventManager.js +18 -4
- package/lib/commonjs/web/tools/EventManager.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerDelegate.js +6 -0
- package/lib/commonjs/web/tools/GestureHandlerDelegate.js.map +1 -0
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +5 -7
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +118 -0
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -0
- package/lib/commonjs/web/tools/PointerEventManager.js +38 -5
- package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
- package/lib/commonjs/web/tools/TouchEventManager.js +2 -2
- package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.macos.js +2 -1
- package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.web.js +6 -3
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.windows.js +2 -1
- package/lib/module/RNGestureHandlerModule.windows.js.map +1 -1
- package/lib/module/components/DrawerLayout.js +1 -0
- package/lib/module/components/DrawerLayout.js.map +1 -1
- package/lib/module/components/touchables/GenericTouchable.js +1 -2
- package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/module/components/touchables/TouchableHighlight.js.map +1 -1
- package/lib/module/components/touchables/TouchableNativeFeedback.android.js.map +1 -1
- package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
- package/lib/module/components/touchables/TouchableWithoutFeedback.js.map +1 -1
- package/lib/module/components/touchables/index.js.map +1 -1
- package/lib/module/handlers/createHandler.js +3 -3
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestureHandlerCommon.js +1 -1
- package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector.js +2 -1
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/module/handlers/gestures/gesture.js +5 -0
- package/lib/module/handlers/gestures/gesture.js.map +1 -1
- package/lib/module/handlers/gestures/gestureObjects.js +4 -0
- package/lib/module/handlers/gestures/gestureObjects.js.map +1 -1
- package/lib/module/handlers/gestures/hoverGesture.js +62 -0
- package/lib/module/handlers/gestures/hoverGesture.js.map +1 -0
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/web/handlers/FlingGestureHandler.js +0 -10
- package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +61 -84
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/handlers/HoverGestureHandler.js +47 -0
- package/lib/module/web/handlers/HoverGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/LongPressGestureHandler.js +5 -7
- package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/NativeViewGestureHandler.js +11 -4
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PanGestureHandler.js +2 -7
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/TapGestureHandler.js +0 -10
- package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
- package/lib/module/web/interfaces.js +1 -1
- package/lib/module/web/interfaces.js.map +1 -1
- package/lib/module/web/tools/EventManager.js +18 -4
- package/lib/module/web/tools/EventManager.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerDelegate.js +2 -0
- package/lib/module/web/tools/GestureHandlerDelegate.js.map +1 -0
- package/lib/module/web/tools/GestureHandlerOrchestrator.js +5 -6
- package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerWebDelegate.js +102 -0
- package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -0
- package/lib/module/web/tools/PointerEventManager.js +39 -6
- package/lib/module/web/tools/PointerEventManager.js.map +1 -1
- package/lib/module/web/tools/TouchEventManager.js +2 -2
- package/lib/module/web/tools/TouchEventManager.js.map +1 -1
- package/lib/typescript/RNGestureHandlerModule.macos.d.ts +1 -1
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +3 -1
- package/lib/typescript/RNGestureHandlerModule.windows.d.ts +1 -1
- package/lib/typescript/components/DrawerLayout.d.ts +7 -1
- package/lib/typescript/components/touchables/GenericTouchable.d.ts +3 -2
- package/lib/typescript/components/touchables/TouchableHighlight.d.ts +4 -3
- package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +3 -2
- package/lib/typescript/components/touchables/TouchableOpacity.d.ts +4 -5
- package/lib/typescript/components/touchables/TouchableWithoutFeedback.d.ts +1 -0
- package/lib/typescript/components/touchables/index.d.ts +3 -0
- package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
- package/lib/typescript/handlers/gestureHandlerCommon.d.ts +3 -1
- package/lib/typescript/handlers/gestures/gesture.d.ts +2 -1
- package/lib/typescript/handlers/gestures/gestureObjects.d.ts +2 -0
- package/lib/typescript/handlers/gestures/hoverGesture.d.ts +32 -0
- package/lib/typescript/index.d.ts +4 -0
- package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +0 -6
- package/lib/typescript/web/handlers/GestureHandler.d.ts +12 -17
- package/lib/typescript/web/handlers/HoverGestureHandler.d.ts +10 -0
- package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +0 -4
- package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -1
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +0 -4
- package/lib/typescript/web/handlers/TapGestureHandler.d.ts +0 -6
- package/lib/typescript/web/interfaces.d.ts +4 -3
- package/lib/typescript/web/tools/EventManager.d.ts +9 -5
- package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +22 -0
- package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +21 -0
- package/lib/typescript/web/tools/NodeManager.d.ts +2 -2
- package/lib/typescript/web/tools/PointerEventManager.d.ts +1 -1
- package/lib/typescript/web/tools/TouchEventManager.d.ts +1 -1
- package/package.json +2 -2
- package/src/RNGestureHandlerModule.macos.ts +5 -1
- package/src/RNGestureHandlerModule.web.ts +7 -1
- package/src/RNGestureHandlerModule.windows.ts +5 -1
- package/src/components/DrawerLayout.tsx +9 -0
- package/src/components/touchables/GenericTouchable.tsx +4 -4
- package/src/components/touchables/TouchableHighlight.tsx +6 -3
- package/src/components/touchables/TouchableNativeFeedback.android.tsx +5 -4
- package/src/components/touchables/TouchableOpacity.tsx +6 -7
- package/src/components/touchables/TouchableWithoutFeedback.tsx +3 -1
- package/src/components/touchables/index.ts +3 -0
- package/src/handlers/createHandler.tsx +4 -2
- package/src/handlers/gestureHandlerCommon.ts +39 -0
- package/src/handlers/gestures/GestureDetector.tsx +2 -0
- package/src/handlers/gestures/gesture.ts +6 -0
- package/src/handlers/gestures/gestureObjects.ts +5 -0
- package/src/handlers/gestures/hoverGesture.ts +83 -0
- package/src/index.ts +8 -0
- package/src/web/handlers/FlingGestureHandler.ts +0 -11
- package/src/web/handlers/GestureHandler.ts +68 -88
- package/src/web/handlers/HoverGestureHandler.ts +43 -0
- package/src/web/handlers/LongPressGestureHandler.ts +5 -7
- package/src/web/handlers/NativeViewGestureHandler.ts +11 -4
- package/src/web/handlers/PanGestureHandler.ts +1 -6
- package/src/web/handlers/TapGestureHandler.ts +0 -11
- package/src/web/interfaces.ts +4 -2
- package/src/web/tools/EventManager.ts +15 -7
- package/src/web/tools/GestureHandlerDelegate.ts +23 -0
- package/src/web/tools/GestureHandlerOrchestrator.ts +7 -6
- package/src/web/tools/GestureHandlerWebDelegate.ts +115 -0
- package/src/web/tools/PointerEventManager.ts +46 -16
- package/src/web/tools/TouchEventManager.ts +3 -3
|
@@ -3,7 +3,6 @@ import { PointerType } from '../interfaces';
|
|
|
3
3
|
|
|
4
4
|
import GestureHandler from '../handlers/GestureHandler';
|
|
5
5
|
import PointerTracker from './PointerTracker';
|
|
6
|
-
import { isPointerInBounds } from '../utils';
|
|
7
6
|
|
|
8
7
|
export default class GestureHandlerOrchestrator {
|
|
9
8
|
private static instance: GestureHandlerOrchestrator;
|
|
@@ -301,7 +300,7 @@ export default class GestureHandlerOrchestrator {
|
|
|
301
300
|
|
|
302
301
|
if (
|
|
303
302
|
!PointerTracker.shareCommonPointers(handlerPointers, otherPointers) &&
|
|
304
|
-
handler.getView() !== otherHandler.getView()
|
|
303
|
+
handler.getDelegate().getView() !== otherHandler.getDelegate().getView()
|
|
305
304
|
) {
|
|
306
305
|
return this.checkOverlap(handler, otherHandler);
|
|
307
306
|
}
|
|
@@ -329,8 +328,10 @@ export default class GestureHandlerOrchestrator {
|
|
|
329
328
|
const handlerY: number = handler.getTracker().getLastY(pointer);
|
|
330
329
|
|
|
331
330
|
if (
|
|
332
|
-
|
|
333
|
-
|
|
331
|
+
handler.getDelegate().isPointerInBounds({ x: handlerX, y: handlerY }) &&
|
|
332
|
+
otherHandler
|
|
333
|
+
.getDelegate()
|
|
334
|
+
.isPointerInBounds({ x: handlerX, y: handlerY })
|
|
334
335
|
) {
|
|
335
336
|
overlap = true;
|
|
336
337
|
}
|
|
@@ -341,8 +342,8 @@ export default class GestureHandlerOrchestrator {
|
|
|
341
342
|
const otherY: number = otherHandler.getTracker().getLastY(pointer);
|
|
342
343
|
|
|
343
344
|
if (
|
|
344
|
-
|
|
345
|
-
|
|
345
|
+
handler.getDelegate().isPointerInBounds({ x: otherX, y: otherY }) &&
|
|
346
|
+
otherHandler.getDelegate().isPointerInBounds({ x: otherX, y: otherY })
|
|
346
347
|
) {
|
|
347
348
|
overlap = true;
|
|
348
349
|
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { findNodeHandle } from 'react-native';
|
|
2
|
+
import type GestureHandler from '../handlers/GestureHandler';
|
|
3
|
+
import {
|
|
4
|
+
GestureHandlerDelegate,
|
|
5
|
+
MeasureResult,
|
|
6
|
+
} from './GestureHandlerDelegate';
|
|
7
|
+
import PointerEventManager from './PointerEventManager';
|
|
8
|
+
import TouchEventManager from './TouchEventManager';
|
|
9
|
+
import { State } from '../../State';
|
|
10
|
+
import { isPointerInBounds } from '../utils';
|
|
11
|
+
import EventManager from './EventManager';
|
|
12
|
+
|
|
13
|
+
export class GestureHandlerWebDelegate
|
|
14
|
+
implements GestureHandlerDelegate<HTMLElement>
|
|
15
|
+
{
|
|
16
|
+
private view!: HTMLElement;
|
|
17
|
+
private gestureHandler!: GestureHandler;
|
|
18
|
+
private eventManagers: EventManager<unknown>[] = [];
|
|
19
|
+
|
|
20
|
+
getView(): HTMLElement {
|
|
21
|
+
return this.view;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
init(viewRef: number, handler: GestureHandler): void {
|
|
25
|
+
if (!viewRef) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
`Cannot find HTML Element for handler ${handler.getTag()}`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
this.gestureHandler = handler;
|
|
32
|
+
this.view = findNodeHandle(viewRef) as unknown as HTMLElement;
|
|
33
|
+
|
|
34
|
+
this.view.style['touchAction'] = 'none';
|
|
35
|
+
//@ts-ignore This one disables default events on Safari
|
|
36
|
+
this.view.style['WebkitTouchCallout'] = 'none';
|
|
37
|
+
|
|
38
|
+
const config = handler.getConfig();
|
|
39
|
+
|
|
40
|
+
if (!config.userSelect) {
|
|
41
|
+
this.view.style['webkitUserSelect'] = 'none';
|
|
42
|
+
this.view.style['userSelect'] = 'none';
|
|
43
|
+
} else {
|
|
44
|
+
this.view.style['webkitUserSelect'] = config.userSelect;
|
|
45
|
+
this.view.style['userSelect'] = config.userSelect;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
this.eventManagers.push(new PointerEventManager(this.view));
|
|
49
|
+
this.eventManagers.push(new TouchEventManager(this.view));
|
|
50
|
+
|
|
51
|
+
this.eventManagers.forEach((manager) =>
|
|
52
|
+
this.gestureHandler.attachEventManager(manager)
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
isPointerInBounds({ x, y }: { x: number; y: number }): boolean {
|
|
57
|
+
return isPointerInBounds(this.view, { x, y });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
measureView(): MeasureResult {
|
|
61
|
+
const rect = this.view.getBoundingClientRect();
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
pageX: rect.left,
|
|
65
|
+
pageY: rect.top,
|
|
66
|
+
width: rect.width,
|
|
67
|
+
height: rect.height,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
reset(): void {
|
|
72
|
+
this.eventManagers.forEach((manager: EventManager<unknown>) =>
|
|
73
|
+
manager.resetManager()
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
tryResetCursor() {
|
|
78
|
+
const config = this.gestureHandler.getConfig();
|
|
79
|
+
|
|
80
|
+
if (
|
|
81
|
+
config.activeCursor &&
|
|
82
|
+
config.activeCursor !== 'auto' &&
|
|
83
|
+
this.gestureHandler.getState() === State.ACTIVE
|
|
84
|
+
) {
|
|
85
|
+
this.view.style.cursor = 'auto';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
onBegin(): void {
|
|
90
|
+
// no-op for now
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
onActivate(): void {
|
|
94
|
+
const config = this.gestureHandler.getConfig();
|
|
95
|
+
|
|
96
|
+
if (
|
|
97
|
+
(!this.view.style.cursor || this.view.style.cursor === 'auto') &&
|
|
98
|
+
config.activeCursor
|
|
99
|
+
) {
|
|
100
|
+
this.view.style.cursor = config.activeCursor;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
onEnd(): void {
|
|
105
|
+
this.tryResetCursor();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
onCancel(): void {
|
|
109
|
+
this.tryResetCursor();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
onFail(): void {
|
|
113
|
+
this.tryResetCursor();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AdaptedEvent,
|
|
3
|
-
EventTypes,
|
|
4
|
-
MouseButtons,
|
|
5
|
-
PointerType,
|
|
6
|
-
} from '../interfaces';
|
|
1
|
+
import { AdaptedEvent, EventTypes, PointerType } from '../interfaces';
|
|
7
2
|
import EventManager from './EventManager';
|
|
8
3
|
import { isPointerInBounds } from '../utils';
|
|
9
4
|
|
|
10
|
-
export default class PointerEventManager extends EventManager {
|
|
5
|
+
export default class PointerEventManager extends EventManager<HTMLElement> {
|
|
11
6
|
private trackedPointers = new Set<number>();
|
|
12
7
|
|
|
13
8
|
public setListeners(): void {
|
|
@@ -69,14 +64,24 @@ export default class PointerEventManager extends EventManager {
|
|
|
69
64
|
return;
|
|
70
65
|
}
|
|
71
66
|
|
|
72
|
-
if (
|
|
73
|
-
event.pointerType === PointerType.MOUSE &&
|
|
74
|
-
event.buttons !== MouseButtons.LEFT
|
|
75
|
-
) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
67
|
const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.MOVE);
|
|
68
|
+
const target = event.target as HTMLElement;
|
|
69
|
+
|
|
70
|
+
// You may be wondering why are we setting pointer capture here, when we
|
|
71
|
+
// already set it in `pointerdown` handler. Well, that's a great question,
|
|
72
|
+
// for which I don't have an answer. Specification (https://www.w3.org/TR/pointerevents2/#dom-element-setpointercapture)
|
|
73
|
+
// says that the requirement for `setPointerCapture` to work is that pointer
|
|
74
|
+
// must be in 'active buttons state`, otherwise it will fail silently, which
|
|
75
|
+
// is lovely. Obviously, when `pointerdown` is fired, one of the buttons
|
|
76
|
+
// (when using mouse) is pressed, but that doesn't mean that `setPointerCapture`
|
|
77
|
+
// will succeed, for some reason. Since it fails silently, we don't actually know
|
|
78
|
+
// if it worked or not (there's `gotpointercapture` event, but the complexity of
|
|
79
|
+
// incorporating it here seems stupid), so we just call it again here, every time
|
|
80
|
+
// pointer moves until it succeeds.
|
|
81
|
+
// God, I do love web development.
|
|
82
|
+
if (!target.hasPointerCapture(event.pointerId)) {
|
|
83
|
+
target.setPointerCapture(event.pointerId);
|
|
84
|
+
}
|
|
80
85
|
|
|
81
86
|
const inBounds: boolean = isPointerInBounds(this.view, {
|
|
82
87
|
x: adaptedEvent.x,
|
|
@@ -97,8 +102,8 @@ export default class PointerEventManager extends EventManager {
|
|
|
97
102
|
}
|
|
98
103
|
} else {
|
|
99
104
|
if (pointerIndex >= 0) {
|
|
100
|
-
adaptedEvent.eventType = EventTypes.
|
|
101
|
-
this.
|
|
105
|
+
adaptedEvent.eventType = EventTypes.LEAVE;
|
|
106
|
+
this.onPointerLeave(adaptedEvent);
|
|
102
107
|
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
|
103
108
|
} else {
|
|
104
109
|
this.onPointerOutOfBounds(adaptedEvent);
|
|
@@ -122,6 +127,31 @@ export default class PointerEventManager extends EventManager {
|
|
|
122
127
|
this.trackedPointers.clear();
|
|
123
128
|
});
|
|
124
129
|
|
|
130
|
+
// onPointerEnter and onPointerLeave are triggered by a custom logic responsible for
|
|
131
|
+
// handling shouldCancelWhenOutside flag, and are unreliable unless the pointer is down.
|
|
132
|
+
// We therefore use pointerenter and pointerleave events to handle the hover gesture,
|
|
133
|
+
// mapping them to onPointerMoveOver and onPointerMoveOut respectively.
|
|
134
|
+
|
|
135
|
+
this.view.addEventListener('pointerenter', (event: PointerEvent): void => {
|
|
136
|
+
if (event.pointerType === PointerType.TOUCH) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.ENTER);
|
|
141
|
+
|
|
142
|
+
this.onPointerMoveOver(adaptedEvent);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
this.view.addEventListener('pointerleave', (event: PointerEvent): void => {
|
|
146
|
+
if (event.pointerType === PointerType.TOUCH) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.LEAVE);
|
|
151
|
+
|
|
152
|
+
this.onPointerMoveOut(adaptedEvent);
|
|
153
|
+
});
|
|
154
|
+
|
|
125
155
|
this.view.addEventListener(
|
|
126
156
|
'lostpointercapture',
|
|
127
157
|
(event: PointerEvent): void => {
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
import EventManager from './EventManager';
|
|
9
9
|
import { isPointerInBounds } from '../utils';
|
|
10
10
|
|
|
11
|
-
export default class TouchEventManager extends EventManager {
|
|
11
|
+
export default class TouchEventManager extends EventManager<HTMLElement> {
|
|
12
12
|
public setListeners(): void {
|
|
13
13
|
this.view.addEventListener('touchstart', (event: TouchEvent) => {
|
|
14
14
|
for (let i = 0; i < event.changedTouches.length; ++i) {
|
|
@@ -75,8 +75,8 @@ export default class TouchEventManager extends EventManager {
|
|
|
75
75
|
}
|
|
76
76
|
} else {
|
|
77
77
|
if (pointerIndex >= 0) {
|
|
78
|
-
adaptedEvent.eventType = EventTypes.
|
|
79
|
-
this.
|
|
78
|
+
adaptedEvent.eventType = EventTypes.LEAVE;
|
|
79
|
+
this.onPointerLeave(adaptedEvent);
|
|
80
80
|
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
|
81
81
|
} else {
|
|
82
82
|
this.onPointerOutOfBounds(adaptedEvent);
|