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