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