1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16
17 #include "node_model.h"
18 #include "gesture_impl.h"
19
20 #include "core/gestures/gesture_event.h"
21 #include "interfaces/native/event/ui_input_event_impl.h"
22
OH_ArkUI_GestureEvent_GetActionType(const ArkUI_GestureEvent * event)23 ArkUI_GestureEventActionType OH_ArkUI_GestureEvent_GetActionType(const ArkUI_GestureEvent* event)
24 {
25 ArkUI_GestureEventActionType ret;
26 switch (event->eventData.subKind) {
27 case ON_ACTION:
28 case ON_ACTION_START:
29 ret = GESTURE_EVENT_ACTION_ACCEPT;
30 break;
31 case ON_ACTION_UPDATE:
32 ret = GESTURE_EVENT_ACTION_UPDATE;
33 break;
34 case ON_ACTION_END:
35 ret = GESTURE_EVENT_ACTION_END;
36 break;
37 case ON_ACTION_CANCEL:
38 ret = GESTURE_EVENT_ACTION_CANCEL;
39 break;
40 default:
41 ret = GESTURE_EVENT_ACTION_ACCEPT;
42 break;
43 }
44 return ret;
45 }
46
OH_ArkUI_GestureEvent_GetRawInputEvent(const ArkUI_GestureEvent * event)47 const ArkUI_UIInputEvent* OH_ArkUI_GestureEvent_GetRawInputEvent(const ArkUI_GestureEvent* event)
48 {
49 if (!event) {
50 return nullptr;
51 }
52 return reinterpret_cast<ArkUI_UIInputEvent*>(event->eventData.rawPointerEvent);
53 }
54
OH_ArkUI_LongPress_GetRepeatCount(const ArkUI_GestureEvent * event)55 int32_t OH_ArkUI_LongPress_GetRepeatCount(const ArkUI_GestureEvent* event)
56 {
57 return event->eventData.repeat;
58 }
59
OH_ArkUI_PanGesture_GetVelocity(const ArkUI_GestureEvent * event)60 float OH_ArkUI_PanGesture_GetVelocity(const ArkUI_GestureEvent* event)
61 {
62 return event->eventData.velocity;
63 }
64
OH_ArkUI_PanGesture_GetVelocityX(const ArkUI_GestureEvent * event)65 float OH_ArkUI_PanGesture_GetVelocityX(const ArkUI_GestureEvent* event)
66 {
67 return event->eventData.velocityX;
68 }
69
OH_ArkUI_PanGesture_GetVelocityY(const ArkUI_GestureEvent * event)70 float OH_ArkUI_PanGesture_GetVelocityY(const ArkUI_GestureEvent* event)
71 {
72 return event->eventData.velocityY;
73 }
74
OH_ArkUI_PanGesture_GetOffsetX(const ArkUI_GestureEvent * event)75 float OH_ArkUI_PanGesture_GetOffsetX(const ArkUI_GestureEvent* event)
76 {
77 return event->eventData.x;
78 }
79
OH_ArkUI_PanGesture_GetOffsetY(const ArkUI_GestureEvent * event)80 float OH_ArkUI_PanGesture_GetOffsetY(const ArkUI_GestureEvent* event)
81 {
82 return event->eventData.y;
83 }
84
OH_ArkUI_SwipeGesture_GetAngle(const ArkUI_GestureEvent * event)85 float OH_ArkUI_SwipeGesture_GetAngle(const ArkUI_GestureEvent* event)
86 {
87 return event->eventData.angle;
88 }
89
OH_ArkUI_SwipeGesture_GetVelocity(const ArkUI_GestureEvent * event)90 float OH_ArkUI_SwipeGesture_GetVelocity(const ArkUI_GestureEvent* event)
91 {
92 return event->eventData.speed;
93 }
94
OH_ArkUI_RotationGesture_GetAngle(const ArkUI_GestureEvent * event)95 float OH_ArkUI_RotationGesture_GetAngle(const ArkUI_GestureEvent* event)
96 {
97 return event->eventData.angle;
98 }
99
OH_ArkUI_PinchGesture_GetScale(const ArkUI_GestureEvent * event)100 float OH_ArkUI_PinchGesture_GetScale(const ArkUI_GestureEvent* event)
101 {
102 return event->eventData.scale;
103 }
104
OH_ArkUI_PinchGesture_GetCenterX(const ArkUI_GestureEvent * event)105 float OH_ArkUI_PinchGesture_GetCenterX(const ArkUI_GestureEvent* event)
106 {
107 return event->eventData.pinchCenterX;
108 }
109
OH_ArkUI_PinchGesture_GetCenterY(const ArkUI_GestureEvent * event)110 float OH_ArkUI_PinchGesture_GetCenterY(const ArkUI_GestureEvent* event)
111 {
112 return event->eventData.pinchCenterY;
113 }
114
OH_ArkUI_GestureEvent_GetNode(const ArkUI_GestureEvent * event)115 ArkUI_NodeHandle OH_ArkUI_GestureEvent_GetNode(const ArkUI_GestureEvent* event)
116 {
117 if (!event) {
118 return nullptr;
119 }
120 return reinterpret_cast<ArkUI_NodeHandle>(event->attachNode);
121 }
122
OH_ArkUI_GestureInterruptInfo_GetSystemFlag(const ArkUI_GestureInterruptInfo * event)123 bool OH_ArkUI_GestureInterruptInfo_GetSystemFlag(const ArkUI_GestureInterruptInfo* event)
124 {
125 return event->interruptData.isSystemGesture;
126 }
127
OH_ArkUI_GestureInterruptInfo_GetRecognizer(const ArkUI_GestureInterruptInfo * event)128 ArkUI_GestureRecognizer* OH_ArkUI_GestureInterruptInfo_GetRecognizer(const ArkUI_GestureInterruptInfo* event)
129 {
130 return reinterpret_cast<ArkUI_GestureRecognizer *>(event->interruptData.userData);
131 }
132
OH_ArkUI_GestureInterruptInfo_GetGestureEvent(const ArkUI_GestureInterruptInfo * event)133 ArkUI_GestureEvent* OH_ArkUI_GestureInterruptInfo_GetGestureEvent(const ArkUI_GestureInterruptInfo* event)
134 {
135 CHECK_NULL_RETURN(event, nullptr);
136 ArkUI_GestureEvent* gestureEvent = reinterpret_cast<ArkUI_GestureEvent*>(event->interruptData.gestureEvent);
137 CHECK_NULL_RETURN(gestureEvent, nullptr);
138
139 ArkUI_UIInputEvent* uiEvent = reinterpret_cast<ArkUI_UIInputEvent*>(event->interruptData.inputEvent);
140 gestureEvent->eventData.rawPointerEvent = uiEvent;
141
142 auto* gestureRecognizer = reinterpret_cast<ArkUI_GestureRecognizer*>(event->interruptData.userData);
143 CHECK_NULL_RETURN(gestureRecognizer, nullptr);
144 gestureEvent->attachNode = gestureRecognizer->attachNode;
145 return gestureEvent;
146 }
147
OH_ArkUI_GestureInterruptInfo_GetSystemRecognizerType(const ArkUI_GestureInterruptInfo * event)148 int32_t OH_ArkUI_GestureInterruptInfo_GetSystemRecognizerType(const ArkUI_GestureInterruptInfo* event)
149 {
150 if (event->interruptData.isSystemGesture) {
151 return event->interruptData.systemRecognizerType;
152 }
153 return -1;
154 }
155
OH_ArkUI_GestureInterruptInfo_GetTouchRecognizers(const ArkUI_GestureInterruptInfo * info,ArkUI_TouchRecognizerHandleArray * recognizers,int32_t * size)156 int32_t OH_ArkUI_GestureInterruptInfo_GetTouchRecognizers(
157 const ArkUI_GestureInterruptInfo* info, ArkUI_TouchRecognizerHandleArray* recognizers, int32_t* size)
158 {
159 CHECK_NULL_RETURN(info, ARKUI_ERROR_CODE_PARAM_INVALID);
160 CHECK_NULL_RETURN(recognizers, ARKUI_ERROR_CODE_PARAM_INVALID);
161 CHECK_NULL_RETURN(size, ARKUI_ERROR_CODE_PARAM_INVALID);
162 *recognizers = reinterpret_cast<ArkUI_TouchRecognizerHandleArray>(info->interruptData.touchRecognizers);
163 *size = info->interruptData.touchRecognizerCnt;
164 return ARKUI_ERROR_CODE_NO_ERROR;
165 }
166
OH_ArkUI_TouchRecognizer_GetNodeHandle(const ArkUI_TouchRecognizerHandle recognizer)167 ArkUI_NodeHandle OH_ArkUI_TouchRecognizer_GetNodeHandle(const ArkUI_TouchRecognizerHandle recognizer)
168 {
169 CHECK_NULL_RETURN(recognizer, nullptr);
170 auto node =
171 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->touchRecognizerGetNodeHandle(
172 static_cast<void*>(recognizer));
173
174 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
175 ArkUI_Node* arkUINode = new ArkUI_Node({ -1, node, false });
176 impl->getExtendedAPI()->setAttachNodePtr((arkUINode)->uiNodeHandle, reinterpret_cast<void*>(arkUINode));
177 return reinterpret_cast<ArkUI_NodeHandle>(arkUINode);
178 }
179
OH_ArkUI_TouchRecognizer_CancelTouch(ArkUI_TouchRecognizerHandle recognizer,ArkUI_GestureInterruptInfo * info)180 int32_t OH_ArkUI_TouchRecognizer_CancelTouch(ArkUI_TouchRecognizerHandle recognizer, ArkUI_GestureInterruptInfo* info)
181 {
182 CHECK_NULL_RETURN(recognizer, ARKUI_ERROR_CODE_PARAM_INVALID);
183 CHECK_NULL_RETURN(info, ARKUI_ERROR_CODE_PARAM_INVALID);
184 bool ret =
185 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->touchRecognizerCancelTouch(
186 static_cast<void*>(recognizer));
187 return ret ? ARKUI_ERROR_CODE_NO_ERROR : ARKUI_ERROR_CODE_PARAM_INVALID;
188 }
189
OH_ArkUI_GetResponseRecognizersFromInterruptInfo(const ArkUI_GestureInterruptInfo * event,ArkUI_GestureRecognizerHandleArray * responseChain,int32_t * count)190 int32_t OH_ArkUI_GetResponseRecognizersFromInterruptInfo(
191 const ArkUI_GestureInterruptInfo* event, ArkUI_GestureRecognizerHandleArray* responseChain, int32_t* count)
192 {
193 CHECK_NULL_RETURN(responseChain, ARKUI_ERROR_CODE_PARAM_INVALID);
194 CHECK_NULL_RETURN(count, ARKUI_ERROR_CODE_PARAM_INVALID);
195 *responseChain = reinterpret_cast<ArkUI_GestureRecognizer**>(event->interruptData.responseLinkRecognizer);
196 *count = event->interruptData.count;
197 return 0;
198 }
199
OH_ArkUI_SetGestureRecognizerEnabled(ArkUI_GestureRecognizer * recognizer,bool enabled)200 int32_t OH_ArkUI_SetGestureRecognizerEnabled(ArkUI_GestureRecognizer* recognizer, bool enabled)
201 {
202 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
203 if (!gestureRecognizer) {
204 return ARKUI_ERROR_CODE_PARAM_INVALID;
205 }
206 return OHOS::Ace::NodeModel::GetFullImpl()
207 ->getNodeModifiers()
208 ->getGestureModifier()
209 ->setGestureRecognizerEnabled(gestureRecognizer, enabled);
210 }
211
OH_ArkUI_SetGestureRecognizerLimitFingerCount(ArkUI_GestureRecognizer * recognizer,bool limitFingerCount)212 int32_t OH_ArkUI_SetGestureRecognizerLimitFingerCount(ArkUI_GestureRecognizer* recognizer, bool limitFingerCount)
213 {
214 auto* gesture = reinterpret_cast<ArkUIGesture*>(recognizer->gesture);
215 if (!gesture) {
216 return ARKUI_ERROR_CODE_PARAM_INVALID;
217 }
218 return OHOS::Ace::NodeModel::GetFullImpl()
219 ->getNodeModifiers()
220 ->getGestureModifier()
221 ->setGestureRecognizerLimitFingerCount(gesture, limitFingerCount);
222 }
223
OH_ArkUI_GetGestureRecognizerEnabled(ArkUI_GestureRecognizer * recognizer)224 bool OH_ArkUI_GetGestureRecognizerEnabled(ArkUI_GestureRecognizer* recognizer)
225 {
226 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
227 if (!gestureRecognizer) {
228 return false;
229 }
230 return OHOS::Ace::NodeModel::GetFullImpl()
231 ->getNodeModifiers()
232 ->getGestureModifier()
233 ->getGestureRecognizerEnabled(gestureRecognizer);
234 }
235
OH_ArkUI_GetGestureRecognizerState(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureRecognizerState * state)236 int32_t OH_ArkUI_GetGestureRecognizerState(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureRecognizerState* state)
237 {
238 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
239 if (!gestureRecognizer) {
240 return ARKUI_ERROR_CODE_PARAM_INVALID;
241 }
242 ArkUIGestureRecognizerState recognizerState;
243 auto result =
244 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureRecognizerState(
245 gestureRecognizer, &recognizerState);
246 *state = static_cast<ArkUI_GestureRecognizerState>(recognizerState);
247 return result;
248 }
249
OH_ArkUI_GetGestureEventTargetInfo(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureEventTargetInfo ** info)250 int32_t OH_ArkUI_GetGestureEventTargetInfo(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureEventTargetInfo** info)
251 {
252 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
253 if (!gestureRecognizer) {
254 return ARKUI_ERROR_CODE_PARAM_INVALID;
255 }
256 *info = reinterpret_cast<ArkUI_GestureEventTargetInfo*>(&gestureRecognizer->targetInfo);
257 return 0;
258 }
259
OH_ArkUI_GestureEventTargetInfo_IsScrollBegin(ArkUI_GestureEventTargetInfo * info,bool * ret)260 int32_t OH_ArkUI_GestureEventTargetInfo_IsScrollBegin(ArkUI_GestureEventTargetInfo* info, bool* ret)
261 {
262 auto* targetInfo = reinterpret_cast<ArkUIGestureEventTargetInfo*>(info);
263 if (!targetInfo) {
264 return ARKUI_ERROR_CODE_PARAM_INVALID;
265 }
266 return OHOS::Ace::NodeModel::GetFullImpl()
267 ->getNodeModifiers()
268 ->getGestureModifier()
269 ->gestureEventTargetInfoIsScrollBegin(targetInfo, ret);
270 }
271
OH_ArkUI_GestureEventTargetInfo_IsScrollEnd(ArkUI_GestureEventTargetInfo * info,bool * ret)272 int32_t OH_ArkUI_GestureEventTargetInfo_IsScrollEnd(ArkUI_GestureEventTargetInfo* info, bool* ret)
273 {
274 auto* targetInfo = reinterpret_cast<ArkUIGestureEventTargetInfo*>(info);
275 if (!targetInfo) {
276 return ARKUI_ERROR_CODE_PARAM_INVALID;
277 }
278 return OHOS::Ace::NodeModel::GetFullImpl()
279 ->getNodeModifiers()
280 ->getGestureModifier()
281 ->gestureEventTargetInfoIsScrollEnd(targetInfo, ret);
282 }
283
OH_ArkUI_GetPanGestureDirectionMask(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureDirectionMask * directionMask)284 int32_t OH_ArkUI_GetPanGestureDirectionMask(
285 ArkUI_GestureRecognizer* recognizer, ArkUI_GestureDirectionMask* directionMask)
286 {
287 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
288 if (!gestureRecognizer) {
289 return ARKUI_ERROR_CODE_PARAM_INVALID;
290 }
291 ArkUIGestureDirection direction = ArkUIGestureDirection::ArkUI_GESTURE_DIRECTION_ALL;
292 auto result =
293 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getPanGestureDirectionMask(
294 gestureRecognizer, &direction);
295 *directionMask = static_cast<ArkUI_GestureDirectionMask>(direction);
296 return result;
297 }
298
OH_ArkUI_IsBuiltInGesture(ArkUI_GestureRecognizer * recognizer)299 bool OH_ArkUI_IsBuiltInGesture(ArkUI_GestureRecognizer* recognizer)
300 {
301 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
302 if (!gestureRecognizer) {
303 return false;
304 }
305 return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->isBuiltInGesture(
306 gestureRecognizer);
307 }
308
OH_ArkUI_GetGestureTag(ArkUI_GestureRecognizer * recognizer,char * buffer,int32_t bufferSize,int32_t * result)309 int32_t OH_ArkUI_GetGestureTag(ArkUI_GestureRecognizer* recognizer, char* buffer, int32_t bufferSize, int32_t* result)
310 {
311 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
312 if (!gestureRecognizer) {
313 return ARKUI_ERROR_CODE_PARAM_INVALID;
314 }
315 return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureTag(
316 gestureRecognizer, buffer, bufferSize, result);
317 }
318
OH_ArkUI_GetGestureBindNodeId(ArkUI_GestureRecognizer * recognizer,char * nodeId,int32_t size,int32_t * result)319 int32_t OH_ArkUI_GetGestureBindNodeId(ArkUI_GestureRecognizer* recognizer, char* nodeId, int32_t size, int32_t* result)
320 {
321 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
322 if (!gestureRecognizer) {
323 return ARKUI_ERROR_CODE_PARAM_INVALID;
324 }
325 return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureBindNodeId(
326 gestureRecognizer, nodeId, size, result);
327 }
328
OH_ArkUI_IsGestureRecognizerValid(ArkUI_GestureRecognizer * recognizer)329 bool OH_ArkUI_IsGestureRecognizerValid(ArkUI_GestureRecognizer* recognizer)
330 {
331 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
332 if (!gestureRecognizer) {
333 return false;
334 }
335 return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->isGestureRecognizerValid(
336 gestureRecognizer);
337 }
338
OH_ArkUI_ParallelInnerGestureEvent_GetUserData(ArkUI_ParallelInnerGestureEvent * event)339 void* OH_ArkUI_ParallelInnerGestureEvent_GetUserData(ArkUI_ParallelInnerGestureEvent* event)
340 {
341 return event->userData;
342 }
343
OH_ArkUI_GestureInterrupter_GetUserData(ArkUI_GestureInterruptInfo * event)344 void* OH_ArkUI_GestureInterrupter_GetUserData(ArkUI_GestureInterruptInfo* event)
345 {
346 if (!event) {
347 return nullptr;
348 }
349 return event->interruptData.customUserData;
350 }
351
OH_ArkUI_ParallelInnerGestureEvent_GetCurrentRecognizer(ArkUI_ParallelInnerGestureEvent * event)352 ArkUI_GestureRecognizer* OH_ArkUI_ParallelInnerGestureEvent_GetCurrentRecognizer(ArkUI_ParallelInnerGestureEvent* event)
353 {
354 return reinterpret_cast<ArkUI_GestureRecognizer*>(event->current);
355 }
356
OH_ArkUI_ParallelInnerGestureEvent_GetConflictRecognizers(ArkUI_ParallelInnerGestureEvent * event,ArkUI_GestureRecognizerHandleArray * array,int32_t * size)357 int32_t OH_ArkUI_ParallelInnerGestureEvent_GetConflictRecognizers(
358 ArkUI_ParallelInnerGestureEvent* event, ArkUI_GestureRecognizerHandleArray* array, int32_t* size)
359 {
360 CHECK_NULL_RETURN(array, ARKUI_ERROR_CODE_PARAM_INVALID);
361 CHECK_NULL_RETURN(size, ARKUI_ERROR_CODE_PARAM_INVALID);
362 *array = reinterpret_cast<ArkUI_GestureRecognizer**>(event->responseLinkRecognizer);
363 *size = event->count;
364 return 0;
365 }
366
OH_ArkUI_SetArkUIGestureRecognizerDisposeNotify(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureRecognizerDisposeNotifyCallback callback,void * userData)367 int32_t OH_ArkUI_SetArkUIGestureRecognizerDisposeNotify(
368 ArkUI_GestureRecognizer* recognizer, ArkUI_GestureRecognizerDisposeNotifyCallback callback, void* userData)
369 {
370 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
371 if (!gestureRecognizer || gestureRecognizer->capi) {
372 return ARKUI_ERROR_CODE_PARAM_INVALID;
373 }
374 auto disposeCallback = reinterpret_cast<void (*)(ArkUIGestureRecognizer * recognizer, void* userData)>(callback);
375 OHOS::Ace::NodeModel::GetFullImpl()
376 ->getNodeModifiers()
377 ->getGestureModifier()
378 ->setArkUIGestureRecognizerDisposeNotify(gestureRecognizer, userData, disposeCallback);
379 return 0;
380 }
381
OH_ArkUI_GetGestureParam_DirectMask(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureDirectionMask * directMask)382 int32_t OH_ArkUI_GetGestureParam_DirectMask(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureDirectionMask* directMask)
383 {
384 if (!recognizer || !directMask) {
385 return ARKUI_ERROR_CODE_PARAM_INVALID;
386 }
387 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
388 if (!gestureRecognizer) {
389 return ARKUI_ERROR_CODE_PARAM_INVALID;
390 }
391 switch (recognizer->type) {
392 case SWIPE_GESTURE: {
393 ArkUIGestureDirection direction = ArkUIGestureDirection::ArkUI_GESTURE_DIRECTION_ALL;
394 auto result = OHOS::Ace::NodeModel::GetFullImpl()
395 ->getNodeModifiers()
396 ->getGestureModifier()
397 ->getSwipeGestureDirectionMask(gestureRecognizer, &direction);
398 *directMask = static_cast<ArkUI_GestureDirectionMask>(direction);
399 return result;
400 }
401 case PAN_GESTURE: {
402 ArkUIGestureDirection direction = ArkUIGestureDirection::ArkUI_GESTURE_DIRECTION_ALL;
403 auto result = OHOS::Ace::NodeModel::GetFullImpl()
404 ->getNodeModifiers()
405 ->getGestureModifier()
406 ->getPanGestureDirectionMask(gestureRecognizer, &direction);
407 *directMask = static_cast<ArkUI_GestureDirectionMask>(direction);
408 return result;
409 }
410 default:
411 break;
412 }
413 return ARKUI_ERROR_CODE_PARAM_INVALID;
414 }
415
OH_ArkUI_GetGestureParam_FingerCount(ArkUI_GestureRecognizer * recognizer,int * finger)416 int32_t OH_ArkUI_GetGestureParam_FingerCount(ArkUI_GestureRecognizer* recognizer, int* finger)
417 {
418 if (!recognizer || !finger) {
419 return ARKUI_ERROR_CODE_PARAM_INVALID;
420 }
421 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
422 if (!gestureRecognizer) {
423 return ARKUI_ERROR_CODE_PARAM_INVALID;
424 }
425 switch (recognizer->type) {
426 case TAP_GESTURE:
427 case LONG_PRESS_GESTURE:
428 case PINCH_GESTURE:
429 case ROTATION_GESTURE:
430 case SWIPE_GESTURE:
431 case PAN_GESTURE: {
432 auto result =
433 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureFingerCount(
434 gestureRecognizer, finger);
435 return result;
436 }
437 default:
438 break;
439 }
440 return ARKUI_ERROR_CODE_PARAM_INVALID;
441 }
442
OH_ArkUI_GetGestureParam_limitFingerCount(ArkUI_GestureRecognizer * recognizer,bool * isLimited)443 int32_t OH_ArkUI_GetGestureParam_limitFingerCount(ArkUI_GestureRecognizer* recognizer, bool* isLimited)
444 {
445 if (!recognizer || !isLimited) {
446 return ARKUI_ERROR_CODE_PARAM_INVALID;
447 }
448 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
449 if (!gestureRecognizer) {
450 return ARKUI_ERROR_CODE_PARAM_INVALID;
451 }
452 switch (recognizer->type) {
453 case TAP_GESTURE:
454 case LONG_PRESS_GESTURE:
455 case PINCH_GESTURE:
456 case ROTATION_GESTURE:
457 case SWIPE_GESTURE:
458 case PAN_GESTURE: {
459 auto result = OHOS::Ace::NodeModel::GetFullImpl()
460 ->getNodeModifiers()
461 ->getGestureModifier()
462 ->getGestureLimitFingerCount(gestureRecognizer, isLimited);
463 return result;
464 }
465 default:
466 break;
467 }
468 return ARKUI_ERROR_CODE_PARAM_INVALID;
469 }
470
OH_ArkUI_GetGestureParam_repeat(ArkUI_GestureRecognizer * recognizer,bool * isRepeat)471 int32_t OH_ArkUI_GetGestureParam_repeat(ArkUI_GestureRecognizer* recognizer, bool* isRepeat)
472 {
473 if (!recognizer || !isRepeat) {
474 return ARKUI_ERROR_CODE_PARAM_INVALID;
475 }
476 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
477 if (!gestureRecognizer) {
478 return ARKUI_ERROR_CODE_PARAM_INVALID;
479 }
480 switch (recognizer->type) {
481 case LONG_PRESS_GESTURE: {
482 auto result = OHOS::Ace::NodeModel::GetFullImpl()
483 ->getNodeModifiers()
484 ->getGestureModifier()
485 ->getLongPressGestureRepeat(gestureRecognizer, isRepeat);
486 return result;
487 }
488 default:
489 break;
490 }
491 return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
492 }
493
OH_ArkUI_GetGestureParam_distance(ArkUI_GestureRecognizer * recognizer,double * distance)494 int32_t OH_ArkUI_GetGestureParam_distance(ArkUI_GestureRecognizer* recognizer, double* distance)
495 {
496 if (!recognizer || !distance) {
497 return ARKUI_ERROR_CODE_PARAM_INVALID;
498 }
499 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
500 if (!gestureRecognizer) {
501 return ARKUI_ERROR_CODE_PARAM_INVALID;
502 }
503 switch (recognizer->type) {
504 case PINCH_GESTURE: {
505 auto result =
506 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getPinchGestureDistance(
507 gestureRecognizer, distance);
508 return result;
509 }
510 case PAN_GESTURE: {
511 auto result =
512 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getPanGestureDistance(
513 gestureRecognizer, distance);
514 return result;
515 }
516 default:
517 break;
518 }
519 return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
520 }
521
OH_ArkUI_GetGestureParam_speed(ArkUI_GestureRecognizer * recognizer,double * speed)522 int32_t OH_ArkUI_GetGestureParam_speed(ArkUI_GestureRecognizer* recognizer, double* speed)
523 {
524 if (!recognizer || !speed) {
525 return ARKUI_ERROR_CODE_PARAM_INVALID;
526 }
527 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
528 if (!gestureRecognizer) {
529 return ARKUI_ERROR_CODE_PARAM_INVALID;
530 }
531 switch (recognizer->type) {
532 case SWIPE_GESTURE: {
533 auto result =
534 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getSwipeGestureSpeed(
535 gestureRecognizer, speed);
536 return result;
537 }
538 default:
539 break;
540 }
541 return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
542 }
543
OH_ArkUI_GetGestureParam_duration(ArkUI_GestureRecognizer * recognizer,int * duration)544 int32_t OH_ArkUI_GetGestureParam_duration(ArkUI_GestureRecognizer* recognizer, int* duration)
545 {
546 if (!recognizer || !duration) {
547 return ARKUI_ERROR_CODE_PARAM_INVALID;
548 }
549 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
550 if (!gestureRecognizer) {
551 return ARKUI_ERROR_CODE_PARAM_INVALID;
552 }
553 switch (recognizer->type) {
554 case LONG_PRESS_GESTURE: {
555 auto result = OHOS::Ace::NodeModel::GetFullImpl()
556 ->getNodeModifiers()
557 ->getGestureModifier()
558 ->getLongPressGestureDuration(gestureRecognizer, duration);
559 return result;
560 }
561 default:
562 break;
563 }
564 return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
565 }
566
OH_ArkUI_GetGestureParam_angle(ArkUI_GestureRecognizer * recognizer,double * angle)567 int32_t OH_ArkUI_GetGestureParam_angle(ArkUI_GestureRecognizer* recognizer, double* angle)
568 {
569 if (!recognizer || !angle) {
570 return ARKUI_ERROR_CODE_PARAM_INVALID;
571 }
572 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
573 if (!gestureRecognizer) {
574 return ARKUI_ERROR_CODE_PARAM_INVALID;
575 }
576 switch (recognizer->type) {
577 case ROTATION_GESTURE: {
578 auto result =
579 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getRotationGestureAngle(
580 gestureRecognizer, angle);
581 return result;
582 }
583 default:
584 break;
585 }
586 return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
587 }
588
OH_ArkUI_GetGestureParam_distanceThreshold(ArkUI_GestureRecognizer * recognizer,double * distanceThreshold)589 int32_t OH_ArkUI_GetGestureParam_distanceThreshold(ArkUI_GestureRecognizer* recognizer, double* distanceThreshold)
590 {
591 if (!recognizer || !distanceThreshold) {
592 return ARKUI_ERROR_CODE_PARAM_INVALID;
593 }
594 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
595 if (!gestureRecognizer) {
596 return ARKUI_ERROR_CODE_PARAM_INVALID;
597 }
598 switch (recognizer->type) {
599 case TAP_GESTURE: {
600 auto result = OHOS::Ace::NodeModel::GetFullImpl()
601 ->getNodeModifiers()
602 ->getGestureModifier()
603 ->getTapGestureDistanceThreshold(gestureRecognizer, distanceThreshold);
604 return result;
605 }
606 default:
607 break;
608 }
609 return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
610 }
611
OH_ArkUI_PanGesture_SetDistanceMap(ArkUI_GestureRecognizer * recognizer,int size,int * toolTypeArray,double * distanceArray)612 ArkUI_ErrorCode OH_ArkUI_PanGesture_SetDistanceMap(
613 ArkUI_GestureRecognizer* recognizer, int size, int* toolTypeArray, double* distanceArray)
614 {
615 if (!recognizer || !toolTypeArray || !distanceArray) {
616 return ARKUI_ERROR_CODE_PARAM_INVALID;
617 }
618 auto* gesture = reinterpret_cast<ArkUIGesture*>(recognizer->gesture);
619 if (!gesture) {
620 return ARKUI_ERROR_CODE_PARAM_INVALID;
621 }
622 if (recognizer->type == PAN_GESTURE) {
623 auto result = OHOS::Ace::NodeModel::GetFullImpl()
624 ->getNodeModifiers()
625 ->getGestureModifier()
626 ->setDistanceMap(gesture, size, toolTypeArray, distanceArray);
627 return static_cast<ArkUI_ErrorCode>(result);
628 }
629 return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
630 }
631
OH_ArkUI_PreventGestureRecognizerBegin(ArkUI_GestureRecognizer * recognizer)632 ArkUI_ErrorCode OH_ArkUI_PreventGestureRecognizerBegin(ArkUI_GestureRecognizer* recognizer)
633 {
634 if (!recognizer) {
635 return ARKUI_ERROR_CODE_PARAM_INVALID;
636 }
637
638 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
639 if (!gestureRecognizer) {
640 return ARKUI_ERROR_CODE_PARAM_INVALID;
641 }
642 auto result = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->setPreventBegin(
643 gestureRecognizer);
644 return static_cast<ArkUI_ErrorCode>(result);
645 }
646
OH_ArkUI_SetTouchTestDoneCallback(ArkUI_NodeHandle node,void * userData,void (* touchTestDone)(ArkUI_GestureEvent * event,ArkUI_GestureRecognizerHandleArray recognizers,int32_t count,void * userData))647 ArkUI_ErrorCode OH_ArkUI_SetTouchTestDoneCallback(ArkUI_NodeHandle node, void* userData,
648 void (*touchTestDone)(
649 ArkUI_GestureEvent* event, ArkUI_GestureRecognizerHandleArray recognizers, int32_t count, void* userData))
650 {
651 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
652 if (!impl || !node) {
653 return ARKUI_ERROR_CODE_PARAM_INVALID;
654 }
655 auto callback = reinterpret_cast<void (*)(ArkUIGestureEvent* event, ArkUIGestureRecognizerHandleArray recognizers,
656 int32_t count, void* userData)>(touchTestDone);
657 auto result = impl->getNodeModifiers()->getCommonModifier()->setOnTouchTestDoneCallback(
658 node->uiNodeHandle, userData, callback);
659 return static_cast<ArkUI_ErrorCode>(result);
660 }
661
OH_ArkUI_PanGesture_GetDistanceByToolType(ArkUI_GestureRecognizer * recognizer,int toolType,double * distance)662 ArkUI_ErrorCode OH_ArkUI_PanGesture_GetDistanceByToolType(
663 ArkUI_GestureRecognizer* recognizer, int toolType, double* distance)
664 {
665 if (!recognizer || !distance) {
666 return ARKUI_ERROR_CODE_PARAM_INVALID;
667 }
668 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
669 if (!gestureRecognizer) {
670 return ARKUI_ERROR_CODE_PARAM_INVALID;
671 }
672 if (recognizer->type == PAN_GESTURE) {
673 auto result = OHOS::Ace::NodeModel::GetFullImpl()
674 ->getNodeModifiers()
675 ->getGestureModifier()
676 ->getDistanceByToolType(gestureRecognizer, toolType, distance);
677 return static_cast<ArkUI_ErrorCode>(result);
678 }
679 return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
680 }
681
682 namespace OHOS::Ace::GestureModel {
683
684 constexpr int32_t DEFAULT_PAN_FINGERS = 1;
685 constexpr int32_t MAX_PAN_FINGERS = 10;
686 constexpr double DEFAULT_PINCH_DISTANCE = 5.0f;
687 constexpr double DEFAULT_SWIPE_SPEED = 100.0f;
688 constexpr int32_t DEFAULT_TAP_COUNT = 1;
689 constexpr int32_t DEFAULT_TAP_FINGERS = 1;
690 constexpr int32_t MAX_TAP_FINGERS = 10;
691
692 struct GestureInnerData {
693 void (*targetReceiver)(ArkUI_GestureEvent* event, void* extraParam);
694 void* extraParam;
695 void* gesture;
696 };
697
CreateTapGesture(int32_t count,int32_t fingers)698 ArkUI_GestureRecognizer* CreateTapGesture(int32_t count, int32_t fingers)
699 {
700 count = std::max(count, DEFAULT_TAP_COUNT);
701 fingers = std::clamp(fingers, DEFAULT_TAP_FINGERS, MAX_TAP_FINGERS);
702 auto* ndkGesture = new ArkUI_GestureRecognizer{ TAP_GESTURE, nullptr, nullptr, nullptr };
703 auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createTapGesture(
704 count, fingers, false, ndkGesture);
705 ndkGesture->gesture = gesture;
706 return ndkGesture;
707 }
708
CreateTapGestureWithDistanceThreshold(int32_t count,int32_t fingers,double distanceThreshold)709 ArkUI_GestureRecognizer* CreateTapGestureWithDistanceThreshold(int32_t count, int32_t fingers, double distanceThreshold)
710 {
711 count = std::max(count, DEFAULT_TAP_COUNT);
712 fingers = std::clamp(fingers, DEFAULT_TAP_FINGERS, MAX_TAP_FINGERS);
713 auto* ndkGesture = new ArkUI_GestureRecognizer{ TAP_GESTURE, nullptr, nullptr, nullptr };
714 auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->
715 createTapGestureWithDistanceThreshold(count, fingers, distanceThreshold, false, ndkGesture);
716 ndkGesture->gesture = gesture;
717 return ndkGesture;
718 }
719
CreateLongPressGesture(int32_t fingers,bool repeatResult,int32_t duration)720 ArkUI_GestureRecognizer* CreateLongPressGesture(int32_t fingers, bool repeatResult, int32_t duration)
721 {
722 auto* ndkGesture = new ArkUI_GestureRecognizer{ LONG_PRESS_GESTURE, nullptr, nullptr, nullptr };
723 auto* gesture =
724 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createLongPressGesture(fingers,
725 repeatResult, duration, false, ndkGesture);
726 ndkGesture->gesture = gesture;
727 return ndkGesture;
728 }
729
CreatePinchGesture(int32_t fingers,double distance)730 ArkUI_GestureRecognizer* CreatePinchGesture(int32_t fingers, double distance)
731 {
732 if (LessOrEqual(distance, 0.0f)) {
733 distance = DEFAULT_PINCH_DISTANCE;
734 }
735 double distanceNum = OHOS::Ace::NodeModel::GetFullImpl()->getBasicAPI()->convertLengthMetricsUnit(
736 distance, static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_PX), static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_VP));
737 auto* ndkGesture = new ArkUI_GestureRecognizer{ PINCH_GESTURE, nullptr, nullptr, nullptr };
738 auto* gesture =
739 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createPinchGesture(fingers,
740 distanceNum, false, ndkGesture);
741 ndkGesture->gesture = gesture;
742 return ndkGesture;
743 }
744
CreateRotationGesture(int32_t fingers,double angle)745 ArkUI_GestureRecognizer* CreateRotationGesture(int32_t fingers, double angle)
746 {
747 auto* ndkGesture = new ArkUI_GestureRecognizer{ ROTATION_GESTURE, nullptr, nullptr, nullptr };
748 auto* gesture =
749 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createRotationGesture(fingers,
750 angle, false, ndkGesture);
751 ndkGesture->gesture = gesture;
752 return ndkGesture;
753 }
754
CreateSwipeGesture(int32_t fingers,ArkUI_GestureDirectionMask directions,double speed)755 ArkUI_GestureRecognizer* CreateSwipeGesture(
756 int32_t fingers, ArkUI_GestureDirectionMask directions, double speed)
757 {
758 if (LessOrEqual(speed, 0.0f)) {
759 speed = DEFAULT_SWIPE_SPEED;
760 }
761 double speedNum = OHOS::Ace::NodeModel::GetFullImpl()->getBasicAPI()->convertLengthMetricsUnit(
762 speed, static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_PX), static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_VP));
763 auto* ndkGesture = new ArkUI_GestureRecognizer{ SWIPE_GESTURE, nullptr, nullptr, nullptr };
764 auto* gesture =
765 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createSwipeGesture(fingers,
766 directions, speedNum, false, ndkGesture);
767 ndkGesture->gesture = gesture;
768 return ndkGesture;
769 }
770
CreatePanGesture(int32_t fingersNum,ArkUI_GestureDirectionMask mask,double distanceNum)771 ArkUI_GestureRecognizer* CreatePanGesture(int32_t fingersNum, ArkUI_GestureDirectionMask mask, double distanceNum)
772 {
773 int32_t fingers = DEFAULT_PAN_FINGERS;
774 if (fingersNum < DEFAULT_PAN_FINGERS || fingersNum > MAX_PAN_FINGERS) {
775 fingers = DEFAULT_PAN_FINGERS;
776 } else {
777 fingers = fingersNum;
778 }
779 auto* ndkGesture = new ArkUI_GestureRecognizer{ PAN_GESTURE, nullptr, nullptr, nullptr };
780 auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createPanGesture(
781 fingers, mask, distanceNum, false, ndkGesture);
782 ndkGesture->gesture = gesture;
783 return ndkGesture;
784 }
785
DisposeGesture(ArkUI_GestureRecognizer * recognizer)786 void DisposeGesture(ArkUI_GestureRecognizer* recognizer)
787 {
788 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->dispose(recognizer->gesture);
789 delete reinterpret_cast<GestureInnerData*>(recognizer->extraData);
790 recognizer->extraData = nullptr;
791 delete recognizer;
792 recognizer = nullptr;
793 }
794
SetGestureEventTarget(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureEventActionTypeMask mask,void * extraParam,void (* targetReceiver)(ArkUI_GestureEvent * event,void * extraParam))795 int32_t SetGestureEventTarget(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureEventActionTypeMask mask,
796 void* extraParam, void (*targetReceiver)(ArkUI_GestureEvent* event, void* extraParam))
797 {
798 // 手势事件通过通用的异步事件接口进行处理。(HandleGestureEvent)
799 // 把回调函数和上下文都封装到内部结构体中。
800 if (recognizer->extraData) {
801 delete reinterpret_cast<GestureInnerData*>(recognizer->extraData);
802 recognizer->extraData = nullptr;
803 }
804 recognizer->extraData = new GestureInnerData { targetReceiver, extraParam, recognizer };
805 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->registerGestureEvent(
806 recognizer->gesture, mask, recognizer->extraData);
807 return 0;
808 }
809
AddGestureToNode(ArkUI_NodeHandle node,ArkUI_GestureRecognizer * recognizer,ArkUI_GesturePriority priorityNum,ArkUI_GestureMask mask)810 int32_t AddGestureToNode(ArkUI_NodeHandle node, ArkUI_GestureRecognizer* recognizer, ArkUI_GesturePriority priorityNum,
811 ArkUI_GestureMask mask)
812 {
813 recognizer->attachNode = node;
814 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->addGestureToNode(
815 node->uiNodeHandle, recognizer->gesture, priorityNum, mask);
816 recognizer->targetInfo.uiNode = reinterpret_cast<void*>(node->uiNodeHandle);
817 return 0;
818 }
819
RemoveGestureFromNode(ArkUI_NodeHandle node,ArkUI_GestureRecognizer * recognizer)820 int32_t RemoveGestureFromNode(ArkUI_NodeHandle node, ArkUI_GestureRecognizer* recognizer)
821 {
822 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->removeGestureFromNode(
823 node->uiNodeHandle, recognizer->gesture);
824 recognizer->targetInfo.uiNode = nullptr;
825 return 0;
826 }
827
GetGestureType(ArkUI_GestureRecognizer * recognizer)828 ArkUI_GestureRecognizerType GetGestureType(ArkUI_GestureRecognizer* recognizer)
829 {
830 return static_cast<ArkUI_GestureRecognizerType>(recognizer->type);
831 }
832
CreateGroupGesture(ArkUI_GroupGestureMode gestureMode)833 ArkUI_GestureRecognizer* CreateGroupGesture(ArkUI_GroupGestureMode gestureMode)
834 {
835 auto* gesture =
836 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createGestureGroup(gestureMode);
837 return new ArkUI_GestureRecognizer { GROUP_GESTURE, gesture, nullptr };
838 }
839
AddChildGesture(ArkUI_GestureRecognizer * group,ArkUI_GestureRecognizer * child)840 int32_t AddChildGesture(ArkUI_GestureRecognizer* group, ArkUI_GestureRecognizer* child)
841 {
842 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->addGestureToGestureGroup(
843 group->gesture, child->gesture);
844 return 0;
845 }
846
RemoveChildGesture(ArkUI_GestureRecognizer * group,ArkUI_GestureRecognizer * child)847 int32_t RemoveChildGesture(ArkUI_GestureRecognizer* group, ArkUI_GestureRecognizer* child)
848 {
849 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->removeGestureFromGestureGroup(
850 group->gesture, child->gesture);
851 return 0;
852 }
853
HandleGestureEvent(ArkUINodeEvent * event)854 void HandleGestureEvent(ArkUINodeEvent* event)
855 {
856 if (event == nullptr) {
857 return;
858 }
859 auto* extraData = reinterpret_cast<GestureInnerData*>(event->extraParam);
860 if (extraData == nullptr) {
861 return;
862 }
863 ArkUI_GestureEvent* gestureEvent = reinterpret_cast<ArkUI_GestureEvent *>(&event->gestureAsyncEvent);
864 if (gestureEvent == nullptr || extraData->targetReceiver == nullptr) {
865 return;
866 }
867 ArkUI_UIInputEvent* uiEvent = new ArkUI_UIInputEvent();
868 if (gestureEvent->eventData.inputEventType == static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_MOUSE)) {
869 uiEvent->eventTypeId = C_MOUSE_EVENT_ID;
870 uiEvent->inputType = ARKUI_UIINPUTEVENT_TYPE_MOUSE;
871 } else if (gestureEvent->eventData.inputEventType == static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_AXIS)) {
872 uiEvent->eventTypeId = C_AXIS_EVENT_ID;
873 uiEvent->inputType = ARKUI_UIINPUTEVENT_TYPE_AXIS;
874 } else if (gestureEvent->eventData.inputEventType == static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_KEY)) {
875 uiEvent->eventTypeId = C_CLICK_EVENT_ID;
876 uiEvent->inputType = ARKUI_UIINPUTEVENT_TYPE_KEY;
877 } else {
878 uiEvent->eventTypeId = C_TOUCH_EVENT_ID;
879 uiEvent->inputType = ARKUI_UIINPUTEVENT_TYPE_TOUCH;
880 }
881 uiEvent->apiVersion = event->apiVersion;
882 uiEvent->inputEvent = gestureEvent->eventData.rawPointerEvent;
883 gestureEvent->eventData.rawPointerEvent = uiEvent;
884 if (extraData->gesture) {
885 ArkUI_GestureRecognizer* recognizer = reinterpret_cast<ArkUI_GestureRecognizer*>(extraData->gesture);
886 gestureEvent->attachNode = recognizer->attachNode;
887 }
888 extraData->targetReceiver(gestureEvent, extraData->extraParam);
889 delete uiEvent;
890 gestureEvent->eventData.rawPointerEvent = nullptr;
891 }
892
SetGestureInterrupterToNode(ArkUI_NodeHandle node,ArkUI_GestureInterruptResult (* interrupter)(ArkUI_GestureInterruptInfo * info))893 int32_t SetGestureInterrupterToNode(
894 ArkUI_NodeHandle node, ArkUI_GestureInterruptResult (*interrupter)(ArkUI_GestureInterruptInfo* info))
895 {
896 auto callback = reinterpret_cast<int32_t (*)(ArkUIGestureInterruptInfo*)>(interrupter);
897 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->setGestureInterrupterToNode(
898 node->uiNodeHandle, callback);
899 return 0;
900 }
901
SetGestureInterrupterToNodeWithUserData(ArkUI_NodeHandle node,void * userData,ArkUI_GestureInterruptResult (* interrupter)(ArkUI_GestureInterruptInfo * info))902 int32_t SetGestureInterrupterToNodeWithUserData(ArkUI_NodeHandle node, void* userData,
903 ArkUI_GestureInterruptResult (*interrupter)(ArkUI_GestureInterruptInfo* info))
904 {
905 auto callback = reinterpret_cast<int32_t (*)(ArkUIGestureInterruptInfo*)>(interrupter);
906 auto nodeModel = OHOS::Ace::NodeModel::GetFullImpl();
907 if (nodeModel) {
908 nodeModel->getNodeModifiers()->getGestureModifier()->setGestureInterrupterToNodeWithUserData(
909 node->uiNodeHandle, userData, callback);
910 }
911 return 0;
912 }
913
SetInnerGestureParallelTo(ArkUI_NodeHandle node,void * userData,ArkUI_GestureRecognizer * (* parallelInnerGesture)(ArkUI_ParallelInnerGestureEvent * event))914 int32_t SetInnerGestureParallelTo(ArkUI_NodeHandle node, void* userData,
915 ArkUI_GestureRecognizer* (*parallelInnerGesture)(ArkUI_ParallelInnerGestureEvent* event))
916 {
917 auto callback =
918 reinterpret_cast<ArkUIGestureRecognizer* (*)(ArkUIParallelInnerGestureEvent * current)>(parallelInnerGesture);
919 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->setInnerGestureParallelTo(
920 node->uiNodeHandle, userData, callback);
921 return 0;
922 }
923
924 }; // namespace OHOS::Ace::GestureModel