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