react-native-gesture-handler 2.19.0 → 2.20.1
Sign up to get free protection for your applications and to get access to all the features.
- package/android/build.gradle +7 -12
- package/android/paper/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +1 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt +11 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt +8 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/StylusData.kt +103 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +24 -15
- package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/HoverGestureHandlerEventDataBuilder.kt +7 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/PanGestureHandlerEventDataBuilder.kt +7 -0
- package/android/src/main/jni/CMakeLists.txt +18 -9
- package/apple/Handlers/RNLongPressHandler.m +2 -0
- package/apple/Handlers/RNPanHandler.m +57 -7
- package/apple/Handlers/RNRotationHandler.m +1 -1
- package/apple/RNGHStylusData.h +77 -0
- package/apple/RNGHStylusData.m +37 -0
- package/apple/RNGestureHandlerButtonComponentView.mm +35 -0
- package/apple/RNGestureHandlerEvents.h +3 -1
- package/apple/RNGestureHandlerEvents.m +11 -3
- package/lib/commonjs/components/GestureButtons.js +5 -1
- package/lib/commonjs/components/GestureButtons.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.js.map +1 -1
- package/lib/commonjs/components/Pressable/Pressable.js +5 -14
- package/lib/commonjs/components/Pressable/Pressable.js.map +1 -1
- package/lib/commonjs/components/Pressable/utils.js +1 -23
- package/lib/commonjs/components/Pressable/utils.js.map +1 -1
- package/lib/commonjs/handlers/GestureHandlerEventPayload.js +4 -0
- package/lib/commonjs/handlers/createHandler.js +2 -1
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/hoverGesture.js.map +1 -1
- package/lib/commonjs/jestUtils/jestUtils.js +12 -4
- package/lib/commonjs/jestUtils/jestUtils.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +1 -3
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/HoverGestureHandler.js +18 -1
- package/lib/commonjs/web/handlers/HoverGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js +8 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/web/interfaces.js.map +1 -1
- package/lib/commonjs/web/tools/EventManager.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +0 -3
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/commonjs/web/tools/PointerEventManager.js +3 -37
- package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
- package/lib/commonjs/web/utils.js +173 -0
- package/lib/commonjs/web/utils.js.map +1 -1
- package/lib/module/components/GestureButtons.js +5 -1
- package/lib/module/components/GestureButtons.js.map +1 -1
- package/lib/module/components/GestureComponents.js.map +1 -1
- package/lib/module/components/Pressable/Pressable.js +7 -14
- package/lib/module/components/Pressable/Pressable.js.map +1 -1
- package/lib/module/components/Pressable/utils.js +1 -22
- package/lib/module/components/Pressable/utils.js.map +1 -1
- package/lib/module/handlers/GestureHandlerEventPayload.js +1 -1
- package/lib/module/handlers/createHandler.js +2 -1
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestures/gesture.js.map +1 -1
- package/lib/module/handlers/gestures/hoverGesture.js.map +1 -1
- package/lib/module/jestUtils/jestUtils.js +12 -4
- package/lib/module/jestUtils/jestUtils.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +1 -3
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/handlers/HoverGestureHandler.js +18 -1
- package/lib/module/web/handlers/HoverGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PanGestureHandler.js +8 -1
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/web/interfaces.js.map +1 -1
- package/lib/module/web/tools/EventManager.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerWebDelegate.js +0 -2
- package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/module/web/tools/PointerEventManager.js +4 -38
- package/lib/module/web/tools/PointerEventManager.js.map +1 -1
- package/lib/module/web/utils.js +170 -0
- package/lib/module/web/utils.js.map +1 -1
- package/lib/typescript/components/GestureComponents.d.ts +1 -1
- package/lib/typescript/components/Pressable/utils.d.ts +3 -5
- package/lib/typescript/handlers/GestureHandlerEventPayload.d.ts +35 -0
- package/lib/typescript/handlers/gestures/gesture.d.ts +2 -2
- package/lib/typescript/handlers/gestures/hoverGesture.d.ts +1 -6
- package/lib/typescript/handlers/handlersRegistry.d.ts +1 -1
- package/lib/typescript/jestUtils/jestUtils.d.ts +1 -1
- package/lib/typescript/web/handlers/HoverGestureHandler.d.ts +2 -0
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +3 -1
- package/lib/typescript/web/interfaces.d.ts +8 -3
- package/lib/typescript/web/tools/EventManager.d.ts +2 -2
- package/lib/typescript/web/utils.d.ts +2 -1
- package/package.json +1 -1
- package/src/components/GestureButtons.tsx +2 -1
- package/src/components/GestureComponents.tsx +1 -1
- package/src/components/Pressable/Pressable.tsx +16 -29
- package/src/components/Pressable/utils.ts +5 -49
- package/src/handlers/GestureHandlerEventPayload.ts +42 -0
- package/src/handlers/createHandler.tsx +1 -0
- package/src/handlers/gestures/gesture.ts +3 -1
- package/src/handlers/gestures/hoverGesture.ts +1 -7
- package/src/jestUtils/jestUtils.ts +9 -1
- package/src/web/handlers/GestureHandler.ts +1 -1
- package/src/web/handlers/HoverGestureHandler.ts +16 -2
- package/src/web/handlers/PanGestureHandler.ts +10 -1
- package/src/web/interfaces.ts +9 -3
- package/src/web/tools/EventManager.ts +2 -4
- package/src/web/tools/GestureHandlerWebDelegate.ts +0 -2
- package/src/web/tools/PointerEventManager.ts +2 -38
- package/src/web/utils.ts +174 -1
- package/lib/commonjs/web/tools/TouchEventManager.js +0 -164
- package/lib/commonjs/web/tools/TouchEventManager.js.map +0 -1
- package/lib/module/web/tools/TouchEventManager.js +0 -149
- package/lib/module/web/tools/TouchEventManager.js.map +0 -1
- package/lib/typescript/web/tools/TouchEventManager.d.ts +0 -11
- package/src/web/tools/TouchEventManager.ts +0 -175
@@ -1,164 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.default = void 0;
|
7
|
-
|
8
|
-
var _interfaces = require("../interfaces");
|
9
|
-
|
10
|
-
var _EventManager = _interopRequireDefault(require("./EventManager"));
|
11
|
-
|
12
|
-
var _utils = require("../utils");
|
13
|
-
|
14
|
-
var _PointerType = require("../../PointerType");
|
15
|
-
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
17
|
-
|
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; }
|
19
|
-
|
20
|
-
class TouchEventManager extends _EventManager.default {
|
21
|
-
constructor(...args) {
|
22
|
-
super(...args);
|
23
|
-
|
24
|
-
_defineProperty(this, "touchStartCallback", event => {
|
25
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
26
|
-
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.DOWN, i, _interfaces.TouchEventType.DOWN); // Here we skip stylus, because in case of anything different than touch we want to handle it by using PointerEvents
|
27
|
-
// If we leave stylus to send touch events, handlers will receive every action twice
|
28
|
-
|
29
|
-
if (!(0, _utils.isPointerInBounds)(this.view, {
|
30
|
-
x: adaptedEvent.x,
|
31
|
-
y: adaptedEvent.y
|
32
|
-
}) || // @ts-ignore touchType field does exist
|
33
|
-
event.changedTouches[i].touchType === 'stylus') {
|
34
|
-
continue;
|
35
|
-
}
|
36
|
-
|
37
|
-
this.markAsInBounds(adaptedEvent.pointerId);
|
38
|
-
|
39
|
-
if (++this.activePointersCounter > 1) {
|
40
|
-
adaptedEvent.eventType = _interfaces.EventTypes.ADDITIONAL_POINTER_DOWN;
|
41
|
-
this.onPointerAdd(adaptedEvent);
|
42
|
-
} else {
|
43
|
-
this.onPointerDown(adaptedEvent);
|
44
|
-
}
|
45
|
-
}
|
46
|
-
});
|
47
|
-
|
48
|
-
_defineProperty(this, "touchMoveCallback", event => {
|
49
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
50
|
-
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.MOVE, i, _interfaces.TouchEventType.MOVE); // @ts-ignore touchType field does exist
|
51
|
-
|
52
|
-
if (event.changedTouches[i].touchType === 'stylus') {
|
53
|
-
continue;
|
54
|
-
}
|
55
|
-
|
56
|
-
const inBounds = (0, _utils.isPointerInBounds)(this.view, {
|
57
|
-
x: adaptedEvent.x,
|
58
|
-
y: adaptedEvent.y
|
59
|
-
});
|
60
|
-
const pointerIndex = this.pointersInBounds.indexOf(adaptedEvent.pointerId);
|
61
|
-
|
62
|
-
if (inBounds) {
|
63
|
-
if (pointerIndex < 0) {
|
64
|
-
adaptedEvent.eventType = _interfaces.EventTypes.ENTER;
|
65
|
-
this.onPointerEnter(adaptedEvent);
|
66
|
-
this.markAsInBounds(adaptedEvent.pointerId);
|
67
|
-
} else {
|
68
|
-
this.onPointerMove(adaptedEvent);
|
69
|
-
}
|
70
|
-
} else {
|
71
|
-
if (pointerIndex >= 0) {
|
72
|
-
adaptedEvent.eventType = _interfaces.EventTypes.LEAVE;
|
73
|
-
this.onPointerLeave(adaptedEvent);
|
74
|
-
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
75
|
-
} else {
|
76
|
-
this.onPointerOutOfBounds(adaptedEvent);
|
77
|
-
}
|
78
|
-
}
|
79
|
-
}
|
80
|
-
});
|
81
|
-
|
82
|
-
_defineProperty(this, "touchEndCallback", event => {
|
83
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
84
|
-
// When we call reset on gesture handlers, it also resets their event managers
|
85
|
-
// In some handlers (like RotationGestureHandler) reset is called before all pointers leave view
|
86
|
-
// This means, that activePointersCounter will be set to 0, while there are still remaining pointers on view
|
87
|
-
// Removing them will end in activePointersCounter going below 0, therefore handlers won't behave properly
|
88
|
-
if (this.activePointersCounter === 0) {
|
89
|
-
break;
|
90
|
-
} // @ts-ignore touchType field does exist
|
91
|
-
|
92
|
-
|
93
|
-
if (event.changedTouches[i].touchType === 'stylus') {
|
94
|
-
continue;
|
95
|
-
}
|
96
|
-
|
97
|
-
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.UP, i, _interfaces.TouchEventType.UP);
|
98
|
-
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
99
|
-
|
100
|
-
if (--this.activePointersCounter > 0) {
|
101
|
-
adaptedEvent.eventType = _interfaces.EventTypes.ADDITIONAL_POINTER_UP;
|
102
|
-
this.onPointerRemove(adaptedEvent);
|
103
|
-
} else {
|
104
|
-
this.onPointerUp(adaptedEvent);
|
105
|
-
}
|
106
|
-
}
|
107
|
-
});
|
108
|
-
|
109
|
-
_defineProperty(this, "touchCancelCallback", event => {
|
110
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
111
|
-
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.CANCEL, i, _interfaces.TouchEventType.CANCELLED); // @ts-ignore touchType field does exist
|
112
|
-
|
113
|
-
if (event.changedTouches[i].touchType === 'stylus') {
|
114
|
-
continue;
|
115
|
-
}
|
116
|
-
|
117
|
-
this.onPointerCancel(adaptedEvent);
|
118
|
-
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
119
|
-
this.activePointersCounter = 0;
|
120
|
-
}
|
121
|
-
});
|
122
|
-
}
|
123
|
-
|
124
|
-
registerListeners() {
|
125
|
-
this.view.addEventListener('touchstart', this.touchStartCallback);
|
126
|
-
this.view.addEventListener('touchmove', this.touchMoveCallback);
|
127
|
-
this.view.addEventListener('touchend', this.touchEndCallback);
|
128
|
-
this.view.addEventListener('touchcancel', this.touchCancelCallback);
|
129
|
-
}
|
130
|
-
|
131
|
-
unregisterListeners() {
|
132
|
-
this.view.removeEventListener('touchstart', this.touchStartCallback);
|
133
|
-
this.view.removeEventListener('touchmove', this.touchMoveCallback);
|
134
|
-
this.view.removeEventListener('touchend', this.touchEndCallback);
|
135
|
-
this.view.removeEventListener('touchcancel', this.touchCancelCallback);
|
136
|
-
}
|
137
|
-
|
138
|
-
mapEvent(event, eventType, index, touchEventType) {
|
139
|
-
const rect = this.view.getBoundingClientRect();
|
140
|
-
const clientX = event.changedTouches[index].clientX;
|
141
|
-
const clientY = event.changedTouches[index].clientY;
|
142
|
-
const {
|
143
|
-
scaleX,
|
144
|
-
scaleY
|
145
|
-
} = (0, _utils.calculateViewScale)(this.view);
|
146
|
-
return {
|
147
|
-
x: clientX,
|
148
|
-
y: clientY,
|
149
|
-
offsetX: (clientX - rect.left) / scaleX,
|
150
|
-
offsetY: (clientY - rect.top) / scaleY,
|
151
|
-
pointerId: event.changedTouches[index].identifier,
|
152
|
-
eventType: eventType,
|
153
|
-
pointerType: _PointerType.PointerType.TOUCH,
|
154
|
-
time: event.timeStamp,
|
155
|
-
allTouches: event.touches,
|
156
|
-
changedTouches: event.changedTouches,
|
157
|
-
touchEventType: touchEventType
|
158
|
-
};
|
159
|
-
}
|
160
|
-
|
161
|
-
}
|
162
|
-
|
163
|
-
exports.default = TouchEventManager;
|
164
|
-
//# sourceMappingURL=TouchEventManager.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["TouchEventManager.ts"],"names":["TouchEventManager","EventManager","event","i","changedTouches","length","adaptedEvent","mapEvent","EventTypes","DOWN","TouchEventType","view","x","y","touchType","markAsInBounds","pointerId","activePointersCounter","eventType","ADDITIONAL_POINTER_DOWN","onPointerAdd","onPointerDown","MOVE","inBounds","pointerIndex","pointersInBounds","indexOf","ENTER","onPointerEnter","onPointerMove","LEAVE","onPointerLeave","markAsOutOfBounds","onPointerOutOfBounds","UP","ADDITIONAL_POINTER_UP","onPointerRemove","onPointerUp","CANCEL","CANCELLED","onPointerCancel","registerListeners","addEventListener","touchStartCallback","touchMoveCallback","touchEndCallback","touchCancelCallback","unregisterListeners","removeEventListener","index","touchEventType","rect","getBoundingClientRect","clientX","clientY","scaleX","scaleY","offsetX","left","offsetY","top","identifier","pointerType","PointerType","TOUCH","time","timeStamp","allTouches","touches"],"mappings":"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","sourcesContent":["import { AdaptedEvent, EventTypes, TouchEventType } from '../interfaces';\nimport EventManager from './EventManager';\nimport { calculateViewScale, isPointerInBounds } from '../utils';\nimport { PointerType } from '../../PointerType';\n\nexport default class TouchEventManager extends EventManager<HTMLElement> {\n private touchStartCallback = (event: TouchEvent): void => {\n for (let i = 0; i < event.changedTouches.length; ++i) {\n const adaptedEvent: AdaptedEvent = this.mapEvent(\n event,\n EventTypes.DOWN,\n i,\n TouchEventType.DOWN\n );\n\n // Here we skip stylus, because in case of anything different than touch we want to handle it by using PointerEvents\n // If we leave stylus to send touch events, handlers will receive every action twice\n if (\n !isPointerInBounds(this.view, {\n x: adaptedEvent.x,\n y: adaptedEvent.y,\n }) ||\n // @ts-ignore touchType field does exist\n event.changedTouches[i].touchType === 'stylus'\n ) {\n continue;\n }\n\n this.markAsInBounds(adaptedEvent.pointerId);\n\n if (++this.activePointersCounter > 1) {\n adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_DOWN;\n this.onPointerAdd(adaptedEvent);\n } else {\n this.onPointerDown(adaptedEvent);\n }\n }\n };\n\n private touchMoveCallback = (event: TouchEvent): void => {\n for (let i = 0; i < event.changedTouches.length; ++i) {\n const adaptedEvent: AdaptedEvent = this.mapEvent(\n event,\n EventTypes.MOVE,\n i,\n TouchEventType.MOVE\n );\n // @ts-ignore touchType field does exist\n if (event.changedTouches[i].touchType === 'stylus') {\n continue;\n }\n\n const inBounds: boolean = isPointerInBounds(this.view, {\n x: adaptedEvent.x,\n y: adaptedEvent.y,\n });\n\n const pointerIndex: number = this.pointersInBounds.indexOf(\n adaptedEvent.pointerId\n );\n\n if (inBounds) {\n if (pointerIndex < 0) {\n adaptedEvent.eventType = EventTypes.ENTER;\n this.onPointerEnter(adaptedEvent);\n this.markAsInBounds(adaptedEvent.pointerId);\n } else {\n this.onPointerMove(adaptedEvent);\n }\n } else {\n if (pointerIndex >= 0) {\n adaptedEvent.eventType = EventTypes.LEAVE;\n this.onPointerLeave(adaptedEvent);\n this.markAsOutOfBounds(adaptedEvent.pointerId);\n } else {\n this.onPointerOutOfBounds(adaptedEvent);\n }\n }\n }\n };\n\n private touchEndCallback = (event: TouchEvent): void => {\n for (let i = 0; i < event.changedTouches.length; ++i) {\n // When we call reset on gesture handlers, it also resets their event managers\n // In some handlers (like RotationGestureHandler) reset is called before all pointers leave view\n // This means, that activePointersCounter will be set to 0, while there are still remaining pointers on view\n // Removing them will end in activePointersCounter going below 0, therefore handlers won't behave properly\n if (this.activePointersCounter === 0) {\n break;\n }\n\n // @ts-ignore touchType field does exist\n if (event.changedTouches[i].touchType === 'stylus') {\n continue;\n }\n\n const adaptedEvent: AdaptedEvent = this.mapEvent(\n event,\n EventTypes.UP,\n i,\n TouchEventType.UP\n );\n\n this.markAsOutOfBounds(adaptedEvent.pointerId);\n\n if (--this.activePointersCounter > 0) {\n adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_UP;\n this.onPointerRemove(adaptedEvent);\n } else {\n this.onPointerUp(adaptedEvent);\n }\n }\n };\n\n private touchCancelCallback = (event: TouchEvent): void => {\n for (let i = 0; i < event.changedTouches.length; ++i) {\n const adaptedEvent: AdaptedEvent = this.mapEvent(\n event,\n EventTypes.CANCEL,\n i,\n TouchEventType.CANCELLED\n );\n\n // @ts-ignore touchType field does exist\n if (event.changedTouches[i].touchType === 'stylus') {\n continue;\n }\n\n this.onPointerCancel(adaptedEvent);\n this.markAsOutOfBounds(adaptedEvent.pointerId);\n this.activePointersCounter = 0;\n }\n };\n\n public registerListeners(): void {\n this.view.addEventListener('touchstart', this.touchStartCallback);\n this.view.addEventListener('touchmove', this.touchMoveCallback);\n this.view.addEventListener('touchend', this.touchEndCallback);\n this.view.addEventListener('touchcancel', this.touchCancelCallback);\n }\n\n public unregisterListeners(): void {\n this.view.removeEventListener('touchstart', this.touchStartCallback);\n this.view.removeEventListener('touchmove', this.touchMoveCallback);\n this.view.removeEventListener('touchend', this.touchEndCallback);\n this.view.removeEventListener('touchcancel', this.touchCancelCallback);\n }\n\n protected mapEvent(\n event: TouchEvent,\n eventType: EventTypes,\n index: number,\n touchEventType: TouchEventType\n ): AdaptedEvent {\n const rect = this.view.getBoundingClientRect();\n const clientX = event.changedTouches[index].clientX;\n const clientY = event.changedTouches[index].clientY;\n\n const { scaleX, scaleY } = calculateViewScale(this.view);\n\n return {\n x: clientX,\n y: clientY,\n offsetX: (clientX - rect.left) / scaleX,\n offsetY: (clientY - rect.top) / scaleY,\n pointerId: event.changedTouches[index].identifier,\n eventType: eventType,\n pointerType: PointerType.TOUCH,\n time: event.timeStamp,\n allTouches: event.touches,\n changedTouches: event.changedTouches,\n touchEventType: touchEventType,\n };\n }\n}\n"]}
|
@@ -1,149 +0,0 @@
|
|
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
|
-
|
3
|
-
import { EventTypes, TouchEventType } from '../interfaces';
|
4
|
-
import EventManager from './EventManager';
|
5
|
-
import { calculateViewScale, isPointerInBounds } from '../utils';
|
6
|
-
import { PointerType } from '../../PointerType';
|
7
|
-
export default class TouchEventManager extends EventManager {
|
8
|
-
constructor(...args) {
|
9
|
-
super(...args);
|
10
|
-
|
11
|
-
_defineProperty(this, "touchStartCallback", event => {
|
12
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
13
|
-
const adaptedEvent = this.mapEvent(event, EventTypes.DOWN, i, TouchEventType.DOWN); // Here we skip stylus, because in case of anything different than touch we want to handle it by using PointerEvents
|
14
|
-
// If we leave stylus to send touch events, handlers will receive every action twice
|
15
|
-
|
16
|
-
if (!isPointerInBounds(this.view, {
|
17
|
-
x: adaptedEvent.x,
|
18
|
-
y: adaptedEvent.y
|
19
|
-
}) || // @ts-ignore touchType field does exist
|
20
|
-
event.changedTouches[i].touchType === 'stylus') {
|
21
|
-
continue;
|
22
|
-
}
|
23
|
-
|
24
|
-
this.markAsInBounds(adaptedEvent.pointerId);
|
25
|
-
|
26
|
-
if (++this.activePointersCounter > 1) {
|
27
|
-
adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_DOWN;
|
28
|
-
this.onPointerAdd(adaptedEvent);
|
29
|
-
} else {
|
30
|
-
this.onPointerDown(adaptedEvent);
|
31
|
-
}
|
32
|
-
}
|
33
|
-
});
|
34
|
-
|
35
|
-
_defineProperty(this, "touchMoveCallback", event => {
|
36
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
37
|
-
const adaptedEvent = this.mapEvent(event, EventTypes.MOVE, i, TouchEventType.MOVE); // @ts-ignore touchType field does exist
|
38
|
-
|
39
|
-
if (event.changedTouches[i].touchType === 'stylus') {
|
40
|
-
continue;
|
41
|
-
}
|
42
|
-
|
43
|
-
const inBounds = isPointerInBounds(this.view, {
|
44
|
-
x: adaptedEvent.x,
|
45
|
-
y: adaptedEvent.y
|
46
|
-
});
|
47
|
-
const pointerIndex = this.pointersInBounds.indexOf(adaptedEvent.pointerId);
|
48
|
-
|
49
|
-
if (inBounds) {
|
50
|
-
if (pointerIndex < 0) {
|
51
|
-
adaptedEvent.eventType = EventTypes.ENTER;
|
52
|
-
this.onPointerEnter(adaptedEvent);
|
53
|
-
this.markAsInBounds(adaptedEvent.pointerId);
|
54
|
-
} else {
|
55
|
-
this.onPointerMove(adaptedEvent);
|
56
|
-
}
|
57
|
-
} else {
|
58
|
-
if (pointerIndex >= 0) {
|
59
|
-
adaptedEvent.eventType = EventTypes.LEAVE;
|
60
|
-
this.onPointerLeave(adaptedEvent);
|
61
|
-
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
62
|
-
} else {
|
63
|
-
this.onPointerOutOfBounds(adaptedEvent);
|
64
|
-
}
|
65
|
-
}
|
66
|
-
}
|
67
|
-
});
|
68
|
-
|
69
|
-
_defineProperty(this, "touchEndCallback", event => {
|
70
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
71
|
-
// When we call reset on gesture handlers, it also resets their event managers
|
72
|
-
// In some handlers (like RotationGestureHandler) reset is called before all pointers leave view
|
73
|
-
// This means, that activePointersCounter will be set to 0, while there are still remaining pointers on view
|
74
|
-
// Removing them will end in activePointersCounter going below 0, therefore handlers won't behave properly
|
75
|
-
if (this.activePointersCounter === 0) {
|
76
|
-
break;
|
77
|
-
} // @ts-ignore touchType field does exist
|
78
|
-
|
79
|
-
|
80
|
-
if (event.changedTouches[i].touchType === 'stylus') {
|
81
|
-
continue;
|
82
|
-
}
|
83
|
-
|
84
|
-
const adaptedEvent = this.mapEvent(event, EventTypes.UP, i, TouchEventType.UP);
|
85
|
-
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
86
|
-
|
87
|
-
if (--this.activePointersCounter > 0) {
|
88
|
-
adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_UP;
|
89
|
-
this.onPointerRemove(adaptedEvent);
|
90
|
-
} else {
|
91
|
-
this.onPointerUp(adaptedEvent);
|
92
|
-
}
|
93
|
-
}
|
94
|
-
});
|
95
|
-
|
96
|
-
_defineProperty(this, "touchCancelCallback", event => {
|
97
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
98
|
-
const adaptedEvent = this.mapEvent(event, EventTypes.CANCEL, i, TouchEventType.CANCELLED); // @ts-ignore touchType field does exist
|
99
|
-
|
100
|
-
if (event.changedTouches[i].touchType === 'stylus') {
|
101
|
-
continue;
|
102
|
-
}
|
103
|
-
|
104
|
-
this.onPointerCancel(adaptedEvent);
|
105
|
-
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
106
|
-
this.activePointersCounter = 0;
|
107
|
-
}
|
108
|
-
});
|
109
|
-
}
|
110
|
-
|
111
|
-
registerListeners() {
|
112
|
-
this.view.addEventListener('touchstart', this.touchStartCallback);
|
113
|
-
this.view.addEventListener('touchmove', this.touchMoveCallback);
|
114
|
-
this.view.addEventListener('touchend', this.touchEndCallback);
|
115
|
-
this.view.addEventListener('touchcancel', this.touchCancelCallback);
|
116
|
-
}
|
117
|
-
|
118
|
-
unregisterListeners() {
|
119
|
-
this.view.removeEventListener('touchstart', this.touchStartCallback);
|
120
|
-
this.view.removeEventListener('touchmove', this.touchMoveCallback);
|
121
|
-
this.view.removeEventListener('touchend', this.touchEndCallback);
|
122
|
-
this.view.removeEventListener('touchcancel', this.touchCancelCallback);
|
123
|
-
}
|
124
|
-
|
125
|
-
mapEvent(event, eventType, index, touchEventType) {
|
126
|
-
const rect = this.view.getBoundingClientRect();
|
127
|
-
const clientX = event.changedTouches[index].clientX;
|
128
|
-
const clientY = event.changedTouches[index].clientY;
|
129
|
-
const {
|
130
|
-
scaleX,
|
131
|
-
scaleY
|
132
|
-
} = calculateViewScale(this.view);
|
133
|
-
return {
|
134
|
-
x: clientX,
|
135
|
-
y: clientY,
|
136
|
-
offsetX: (clientX - rect.left) / scaleX,
|
137
|
-
offsetY: (clientY - rect.top) / scaleY,
|
138
|
-
pointerId: event.changedTouches[index].identifier,
|
139
|
-
eventType: eventType,
|
140
|
-
pointerType: PointerType.TOUCH,
|
141
|
-
time: event.timeStamp,
|
142
|
-
allTouches: event.touches,
|
143
|
-
changedTouches: event.changedTouches,
|
144
|
-
touchEventType: touchEventType
|
145
|
-
};
|
146
|
-
}
|
147
|
-
|
148
|
-
}
|
149
|
-
//# sourceMappingURL=TouchEventManager.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["TouchEventManager.ts"],"names":["EventTypes","TouchEventType","EventManager","calculateViewScale","isPointerInBounds","PointerType","TouchEventManager","event","i","changedTouches","length","adaptedEvent","mapEvent","DOWN","view","x","y","touchType","markAsInBounds","pointerId","activePointersCounter","eventType","ADDITIONAL_POINTER_DOWN","onPointerAdd","onPointerDown","MOVE","inBounds","pointerIndex","pointersInBounds","indexOf","ENTER","onPointerEnter","onPointerMove","LEAVE","onPointerLeave","markAsOutOfBounds","onPointerOutOfBounds","UP","ADDITIONAL_POINTER_UP","onPointerRemove","onPointerUp","CANCEL","CANCELLED","onPointerCancel","registerListeners","addEventListener","touchStartCallback","touchMoveCallback","touchEndCallback","touchCancelCallback","unregisterListeners","removeEventListener","index","touchEventType","rect","getBoundingClientRect","clientX","clientY","scaleX","scaleY","offsetX","left","offsetY","top","identifier","pointerType","TOUCH","time","timeStamp","allTouches","touches"],"mappings":"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","sourcesContent":["import { AdaptedEvent, EventTypes, TouchEventType } from '../interfaces';\nimport EventManager from './EventManager';\nimport { calculateViewScale, isPointerInBounds } from '../utils';\nimport { PointerType } from '../../PointerType';\n\nexport default class TouchEventManager extends EventManager<HTMLElement> {\n private touchStartCallback = (event: TouchEvent): void => {\n for (let i = 0; i < event.changedTouches.length; ++i) {\n const adaptedEvent: AdaptedEvent = this.mapEvent(\n event,\n EventTypes.DOWN,\n i,\n TouchEventType.DOWN\n );\n\n // Here we skip stylus, because in case of anything different than touch we want to handle it by using PointerEvents\n // If we leave stylus to send touch events, handlers will receive every action twice\n if (\n !isPointerInBounds(this.view, {\n x: adaptedEvent.x,\n y: adaptedEvent.y,\n }) ||\n // @ts-ignore touchType field does exist\n event.changedTouches[i].touchType === 'stylus'\n ) {\n continue;\n }\n\n this.markAsInBounds(adaptedEvent.pointerId);\n\n if (++this.activePointersCounter > 1) {\n adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_DOWN;\n this.onPointerAdd(adaptedEvent);\n } else {\n this.onPointerDown(adaptedEvent);\n }\n }\n };\n\n private touchMoveCallback = (event: TouchEvent): void => {\n for (let i = 0; i < event.changedTouches.length; ++i) {\n const adaptedEvent: AdaptedEvent = this.mapEvent(\n event,\n EventTypes.MOVE,\n i,\n TouchEventType.MOVE\n );\n // @ts-ignore touchType field does exist\n if (event.changedTouches[i].touchType === 'stylus') {\n continue;\n }\n\n const inBounds: boolean = isPointerInBounds(this.view, {\n x: adaptedEvent.x,\n y: adaptedEvent.y,\n });\n\n const pointerIndex: number = this.pointersInBounds.indexOf(\n adaptedEvent.pointerId\n );\n\n if (inBounds) {\n if (pointerIndex < 0) {\n adaptedEvent.eventType = EventTypes.ENTER;\n this.onPointerEnter(adaptedEvent);\n this.markAsInBounds(adaptedEvent.pointerId);\n } else {\n this.onPointerMove(adaptedEvent);\n }\n } else {\n if (pointerIndex >= 0) {\n adaptedEvent.eventType = EventTypes.LEAVE;\n this.onPointerLeave(adaptedEvent);\n this.markAsOutOfBounds(adaptedEvent.pointerId);\n } else {\n this.onPointerOutOfBounds(adaptedEvent);\n }\n }\n }\n };\n\n private touchEndCallback = (event: TouchEvent): void => {\n for (let i = 0; i < event.changedTouches.length; ++i) {\n // When we call reset on gesture handlers, it also resets their event managers\n // In some handlers (like RotationGestureHandler) reset is called before all pointers leave view\n // This means, that activePointersCounter will be set to 0, while there are still remaining pointers on view\n // Removing them will end in activePointersCounter going below 0, therefore handlers won't behave properly\n if (this.activePointersCounter === 0) {\n break;\n }\n\n // @ts-ignore touchType field does exist\n if (event.changedTouches[i].touchType === 'stylus') {\n continue;\n }\n\n const adaptedEvent: AdaptedEvent = this.mapEvent(\n event,\n EventTypes.UP,\n i,\n TouchEventType.UP\n );\n\n this.markAsOutOfBounds(adaptedEvent.pointerId);\n\n if (--this.activePointersCounter > 0) {\n adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_UP;\n this.onPointerRemove(adaptedEvent);\n } else {\n this.onPointerUp(adaptedEvent);\n }\n }\n };\n\n private touchCancelCallback = (event: TouchEvent): void => {\n for (let i = 0; i < event.changedTouches.length; ++i) {\n const adaptedEvent: AdaptedEvent = this.mapEvent(\n event,\n EventTypes.CANCEL,\n i,\n TouchEventType.CANCELLED\n );\n\n // @ts-ignore touchType field does exist\n if (event.changedTouches[i].touchType === 'stylus') {\n continue;\n }\n\n this.onPointerCancel(adaptedEvent);\n this.markAsOutOfBounds(adaptedEvent.pointerId);\n this.activePointersCounter = 0;\n }\n };\n\n public registerListeners(): void {\n this.view.addEventListener('touchstart', this.touchStartCallback);\n this.view.addEventListener('touchmove', this.touchMoveCallback);\n this.view.addEventListener('touchend', this.touchEndCallback);\n this.view.addEventListener('touchcancel', this.touchCancelCallback);\n }\n\n public unregisterListeners(): void {\n this.view.removeEventListener('touchstart', this.touchStartCallback);\n this.view.removeEventListener('touchmove', this.touchMoveCallback);\n this.view.removeEventListener('touchend', this.touchEndCallback);\n this.view.removeEventListener('touchcancel', this.touchCancelCallback);\n }\n\n protected mapEvent(\n event: TouchEvent,\n eventType: EventTypes,\n index: number,\n touchEventType: TouchEventType\n ): AdaptedEvent {\n const rect = this.view.getBoundingClientRect();\n const clientX = event.changedTouches[index].clientX;\n const clientY = event.changedTouches[index].clientY;\n\n const { scaleX, scaleY } = calculateViewScale(this.view);\n\n return {\n x: clientX,\n y: clientY,\n offsetX: (clientX - rect.left) / scaleX,\n offsetY: (clientY - rect.top) / scaleY,\n pointerId: event.changedTouches[index].identifier,\n eventType: eventType,\n pointerType: PointerType.TOUCH,\n time: event.timeStamp,\n allTouches: event.touches,\n changedTouches: event.changedTouches,\n touchEventType: touchEventType,\n };\n }\n}\n"]}
|
@@ -1,11 +0,0 @@
|
|
1
|
-
import { AdaptedEvent, EventTypes, TouchEventType } from '../interfaces';
|
2
|
-
import EventManager from './EventManager';
|
3
|
-
export default class TouchEventManager extends EventManager<HTMLElement> {
|
4
|
-
private touchStartCallback;
|
5
|
-
private touchMoveCallback;
|
6
|
-
private touchEndCallback;
|
7
|
-
private touchCancelCallback;
|
8
|
-
registerListeners(): void;
|
9
|
-
unregisterListeners(): void;
|
10
|
-
protected mapEvent(event: TouchEvent, eventType: EventTypes, index: number, touchEventType: TouchEventType): AdaptedEvent;
|
11
|
-
}
|
@@ -1,175 +0,0 @@
|
|
1
|
-
import { AdaptedEvent, EventTypes, TouchEventType } from '../interfaces';
|
2
|
-
import EventManager from './EventManager';
|
3
|
-
import { calculateViewScale, isPointerInBounds } from '../utils';
|
4
|
-
import { PointerType } from '../../PointerType';
|
5
|
-
|
6
|
-
export default class TouchEventManager extends EventManager<HTMLElement> {
|
7
|
-
private touchStartCallback = (event: TouchEvent): void => {
|
8
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
9
|
-
const adaptedEvent: AdaptedEvent = this.mapEvent(
|
10
|
-
event,
|
11
|
-
EventTypes.DOWN,
|
12
|
-
i,
|
13
|
-
TouchEventType.DOWN
|
14
|
-
);
|
15
|
-
|
16
|
-
// Here we skip stylus, because in case of anything different than touch we want to handle it by using PointerEvents
|
17
|
-
// If we leave stylus to send touch events, handlers will receive every action twice
|
18
|
-
if (
|
19
|
-
!isPointerInBounds(this.view, {
|
20
|
-
x: adaptedEvent.x,
|
21
|
-
y: adaptedEvent.y,
|
22
|
-
}) ||
|
23
|
-
// @ts-ignore touchType field does exist
|
24
|
-
event.changedTouches[i].touchType === 'stylus'
|
25
|
-
) {
|
26
|
-
continue;
|
27
|
-
}
|
28
|
-
|
29
|
-
this.markAsInBounds(adaptedEvent.pointerId);
|
30
|
-
|
31
|
-
if (++this.activePointersCounter > 1) {
|
32
|
-
adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_DOWN;
|
33
|
-
this.onPointerAdd(adaptedEvent);
|
34
|
-
} else {
|
35
|
-
this.onPointerDown(adaptedEvent);
|
36
|
-
}
|
37
|
-
}
|
38
|
-
};
|
39
|
-
|
40
|
-
private touchMoveCallback = (event: TouchEvent): void => {
|
41
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
42
|
-
const adaptedEvent: AdaptedEvent = this.mapEvent(
|
43
|
-
event,
|
44
|
-
EventTypes.MOVE,
|
45
|
-
i,
|
46
|
-
TouchEventType.MOVE
|
47
|
-
);
|
48
|
-
// @ts-ignore touchType field does exist
|
49
|
-
if (event.changedTouches[i].touchType === 'stylus') {
|
50
|
-
continue;
|
51
|
-
}
|
52
|
-
|
53
|
-
const inBounds: boolean = isPointerInBounds(this.view, {
|
54
|
-
x: adaptedEvent.x,
|
55
|
-
y: adaptedEvent.y,
|
56
|
-
});
|
57
|
-
|
58
|
-
const pointerIndex: number = this.pointersInBounds.indexOf(
|
59
|
-
adaptedEvent.pointerId
|
60
|
-
);
|
61
|
-
|
62
|
-
if (inBounds) {
|
63
|
-
if (pointerIndex < 0) {
|
64
|
-
adaptedEvent.eventType = EventTypes.ENTER;
|
65
|
-
this.onPointerEnter(adaptedEvent);
|
66
|
-
this.markAsInBounds(adaptedEvent.pointerId);
|
67
|
-
} else {
|
68
|
-
this.onPointerMove(adaptedEvent);
|
69
|
-
}
|
70
|
-
} else {
|
71
|
-
if (pointerIndex >= 0) {
|
72
|
-
adaptedEvent.eventType = EventTypes.LEAVE;
|
73
|
-
this.onPointerLeave(adaptedEvent);
|
74
|
-
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
75
|
-
} else {
|
76
|
-
this.onPointerOutOfBounds(adaptedEvent);
|
77
|
-
}
|
78
|
-
}
|
79
|
-
}
|
80
|
-
};
|
81
|
-
|
82
|
-
private touchEndCallback = (event: TouchEvent): void => {
|
83
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
84
|
-
// When we call reset on gesture handlers, it also resets their event managers
|
85
|
-
// In some handlers (like RotationGestureHandler) reset is called before all pointers leave view
|
86
|
-
// This means, that activePointersCounter will be set to 0, while there are still remaining pointers on view
|
87
|
-
// Removing them will end in activePointersCounter going below 0, therefore handlers won't behave properly
|
88
|
-
if (this.activePointersCounter === 0) {
|
89
|
-
break;
|
90
|
-
}
|
91
|
-
|
92
|
-
// @ts-ignore touchType field does exist
|
93
|
-
if (event.changedTouches[i].touchType === 'stylus') {
|
94
|
-
continue;
|
95
|
-
}
|
96
|
-
|
97
|
-
const adaptedEvent: AdaptedEvent = this.mapEvent(
|
98
|
-
event,
|
99
|
-
EventTypes.UP,
|
100
|
-
i,
|
101
|
-
TouchEventType.UP
|
102
|
-
);
|
103
|
-
|
104
|
-
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
105
|
-
|
106
|
-
if (--this.activePointersCounter > 0) {
|
107
|
-
adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_UP;
|
108
|
-
this.onPointerRemove(adaptedEvent);
|
109
|
-
} else {
|
110
|
-
this.onPointerUp(adaptedEvent);
|
111
|
-
}
|
112
|
-
}
|
113
|
-
};
|
114
|
-
|
115
|
-
private touchCancelCallback = (event: TouchEvent): void => {
|
116
|
-
for (let i = 0; i < event.changedTouches.length; ++i) {
|
117
|
-
const adaptedEvent: AdaptedEvent = this.mapEvent(
|
118
|
-
event,
|
119
|
-
EventTypes.CANCEL,
|
120
|
-
i,
|
121
|
-
TouchEventType.CANCELLED
|
122
|
-
);
|
123
|
-
|
124
|
-
// @ts-ignore touchType field does exist
|
125
|
-
if (event.changedTouches[i].touchType === 'stylus') {
|
126
|
-
continue;
|
127
|
-
}
|
128
|
-
|
129
|
-
this.onPointerCancel(adaptedEvent);
|
130
|
-
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
131
|
-
this.activePointersCounter = 0;
|
132
|
-
}
|
133
|
-
};
|
134
|
-
|
135
|
-
public registerListeners(): void {
|
136
|
-
this.view.addEventListener('touchstart', this.touchStartCallback);
|
137
|
-
this.view.addEventListener('touchmove', this.touchMoveCallback);
|
138
|
-
this.view.addEventListener('touchend', this.touchEndCallback);
|
139
|
-
this.view.addEventListener('touchcancel', this.touchCancelCallback);
|
140
|
-
}
|
141
|
-
|
142
|
-
public unregisterListeners(): void {
|
143
|
-
this.view.removeEventListener('touchstart', this.touchStartCallback);
|
144
|
-
this.view.removeEventListener('touchmove', this.touchMoveCallback);
|
145
|
-
this.view.removeEventListener('touchend', this.touchEndCallback);
|
146
|
-
this.view.removeEventListener('touchcancel', this.touchCancelCallback);
|
147
|
-
}
|
148
|
-
|
149
|
-
protected mapEvent(
|
150
|
-
event: TouchEvent,
|
151
|
-
eventType: EventTypes,
|
152
|
-
index: number,
|
153
|
-
touchEventType: TouchEventType
|
154
|
-
): AdaptedEvent {
|
155
|
-
const rect = this.view.getBoundingClientRect();
|
156
|
-
const clientX = event.changedTouches[index].clientX;
|
157
|
-
const clientY = event.changedTouches[index].clientY;
|
158
|
-
|
159
|
-
const { scaleX, scaleY } = calculateViewScale(this.view);
|
160
|
-
|
161
|
-
return {
|
162
|
-
x: clientX,
|
163
|
-
y: clientY,
|
164
|
-
offsetX: (clientX - rect.left) / scaleX,
|
165
|
-
offsetY: (clientY - rect.top) / scaleY,
|
166
|
-
pointerId: event.changedTouches[index].identifier,
|
167
|
-
eventType: eventType,
|
168
|
-
pointerType: PointerType.TOUCH,
|
169
|
-
time: event.timeStamp,
|
170
|
-
allTouches: event.touches,
|
171
|
-
changedTouches: event.changedTouches,
|
172
|
-
touchEventType: touchEventType,
|
173
|
-
};
|
174
|
-
}
|
175
|
-
}
|