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