react-native-gesture-handler 2.18.1 → 2.20.0
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/README.md +1 -0
- package/android/build.gradle +11 -29
- package/android/fabric/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
- package/android/paper/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
- package/android/src/main/AndroidManifest.xml +1 -3
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +21 -21
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +1 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt +16 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt +80 -4
- package/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt +8 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt +2 -1
- package/android/src/main/java/com/swmansion/gesturehandler/core/ScaleGestureDetector.java +10 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/StylusData.kt +103 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +24 -15
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +3 -0
- 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/RNFlingHandler.h +1 -0
- package/apple/Handlers/RNFlingHandler.m +153 -19
- package/apple/Handlers/RNHoverHandler.m +44 -2
- package/apple/Handlers/RNLongPressHandler.m +111 -20
- package/apple/Handlers/RNManualHandler.m +53 -29
- package/apple/Handlers/RNNativeViewHandler.mm +22 -15
- 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/RNGHUIKit.h +2 -0
- package/apple/RNGHVector.h +31 -0
- package/apple/RNGHVector.m +67 -0
- package/apple/RNGestureHandler.h +7 -0
- package/apple/{RNGestureHandler.m → RNGestureHandler.mm} +63 -1
- package/apple/RNGestureHandlerButtonComponentView.mm +41 -0
- package/apple/RNGestureHandlerDirection.h +25 -0
- package/apple/RNGestureHandlerEvents.h +3 -1
- package/apple/RNGestureHandlerEvents.m +11 -3
- package/lib/commonjs/PointerType.js +2 -1
- package/lib/commonjs/PointerType.js.map +1 -1
- 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 +66 -78
- package/lib/commonjs/components/Pressable/Pressable.js.map +1 -1
- package/lib/commonjs/components/Pressable/index.js +0 -8
- package/lib/commonjs/components/Pressable/index.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/components/ReanimatedSwipeable.js +60 -41
- package/lib/commonjs/components/ReanimatedSwipeable.js.map +1 -1
- package/lib/commonjs/handlers/GestureHandlerEventPayload.js +4 -0
- package/lib/commonjs/handlers/LongPressGestureHandler.js +1 -1
- package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/createHandler.js +2 -1
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector/utils.js +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector/utils.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/handlers/gestures/longPressGesture.js +10 -0
- package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -1
- package/lib/commonjs/jestUtils/jestUtils.js +12 -4
- package/lib/commonjs/jestUtils/jestUtils.js.map +1 -1
- package/lib/commonjs/mocks.js +16 -3
- package/lib/commonjs/mocks.js.map +1 -1
- package/lib/commonjs/utils.js +4 -0
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/commonjs/web/constants.js +3 -3
- package/lib/commonjs/web/constants.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +2 -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/LongPressGestureHandler.js +43 -9
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +14 -3
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js +12 -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 +55 -11
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/commonjs/web/tools/KeyboardEventManager.js +110 -0
- package/lib/commonjs/web/tools/KeyboardEventManager.js.map +1 -0
- package/lib/commonjs/web/tools/PointerEventManager.js +3 -37
- package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
- package/lib/commonjs/web/tools/Vector.js +4 -2
- package/lib/commonjs/web/tools/Vector.js.map +1 -1
- package/lib/commonjs/web/utils.js +187 -13
- package/lib/commonjs/web/utils.js.map +1 -1
- package/lib/module/PointerType.js +2 -1
- package/lib/module/PointerType.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 +67 -78
- package/lib/module/components/Pressable/Pressable.js.map +1 -1
- package/lib/module/components/Pressable/index.js +0 -1
- package/lib/module/components/Pressable/index.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/components/ReanimatedSwipeable.js +58 -37
- package/lib/module/components/ReanimatedSwipeable.js.map +1 -1
- package/lib/module/handlers/GestureHandlerEventPayload.js +1 -1
- package/lib/module/handlers/LongPressGestureHandler.js +1 -1
- package/lib/module/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/handlers/createHandler.js +2 -1
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector/utils.js +2 -2
- package/lib/module/handlers/gestures/GestureDetector/utils.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/handlers/gestures/longPressGesture.js +10 -0
- package/lib/module/handlers/gestures/longPressGesture.js.map +1 -1
- package/lib/module/jestUtils/jestUtils.js +12 -4
- package/lib/module/jestUtils/jestUtils.js.map +1 -1
- package/lib/module/mocks.js +13 -3
- package/lib/module/mocks.js.map +1 -1
- package/lib/module/utils.js +1 -0
- package/lib/module/utils.js.map +1 -1
- package/lib/module/web/constants.js +1 -1
- package/lib/module/web/constants.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +2 -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/LongPressGestureHandler.js +43 -9
- package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/NativeViewGestureHandler.js +14 -3
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PanGestureHandler.js +12 -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 +54 -10
- package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/module/web/tools/KeyboardEventManager.js +96 -0
- package/lib/module/web/tools/KeyboardEventManager.js.map +1 -0
- package/lib/module/web/tools/PointerEventManager.js +4 -38
- package/lib/module/web/tools/PointerEventManager.js.map +1 -1
- package/lib/module/web/tools/Vector.js +5 -3
- package/lib/module/web/tools/Vector.js.map +1 -1
- package/lib/module/web/utils.js +184 -13
- package/lib/module/web/utils.js.map +1 -1
- package/lib/typescript/PointerType.d.ts +2 -1
- package/lib/typescript/components/GestureComponents.d.ts +1 -1
- package/lib/typescript/components/Pressable/index.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/LongPressGestureHandler.d.ts +5 -1
- package/lib/typescript/handlers/gestures/gesture.d.ts +2 -2
- package/lib/typescript/handlers/gestures/hoverGesture.d.ts +1 -6
- package/lib/typescript/handlers/gestures/longPressGesture.d.ts +5 -0
- package/lib/typescript/handlers/handlersRegistry.d.ts +1 -1
- package/lib/typescript/jestUtils/jestUtils.d.ts +1 -1
- package/lib/typescript/mocks.d.ts +4 -3
- package/lib/typescript/utils.d.ts +1 -0
- package/lib/typescript/web/constants.d.ts +1 -1
- package/lib/typescript/web/handlers/GestureHandler.d.ts +1 -1
- package/lib/typescript/web/handlers/HoverGestureHandler.d.ts +2 -0
- package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +3 -0
- package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +3 -1
- package/lib/typescript/web/interfaces.d.ts +9 -4
- package/lib/typescript/web/tools/EventManager.d.ts +2 -2
- package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +1 -0
- package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +6 -0
- package/lib/typescript/web/tools/KeyboardEventManager.d.ts +13 -0
- package/lib/typescript/web/utils.d.ts +2 -1
- package/package.json +3 -3
- package/src/PointerType.ts +1 -0
- package/src/components/GestureButtons.tsx +2 -1
- package/src/components/GestureComponents.tsx +1 -1
- package/src/components/Pressable/Pressable.tsx +77 -70
- package/src/components/Pressable/index.ts +1 -1
- package/src/components/Pressable/utils.ts +5 -49
- package/src/components/ReanimatedSwipeable.tsx +70 -47
- package/src/handlers/GestureHandlerEventPayload.ts +42 -0
- package/src/handlers/LongPressGestureHandler.ts +6 -0
- package/src/handlers/createHandler.tsx +1 -0
- package/src/handlers/gestures/GestureDetector/utils.ts +2 -2
- package/src/handlers/gestures/gesture.ts +3 -1
- package/src/handlers/gestures/hoverGesture.ts +1 -7
- package/src/handlers/gestures/longPressGesture.ts +9 -0
- package/src/jestUtils/jestUtils.ts +9 -1
- package/src/{mocks.ts → mocks.tsx} +8 -3
- package/src/utils.ts +2 -0
- package/src/web/constants.ts +1 -1
- package/src/web/handlers/GestureHandler.ts +4 -2
- package/src/web/handlers/HoverGestureHandler.ts +16 -2
- package/src/web/handlers/LongPressGestureHandler.ts +49 -10
- package/src/web/handlers/NativeViewGestureHandler.ts +14 -4
- package/src/web/handlers/PanGestureHandler.ts +14 -1
- package/src/web/interfaces.ts +10 -4
- package/src/web/tools/EventManager.ts +2 -4
- package/src/web/tools/GestureHandlerDelegate.ts +1 -0
- package/src/web/tools/GestureHandlerWebDelegate.ts +67 -10
- package/src/web/tools/KeyboardEventManager.ts +91 -0
- package/src/web/tools/PointerEventManager.ts +2 -38
- package/src/web/tools/Vector.ts +4 -3
- package/src/web/utils.ts +188 -13
- 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
|
@@ -154,6 +154,9 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) :
|
|
|
154
154
|
if (config.hasKey(KEY_LONG_PRESS_MAX_DIST)) {
|
|
155
155
|
handler.setMaxDist(PixelUtil.toPixelFromDIP(config.getDouble(KEY_LONG_PRESS_MAX_DIST)))
|
|
156
156
|
}
|
|
157
|
+
if (config.hasKey(KEY_NUMBER_OF_POINTERS)) {
|
|
158
|
+
handler.setNumberOfPointers(config.getInt(KEY_NUMBER_OF_POINTERS))
|
|
159
|
+
}
|
|
157
160
|
}
|
|
158
161
|
|
|
159
162
|
override fun createEventBuilder(handler: LongPressGestureHandler) = LongPressGestureHandlerEventDataBuilder(handler)
|
|
@@ -3,18 +3,21 @@ package com.swmansion.gesturehandler.react.eventbuilders
|
|
|
3
3
|
import com.facebook.react.bridge.WritableMap
|
|
4
4
|
import com.facebook.react.uimanager.PixelUtil
|
|
5
5
|
import com.swmansion.gesturehandler.core.HoverGestureHandler
|
|
6
|
+
import com.swmansion.gesturehandler.core.StylusData
|
|
6
7
|
|
|
7
8
|
class HoverGestureHandlerEventDataBuilder(handler: HoverGestureHandler) : GestureHandlerEventDataBuilder<HoverGestureHandler>(handler) {
|
|
8
9
|
private val x: Float
|
|
9
10
|
private val y: Float
|
|
10
11
|
private val absoluteX: Float
|
|
11
12
|
private val absoluteY: Float
|
|
13
|
+
private val stylusData: StylusData
|
|
12
14
|
|
|
13
15
|
init {
|
|
14
16
|
x = handler.lastRelativePositionX
|
|
15
17
|
y = handler.lastRelativePositionY
|
|
16
18
|
absoluteX = handler.lastPositionInWindowX
|
|
17
19
|
absoluteY = handler.lastPositionInWindowY
|
|
20
|
+
stylusData = handler.stylusData
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
override fun buildEventData(eventData: WritableMap) {
|
|
@@ -25,6 +28,10 @@ class HoverGestureHandlerEventDataBuilder(handler: HoverGestureHandler) : Gestur
|
|
|
25
28
|
putDouble("y", PixelUtil.toDIPFromPixel(y).toDouble())
|
|
26
29
|
putDouble("absoluteX", PixelUtil.toDIPFromPixel(absoluteX).toDouble())
|
|
27
30
|
putDouble("absoluteY", PixelUtil.toDIPFromPixel(absoluteY).toDouble())
|
|
31
|
+
|
|
32
|
+
if (stylusData.pressure != -1.0) {
|
|
33
|
+
putMap("stylusData", stylusData.toReadableMap())
|
|
34
|
+
}
|
|
28
35
|
}
|
|
29
36
|
}
|
|
30
37
|
}
|
|
@@ -3,6 +3,7 @@ package com.swmansion.gesturehandler.react.eventbuilders
|
|
|
3
3
|
import com.facebook.react.bridge.WritableMap
|
|
4
4
|
import com.facebook.react.uimanager.PixelUtil
|
|
5
5
|
import com.swmansion.gesturehandler.core.PanGestureHandler
|
|
6
|
+
import com.swmansion.gesturehandler.core.StylusData
|
|
6
7
|
|
|
7
8
|
class PanGestureHandlerEventDataBuilder(handler: PanGestureHandler) : GestureHandlerEventDataBuilder<PanGestureHandler>(handler) {
|
|
8
9
|
private val x: Float
|
|
@@ -13,6 +14,7 @@ class PanGestureHandlerEventDataBuilder(handler: PanGestureHandler) : GestureHan
|
|
|
13
14
|
private val translationY: Float
|
|
14
15
|
private val velocityX: Float
|
|
15
16
|
private val velocityY: Float
|
|
17
|
+
private val stylusData: StylusData
|
|
16
18
|
|
|
17
19
|
init {
|
|
18
20
|
x = handler.lastRelativePositionX
|
|
@@ -23,6 +25,7 @@ class PanGestureHandlerEventDataBuilder(handler: PanGestureHandler) : GestureHan
|
|
|
23
25
|
translationY = handler.translationY
|
|
24
26
|
velocityX = handler.velocityX
|
|
25
27
|
velocityY = handler.velocityY
|
|
28
|
+
stylusData = handler.stylusData
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
override fun buildEventData(eventData: WritableMap) {
|
|
@@ -37,6 +40,10 @@ class PanGestureHandlerEventDataBuilder(handler: PanGestureHandler) : GestureHan
|
|
|
37
40
|
putDouble("translationY", PixelUtil.toDIPFromPixel(translationY).toDouble())
|
|
38
41
|
putDouble("velocityX", PixelUtil.toDIPFromPixel(velocityX).toDouble())
|
|
39
42
|
putDouble("velocityY", PixelUtil.toDIPFromPixel(velocityY).toDouble())
|
|
43
|
+
|
|
44
|
+
if (stylusData.pressure != -1.0) {
|
|
45
|
+
putMap("stylusData", stylusData.toReadableMap())
|
|
46
|
+
}
|
|
40
47
|
}
|
|
41
48
|
}
|
|
42
49
|
}
|
|
@@ -26,12 +26,21 @@ target_include_directories(
|
|
|
26
26
|
)
|
|
27
27
|
|
|
28
28
|
find_package(ReactAndroid REQUIRED CONFIG)
|
|
29
|
-
|
|
30
|
-
target_link_libraries(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
if (ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
|
|
30
|
+
target_link_libraries(
|
|
31
|
+
${PACKAGE_NAME}
|
|
32
|
+
ReactAndroid::reactnative
|
|
33
|
+
ReactAndroid::jsi
|
|
34
|
+
)
|
|
35
|
+
elseif (ReactAndroid_VERSION_MINOR GREATER_EQUAL 75)
|
|
36
|
+
target_link_libraries(
|
|
37
|
+
${PACKAGE_NAME}
|
|
38
|
+
ReactAndroid::react_render_core
|
|
39
|
+
ReactAndroid::react_render_uimanager
|
|
40
|
+
ReactAndroid::react_render_graphics
|
|
41
|
+
ReactAndroid::jsi
|
|
42
|
+
ReactAndroid::react_nativemodule_core
|
|
43
|
+
)
|
|
44
|
+
else ()
|
|
45
|
+
message(FATAL_ERROR "react-native-gesture-handler on the New Architecture requires react-native 0.75 or newer.")
|
|
46
|
+
endif ()
|
|
@@ -87,6 +87,154 @@
|
|
|
87
87
|
|
|
88
88
|
@end
|
|
89
89
|
|
|
90
|
+
#else
|
|
91
|
+
|
|
92
|
+
@interface RNBetterSwipeGestureRecognizer : NSGestureRecognizer {
|
|
93
|
+
dispatch_block_t failFlingAction;
|
|
94
|
+
int maxDuration;
|
|
95
|
+
int minVelocity;
|
|
96
|
+
double defaultAlignmentCone;
|
|
97
|
+
double axialDeviationCosine;
|
|
98
|
+
double diagonalDeviationCosine;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@property (atomic, assign) RNGestureHandlerDirection direction;
|
|
102
|
+
@property (atomic, assign) int numberOfTouchesRequired;
|
|
103
|
+
|
|
104
|
+
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
|
|
105
|
+
|
|
106
|
+
@end
|
|
107
|
+
|
|
108
|
+
@implementation RNBetterSwipeGestureRecognizer {
|
|
109
|
+
__weak RNGestureHandler *_gestureHandler;
|
|
110
|
+
|
|
111
|
+
NSPoint startPosition;
|
|
112
|
+
double startTime;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
|
|
116
|
+
{
|
|
117
|
+
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
|
|
118
|
+
_gestureHandler = gestureHandler;
|
|
119
|
+
|
|
120
|
+
maxDuration = 1.0;
|
|
121
|
+
minVelocity = 700;
|
|
122
|
+
|
|
123
|
+
defaultAlignmentCone = 30;
|
|
124
|
+
axialDeviationCosine = [self coneToDeviation:defaultAlignmentCone];
|
|
125
|
+
diagonalDeviationCosine = [self coneToDeviation:(90 - defaultAlignmentCone)];
|
|
126
|
+
}
|
|
127
|
+
return self;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
- (void)handleGesture:(NSPanGestureRecognizer *)gestureRecognizer
|
|
131
|
+
{
|
|
132
|
+
[_gestureHandler handleGesture:self];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
- (void)mouseDown:(NSEvent *)event
|
|
136
|
+
{
|
|
137
|
+
[super mouseDown:event];
|
|
138
|
+
|
|
139
|
+
startPosition = [self locationInView:self.view];
|
|
140
|
+
startTime = CACurrentMediaTime();
|
|
141
|
+
|
|
142
|
+
self.state = NSGestureRecognizerStatePossible;
|
|
143
|
+
|
|
144
|
+
__weak typeof(self) weakSelf = self;
|
|
145
|
+
|
|
146
|
+
failFlingAction = dispatch_block_create(0, ^{
|
|
147
|
+
__strong typeof(self) strongSelf = weakSelf;
|
|
148
|
+
|
|
149
|
+
if (strongSelf) {
|
|
150
|
+
strongSelf.state = NSGestureRecognizerStateFailed;
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
dispatch_after(
|
|
155
|
+
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(maxDuration * NSEC_PER_SEC)),
|
|
156
|
+
dispatch_get_main_queue(),
|
|
157
|
+
failFlingAction);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
- (void)mouseDragged:(NSEvent *)event
|
|
161
|
+
{
|
|
162
|
+
[super mouseDragged:event];
|
|
163
|
+
|
|
164
|
+
NSPoint currentPosition = [self locationInView:self.view];
|
|
165
|
+
double currentTime = CACurrentMediaTime();
|
|
166
|
+
|
|
167
|
+
NSPoint distance;
|
|
168
|
+
distance.x = currentPosition.x - startPosition.x;
|
|
169
|
+
distance.y = startPosition.y - currentPosition.y;
|
|
170
|
+
|
|
171
|
+
double timeDelta = currentTime - startTime;
|
|
172
|
+
|
|
173
|
+
Vector *velocityVector = [Vector fromVelocityX:(distance.x / timeDelta) withVelocityY:(distance.y / timeDelta)];
|
|
174
|
+
|
|
175
|
+
[self tryActivate:velocityVector];
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
- (void)mouseUp:(NSEvent *)event
|
|
179
|
+
{
|
|
180
|
+
[super mouseUp:event];
|
|
181
|
+
|
|
182
|
+
dispatch_block_cancel(failFlingAction);
|
|
183
|
+
|
|
184
|
+
self.state =
|
|
185
|
+
self.state == NSGestureRecognizerStateChanged ? NSGestureRecognizerStateEnded : NSGestureRecognizerStateFailed;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
- (void)tryActivate:(Vector *)velocityVector
|
|
189
|
+
{
|
|
190
|
+
bool isAligned = NO;
|
|
191
|
+
|
|
192
|
+
for (int i = 0; i < directionsSize; ++i) {
|
|
193
|
+
if ([self getAlignment:axialDirections[i]
|
|
194
|
+
withMinimalAlignmentCosine:axialDeviationCosine
|
|
195
|
+
withVelocityVector:velocityVector]) {
|
|
196
|
+
isAligned = YES;
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (!isAligned) {
|
|
202
|
+
for (int i = 0; i < directionsSize; ++i) {
|
|
203
|
+
if ([self getAlignment:diagonalDirections[i]
|
|
204
|
+
withMinimalAlignmentCosine:diagonalDeviationCosine
|
|
205
|
+
withVelocityVector:velocityVector]) {
|
|
206
|
+
isAligned = YES;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
bool isFastEnough = velocityVector.magnitude >= minVelocity;
|
|
213
|
+
|
|
214
|
+
if (isAligned && isFastEnough) {
|
|
215
|
+
self.state = NSGestureRecognizerStateChanged;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
- (BOOL)getAlignment:(RNGestureHandlerDirection)direction
|
|
220
|
+
withMinimalAlignmentCosine:(double)minimalAlignmentCosine
|
|
221
|
+
withVelocityVector:(Vector *)velocityVector
|
|
222
|
+
{
|
|
223
|
+
Vector *directionVector = [Vector fromDirection:direction];
|
|
224
|
+
return ((self.direction & direction) == direction) &&
|
|
225
|
+
[velocityVector isSimilar:directionVector withThreshold:minimalAlignmentCosine];
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
- (double)coneToDeviation:(double)degrees
|
|
229
|
+
{
|
|
230
|
+
double radians = (degrees * M_PI) / 180;
|
|
231
|
+
return cos(radians / 2);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
@end
|
|
235
|
+
|
|
236
|
+
#endif
|
|
237
|
+
|
|
90
238
|
@implementation RNFlingGestureHandler
|
|
91
239
|
|
|
92
240
|
- (instancetype)initWithTag:(NSNumber *)tag
|
|
@@ -100,8 +248,8 @@
|
|
|
100
248
|
- (void)resetConfig
|
|
101
249
|
{
|
|
102
250
|
[super resetConfig];
|
|
103
|
-
|
|
104
|
-
recognizer.direction =
|
|
251
|
+
RNBetterSwipeGestureRecognizer *recognizer = (RNBetterSwipeGestureRecognizer *)_recognizer;
|
|
252
|
+
recognizer.direction = RNGestureHandlerDirectionRight;
|
|
105
253
|
#if !TARGET_OS_TV
|
|
106
254
|
recognizer.numberOfTouchesRequired = 1;
|
|
107
255
|
#endif
|
|
@@ -110,7 +258,7 @@
|
|
|
110
258
|
- (void)configure:(NSDictionary *)config
|
|
111
259
|
{
|
|
112
260
|
[super configure:config];
|
|
113
|
-
|
|
261
|
+
RNBetterSwipeGestureRecognizer *recognizer = (RNBetterSwipeGestureRecognizer *)_recognizer;
|
|
114
262
|
|
|
115
263
|
id prop = config[@"direction"];
|
|
116
264
|
if (prop != nil) {
|
|
@@ -125,6 +273,7 @@
|
|
|
125
273
|
#endif
|
|
126
274
|
}
|
|
127
275
|
|
|
276
|
+
#if !TARGET_OS_OSX
|
|
128
277
|
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
|
|
129
278
|
{
|
|
130
279
|
RNGestureHandlerState savedState = _lastState;
|
|
@@ -154,21 +303,6 @@
|
|
|
154
303
|
withNumberOfTouches:recognizer.numberOfTouches
|
|
155
304
|
withPointerType:_pointerType];
|
|
156
305
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
#else
|
|
160
|
-
|
|
161
|
-
@implementation RNFlingGestureHandler
|
|
162
|
-
|
|
163
|
-
- (instancetype)initWithTag:(NSNumber *)tag
|
|
164
|
-
{
|
|
165
|
-
RCTLogWarn(@"FlingGestureHandler is not supported on macOS");
|
|
166
|
-
if ((self = [super initWithTag:tag])) {
|
|
167
|
-
_recognizer = [NSGestureRecognizer alloc];
|
|
168
|
-
}
|
|
169
|
-
return self;
|
|
170
|
-
}
|
|
306
|
+
#endif
|
|
171
307
|
|
|
172
308
|
@end
|
|
173
|
-
|
|
174
|
-
#endif
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
//
|
|
7
7
|
|
|
8
8
|
#import "RNHoverHandler.h"
|
|
9
|
+
#import <React/UIView+React.h>
|
|
9
10
|
|
|
10
11
|
#if !TARGET_OS_OSX
|
|
11
12
|
|
|
@@ -163,17 +164,58 @@ API_AVAILABLE(ios(13.4))
|
|
|
163
164
|
|
|
164
165
|
#else
|
|
165
166
|
|
|
166
|
-
@implementation RNHoverGestureHandler
|
|
167
|
+
@implementation RNHoverGestureHandler {
|
|
168
|
+
NSTrackingArea *trackingArea;
|
|
169
|
+
RNGHUIView *_view;
|
|
170
|
+
}
|
|
167
171
|
|
|
168
172
|
- (instancetype)initWithTag:(NSNumber *)tag
|
|
169
173
|
{
|
|
170
|
-
RCTLogWarn(@"HoverGestureHandler is not supported on macOS");
|
|
171
174
|
if ((self = [super initWithTag:tag])) {
|
|
172
175
|
_recognizer = [NSGestureRecognizer alloc];
|
|
173
176
|
}
|
|
177
|
+
|
|
174
178
|
return self;
|
|
175
179
|
}
|
|
176
180
|
|
|
181
|
+
- (void)bindToView:(RNGHUIView *)view
|
|
182
|
+
{
|
|
183
|
+
_view = view;
|
|
184
|
+
|
|
185
|
+
NSTrackingAreaOptions options =
|
|
186
|
+
NSTrackingMouseEnteredAndExited | NSTrackingActiveInActiveApp | NSTrackingInVisibleRect;
|
|
187
|
+
|
|
188
|
+
trackingArea = [[NSTrackingArea alloc] initWithRect:_view.bounds options:options owner:self userInfo:nil];
|
|
189
|
+
[_view addTrackingArea:trackingArea];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
- (void)unbindFromView
|
|
193
|
+
{
|
|
194
|
+
[_view removeTrackingArea:trackingArea];
|
|
195
|
+
_view = nil;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
- (void)mouseEntered:(NSEvent *)event
|
|
199
|
+
{
|
|
200
|
+
[self sendEventsInState:RNGestureHandlerStateBegan
|
|
201
|
+
forViewWithTag:_view.reactTag
|
|
202
|
+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
|
|
203
|
+
[self sendEventsInState:RNGestureHandlerStateActive
|
|
204
|
+
forViewWithTag:_view.reactTag
|
|
205
|
+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
- (void)mouseExited:(NSEvent *)theEvent
|
|
209
|
+
{
|
|
210
|
+
[self sendEventsInState:RNGestureHandlerStateEnd
|
|
211
|
+
forViewWithTag:_view.reactTag
|
|
212
|
+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
|
|
213
|
+
|
|
214
|
+
[self sendEventsInState:RNGestureHandlerStateUndetermined
|
|
215
|
+
forViewWithTag:_view.reactTag
|
|
216
|
+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
|
|
217
|
+
}
|
|
218
|
+
|
|
177
219
|
@end
|
|
178
220
|
|
|
179
221
|
#endif
|
|
@@ -7,22 +7,37 @@
|
|
|
7
7
|
//
|
|
8
8
|
|
|
9
9
|
#import "RNLongPressHandler.h"
|
|
10
|
+
#import <React/RCTConvert.h>
|
|
10
11
|
|
|
11
12
|
#if !TARGET_OS_OSX
|
|
12
13
|
|
|
13
14
|
#import <UIKit/UIGestureRecognizerSubclass.h>
|
|
14
15
|
|
|
15
|
-
#import <React/RCTConvert.h>
|
|
16
|
-
|
|
17
16
|
@interface RNBetterLongPressGestureRecognizer : UILongPressGestureRecognizer {
|
|
17
|
+
#else
|
|
18
|
+
@interface RNBetterLongPressGestureRecognizer : NSGestureRecognizer {
|
|
19
|
+
dispatch_block_t block;
|
|
20
|
+
#endif
|
|
21
|
+
|
|
18
22
|
CFTimeInterval startTime;
|
|
19
23
|
CFTimeInterval previousTime;
|
|
20
24
|
}
|
|
21
25
|
|
|
26
|
+
#if TARGET_OS_OSX
|
|
27
|
+
@property (nonatomic, assign) double minimumPressDuration;
|
|
28
|
+
@property (nonatomic, assign) double allowableMovement;
|
|
29
|
+
@property (nonatomic, assign) double numberOfTouchesRequired;
|
|
30
|
+
#endif
|
|
31
|
+
|
|
22
32
|
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
|
|
23
|
-
- (void)handleGesture:(UIGestureRecognizer *)recognizer;
|
|
24
33
|
- (NSUInteger)getDuration;
|
|
25
34
|
|
|
35
|
+
#if !TARGET_OS_OSX
|
|
36
|
+
- (void)handleGesture:(UIGestureRecognizer *)recognizer;
|
|
37
|
+
#else
|
|
38
|
+
- (void)handleGesture:(NSGestureRecognizer *)recognizer;
|
|
39
|
+
#endif
|
|
40
|
+
|
|
26
41
|
@end
|
|
27
42
|
|
|
28
43
|
@implementation RNBetterLongPressGestureRecognizer {
|
|
@@ -55,12 +70,16 @@
|
|
|
55
70
|
return CGPointMake(currentPosition.x - _initPosition.x, currentPosition.y - _initPosition.y);
|
|
56
71
|
}
|
|
57
72
|
|
|
73
|
+
#if !TARGET_OS_OSX
|
|
74
|
+
|
|
58
75
|
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
|
|
59
76
|
{
|
|
60
77
|
[_gestureHandler setCurrentPointerType:event];
|
|
61
78
|
[super touchesBegan:touches withEvent:event];
|
|
62
79
|
[_gestureHandler.pointerTracker touchesBegan:touches withEvent:event];
|
|
63
80
|
|
|
81
|
+
self.state = UIGestureRecognizerStatePossible;
|
|
82
|
+
|
|
64
83
|
_initPosition = [self locationInView:self.view];
|
|
65
84
|
startTime = CACurrentMediaTime();
|
|
66
85
|
[_gestureHandler reset];
|
|
@@ -72,10 +91,8 @@
|
|
|
72
91
|
[super touchesMoved:touches withEvent:event];
|
|
73
92
|
[_gestureHandler.pointerTracker touchesMoved:touches withEvent:event];
|
|
74
93
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
(TEST_MAX_IF_NOT_NAN(
|
|
78
|
-
fabs(trans.y * trans.y + trans.x * trans.x), self.allowableMovement * self.allowableMovement))) {
|
|
94
|
+
if ([self shouldCancelGesture]) {
|
|
95
|
+
self.state = UIGestureRecognizerStateFailed;
|
|
79
96
|
self.enabled = NO;
|
|
80
97
|
self.enabled = YES;
|
|
81
98
|
}
|
|
@@ -94,6 +111,75 @@
|
|
|
94
111
|
[self reset];
|
|
95
112
|
}
|
|
96
113
|
|
|
114
|
+
#else
|
|
115
|
+
- (void)mouseDown:(NSEvent *)event
|
|
116
|
+
{
|
|
117
|
+
self.state = NSGestureRecognizerStateBegan;
|
|
118
|
+
startTime = CACurrentMediaTime();
|
|
119
|
+
|
|
120
|
+
[_gestureHandler.pointerTracker touchesBegan:[NSSet setWithObject:event] withEvent:event];
|
|
121
|
+
|
|
122
|
+
_initPosition = [self locationInView:self.view];
|
|
123
|
+
|
|
124
|
+
__weak typeof(self) weakSelf = self;
|
|
125
|
+
|
|
126
|
+
block = dispatch_block_create(0, ^{
|
|
127
|
+
__strong typeof(self) strongSelf = weakSelf;
|
|
128
|
+
|
|
129
|
+
if (strongSelf) {
|
|
130
|
+
strongSelf.state = NSGestureRecognizerStateChanged;
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
dispatch_after(
|
|
135
|
+
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.minimumPressDuration * NSEC_PER_SEC)),
|
|
136
|
+
dispatch_get_main_queue(),
|
|
137
|
+
block);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
- (void)mouseDragged:(NSEvent *)event
|
|
141
|
+
{
|
|
142
|
+
[_gestureHandler.pointerTracker touchesMoved:[NSSet setWithObject:event] withEvent:event];
|
|
143
|
+
|
|
144
|
+
if (block == nil) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if ([self shouldCancelGesture]) {
|
|
149
|
+
dispatch_block_cancel(block);
|
|
150
|
+
block = nil;
|
|
151
|
+
|
|
152
|
+
self.state = self.state == NSGestureRecognizerStateChanged ? NSGestureRecognizerStateCancelled
|
|
153
|
+
: NSGestureRecognizerStateFailed;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
- (void)mouseUp:(NSEvent *)event
|
|
158
|
+
{
|
|
159
|
+
[_gestureHandler.pointerTracker touchesEnded:[NSSet setWithObject:event] withEvent:event];
|
|
160
|
+
|
|
161
|
+
if (block) {
|
|
162
|
+
dispatch_block_cancel(block);
|
|
163
|
+
block = nil;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
self.state =
|
|
167
|
+
self.state == NSGestureRecognizerStateChanged ? NSGestureRecognizerStateEnded : NSGestureRecognizerStateFailed;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
#endif
|
|
171
|
+
|
|
172
|
+
- (BOOL)shouldCancelGesture
|
|
173
|
+
{
|
|
174
|
+
CGPoint trans = [self translationInView];
|
|
175
|
+
|
|
176
|
+
BOOL shouldBeCancelledOutside = _gestureHandler.shouldCancelWhenOutside && ![_gestureHandler containsPointInView];
|
|
177
|
+
BOOL distanceExceeded =
|
|
178
|
+
TEST_MAX_IF_NOT_NAN(fabs(trans.y * trans.y + trans.x * trans.x), self.allowableMovement * self.allowableMovement);
|
|
179
|
+
|
|
180
|
+
return shouldBeCancelledOutside || distanceExceeded;
|
|
181
|
+
}
|
|
182
|
+
|
|
97
183
|
- (void)reset
|
|
98
184
|
{
|
|
99
185
|
if (self.state == UIGestureRecognizerStateFailed) {
|
|
@@ -126,7 +212,7 @@
|
|
|
126
212
|
- (void)resetConfig
|
|
127
213
|
{
|
|
128
214
|
[super resetConfig];
|
|
129
|
-
|
|
215
|
+
RNBetterLongPressGestureRecognizer *recognizer = (RNBetterLongPressGestureRecognizer *)_recognizer;
|
|
130
216
|
|
|
131
217
|
recognizer.minimumPressDuration = 0.5;
|
|
132
218
|
recognizer.allowableMovement = 10;
|
|
@@ -135,7 +221,7 @@
|
|
|
135
221
|
- (void)configure:(NSDictionary *)config
|
|
136
222
|
{
|
|
137
223
|
[super configure:config];
|
|
138
|
-
|
|
224
|
+
RNBetterLongPressGestureRecognizer *recognizer = (RNBetterLongPressGestureRecognizer *)_recognizer;
|
|
139
225
|
|
|
140
226
|
id prop = config[@"minDurationMs"];
|
|
141
227
|
if (prop != nil) {
|
|
@@ -146,8 +232,17 @@
|
|
|
146
232
|
if (prop != nil) {
|
|
147
233
|
recognizer.allowableMovement = [RCTConvert CGFloat:prop];
|
|
148
234
|
}
|
|
235
|
+
|
|
236
|
+
#if !TARGET_OS_TV
|
|
237
|
+
prop = config[@"numberOfPointers"];
|
|
238
|
+
if (prop != nil) {
|
|
239
|
+
recognizer.numberOfTouchesRequired = [RCTConvert CGFloat:prop];
|
|
240
|
+
}
|
|
241
|
+
#endif
|
|
149
242
|
}
|
|
150
243
|
|
|
244
|
+
#if !TARGET_OS_OSX
|
|
245
|
+
|
|
151
246
|
- (RNGestureHandlerState)state
|
|
152
247
|
{
|
|
153
248
|
// For long press recognizer we treat "Began" state as "active"
|
|
@@ -178,21 +273,17 @@
|
|
|
178
273
|
withDuration:[(RNBetterLongPressGestureRecognizer *)recognizer getDuration]
|
|
179
274
|
withPointerType:_pointerType];
|
|
180
275
|
}
|
|
181
|
-
@end
|
|
182
276
|
|
|
183
277
|
#else
|
|
184
278
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
- (instancetype)initWithTag:(NSNumber *)tag
|
|
279
|
+
- (RNGestureHandlerEventExtraData *)eventExtraData:(NSGestureRecognizer *)recognizer
|
|
188
280
|
{
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
281
|
+
return [RNGestureHandlerEventExtraData forPosition:[recognizer locationInView:recognizer.view]
|
|
282
|
+
withAbsolutePosition:[recognizer locationInView:recognizer.view.window.contentView]
|
|
283
|
+
withNumberOfTouches:1
|
|
284
|
+
withDuration:[(RNBetterLongPressGestureRecognizer *)recognizer getDuration]
|
|
285
|
+
withPointerType:RNGestureHandlerMouse];
|
|
194
286
|
}
|
|
195
287
|
|
|
196
|
-
@end
|
|
197
|
-
|
|
198
288
|
#endif
|
|
289
|
+
@end
|