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