react-native-gesture-handler 2.18.1 → 2.20.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|