• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-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 #include "core/interfaces/native/node/node_scroll_modifier.h"
16 
17 #include "interfaces/native/node/node_model.h"
18 #include "core/components_ng/pattern/list/list_model_ng.h"
19 #include "core/components_ng/pattern/scroll/scroll_model_ng.h"
20 #include "core/components_ng/pattern/scrollable/scrollable_model_ng.h"
21 #include "core/components_ng/pattern/scrollable/scrollable_pattern.h"
22 #include "core/components_ng/pattern/waterflow/water_flow_model_ng.h"
23 #include "core/components_ng/pattern/grid/grid_model_ng.h"
24 
25 namespace OHOS::Ace::NG {
26 namespace {
27 constexpr int32_t SNAP_START_INDEX = 0;
28 constexpr int32_t DEFAULT_SNAP_ALIGN_VALUE = 0;
29 constexpr int32_t DEFAULT_SCROLLABLE_AXIS_VALUE = 0;
30 constexpr double FRICTION_DEFAULT = 0.6;
31 constexpr double DEFAULT_DIMENSION_VALUE = 0.0;
32 constexpr double DEFAULT_SCROLLBARWIDTH_VALUE = 4.0;
33 constexpr int32_t PARAM_SIZE = 4;
34 constexpr Dimension DEFAULT_FADING_EDGE_LENGTH = Dimension(32.0f, DimensionUnit::VP); // default value
35 constexpr float DEFAULT_OFFSET_VALUE = 0.0;
36 constexpr int32_t ERROR_INT_CODE = -1;
37 constexpr int32_t SCROLL_TO_INDEX_0 = 0;
38 constexpr int32_t SCROLL_TO_INDEX_1 = 1;
39 constexpr int32_t SCROLL_TO_INDEX_2 = 2;
40 constexpr int32_t SCROLL_TO_INDEX_CURVE = 5;
41 
42 constexpr int32_t EDGE_NONE = -1;
43 
44 const std::vector<RefPtr<Curve>> CurvesVector = { Curves::LINEAR, Curves::EASE, Curves::EASE_IN,
45     Curves::EASE_OUT, Curves::EASE_IN_OUT, Curves::FAST_OUT_SLOW_IN, Curves::LINEAR_OUT_SLOW_IN,
46     Curves::FAST_OUT_LINEAR_IN, Curves::EXTREME_DECELERATION, Curves::SHARP, Curves::RHYTHM,
47     Curves::SMOOTH, Curves::FRICTION };
48 
CheckSnapPagination(const std::vector<Dimension> & snapPagination)49 bool CheckSnapPagination(const std::vector<Dimension>& snapPagination)
50 {
51     CHECK_NULL_RETURN(!snapPagination.empty(), false);
52     float preValue = (*snapPagination.begin()).Value();
53     CHECK_NULL_RETURN(!Negative(preValue), false);
54     auto unit = (*snapPagination.begin()).Unit();
55     for (auto iter = snapPagination.begin() + 1; iter < snapPagination.end(); ++iter) {
56         if (Negative((*iter).Value()) || (*iter).Unit() != unit || LessOrEqual((*iter).Value(), preValue)) {
57             return false;
58         }
59         preValue = (*iter).Value();
60     }
61     return true;
62 }
SetScrollNestedScroll(ArkUINodeHandle node,ArkUI_Int32 scrollForward,ArkUI_Int32 scrollBackward)63 void SetScrollNestedScroll(ArkUINodeHandle node, ArkUI_Int32 scrollForward, ArkUI_Int32 scrollBackward)
64 {
65     auto* frameNode = reinterpret_cast<FrameNode*>(node);
66     CHECK_NULL_VOID(frameNode);
67     NestedScrollOptions nestedOpt = {
68         .forward = NestedScrollMode::SELF_ONLY,
69         .backward = NestedScrollMode::SELF_ONLY,
70     };
71     nestedOpt.forward = static_cast<NestedScrollMode>(scrollForward);
72     nestedOpt.backward = static_cast<NestedScrollMode>(scrollBackward);
73     ScrollModelNG::SetNestedScroll(frameNode, nestedOpt);
74 }
75 
ResetScrollNestedScroll(ArkUINodeHandle node)76 void ResetScrollNestedScroll(ArkUINodeHandle node)
77 {
78     auto* frameNode = reinterpret_cast<FrameNode*>(node);
79     CHECK_NULL_VOID(frameNode);
80     NestedScrollOptions nestedOpt = {
81         .forward = NestedScrollMode::SELF_ONLY,
82         .backward = NestedScrollMode::SELF_ONLY,
83     };
84     ScrollModelNG::SetNestedScroll(frameNode, nestedOpt);
85 }
86 
GetScrollEnableScroll(ArkUINodeHandle node)87 ArkUI_Bool GetScrollEnableScroll(ArkUINodeHandle node)
88 {
89     auto* frameNode = reinterpret_cast<FrameNode*>(node);
90     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
91     return ScrollModelNG::GetScrollEnabled(frameNode);
92 }
93 
SetScrollEnableScroll(ArkUINodeHandle node,ArkUI_Bool isEnabled)94 void SetScrollEnableScroll(ArkUINodeHandle node, ArkUI_Bool isEnabled)
95 {
96     auto* frameNode = reinterpret_cast<FrameNode*>(node);
97     CHECK_NULL_VOID(frameNode);
98     ScrollModelNG::SetScrollEnabled(frameNode, isEnabled);
99 }
100 
ResetScrollEnableScroll(ArkUINodeHandle node)101 void ResetScrollEnableScroll(ArkUINodeHandle node)
102 {
103     auto* frameNode = reinterpret_cast<FrameNode*>(node);
104     CHECK_NULL_VOID(frameNode);
105     ScrollModelNG::SetScrollEnabled(frameNode, true);
106 }
107 
GetScrollFriction(ArkUINodeHandle node)108 ArkUI_Float32 GetScrollFriction(ArkUINodeHandle node)
109 {
110     auto* frameNode = reinterpret_cast<FrameNode*>(node);
111     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
112     return ScrollModelNG::GetFriction(frameNode);
113 }
114 
SetScrollFriction(ArkUINodeHandle node,ArkUI_Float32 friction)115 void SetScrollFriction(ArkUINodeHandle node, ArkUI_Float32 friction)
116 {
117     auto* frameNode = reinterpret_cast<FrameNode*>(node);
118     CHECK_NULL_VOID(frameNode);
119     ScrollModelNG::SetFriction(frameNode, friction);
120 }
121 
ResetScrollFriction(ArkUINodeHandle node)122 void ResetScrollFriction(ArkUINodeHandle node)
123 {
124     auto* frameNode = reinterpret_cast<FrameNode*>(node);
125     CHECK_NULL_VOID(frameNode);
126     ScrollModelNG::SetFriction(frameNode, FRICTION_DEFAULT);
127 }
128 
GetScrollScrollSnap(ArkUINodeHandle node,ArkUI_Float32 (* values)[32])129 ArkUI_Int32 GetScrollScrollSnap(ArkUINodeHandle node, ArkUI_Float32 (*values)[32])
130 {
131     auto* frameNode = reinterpret_cast<FrameNode*>(node);
132     CHECK_NULL_RETURN(frameNode, 0);
133     ScrollSnapOptions options = ScrollModelNG::GetScrollSnap(frameNode);
134     (*values)[0] = static_cast<ArkUI_Int32>(options.snapAlign);
135     (*values)[1] = static_cast<ArkUI_Int32>(options.enableSnapToStart);
136     (*values)[2] = static_cast<ArkUI_Int32>(options.enableSnapToEnd);
137     auto index = 3;
138     for (auto item : options.paginationParams) {
139         (*values)[index] = item.ConvertToVp();
140         index++;
141     }
142     return index;
143 }
144 
SetScrollScrollSnap(ArkUINodeHandle node,const ArkUI_Float32 * paginationValue,ArkUI_Int32 paginationSize,const int32_t * paginationParam,ArkUI_Int32 paramSize)145 void SetScrollScrollSnap(ArkUINodeHandle node, const ArkUI_Float32* paginationValue, ArkUI_Int32 paginationSize,
146     const int32_t* paginationParam, ArkUI_Int32 paramSize)
147 {
148     auto* frameNode = reinterpret_cast<FrameNode*>(node);
149     CHECK_NULL_VOID(frameNode);
150 
151     int32_t snapAlign = 0;
152     auto snapToStart = false;
153     auto snapToEnd = false;
154     auto isArray = false;
155     auto snapAlignIndex = paginationSize;
156     auto snapToStartIndex = paginationSize + 1;
157     auto snapToEndIndex = paginationSize + 2;
158     auto isArrayIndex = paginationSize + 3;
159     if (paramSize - paginationSize == PARAM_SIZE) {
160         snapAlign = paginationParam[snapAlignIndex];
161         snapToStart = static_cast<bool>(paginationParam[snapToStartIndex]);
162         snapToEnd = static_cast<bool>(paginationParam[snapToEndIndex]);
163         isArray = static_cast<bool>(paginationParam[isArrayIndex]);
164     }
165     std::pair<bool, bool> enableSnapToSide = { snapToStart, snapToEnd };
166 
167     std::vector<Dimension> snapPagination;
168     CalcDimension intervalSize;
169     if (isArray) {
170         for (auto i = 0; i < paginationSize; i++) {
171             auto pValue = paginationValue[i];
172             auto pUnit = static_cast<DimensionUnit>(paginationParam[i]);
173             CalcDimension dms = Dimension(pValue, pUnit);
174             snapPagination.push_back(dms);
175         }
176         intervalSize = CalcDimension(DEFAULT_DIMENSION_VALUE);
177     } else {
178         auto pValue = paginationValue[SNAP_START_INDEX];
179         auto pUnit = static_cast<DimensionUnit>(paginationParam[SNAP_START_INDEX]);
180         intervalSize = Dimension(pValue, pUnit);
181     }
182 
183     if (!CheckSnapPagination(snapPagination)) {
184         std::vector<Dimension>().swap(snapPagination);
185     }
186 
187     ScrollModelNG::SetScrollSnap(
188         frameNode, static_cast<ScrollSnapAlign>(snapAlign), intervalSize, snapPagination, enableSnapToSide);
189 }
190 
ResetScrollScrollSnap(ArkUINodeHandle node)191 void ResetScrollScrollSnap(ArkUINodeHandle node)
192 {
193     auto* frameNode = reinterpret_cast<FrameNode*>(node);
194     CHECK_NULL_VOID(frameNode);
195 
196     int32_t snapAlign = DEFAULT_SNAP_ALIGN_VALUE;
197     CalcDimension intervalSize = CalcDimension(DEFAULT_DIMENSION_VALUE);
198     std::vector<Dimension> snapPaginations;
199     std::pair<bool, bool> enableSnapToSide = { true, true };
200     ScrollModelNG::SetScrollSnap(
201         frameNode, static_cast<ScrollSnapAlign>(snapAlign), intervalSize, snapPaginations, enableSnapToSide);
202 }
203 
GetScrollScrollBar(ArkUINodeHandle node)204 ArkUI_Int32 GetScrollScrollBar(ArkUINodeHandle node)
205 {
206     auto* frameNode = reinterpret_cast<FrameNode*>(node);
207     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
208     return ScrollModelNG::GetScrollBar(frameNode);
209 }
210 
SetScrollScrollBar(ArkUINodeHandle node,ArkUI_Int32 direction)211 void SetScrollScrollBar(ArkUINodeHandle node, ArkUI_Int32 direction)
212 {
213     auto* frameNode = reinterpret_cast<FrameNode*>(node);
214     CHECK_NULL_VOID(frameNode);
215     ScrollModelNG::SetScrollBar(frameNode, static_cast<DisplayMode>(direction));
216 }
217 
ResetScrollScrollBar(ArkUINodeHandle node)218 void ResetScrollScrollBar(ArkUINodeHandle node)
219 {
220     auto* frameNode = reinterpret_cast<FrameNode*>(node);
221     CHECK_NULL_VOID(frameNode);
222     ScrollModelNG::SetScrollBar(frameNode, DisplayMode::AUTO);
223 }
224 
GetScrollScrollable(ArkUINodeHandle node)225 ArkUI_Int32 GetScrollScrollable(ArkUINodeHandle node)
226 {
227     auto* frameNode = reinterpret_cast<FrameNode*>(node);
228     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
229     return ScrollModelNG::GetAxis(frameNode);
230 }
231 
SetScrollScrollable(ArkUINodeHandle node,ArkUI_Int32 scrollDirection)232 void SetScrollScrollable(ArkUINodeHandle node, ArkUI_Int32 scrollDirection)
233 {
234     auto* frameNode = reinterpret_cast<FrameNode*>(node);
235     CHECK_NULL_VOID(frameNode);
236     ScrollModelNG::SetAxis(frameNode, static_cast<Axis>(scrollDirection));
237 }
238 
ResetScrollScrollable(ArkUINodeHandle node)239 void ResetScrollScrollable(ArkUINodeHandle node)
240 {
241     auto* frameNode = reinterpret_cast<FrameNode*>(node);
242     CHECK_NULL_VOID(frameNode);
243     ScrollModelNG::SetAxis(frameNode, static_cast<Axis>(DEFAULT_SCROLLABLE_AXIS_VALUE));
244 }
245 
GetScrollScrollBarColor(ArkUINodeHandle node)246 ArkUI_Uint32 GetScrollScrollBarColor(ArkUINodeHandle node)
247 {
248     auto* frameNode = reinterpret_cast<FrameNode*>(node);
249     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
250     return ScrollModelNG::GetScrollBarColor(frameNode);
251 }
252 
SetScrollScrollBarColor(ArkUINodeHandle node,uint32_t scrollBarColor)253 void SetScrollScrollBarColor(ArkUINodeHandle node, uint32_t scrollBarColor)
254 {
255     auto* frameNode = reinterpret_cast<FrameNode*>(node);
256     CHECK_NULL_VOID(frameNode);
257     ScrollModelNG::SetScrollBarColor(frameNode, Color(scrollBarColor));
258 }
259 
ResetScrollScrollBarColor(ArkUINodeHandle node)260 void ResetScrollScrollBarColor(ArkUINodeHandle node)
261 {
262     auto* frameNode = reinterpret_cast<FrameNode*>(node);
263     CHECK_NULL_VOID(frameNode);
264     auto pipeline = frameNode->GetContext();
265     CHECK_NULL_VOID(pipeline);
266     auto scrollBarTheme = pipeline->GetTheme<ScrollBarTheme>();
267     CHECK_NULL_VOID(scrollBarTheme);
268     Color foregroundColor = scrollBarTheme->GetForegroundColor();
269     ScrollModelNG::SetScrollBarColor(frameNode, foregroundColor);
270 }
271 
GetScrollScrollBarWidth(ArkUINodeHandle node)272 ArkUI_Float32 GetScrollScrollBarWidth(ArkUINodeHandle node)
273 {
274     auto* frameNode = reinterpret_cast<FrameNode*>(node);
275     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
276     return ScrollModelNG::GetScrollBarWidth(frameNode);
277 }
278 
SetScrollScrollBarWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)279 void SetScrollScrollBarWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
280 {
281     auto* frameNode = reinterpret_cast<FrameNode*>(node);
282     CHECK_NULL_VOID(frameNode);
283     CalcDimension width = Dimension(value, static_cast<OHOS::Ace::DimensionUnit>(unit));
284     ScrollModelNG::SetScrollBarWidth(frameNode, width);
285 }
286 
ResetScrollScrollBarWidth(ArkUINodeHandle node)287 void ResetScrollScrollBarWidth(ArkUINodeHandle node)
288 {
289     auto* frameNode = reinterpret_cast<FrameNode*>(node);
290     CHECK_NULL_VOID(frameNode);
291     CalcDimension width = CalcDimension(DEFAULT_SCROLLBARWIDTH_VALUE, DimensionUnit::VP);
292     ScrollModelNG::SetScrollBarWidth(frameNode, width);
293 }
294 
GetScrollEdgeEffect(ArkUINodeHandle node,ArkUI_Int32 (* values)[2])295 ArkUI_Int32 GetScrollEdgeEffect(ArkUINodeHandle node, ArkUI_Int32 (*values)[2])
296 {
297     auto* frameNode = reinterpret_cast<FrameNode*>(node);
298     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
299     (*values)[SCROLL_TO_INDEX_0] = static_cast<ArkUI_Int32>(ScrollModelNG::GetEdgeEffect(frameNode));
300     (*values)[SCROLL_TO_INDEX_1] = static_cast<ArkUI_Int32>(ScrollModelNG::GetEdgeEffectAlways(frameNode));
301     return SCROLL_TO_INDEX_2;
302 }
303 
SetScrollEdgeEffect(ArkUINodeHandle node,ArkUI_Int32 edgeEffect,ArkUI_Bool alwaysEnabled,ArkUI_Int32 edge)304 void SetScrollEdgeEffect(ArkUINodeHandle node, ArkUI_Int32 edgeEffect, ArkUI_Bool alwaysEnabled, ArkUI_Int32 edge)
305 {
306     auto* frameNode = reinterpret_cast<FrameNode*>(node);
307     CHECK_NULL_VOID(frameNode);
308     ScrollModelNG::SetEdgeEffect(
309         frameNode, static_cast<EdgeEffect>(edgeEffect), alwaysEnabled, static_cast<EffectEdge>(edge));
310 }
311 
ResetScrollEdgeEffect(ArkUINodeHandle node)312 void ResetScrollEdgeEffect(ArkUINodeHandle node)
313 {
314     auto* frameNode = reinterpret_cast<FrameNode*>(node);
315     CHECK_NULL_VOID(frameNode);
316     ScrollModelNG::SetEdgeEffect(frameNode, EdgeEffect::NONE, true, EffectEdge::ALL);
317 }
318 
GetEnableScrollInteraction(ArkUINodeHandle node)319 ArkUI_Bool GetEnableScrollInteraction(ArkUINodeHandle node)
320 {
321     auto* frameNode = reinterpret_cast<FrameNode*>(node);
322     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
323     return ScrollModelNG::GetScrollEnabled(frameNode);
324 }
325 
SetEnableScrollInteraction(ArkUINodeHandle node,ArkUI_Bool enableScrollInteraction)326 void SetEnableScrollInteraction(ArkUINodeHandle node, ArkUI_Bool enableScrollInteraction)
327 {
328     auto* frameNode = reinterpret_cast<FrameNode*>(node);
329     CHECK_NULL_VOID(frameNode);
330     ScrollModelNG::SetScrollEnabled(frameNode, enableScrollInteraction);
331 }
332 
ResetEnableScrollInteraction(ArkUINodeHandle node)333 void ResetEnableScrollInteraction(ArkUINodeHandle node)
334 {
335     auto* frameNode = reinterpret_cast<FrameNode*>(node);
336     CHECK_NULL_VOID(frameNode);
337     ScrollModelNG::SetScrollEnabled(frameNode, true);
338 }
339 
GetController(ArkUINodeHandle node)340 RefPtr<ScrollControllerBase> GetController(ArkUINodeHandle node)
341 {
342     auto* frameNode = reinterpret_cast<FrameNode*>(node);
343     CHECK_NULL_RETURN(frameNode, nullptr);
344     if (frameNode->GetTag() == V2::SCROLL_ETS_TAG) {
345         return ScrollModelNG::GetOrCreateController(frameNode);
346     } else if (frameNode->GetTag() == V2::LIST_ETS_TAG) {
347         return ListModelNG::GetOrCreateController(frameNode);
348     } else if (frameNode->GetTag() == V2::WATERFLOW_ETS_TAG) {
349         return WaterFlowModelNG::GetOrCreateController(frameNode);
350     } else if (frameNode->GetTag() == V2::GRID_ETS_TAG) {
351         return GridModelNG::GetOrCreateController(frameNode);
352     }
353     return nullptr;
354 }
355 
SetScrollTo(ArkUINodeHandle node,const ArkUI_Float32 (* values)[8])356 void SetScrollTo(ArkUINodeHandle node, const ArkUI_Float32 (*values)[8])
357 {
358     RefPtr<ScrollControllerBase> scrollControllerBase = GetController(node);
359     CHECK_NULL_VOID(scrollControllerBase);
360     Dimension xOffset((*values)[0], static_cast<OHOS::Ace::DimensionUnit>((*values)[1]));
361     Dimension yOffset((*values)[2], static_cast<OHOS::Ace::DimensionUnit>((*values)[3]));
362     float duration = (*values)[4];
363     RefPtr<Curve> curve = Curves::EASE;
364     if (static_cast<int>((*values)[SCROLL_TO_INDEX_CURVE]) < static_cast<int>(CurvesVector.size())) {
365         curve = CurvesVector[static_cast<int>((*values)[SCROLL_TO_INDEX_CURVE])];
366     }
367     auto smooth = static_cast<bool>((*values)[6]);
368     //index 7 is canOverScroll
369     auto canOverScroll = static_cast<bool>((*values)[7]);
370     auto direction = scrollControllerBase->GetScrollDirection();
371     auto position = direction == Axis::VERTICAL ? yOffset : xOffset;
372     scrollControllerBase->AnimateTo(position, duration, curve, smooth, canOverScroll);
373 }
374 
SetScrollEdge(ArkUINodeHandle node,ArkUI_Int32 value)375 void SetScrollEdge(ArkUINodeHandle node, ArkUI_Int32 value)
376 {
377     RefPtr<ScrollControllerBase> scrollControllerBase = GetController(node);
378     CHECK_NULL_VOID(scrollControllerBase);
379 
380     constexpr ArkUI_Int32 typeSize = 4;
381     if (value >= typeSize || value < 0) {
382         return;
383     }
384     constexpr ScrollEdgeType EDGE_TYPE_TABLE[typeSize] = {
385         ScrollEdgeType::SCROLL_TOP,
386         ScrollEdgeType::SCROLL_BOTTOM,
387         ScrollEdgeType::SCROLL_TOP,
388         ScrollEdgeType::SCROLL_BOTTOM,
389     };
390     scrollControllerBase->ScrollToEdge(EDGE_TYPE_TABLE[value], true);
391 }
392 
ResetScrollTo(ArkUINodeHandle node)393 void ResetScrollTo(ArkUINodeHandle node)
394 {
395     const ArkUI_Float32 values[8] = { DEFAULT_OFFSET_VALUE };
396     SetScrollTo(node, &values);
397 }
398 
ResetScrollEdge(ArkUINodeHandle node)399 void ResetScrollEdge(ArkUINodeHandle node)
400 {
401     SetScrollEdge(node, DEFAULT_SNAP_ALIGN_VALUE);
402 }
403 
GetScrollEnablePaging(ArkUINodeHandle node)404 ArkUI_Int32 GetScrollEnablePaging(ArkUINodeHandle node)
405 {
406     auto* frameNode = reinterpret_cast<FrameNode*>(node);
407     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
408     return ScrollModelNG::GetEnablePaging(frameNode);
409 }
410 
SetScrollEnablePaging(ArkUINodeHandle node,int32_t value)411 void SetScrollEnablePaging(ArkUINodeHandle node, int32_t value)
412 {
413     auto* frameNode = reinterpret_cast<FrameNode*>(node);
414     CHECK_NULL_VOID(frameNode);
415 
416     ScrollModelNG::SetEnablePaging(frameNode, value);
417 }
418 
ResetScrollEnablePaging(ArkUINodeHandle node)419 void ResetScrollEnablePaging(ArkUINodeHandle node)
420 {
421     auto* frameNode = reinterpret_cast<FrameNode*>(node);
422     CHECK_NULL_VOID(frameNode);
423 
424     ScrollModelNG::SetEnablePaging(frameNode, false);
425 }
426 
GetScrollNestedScroll(ArkUINodeHandle node,ArkUI_Int32 (* values)[2])427 void GetScrollNestedScroll(ArkUINodeHandle node, ArkUI_Int32 (*values)[2])
428 {
429     auto* frameNode = reinterpret_cast<FrameNode*>(node);
430     CHECK_NULL_VOID(frameNode);
431     NestedScrollOptions options = ScrollModelNG::GetNestedScroll(frameNode);
432     (*values)[0] = static_cast<ArkUI_Int32>(options.forward);
433     (*values)[1] = static_cast<ArkUI_Int32>(options.backward);
434 }
435 
GetScrollOffset(ArkUINodeHandle node,ArkUI_Float32 (* values)[2])436 void GetScrollOffset(ArkUINodeHandle node, ArkUI_Float32 (*values)[2])
437 {
438     RefPtr<ScrollControllerBase> scrollControllerBase = GetController(node);
439     CHECK_NULL_VOID(scrollControllerBase);
440     Offset offset = scrollControllerBase->GetCurrentOffset();
441     (*values)[0] = offset.GetX();
442     (*values)[1] = offset.GetY();
443 }
444 
GetScrollEdge(ArkUINodeHandle node)445 ArkUI_Int32 GetScrollEdge(ArkUINodeHandle node)
446 {
447     auto* frameNode = reinterpret_cast<FrameNode*>(node);
448     CHECK_NULL_RETURN(frameNode, EDGE_NONE);
449     ScrollEdgeType type = ScrollModelNG::GetOnScrollEdge(frameNode);
450     if (type == ScrollEdgeType::SCROLL_NONE) {
451         return EDGE_NONE;
452     }
453     return static_cast<ArkUI_Int32>(type);
454 }
455 
SetScrollInitialOffset(ArkUINodeHandle node,ArkUI_Float32 xOffsetValue,ArkUI_Int32 xOffsetUnit,ArkUI_Float32 yOffsetValue,ArkUI_Int32 yOffsetUnit)456 void SetScrollInitialOffset(ArkUINodeHandle node,  ArkUI_Float32 xOffsetValue, ArkUI_Int32 xOffsetUnit,
457     ArkUI_Float32 yOffsetValue, ArkUI_Int32 yOffsetUnit)
458 {
459     auto* frameNode = reinterpret_cast<FrameNode*>(node);
460     CHECK_NULL_VOID(frameNode);
461     CalcDimension xOffset = CalcDimension(xOffsetValue, static_cast<OHOS::Ace::DimensionUnit>(xOffsetUnit));
462     CalcDimension yOffset = CalcDimension(yOffsetValue, static_cast<OHOS::Ace::DimensionUnit>(yOffsetUnit));
463     ScrollModelNG::SetInitialOffset(frameNode, NG::OffsetT(xOffset, yOffset));
464 }
465 
ResetScrollInitialOffset(ArkUINodeHandle node)466 void ResetScrollInitialOffset(ArkUINodeHandle node)
467 {
468     auto* frameNode = reinterpret_cast<FrameNode*>(node);
469     CHECK_NULL_VOID(frameNode);
470     ScrollModelNG::SetInitialOffset(frameNode, NG::OffsetT(CalcDimension(), CalcDimension()));
471 }
472 
SetScrollFlingSpeedLimit(ArkUINodeHandle node,ArkUI_Float32 max)473 void SetScrollFlingSpeedLimit(ArkUINodeHandle node, ArkUI_Float32 max)
474 {
475     auto* frameNode = reinterpret_cast<FrameNode*>(node);
476     CHECK_NULL_VOID(frameNode);
477     ScrollableModelNG::SetMaxFlingSpeed(frameNode, max);
478 }
479 
ResetScrollFlingSpeedLimit(ArkUINodeHandle node)480 void ResetScrollFlingSpeedLimit(ArkUINodeHandle node)
481 {
482     auto* frameNode = reinterpret_cast<FrameNode*>(node);
483     CHECK_NULL_VOID(frameNode);
484     ScrollableModelNG::SetMaxFlingSpeed(frameNode, -1.0f);
485 }
486 
SetScrollPage(ArkUINodeHandle node,ArkUI_Int32 next,ArkUI_Int32 animation)487 void SetScrollPage(ArkUINodeHandle node, ArkUI_Int32 next, ArkUI_Int32 animation)
488 {
489     auto* frameNode = reinterpret_cast<FrameNode*>(node);
490     CHECK_NULL_VOID(frameNode);
491     auto pattern = frameNode->GetPattern<OHOS::Ace::NG::ScrollablePattern>();
492     CHECK_NULL_VOID(pattern);
493     pattern->ScrollPage(next, animation);
494 }
495 
SetScrollBy(ArkUINodeHandle node,ArkUI_Float64 x,ArkUI_Float64 y)496 void SetScrollBy(ArkUINodeHandle node, ArkUI_Float64 x, ArkUI_Float64 y)
497 {
498     auto* frameNode = reinterpret_cast<FrameNode*>(node);
499     CHECK_NULL_VOID(frameNode);
500     auto pattern = frameNode->GetPattern<OHOS::Ace::NG::ScrollablePattern>();
501     CHECK_NULL_VOID(pattern);
502     RefPtr<ScrollableController> controller = pattern->GetOrCreatePositionController();
503     CHECK_NULL_VOID(controller);
504     controller->ScrollBy(x, y, false);
505 }
506 
SetScrollFling(ArkUINodeHandle node,ArkUI_Float64 value)507 void SetScrollFling(ArkUINodeHandle node, ArkUI_Float64 value)
508 {
509     if (NearZero(value)) {
510         return;
511     }
512     RefPtr<ScrollControllerBase> scrollControllerBase = GetController(node);
513     CHECK_NULL_VOID(scrollControllerBase);
514     scrollControllerBase->Fling(value);
515 }
516 
GetScroll(ArkUINodeHandle node)517 ArkUINodeHandle GetScroll(ArkUINodeHandle node)
518 {
519     auto* frameNode = reinterpret_cast<FrameNode*>(node);
520     CHECK_NULL_RETURN(frameNode, nullptr);
521     auto controller = ScrollModelNG::GetOrCreateController(frameNode);
522     return reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(controller));
523 }
524 
SetScrollBarProxy(ArkUINodeHandle node,ArkUINodeHandle proxy)525 void SetScrollBarProxy(ArkUINodeHandle node, ArkUINodeHandle proxy)
526 {
527     auto* frameNode = reinterpret_cast<FrameNode*>(node);
528     CHECK_NULL_VOID(frameNode);
529     auto scrollProxy = AceType::Claim(reinterpret_cast<ScrollProxy*>(proxy));
530     CHECK_NULL_VOID(scrollProxy);
531     ScrollModelNG::SetScrollBarProxy(frameNode, scrollProxy);
532 }
533 
SetScrollToIndex(ArkUINodeHandle node,ArkUI_Int32 index,ArkUI_Int32 smooth,ArkUI_Int32 align)534 void SetScrollToIndex(ArkUINodeHandle node, ArkUI_Int32 index, ArkUI_Int32 smooth, ArkUI_Int32 align)
535 {
536     RefPtr<ScrollControllerBase> scrollControllerBase = GetController(node);
537     CHECK_NULL_VOID(scrollControllerBase);
538     scrollControllerBase->ScrollToIndex(index, smooth, static_cast<ScrollAlign>(align));
539 }
540 
SetScrollFadingEdge(ArkUINodeHandle node,ArkUI_Bool fadingEdge,ArkUI_Float32 fadingEdgeLengthValue,ArkUI_Int32 fadingEdgeLengthUnit)541 void SetScrollFadingEdge(
542     ArkUINodeHandle node, ArkUI_Bool fadingEdge, ArkUI_Float32 fadingEdgeLengthValue, ArkUI_Int32 fadingEdgeLengthUnit)
543 {
544     auto* frameNode = reinterpret_cast<FrameNode*>(node);
545     CHECK_NULL_VOID(frameNode);
546     Dimension fadingEdgeLengthDimension =
547         Dimension(fadingEdgeLengthValue, static_cast<OHOS::Ace::DimensionUnit>(fadingEdgeLengthUnit));
548     NG::ScrollableModelNG::SetFadingEdge(frameNode, fadingEdge, fadingEdgeLengthDimension);
549 }
550 
ResetScrollFadingEdge(ArkUINodeHandle node)551 void ResetScrollFadingEdge(ArkUINodeHandle node)
552 {
553     auto* frameNode = reinterpret_cast<FrameNode*>(node);
554     CHECK_NULL_VOID(frameNode);
555     NG::ScrollableModelNG::SetFadingEdge(frameNode, false, DEFAULT_FADING_EDGE_LENGTH);
556 }
557 
GetScrollFadingEdge(ArkUINodeHandle node,ArkUIInt32orFloat32 (* values)[2])558 void GetScrollFadingEdge(ArkUINodeHandle node, ArkUIInt32orFloat32 (*values)[2])
559 {
560     auto* frameNode = reinterpret_cast<FrameNode*>(node);
561     CHECK_NULL_VOID(frameNode);
562     (*values)[0].i32 = static_cast<int32_t>(NG::ScrollableModelNG::GetFadingEdge(frameNode));
563     (*values)[1].f32 = NG::ScrollableModelNG::GetFadingEdgeLength(frameNode);
564 }
565 
GetScrollContentSize(ArkUINodeHandle node,ArkUI_Float32 (* values)[2])566 void GetScrollContentSize(ArkUINodeHandle node, ArkUI_Float32 (*values)[2])
567 {
568     auto* frameNode = reinterpret_cast<FrameNode*>(node);
569     CHECK_NULL_VOID(frameNode);
570     auto pattern = frameNode->GetPattern<OHOS::Ace::NG::ScrollablePattern>();
571     CHECK_NULL_VOID(pattern);
572     SizeF size = pattern->GetChildrenExpandedSize();
573     (*values)[0] = Dimension(size.Width(), DimensionUnit::PX).ConvertToVp();
574     (*values)[1] = Dimension(size.Height(), DimensionUnit::PX).ConvertToVp();
575 }
576 } // namespace
577 
578 namespace NodeModifier {
GetScrollModifier()579 const ArkUIScrollModifier* GetScrollModifier()
580 {
581     /* clang-format off */
582     CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
583     static const ArkUIScrollModifier modifier = {
584         .setScrollNestedScroll = SetScrollNestedScroll,
585         .resetScrollNestedScroll = ResetScrollNestedScroll,
586         .getScrollEnableScroll = GetScrollEnableScroll,
587         .setScrollEnableScroll = SetScrollEnableScroll,
588         .resetScrollEnableScroll = ResetScrollEnableScroll,
589         .getScrollFriction = GetScrollFriction,
590         .setScrollFriction = SetScrollFriction,
591         .resetScrollFriction = ResetScrollFriction,
592         .getScrollScrollSnap = GetScrollScrollSnap,
593         .setScrollScrollSnap = SetScrollScrollSnap,
594         .resetScrollScrollSnap = ResetScrollScrollSnap,
595         .getScrollScrollBar = GetScrollScrollBar,
596         .setScrollScrollBar = SetScrollScrollBar,
597         .resetScrollScrollBar = ResetScrollScrollBar,
598         .getScrollScrollable = GetScrollScrollable,
599         .setScrollScrollable = SetScrollScrollable,
600         .resetScrollScrollable = ResetScrollScrollable,
601         .getScrollScrollBarColor = GetScrollScrollBarColor,
602         .setScrollScrollBarColor = SetScrollScrollBarColor,
603         .resetScrollScrollBarColor = ResetScrollScrollBarColor,
604         .getScrollScrollBarWidth = GetScrollScrollBarWidth,
605         .setScrollScrollBarWidth = SetScrollScrollBarWidth,
606         .resetScrollScrollBarWidth = ResetScrollScrollBarWidth,
607         .getScrollEdgeEffect = GetScrollEdgeEffect,
608         .setScrollEdgeEffect = SetScrollEdgeEffect,
609         .resetScrollEdgeEffect = ResetScrollEdgeEffect,
610         .getEnableScrollInteraction = GetEnableScrollInteraction,
611         .setEnableScrollInteraction = SetEnableScrollInteraction,
612         .resetEnableScrollInteraction = ResetEnableScrollInteraction,
613         .setScrollTo = SetScrollTo,
614         .setScrollEdge = SetScrollEdge,
615         .resetScrollTo = ResetScrollTo,
616         .resetScrollEdge = ResetScrollEdge,
617         .getScrollEnablePaging = GetScrollEnablePaging,
618         .setScrollEnablePaging = SetScrollEnablePaging,
619         .resetScrollEnablePaging = ResetScrollEnablePaging,
620         .getScrollNestedScroll = GetScrollNestedScroll,
621         .getScrollOffset = GetScrollOffset,
622         .getScrollEdge = GetScrollEdge,
623         .setScrollInitialOffset = SetScrollInitialOffset,
624         .resetScrollInitialOffset = ResetScrollInitialOffset,
625         .setScrollPage = SetScrollPage,
626         .setScrollBy = SetScrollBy,
627         .getScroll = GetScroll,
628         .setScrollBarProxy = SetScrollBarProxy,
629         .setScrollToIndex = SetScrollToIndex,
630         .setScrollOnScrollStart = SetScrollOnScrollStart,
631         .resetScrollOnScrollStart = ResetScrollOnScrollStart,
632         .setScrollOnScrollEnd = SetScrollOnScrollEnd,
633         .resetScrollOnScrollEnd = ResetScrollOnScrollEnd,
634         .setScrollOnScrollStop = SetScrollOnScrollStop,
635         .resetScrollOnScrollStop = ResetScrollOnScrollStop,
636         .setScrollOnScroll = SetScrollOnScroll,
637         .resetScrollOnScroll = ResetScrollOnScroll,
638         .setScrollOnScrollEdge = SetScrollOnScrollEdge,
639         .resetScrollOnScrollEdge = ResetScrollOnScrollEdge,
640         .setScrollOnDidScrollCallBack = SetScrollOnDidScrollCallBack,
641         .resetScrollOnDidScroll = ResetScrollOnDidScroll,
642         .setScrollOnWillScrollCallBack = SetScrollOnWillScrollCallBack,
643         .resetScrollOnWillScrollCallBack = ResetScrollOnWillScrollCallBack,
644         .setOnScrollFrameBeginCallBack = SetOnScrollFrameBeginCallBack,
645         .resetOnScrollFrameBeginCallBack = ResetOnScrollFrameBeginCallBack,
646         .setScrollFadingEdge = SetScrollFadingEdge,
647         .resetScrollFadingEdge = ResetScrollFadingEdge,
648         .getScrollFadingEdge = GetScrollFadingEdge,
649         .setScrollFling = SetScrollFling,
650         .getScrollContentSize = GetScrollContentSize,
651     };
652     CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
653     /* clang-format on */
654     return &modifier;
655 }
656 
GetCJUIScrollModifier()657 const CJUIScrollModifier* GetCJUIScrollModifier()
658 {
659     CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
660     static const CJUIScrollModifier modifier = {
661         .setScrollNestedScroll = SetScrollNestedScroll,
662         .resetScrollNestedScroll = ResetScrollNestedScroll,
663         .getScrollEnableScroll = GetScrollEnableScroll,
664         .setScrollEnableScroll = SetScrollEnableScroll,
665         .resetScrollEnableScroll = ResetScrollEnableScroll,
666         .getScrollFriction = GetScrollFriction,
667         .setScrollFriction = SetScrollFriction,
668         .resetScrollFriction = ResetScrollFriction,
669         .getScrollScrollSnap = GetScrollScrollSnap,
670         .setScrollScrollSnap = SetScrollScrollSnap,
671         .resetScrollScrollSnap = ResetScrollScrollSnap,
672         .getScrollScrollBar = GetScrollScrollBar,
673         .setScrollScrollBar = SetScrollScrollBar,
674         .resetScrollScrollBar = ResetScrollScrollBar,
675         .getScrollScrollable = GetScrollScrollable,
676         .setScrollScrollable = SetScrollScrollable,
677         .resetScrollScrollable = ResetScrollScrollable,
678         .getScrollScrollBarColor = GetScrollScrollBarColor,
679         .setScrollScrollBarColor = SetScrollScrollBarColor,
680         .resetScrollScrollBarColor = ResetScrollScrollBarColor,
681         .getScrollScrollBarWidth = GetScrollScrollBarWidth,
682         .setScrollScrollBarWidth = SetScrollScrollBarWidth,
683         .resetScrollScrollBarWidth = ResetScrollScrollBarWidth,
684         .getScrollEdgeEffect = GetScrollEdgeEffect,
685         .setScrollEdgeEffect = SetScrollEdgeEffect,
686         .resetScrollEdgeEffect = ResetScrollEdgeEffect,
687         .getEnableScrollInteraction = GetEnableScrollInteraction,
688         .setEnableScrollInteraction = SetEnableScrollInteraction,
689         .resetEnableScrollInteraction = ResetEnableScrollInteraction,
690         .setScrollTo = SetScrollTo,
691         .setScrollEdge = SetScrollEdge,
692         .resetScrollTo = ResetScrollTo,
693         .resetScrollEdge = ResetScrollEdge,
694         .getScrollEnablePaging = GetScrollEnablePaging,
695         .setScrollEnablePaging = SetScrollEnablePaging,
696         .resetScrollEnablePaging = ResetScrollEnablePaging,
697         .getScrollNestedScroll = GetScrollNestedScroll,
698         .getScrollOffset = GetScrollOffset,
699         .getScrollEdge = GetScrollEdge,
700         .setScrollInitialOffset = SetScrollInitialOffset,
701         .resetScrollInitialOffset = ResetScrollInitialOffset,
702         .setScrollFlingSpeedLimit = SetScrollFlingSpeedLimit,
703         .resetScrollFlingSpeedLimit = ResetScrollFlingSpeedLimit,
704         .setScrollPage = SetScrollPage,
705         .setScrollBy = SetScrollBy,
706         .getScroll = GetScroll,
707         .setScrollBarProxy = SetScrollBarProxy,
708         .setScrollToIndex = SetScrollToIndex,
709     };
710     CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
711     return &modifier;
712 }
713 
SetOnScroll(ArkUINodeHandle node,void * extraParam)714 void SetOnScroll(ArkUINodeHandle node, void* extraParam)
715 {
716     auto* frameNode = reinterpret_cast<FrameNode*>(node);
717     CHECK_NULL_VOID(frameNode);
718     auto onScroll = [node, extraParam](Dimension scrollX, Dimension scrollY) {
719         ArkUINodeEvent event;
720         event.kind = COMPONENT_ASYNC_EVENT;
721         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
722         event.componentAsyncEvent.subKind = ON_SCROLL;
723         event.componentAsyncEvent.data[0].f32 = static_cast<float>(scrollX.Value());
724         event.componentAsyncEvent.data[1].f32 = static_cast<float>(scrollY.Value());
725         SendArkUISyncEvent(&event);
726     };
727     ScrollModelNG::SetOnScroll(frameNode, std::move(onScroll));
728 }
729 
SetOnScrollFrameBegin(ArkUINodeHandle node,void * extraParam)730 void SetOnScrollFrameBegin(ArkUINodeHandle node, void* extraParam)
731 {
732     auto* frameNode = reinterpret_cast<FrameNode*>(node);
733     CHECK_NULL_VOID(frameNode);
734     int32_t nodeId = frameNode->GetId();
735     auto onScrollFrameBegin = [nodeId, node, extraParam](const Dimension& offset, const ScrollState& state) ->
736             ScrollFrameResult {
737         ScrollFrameResult scrollRes { .offset = offset };
738         ArkUINodeEvent event;
739         event.kind = COMPONENT_ASYNC_EVENT;
740         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
741         event.componentAsyncEvent.subKind = ON_SCROLL_FRAME_BEGIN;
742         event.componentAsyncEvent.data[0].f32 = static_cast<float>(offset.Value());
743         event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
744         SendArkUISyncEvent(&event);
745         scrollRes.offset = Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::VP);
746         return scrollRes;
747     };
748     ScrollModelNG::SetOnScrollFrameBegin(frameNode, std::move(onScrollFrameBegin));
749 }
750 
SetScrollOnWillScroll(ArkUINodeHandle node,void * extraParam)751 void SetScrollOnWillScroll(ArkUINodeHandle node, void* extraParam)
752 {
753     auto* frameNode = reinterpret_cast<FrameNode*>(node);
754     CHECK_NULL_VOID(frameNode);
755     int32_t nodeId = frameNode->GetId();
756     auto onWillScroll = [nodeId, node, extraParam](const Dimension& xOffset, const Dimension& yOffset,
757         const ScrollState& state, ScrollSource source) -> TwoDimensionScrollResult {
758         TwoDimensionScrollResult scrollRes { .xOffset = xOffset, .yOffset = yOffset };
759         ArkUINodeEvent event;
760         event.kind = COMPONENT_ASYNC_EVENT;
761         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
762         event.componentAsyncEvent.subKind = ON_SCROLL_WILL_SCROLL;
763         bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
764         if (usePx) {
765             event.componentAsyncEvent.data[0].f32 = static_cast<float>(xOffset.ConvertToPx());
766             event.componentAsyncEvent.data[1].f32 = static_cast<float>(yOffset.ConvertToPx());
767         } else {
768             event.componentAsyncEvent.data[0].f32 = static_cast<float>(xOffset.Value());
769             event.componentAsyncEvent.data[1].f32 = static_cast<float>(yOffset.Value());
770         }
771         event.componentAsyncEvent.data[2].i32 = static_cast<int>(state);
772         event.componentAsyncEvent.data[3].i32 = static_cast<int>(source);
773         SendArkUISyncEvent(&event);
774         if (usePx) {
775             scrollRes.xOffset = Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::PX);
776             scrollRes.yOffset = Dimension(event.componentAsyncEvent.data[1].f32, DimensionUnit::PX);
777         } else {
778             scrollRes.xOffset = Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::VP);
779             scrollRes.yOffset = Dimension(event.componentAsyncEvent.data[1].f32, DimensionUnit::VP);
780         }
781 
782         return scrollRes;
783     };
784     ScrollModelNG::SetOnWillScroll(frameNode, std::move(onWillScroll));
785 }
786 
SetScrollOnDidScroll(ArkUINodeHandle node,void * extraParam)787 void SetScrollOnDidScroll(ArkUINodeHandle node, void* extraParam)
788 {
789     auto* frameNode = reinterpret_cast<FrameNode*>(node);
790     CHECK_NULL_VOID(frameNode);
791     int32_t nodeId = frameNode->GetId();
792     auto onDidScroll = [nodeId, node, extraParam](const Dimension& xOffset, const Dimension& yOffset,
793         const ScrollState& state) -> void {
794         ArkUINodeEvent event;
795         event.kind = COMPONENT_ASYNC_EVENT;
796         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
797         event.componentAsyncEvent.subKind = ON_SCROLL_DID_SCROLL;
798         bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
799         if (usePx) {
800             event.componentAsyncEvent.data[0].f32 = static_cast<float>(xOffset.ConvertToPx());
801             event.componentAsyncEvent.data[1].f32 = static_cast<float>(yOffset.ConvertToPx());
802         } else {
803             event.componentAsyncEvent.data[0].f32 = static_cast<float>(xOffset.Value());
804             event.componentAsyncEvent.data[1].f32 = static_cast<float>(yOffset.Value());
805         }
806         event.componentAsyncEvent.data[2].i32 = static_cast<int>(state);
807         SendArkUISyncEvent(&event);
808     };
809     ScrollModelNG::SetOnDidScroll(frameNode, std::move(onDidScroll));
810 }
811 
SetOnScrollStart(ArkUINodeHandle node,void * extraParam)812 void SetOnScrollStart(ArkUINodeHandle node, void* extraParam)
813 {
814     auto* frameNode = reinterpret_cast<FrameNode*>(node);
815     CHECK_NULL_VOID(frameNode);
816     int32_t nodeId = frameNode->GetId();
817     auto onScrollStart = [nodeId, node, extraParam]() -> void {
818         ArkUINodeEvent event;
819         event.kind = COMPONENT_ASYNC_EVENT;
820         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
821         event.componentAsyncEvent.subKind = ON_SCROLL_START;
822         SendArkUISyncEvent(&event);
823     };
824     ScrollModelNG::SetOnScrollStart(frameNode, std::move(onScrollStart));
825 }
826 
SetOnScrollStop(ArkUINodeHandle node,void * extraParam)827 void SetOnScrollStop(ArkUINodeHandle node, void* extraParam)
828 {
829     auto* frameNode = reinterpret_cast<FrameNode*>(node);
830     CHECK_NULL_VOID(frameNode);
831     int32_t nodeId = frameNode->GetId();
832     auto onScrollStop = [nodeId, node, extraParam]() -> void {
833         ArkUINodeEvent event;
834         event.kind = COMPONENT_ASYNC_EVENT;
835         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
836         event.componentAsyncEvent.subKind = ON_SCROLL_STOP;
837         SendArkUISyncEvent(&event);
838     };
839     ScrollModelNG::SetOnScrollStop(frameNode, std::move(onScrollStop));
840 }
841 
SetOnScrollEdge(ArkUINodeHandle node,void * extraParam)842 void SetOnScrollEdge(ArkUINodeHandle node, void* extraParam)
843 {
844     auto* frameNode = reinterpret_cast<FrameNode*>(node);
845     CHECK_NULL_VOID(frameNode);
846     auto onScroll = [node, extraParam](ScrollEdge edge) {
847         ArkUINodeEvent event;
848         event.kind = COMPONENT_ASYNC_EVENT;
849         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
850         event.componentAsyncEvent.data[0].i32 = static_cast<int>(edge);
851         event.componentAsyncEvent.subKind = ON_SCROLL_EDGE;
852         SendArkUISyncEvent(&event);
853     };
854     ScrollModelNG::SetOnScrollEdge(frameNode, std::move(onScroll));
855 }
856 
SetOnScrollReachStart(ArkUINodeHandle node,void * extraParam)857 void SetOnScrollReachStart(ArkUINodeHandle node, void* extraParam)
858 {
859     auto* frameNode = reinterpret_cast<FrameNode*>(node);
860     CHECK_NULL_VOID(frameNode);
861     auto onReachStart = [node, extraParam]() -> void {
862         ArkUINodeEvent event;
863         event.kind = COMPONENT_ASYNC_EVENT;
864         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
865         event.componentAsyncEvent.subKind = ON_SCROLL_REACH_START;
866         SendArkUISyncEvent(&event);
867     };
868     ScrollModelNG::SetOnReachStart(frameNode, std::move(onReachStart));
869 }
870 
SetOnScrollReachEnd(ArkUINodeHandle node,void * extraParam)871 void SetOnScrollReachEnd(ArkUINodeHandle node, void* extraParam)
872 {
873     auto* frameNode = reinterpret_cast<FrameNode*>(node);
874     CHECK_NULL_VOID(frameNode);
875     auto onReachEnd = [node, extraParam]() -> void {
876         ArkUINodeEvent event;
877         event.kind = COMPONENT_ASYNC_EVENT;
878         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
879         event.componentAsyncEvent.subKind = ON_SCROLL_REACH_END;
880         SendArkUISyncEvent(&event);
881     };
882     ScrollModelNG::SetOnReachEnd(frameNode, std::move(onReachEnd));
883 }
884 
ResetOnScroll(ArkUINodeHandle node)885 void ResetOnScroll(ArkUINodeHandle node)
886 {
887     auto* frameNode = reinterpret_cast<FrameNode*>(node);
888     CHECK_NULL_VOID(frameNode);
889     ScrollModelNG::SetOnScroll(frameNode, nullptr);
890 }
ResetOnScrollFrameBegin(ArkUINodeHandle node)891 void ResetOnScrollFrameBegin(ArkUINodeHandle node)
892 {
893     auto* frameNode = reinterpret_cast<FrameNode*>(node);
894     CHECK_NULL_VOID(frameNode);
895     ScrollModelNG::SetOnScrollFrameBegin(frameNode, nullptr);
896 }
ResetScrollOnWillScroll(ArkUINodeHandle node)897 void ResetScrollOnWillScroll(ArkUINodeHandle node)
898 {
899     auto* frameNode = reinterpret_cast<FrameNode*>(node);
900     CHECK_NULL_VOID(frameNode);
901     ScrollModelNG::SetOnWillScroll(frameNode, nullptr);
902 }
ResetScrollOnDidScroll(ArkUINodeHandle node)903 void ResetScrollOnDidScroll(ArkUINodeHandle node)
904 {
905     auto* frameNode = reinterpret_cast<FrameNode*>(node);
906     CHECK_NULL_VOID(frameNode);
907     ScrollModelNG::SetOnDidScroll(frameNode, nullptr);
908 }
ResetOnScrollStart(ArkUINodeHandle node)909 void ResetOnScrollStart(ArkUINodeHandle node)
910 {
911     auto* frameNode = reinterpret_cast<FrameNode*>(node);
912     CHECK_NULL_VOID(frameNode);
913     ScrollModelNG::SetOnScrollStart(frameNode, nullptr);
914 }
ResetOnScrollStop(ArkUINodeHandle node)915 void ResetOnScrollStop(ArkUINodeHandle node)
916 {
917     auto* frameNode = reinterpret_cast<FrameNode*>(node);
918     CHECK_NULL_VOID(frameNode);
919     ScrollModelNG::SetOnScrollStop(frameNode, nullptr);
920 }
ResetOnScrollEdge(ArkUINodeHandle node)921 void ResetOnScrollEdge(ArkUINodeHandle node)
922 {
923     auto* frameNode = reinterpret_cast<FrameNode*>(node);
924     CHECK_NULL_VOID(frameNode);
925     ScrollModelNG::SetOnScrollEdge(frameNode, nullptr);
926 }
ResetOnScrollReachStart(ArkUINodeHandle node)927 void ResetOnScrollReachStart(ArkUINodeHandle node)
928 {
929     auto* frameNode = reinterpret_cast<FrameNode*>(node);
930     CHECK_NULL_VOID(frameNode);
931     ScrollModelNG::SetOnReachStart(frameNode, nullptr);
932 }
ResetOnScrollReachEnd(ArkUINodeHandle node)933 void ResetOnScrollReachEnd(ArkUINodeHandle node)
934 {
935     auto* frameNode = reinterpret_cast<FrameNode*>(node);
936     CHECK_NULL_VOID(frameNode);
937     ScrollModelNG::SetOnReachEnd(frameNode, nullptr);
938 }
939 
SetScrollOnScrollStart(ArkUINodeHandle node,void * callback)940 void SetScrollOnScrollStart(ArkUINodeHandle node, void* callback)
941 {
942     auto* frameNode = reinterpret_cast<FrameNode*>(node);
943     CHECK_NULL_VOID(frameNode);
944     if (callback) {
945         auto onStart = reinterpret_cast<std::function<void()>*>(callback);
946         ScrollModelNG::SetOnScrollStart(frameNode, std::move(*onStart));
947     } else {
948         ScrollModelNG::SetOnScrollStart(frameNode, nullptr);
949     }
950 }
951 
ResetScrollOnScrollStart(ArkUINodeHandle node)952 void ResetScrollOnScrollStart(ArkUINodeHandle node)
953 {
954     auto* frameNode = reinterpret_cast<FrameNode*>(node);
955     CHECK_NULL_VOID(frameNode);
956     ScrollModelNG::SetOnScrollStart(frameNode, nullptr);
957 }
958 
SetScrollOnScrollEnd(ArkUINodeHandle node,void * callback)959 void SetScrollOnScrollEnd(ArkUINodeHandle node, void* callback)
960 {
961     auto* frameNode = reinterpret_cast<FrameNode*>(node);
962     CHECK_NULL_VOID(frameNode);
963     if (callback) {
964         auto onEnd = reinterpret_cast<std::function<void()>*>(callback);
965         ScrollModelNG::SetOnScrollStop(frameNode, std::move(*onEnd));
966     } else {
967         ScrollModelNG::SetOnScrollStop(frameNode, nullptr);
968     }
969 }
970 
ResetScrollOnScrollEnd(ArkUINodeHandle node)971 void ResetScrollOnScrollEnd(ArkUINodeHandle node)
972 {
973     auto* frameNode = reinterpret_cast<FrameNode*>(node);
974     CHECK_NULL_VOID(frameNode);
975     ScrollModelNG::SetOnScrollStop(frameNode, nullptr);
976 }
977 
SetScrollOnScrollStop(ArkUINodeHandle node,void * callback)978 void SetScrollOnScrollStop(ArkUINodeHandle node, void* callback)
979 {
980     auto* frameNode = reinterpret_cast<FrameNode*>(node);
981     CHECK_NULL_VOID(frameNode);
982     if (callback) {
983         auto onEnd = reinterpret_cast<std::function<void()>*>(callback);
984         ScrollModelNG::SetOnScrollStop(frameNode, std::move(*onEnd));
985     } else {
986         ScrollModelNG::SetOnScrollStop(frameNode, nullptr);
987     }
988 }
989 
ResetScrollOnScrollStop(ArkUINodeHandle node)990 void ResetScrollOnScrollStop(ArkUINodeHandle node)
991 {
992     auto* frameNode = reinterpret_cast<FrameNode*>(node);
993     CHECK_NULL_VOID(frameNode);
994     ScrollModelNG::SetOnScrollStop(frameNode, nullptr);
995 }
996 
SetScrollOnScroll(ArkUINodeHandle node,void * callback)997 void SetScrollOnScroll(ArkUINodeHandle node, void* callback)
998 {
999     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1000     CHECK_NULL_VOID(frameNode);
1001     if (callback) {
1002         auto onScroll = reinterpret_cast<std::function<void(OHOS::Ace::Dimension, OHOS::Ace::Dimension)>*>(callback);
1003         ScrollModelNG::SetOnScroll(frameNode, std::move(*onScroll));
1004     } else {
1005         ScrollModelNG::SetOnScroll(frameNode, nullptr);
1006     }
1007 }
1008 
ResetScrollOnScroll(ArkUINodeHandle node)1009 void ResetScrollOnScroll(ArkUINodeHandle node)
1010 {
1011     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1012     CHECK_NULL_VOID(frameNode);
1013     ScrollModelNG::SetOnScroll(frameNode, nullptr);
1014 }
1015 
SetScrollOnScrollEdge(ArkUINodeHandle node,void * callback)1016 void SetScrollOnScrollEdge(ArkUINodeHandle node, void* callback)
1017 {
1018     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1019     CHECK_NULL_VOID(frameNode);
1020     if (callback) {
1021         auto onScrollEdge = reinterpret_cast<std::function<void(OHOS::Ace::NG::ScrollEdge)>*>(callback);
1022         ScrollModelNG::SetOnScrollEdge(frameNode, std::move(*onScrollEdge));
1023     } else {
1024         ScrollModelNG::SetOnScrollEdge(frameNode, nullptr);
1025     }
1026 }
1027 
ResetScrollOnScrollEdge(ArkUINodeHandle node)1028 void ResetScrollOnScrollEdge(ArkUINodeHandle node)
1029 {
1030     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1031     CHECK_NULL_VOID(frameNode);
1032     ScrollModelNG::SetOnScrollEdge(frameNode, nullptr);
1033 }
1034 
SetScrollOnDidScrollCallBack(ArkUINodeHandle node,void * callback)1035 void SetScrollOnDidScrollCallBack(ArkUINodeHandle node, void* callback)
1036 {
1037     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1038     CHECK_NULL_VOID(frameNode);
1039     if (callback) {
1040         auto onDidScroll = reinterpret_cast<std::function<void(Dimension, Dimension, ScrollState)>*>(callback);
1041         ScrollModelNG::SetOnDidScroll(frameNode, std::move(*onDidScroll));
1042     } else {
1043         ScrollModelNG::SetOnDidScroll(frameNode, nullptr);
1044     }
1045 }
SetScrollOnWillScrollCallBack(ArkUINodeHandle node,void * callback)1046 void SetScrollOnWillScrollCallBack(ArkUINodeHandle node, void* callback)
1047 {
1048     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1049     CHECK_NULL_VOID(frameNode);
1050     if (callback) {
1051         auto onWillScroll = reinterpret_cast<ScrollEventWithReturn*>(callback);
1052         ScrollModelNG::SetOnWillScroll(frameNode, std::move(*onWillScroll));
1053     } else {
1054         ScrollModelNG::SetOnWillScroll(frameNode, nullptr);
1055     }
1056 }
1057 
ResetScrollOnWillScrollCallBack(ArkUINodeHandle node)1058 void ResetScrollOnWillScrollCallBack(ArkUINodeHandle node)
1059 {
1060     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1061     CHECK_NULL_VOID(frameNode);
1062     ScrollModelNG::SetOnWillScroll(frameNode, nullptr);
1063 }
1064 
SetOnScrollFrameBeginCallBack(ArkUINodeHandle node,void * callback)1065 void SetOnScrollFrameBeginCallBack(ArkUINodeHandle node, void* callback)
1066 {
1067     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1068     CHECK_NULL_VOID(frameNode);
1069     if (callback) {
1070         auto onScrollFrameBegin = reinterpret_cast<OnScrollFrameBeginEvent*>(callback);
1071         ScrollModelNG::SetOnScrollFrameBegin(frameNode, std::move(*onScrollFrameBegin));
1072     } else {
1073         ScrollModelNG::SetOnScrollFrameBegin(frameNode, nullptr);
1074     }
1075 }
1076 
ResetOnScrollFrameBeginCallBack(ArkUINodeHandle node)1077 void ResetOnScrollFrameBeginCallBack(ArkUINodeHandle node)
1078 {
1079     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1080     CHECK_NULL_VOID(frameNode);
1081     ScrollModelNG::SetOnScrollFrameBegin(frameNode, nullptr);
1082 }
1083 } // namespace NodeModifier
1084 } // namespace OHOS::Ace::NG
1085