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_list_modifier.h"
16
17 #include <cstdint>
18
19 #include "interfaces/native/node/list_option.h"
20 #include "interfaces/native/node/node_model.h"
21
22 #include "base/error/error_code.h"
23 #include "base/geometry/dimension.h"
24 #include "base/utils/utils.h"
25 #include "core/components/list/list_theme.h"
26 #include "core/components_ng/base/frame_node.h"
27 #include "core/components_ng/pattern/list/list_model_ng.h"
28 #include "core/components_ng/pattern/scrollable/scrollable_model_ng.h"
29 #include "core/interfaces/arkoala/arkoala_api.h"
30 #include "core/interfaces/native/node/node_adapter_impl.h"
31 #include "core/pipeline/base/element_register.h"
32
33 namespace OHOS::Ace::NG {
34 namespace {
35 constexpr int32_t DEFAULT_CACHED_COUNT = 1;
36 constexpr bool DEFAULT_SCROLL_ENABLE = true;
37 constexpr int32_t DEFAULT_STICKY_STYLE = 0;
38 constexpr int32_t DEFAULT_DIRECTION = 0;
39 constexpr int32_t DEFAULT_SCROLL_BAR = 1;
40 constexpr int32_t DEFAULT_DIVIDER_VALUES_COUNT = 3;
41 constexpr float DEFAULT_OFFSET = 0.0f;
42
43 constexpr int32_t DEFAULT_EDGE_EFFECT = 0;
44
45 constexpr int32_t ERROR_INT_CODE = -1;
46 constexpr int32_t CALL_STROKE_WIDTH = 0;
47 constexpr int32_t CALL_START_MARGIN = 1;
48 constexpr int32_t CALL_END_MARGIN = 2;
49 constexpr int32_t INDEX_0 = 0;
50 constexpr int32_t INDEX_1 = 1;
51 constexpr int32_t INDEX_2 = 2;
52
SetListLanes(ArkUINodeHandle node,ArkUI_Int32 lanesNum,const struct ArkUIDimensionType * minLengthType,const struct ArkUIDimensionType * maxLengthType,const struct ArkUIDimensionType * gutterType)53 void SetListLanes(ArkUINodeHandle node, ArkUI_Int32 lanesNum, const struct ArkUIDimensionType* minLengthType,
54 const struct ArkUIDimensionType* maxLengthType, const struct ArkUIDimensionType* gutterType)
55 {
56 auto* frameNode = reinterpret_cast<FrameNode*>(node);
57 CHECK_NULL_VOID(frameNode);
58 if (lanesNum > 0) {
59 ListModelNG::SetLanes(frameNode, lanesNum);
60 Dimension minLength =
61 Dimension(minLengthType->value, static_cast<OHOS::Ace::DimensionUnit>(minLengthType->units));
62 Dimension maxLength =
63 Dimension(maxLengthType->value, static_cast<OHOS::Ace::DimensionUnit>(maxLengthType->units));
64 ListModelNG::SetLaneConstrain(frameNode, minLength, maxLength);
65 } else {
66 Dimension minLength =
67 Dimension(minLengthType->value, static_cast<OHOS::Ace::DimensionUnit>(minLengthType->units));
68 Dimension maxLength =
69 Dimension(maxLengthType->value, static_cast<OHOS::Ace::DimensionUnit>(maxLengthType->units));
70 ListModelNG::SetLaneConstrain(frameNode, minLength, maxLength);
71 ListModelNG::SetLanes(frameNode, 1);
72 }
73
74 Dimension gutter = Dimension(gutterType->value, static_cast<OHOS::Ace::DimensionUnit>(gutterType->units));
75 ListModelNG::SetLaneGutter(frameNode, gutter);
76 }
77
ResetListLanes(ArkUINodeHandle node)78 void ResetListLanes(ArkUINodeHandle node)
79 {
80 auto* frameNode = reinterpret_cast<FrameNode*>(node);
81 CHECK_NULL_VOID(frameNode);
82 ListModelNG::SetLanes(frameNode, 1);
83 ListModelNG::SetLaneGutter(frameNode, Dimension(0));
84 }
85
SetEditMode(ArkUINodeHandle node,ArkUI_Bool editMode)86 void SetEditMode(ArkUINodeHandle node, ArkUI_Bool editMode)
87 {
88 auto* frameNode = reinterpret_cast<FrameNode*>(node);
89 CHECK_NULL_VOID(frameNode);
90 ListModelNG::SetEditMode(frameNode, editMode);
91 }
92
ResetEditMode(ArkUINodeHandle node)93 void ResetEditMode(ArkUINodeHandle node)
94 {
95 auto* frameNode = reinterpret_cast<FrameNode*>(node);
96 CHECK_NULL_VOID(frameNode);
97 ListModelNG::SetEditMode(frameNode, false);
98 }
99
SetMultiSelectable(ArkUINodeHandle node,ArkUI_Bool selectable)100 void SetMultiSelectable(ArkUINodeHandle node, ArkUI_Bool selectable)
101 {
102 auto* frameNode = reinterpret_cast<FrameNode*>(node);
103 CHECK_NULL_VOID(frameNode);
104 ListModelNG::SetMultiSelectable(frameNode, selectable);
105 }
106
ResetMultiSelectable(ArkUINodeHandle node)107 void ResetMultiSelectable(ArkUINodeHandle node)
108 {
109 auto* frameNode = reinterpret_cast<FrameNode*>(node);
110 CHECK_NULL_VOID(frameNode);
111 ListModelNG::SetMultiSelectable(frameNode, false);
112 }
113
SetChainAnimation(ArkUINodeHandle node,ArkUI_Bool chainAnimation)114 void SetChainAnimation(ArkUINodeHandle node, ArkUI_Bool chainAnimation)
115 {
116 auto* frameNode = reinterpret_cast<FrameNode*>(node);
117 CHECK_NULL_VOID(frameNode);
118 ListModelNG::SetChainAnimation(frameNode, chainAnimation);
119 }
120
ResetChainAnimation(ArkUINodeHandle node)121 void ResetChainAnimation(ArkUINodeHandle node)
122 {
123 auto* frameNode = reinterpret_cast<FrameNode*>(node);
124 CHECK_NULL_VOID(frameNode);
125 ListModelNG::SetChainAnimation(frameNode, false);
126 }
127
SetCachedCount(ArkUINodeHandle node,ArkUI_Int32 cachedCount)128 void SetCachedCount(ArkUINodeHandle node, ArkUI_Int32 cachedCount)
129 {
130 auto* frameNode = reinterpret_cast<FrameNode*>(node);
131 CHECK_NULL_VOID(frameNode);
132 if (cachedCount < 0) {
133 cachedCount = 1;
134 }
135 ListModelNG::SetCachedCount(frameNode, cachedCount);
136 }
137
ResetCachedCount(ArkUINodeHandle node)138 void ResetCachedCount(ArkUINodeHandle node)
139 {
140 auto* frameNode = reinterpret_cast<FrameNode*>(node);
141 CHECK_NULL_VOID(frameNode);
142 ListModelNG::SetCachedCount(frameNode, DEFAULT_CACHED_COUNT);
143 }
144
GetEnableScrollInteraction(ArkUINodeHandle node)145 ArkUI_Bool GetEnableScrollInteraction(ArkUINodeHandle node)
146 {
147 auto* frameNode = reinterpret_cast<FrameNode*>(node);
148 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
149 return ListModelNG::GetScrollEnabled(frameNode);
150 }
151
SetEnableScrollInteraction(ArkUINodeHandle node,ArkUI_Bool enableScrollInteraction)152 void SetEnableScrollInteraction(ArkUINodeHandle node, ArkUI_Bool enableScrollInteraction)
153 {
154 auto* frameNode = reinterpret_cast<FrameNode*>(node);
155 CHECK_NULL_VOID(frameNode);
156 ListModelNG::SetScrollEnabled(frameNode, enableScrollInteraction);
157 }
158
ResetEnableScrollInteraction(ArkUINodeHandle node)159 void ResetEnableScrollInteraction(ArkUINodeHandle node)
160 {
161 auto* frameNode = reinterpret_cast<FrameNode*>(node);
162 CHECK_NULL_VOID(frameNode);
163 ListModelNG::SetScrollEnabled(frameNode, DEFAULT_SCROLL_ENABLE);
164 }
165
GetSticky(ArkUINodeHandle node)166 ArkUI_Int32 GetSticky(ArkUINodeHandle node)
167 {
168 auto* frameNode = reinterpret_cast<FrameNode*>(node);
169 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
170 return ListModelNG::GetSticky(frameNode);
171 }
172
SetSticky(ArkUINodeHandle node,ArkUI_Int32 stickyStyle)173 void SetSticky(ArkUINodeHandle node, ArkUI_Int32 stickyStyle)
174 {
175 auto* frameNode = reinterpret_cast<FrameNode*>(node);
176 CHECK_NULL_VOID(frameNode);
177 ListModelNG::SetSticky(frameNode, stickyStyle);
178 }
179
ResetSticky(ArkUINodeHandle node)180 void ResetSticky(ArkUINodeHandle node)
181 {
182 auto* frameNode = reinterpret_cast<FrameNode*>(node);
183 CHECK_NULL_VOID(frameNode);
184 ListModelNG::SetSticky(frameNode, DEFAULT_STICKY_STYLE);
185 }
186
GetListSpace(ArkUINodeHandle node)187 ArkUI_Float32 GetListSpace(ArkUINodeHandle node)
188 {
189 auto* frameNode = reinterpret_cast<FrameNode*>(node);
190 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
191 return ListModelNG::GetListSpace(frameNode);
192 }
193
SetListSpace(ArkUINodeHandle node,ArkUI_Float32 space)194 void SetListSpace(ArkUINodeHandle node, ArkUI_Float32 space)
195 {
196 auto* frameNode = reinterpret_cast<FrameNode*>(node);
197 CHECK_NULL_VOID(frameNode);
198 ListModelNG::SetListSpace(frameNode, Dimension(space, DimensionUnit::VP));
199 }
200
ResetListSpace(ArkUINodeHandle node)201 void ResetListSpace(ArkUINodeHandle node)
202 {
203 auto* frameNode = reinterpret_cast<FrameNode*>(node);
204 CHECK_NULL_VOID(frameNode);
205 ListModelNG::SetListSpace(frameNode, Dimension(0, DimensionUnit::VP));
206 }
207
GetListEdgeEffect(ArkUINodeHandle node,ArkUI_Int32 (* values)[2])208 ArkUI_Int32 GetListEdgeEffect(ArkUINodeHandle node, ArkUI_Int32 (*values)[2])
209 {
210 auto* frameNode = reinterpret_cast<FrameNode*>(node);
211 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
212 (*values)[INDEX_0] = ListModelNG::GetEdgeEffect(frameNode);
213 (*values)[INDEX_1] = ListModelNG::GetEdgeEffectAlways(frameNode);
214 return INDEX_2;
215 }
216
SetListEdgeEffect(ArkUINodeHandle node,ArkUI_Int32 edgeEffect,ArkUI_Bool alwaysEnabled)217 void SetListEdgeEffect(ArkUINodeHandle node, ArkUI_Int32 edgeEffect, ArkUI_Bool alwaysEnabled)
218 {
219 auto* frameNode = reinterpret_cast<FrameNode*>(node);
220 CHECK_NULL_VOID(frameNode);
221 ListModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled);
222 }
223
ResetListEdgeEffect(ArkUINodeHandle node)224 void ResetListEdgeEffect(ArkUINodeHandle node)
225 {
226 auto* frameNode = reinterpret_cast<FrameNode*>(node);
227 CHECK_NULL_VOID(frameNode);
228 ListModelNG::SetEdgeEffect(frameNode, DEFAULT_EDGE_EFFECT, false);
229 }
230
GetListDirection(ArkUINodeHandle node)231 ArkUI_Int32 GetListDirection(ArkUINodeHandle node)
232 {
233 auto* frameNode = reinterpret_cast<FrameNode*>(node);
234 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
235 return ListModelNG::GetListDirection(frameNode);
236 }
237
SetListDirection(ArkUINodeHandle node,ArkUI_Int32 axis)238 void SetListDirection(ArkUINodeHandle node, ArkUI_Int32 axis)
239 {
240 auto* frameNode = reinterpret_cast<FrameNode*>(node);
241 CHECK_NULL_VOID(frameNode);
242 ListModelNG::SetListDirection(frameNode, axis);
243 }
244
ResetListDirection(ArkUINodeHandle node)245 void ResetListDirection(ArkUINodeHandle node)
246 {
247 auto* frameNode = reinterpret_cast<FrameNode*>(node);
248 CHECK_NULL_VOID(frameNode);
249 ListModelNG::SetListDirection(frameNode, DEFAULT_DIRECTION);
250 }
251
GetListFriction(ArkUINodeHandle node)252 ArkUI_Float32 GetListFriction(ArkUINodeHandle node)
253 {
254 auto* frameNode = reinterpret_cast<FrameNode*>(node);
255 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
256 return ListModelNG::GetListFriction(frameNode);
257 }
258
SetListFriction(ArkUINodeHandle node,ArkUI_Float32 friction)259 void SetListFriction(ArkUINodeHandle node, ArkUI_Float32 friction)
260 {
261 auto* frameNode = reinterpret_cast<FrameNode*>(node);
262 CHECK_NULL_VOID(frameNode);
263 ListModelNG::SetListFriction(frameNode, friction);
264 }
265
ResetListFriction(ArkUINodeHandle node)266 void ResetListFriction(ArkUINodeHandle node)
267 {
268 auto* frameNode = reinterpret_cast<FrameNode*>(node);
269 CHECK_NULL_VOID(frameNode);
270 double friction = -1.0;
271 ListModelNG::SetListFriction(frameNode, friction);
272 }
273
GetListNestedScroll(ArkUINodeHandle node,ArkUI_Int32 (* values)[2])274 void GetListNestedScroll(ArkUINodeHandle node, ArkUI_Int32 (*values)[2])
275 {
276 auto* frameNode = reinterpret_cast<FrameNode*>(node);
277 CHECK_NULL_VOID(frameNode);
278 NestedScrollOptions options = ListModelNG::GetListNestedScroll(frameNode);
279 (*values)[0] = static_cast<ArkUI_Int32>(options.forward);
280 (*values)[1] = static_cast<ArkUI_Int32>(options.backward);
281 }
282
SetListNestedScroll(ArkUINodeHandle node,ArkUI_Int32 forward,ArkUI_Int32 backward)283 void SetListNestedScroll(ArkUINodeHandle node, ArkUI_Int32 forward, ArkUI_Int32 backward)
284 {
285 NestedScrollOptions opt = {
286 .forward = static_cast<NestedScrollMode>(forward),
287 .backward = static_cast<NestedScrollMode>(backward),
288 };
289 auto* frameNode = reinterpret_cast<FrameNode*>(node);
290 CHECK_NULL_VOID(frameNode);
291 ListModelNG::SetListNestedScroll(frameNode, opt);
292 }
293
ResetListNestedScroll(ArkUINodeHandle node)294 void ResetListNestedScroll(ArkUINodeHandle node)
295 {
296 auto* frameNode = reinterpret_cast<FrameNode*>(node);
297 CHECK_NULL_VOID(frameNode);
298 const NestedScrollOptions nestedOpt = {
299 .forward = NestedScrollMode::SELF_ONLY,
300 .backward = NestedScrollMode::SELF_ONLY,
301 };
302 ListModelNG::SetListNestedScroll(frameNode, nestedOpt);
303 }
304
GetListScrollBar(ArkUINodeHandle node)305 ArkUI_Int32 GetListScrollBar(ArkUINodeHandle node)
306 {
307 auto* frameNode = reinterpret_cast<FrameNode*>(node);
308 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
309 return ListModelNG::GetListScrollBar(frameNode);
310 }
311
SetListScrollBar(ArkUINodeHandle node,ArkUI_Int32 barState)312 void SetListScrollBar(ArkUINodeHandle node, ArkUI_Int32 barState)
313 {
314 auto* frameNode = reinterpret_cast<FrameNode*>(node);
315 CHECK_NULL_VOID(frameNode);
316 ListModelNG::SetListScrollBar(frameNode, barState);
317 }
318
ResetListScrollBar(ArkUINodeHandle node)319 void ResetListScrollBar(ArkUINodeHandle node)
320 {
321 auto* frameNode = reinterpret_cast<FrameNode*>(node);
322 CHECK_NULL_VOID(frameNode);
323 ListModelNG::SetListScrollBar(frameNode, DEFAULT_SCROLL_BAR);
324 }
325
GetListScrollBarWidth(ArkUINodeHandle node)326 ArkUI_Float32 GetListScrollBarWidth(ArkUINodeHandle node)
327 {
328 auto* frameNode = reinterpret_cast<FrameNode*>(node);
329 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
330 return ListModelNG::GetScrollBarWidth(frameNode);
331 }
332
SetListScrollBarWidth(ArkUINodeHandle node,ArkUI_CharPtr value)333 void SetListScrollBarWidth(ArkUINodeHandle node, ArkUI_CharPtr value)
334 {
335 CHECK_NULL_VOID(value);
336 auto* frameNode = reinterpret_cast<FrameNode*>(node);
337 CHECK_NULL_VOID(frameNode);
338 ListModelNG::SetListScrollBarWidth(frameNode, value);
339 }
340
ResetListScrollBarWidth(ArkUINodeHandle node)341 void ResetListScrollBarWidth(ArkUINodeHandle node)
342 {
343 auto* frameNode = reinterpret_cast<FrameNode*>(node);
344 CHECK_NULL_VOID(frameNode);
345 ListModelNG::SetListScrollBarWidth(frameNode, "0vp");
346 }
347
GetListScrollBarColor(ArkUINodeHandle node)348 ArkUI_Uint32 GetListScrollBarColor(ArkUINodeHandle node)
349 {
350 auto* frameNode = reinterpret_cast<FrameNode*>(node);
351 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
352 return ListModelNG::GetScrollBarColor(frameNode);
353 }
354
SetListScrollBarColor(ArkUINodeHandle node,ArkUI_CharPtr value)355 void SetListScrollBarColor(ArkUINodeHandle node, ArkUI_CharPtr value)
356 {
357 CHECK_NULL_VOID(value);
358 auto* frameNode = reinterpret_cast<FrameNode*>(node);
359 CHECK_NULL_VOID(frameNode);
360 ListModelNG::SetListScrollBarColor(frameNode, value);
361 }
362
ResetListScrollBarColor(ArkUINodeHandle node)363 void ResetListScrollBarColor(ArkUINodeHandle node)
364 {
365 auto* frameNode = reinterpret_cast<FrameNode*>(node);
366 CHECK_NULL_VOID(frameNode);
367 ListModelNG::SetListScrollBarColor(frameNode, "#FF000000");
368 }
369
GetAlignListItem(ArkUINodeHandle node)370 ArkUI_Int32 GetAlignListItem(ArkUINodeHandle node)
371 {
372 auto* frameNode = reinterpret_cast<FrameNode*>(node);
373 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
374 return ListModelNG::GetListItemAlign(frameNode);
375 }
376
SetAlignListItem(ArkUINodeHandle node,ArkUI_Int32 listItemAlign)377 void SetAlignListItem(ArkUINodeHandle node, ArkUI_Int32 listItemAlign)
378 {
379 auto* frameNode = reinterpret_cast<FrameNode*>(node);
380 CHECK_NULL_VOID(frameNode);
381 ListModelNG::SetListItemAlign(frameNode, static_cast<V2::ListItemAlign>(listItemAlign));
382 }
383
ResetAlignListItem(ArkUINodeHandle node)384 void ResetAlignListItem(ArkUINodeHandle node)
385 {
386 auto* frameNode = reinterpret_cast<FrameNode*>(node);
387 CHECK_NULL_VOID(frameNode);
388 ListModelNG::SetListItemAlign(frameNode, V2::ListItemAlign::START);
389 }
390
SetScrollSnapAlign(ArkUINodeHandle node,ArkUI_Int32 scrollSnapAlign)391 void SetScrollSnapAlign(ArkUINodeHandle node, ArkUI_Int32 scrollSnapAlign)
392 {
393 auto* frameNode = reinterpret_cast<FrameNode*>(node);
394 CHECK_NULL_VOID(frameNode);
395 ListModelNG::SetScrollSnapAlign(frameNode, static_cast<V2::ScrollSnapAlign>(scrollSnapAlign));
396 }
397
ResetScrollSnapAlign(ArkUINodeHandle node)398 void ResetScrollSnapAlign(ArkUINodeHandle node)
399 {
400 auto* frameNode = reinterpret_cast<FrameNode*>(node);
401 CHECK_NULL_VOID(frameNode);
402 ListModelNG::SetScrollSnapAlign(frameNode, V2::ScrollSnapAlign::NONE);
403 }
404
SetContentStartOffset(ArkUINodeHandle node,ArkUI_Float32 startOffset)405 void SetContentStartOffset(ArkUINodeHandle node, ArkUI_Float32 startOffset)
406 {
407 auto* frameNode = reinterpret_cast<FrameNode*>(node);
408 CHECK_NULL_VOID(frameNode);
409 ListModelNG::SetContentStartOffset(frameNode, startOffset);
410 }
411
ResetContentStartOffset(ArkUINodeHandle node)412 void ResetContentStartOffset(ArkUINodeHandle node)
413 {
414 auto* frameNode = reinterpret_cast<FrameNode*>(node);
415 CHECK_NULL_VOID(frameNode);
416 ListModelNG::SetContentStartOffset(frameNode, DEFAULT_OFFSET);
417 }
418
SetContentEndOffset(ArkUINodeHandle node,ArkUI_Float32 endOffset)419 void SetContentEndOffset(ArkUINodeHandle node, ArkUI_Float32 endOffset)
420 {
421 auto* frameNode = reinterpret_cast<FrameNode*>(node);
422 CHECK_NULL_VOID(frameNode);
423 ListModelNG::SetContentEndOffset(frameNode, endOffset);
424 }
425
ResetContentEndOffset(ArkUINodeHandle node)426 void ResetContentEndOffset(ArkUINodeHandle node)
427 {
428 auto* frameNode = reinterpret_cast<FrameNode*>(node);
429 CHECK_NULL_VOID(frameNode);
430 ListModelNG::SetContentEndOffset(frameNode, DEFAULT_OFFSET);
431 }
432
ListSetDivider(ArkUINodeHandle node,ArkUI_Uint32 color,const ArkUI_Float32 * values,const int32_t * units,ArkUI_Int32 length)433 void ListSetDivider(
434 ArkUINodeHandle node, ArkUI_Uint32 color, const ArkUI_Float32* values, const int32_t* units, ArkUI_Int32 length)
435 {
436 auto* frameNode = reinterpret_cast<FrameNode*>(node);
437 CHECK_NULL_VOID(frameNode);
438
439 if (length != DEFAULT_DIVIDER_VALUES_COUNT) {
440 return;
441 }
442
443 V2::ItemDivider divider;
444 divider.color = Color(color);
445 divider.strokeWidth =
446 Dimension(values[CALL_STROKE_WIDTH], static_cast<OHOS::Ace::DimensionUnit>(units[CALL_STROKE_WIDTH]));
447 divider.startMargin =
448 Dimension(values[CALL_START_MARGIN], static_cast<OHOS::Ace::DimensionUnit>(units[CALL_START_MARGIN]));
449 divider.endMargin =
450 Dimension(values[CALL_END_MARGIN], static_cast<OHOS::Ace::DimensionUnit>(units[CALL_END_MARGIN]));
451
452 ListModelNG::SetDivider(frameNode, divider);
453 }
454
ListResetDivider(ArkUINodeHandle node)455 void ListResetDivider(ArkUINodeHandle node)
456 {
457 auto* frameNode = reinterpret_cast<FrameNode*>(node);
458 CHECK_NULL_VOID(frameNode);
459 const V2::ItemDivider divider;
460
461 ListModelNG::SetDivider(frameNode, divider);
462 }
463
SetChainAnimationOptions(ArkUINodeHandle node,const struct ArkUIChainAnimationOptionsType * chainAnimationOptions)464 void SetChainAnimationOptions(ArkUINodeHandle node, const struct ArkUIChainAnimationOptionsType* chainAnimationOptions)
465 {
466 auto* frameNode = reinterpret_cast<FrameNode*>(node);
467 CHECK_NULL_VOID(frameNode);
468
469 ChainAnimationOptions options;
470 options.minSpace = CalcDimension(
471 chainAnimationOptions->minSpace, static_cast<OHOS::Ace::DimensionUnit>(chainAnimationOptions->minSpaceUnits));
472 options.maxSpace = CalcDimension(
473 chainAnimationOptions->maxSpace, static_cast<OHOS::Ace::DimensionUnit>(chainAnimationOptions->maxSpaceUnits));
474 options.conductivity = chainAnimationOptions->conductivity;
475 options.intensity = chainAnimationOptions->intensity;
476 options.edgeEffect = chainAnimationOptions->edgeEffect;
477 options.stiffness = chainAnimationOptions->stiffness;
478 options.damping = chainAnimationOptions->damping;
479 ListModelNG::SetChainAnimationOptions(frameNode, options);
480 }
481
ResetChainAnimationOptions(ArkUINodeHandle node)482 void ResetChainAnimationOptions(ArkUINodeHandle node)
483 {
484 auto* frameNode = reinterpret_cast<FrameNode*>(node);
485 CHECK_NULL_VOID(frameNode);
486 RefPtr<ListTheme> listTheme = GetTheme<ListTheme>();
487 CHECK_NULL_VOID(listTheme);
488 ChainAnimationOptions options = {
489 .minSpace = listTheme->GetChainMinSpace(),
490 .maxSpace = listTheme->GetChainMaxSpace(),
491 .conductivity = listTheme->GetChainConductivity(),
492 .intensity = listTheme->GetChainIntensity(),
493 .edgeEffect = 0,
494 .stiffness = listTheme->GetChainStiffness(),
495 .damping = listTheme->GetChainDamping(),
496 };
497
498 ListModelNG::SetChainAnimationOptions(frameNode, options);
499 }
500
SetNodeAdapter(ArkUINodeHandle node,ArkUINodeAdapterHandle handle)501 ArkUI_Int32 SetNodeAdapter(ArkUINodeHandle node, ArkUINodeAdapterHandle handle)
502 {
503 auto* frameNode = reinterpret_cast<FrameNode*>(node);
504 CHECK_NULL_RETURN(frameNode, ERROR_CODE_PARAM_INVALID);
505 auto totalChildCount = frameNode->TotalChildCount();
506 if (totalChildCount > 0) {
507 return ERROR_CODE_NATIVE_IMPL_NODE_ADAPTER_CHILD_NODE_EXIST;
508 }
509 NodeAdapter::GetNodeAdapterAPI()->attachHostNode(handle, node);
510 return ERROR_CODE_NO_ERROR;
511 }
512
ResetNodeAdapter(ArkUINodeHandle node)513 void ResetNodeAdapter(ArkUINodeHandle node)
514 {
515 NodeAdapter::GetNodeAdapterAPI()->detachHostNode(node);
516 }
517
GetNodeAdapter(ArkUINodeHandle node)518 ArkUINodeAdapterHandle GetNodeAdapter(ArkUINodeHandle node)
519 {
520 return NodeAdapter::GetNodeAdapterAPI()->getNodeAdapter(node);
521 }
522
GetCachedCount(ArkUINodeHandle node)523 ArkUI_Int32 GetCachedCount(ArkUINodeHandle node)
524 {
525 auto* frameNode = reinterpret_cast<FrameNode*>(node);
526 CHECK_NULL_RETURN(frameNode, 1);
527 return ListModelNG::GetCachedCount(frameNode);
528 }
529
SetScrollToIndex(ArkUINodeHandle node,ArkUI_Int32 index,ArkUI_Int32 animation,ArkUI_Int32 alignment)530 void SetScrollToIndex(ArkUINodeHandle node, ArkUI_Int32 index, ArkUI_Int32 animation, ArkUI_Int32 alignment)
531 {
532 auto* frameNode = reinterpret_cast<FrameNode*>(node);
533 CHECK_NULL_VOID(frameNode);
534 ListModelNG::SetScrollToIndex(frameNode, index, animation, alignment);
535 }
536
SetScrollBy(ArkUINodeHandle node,ArkUI_Float64 x,ArkUI_Float64 y)537 void SetScrollBy(ArkUINodeHandle node, ArkUI_Float64 x, ArkUI_Float64 y)
538 {
539 auto* frameNode = reinterpret_cast<FrameNode*>(node);
540 CHECK_NULL_VOID(frameNode);
541 ListModelNG::SetScrollBy(frameNode, x, y);
542 }
543
SetInitialIndex(ArkUINodeHandle node,ArkUI_Int32 index)544 void SetInitialIndex(ArkUINodeHandle node, ArkUI_Int32 index)
545 {
546 auto* frameNode = reinterpret_cast<FrameNode*>(node);
547 CHECK_NULL_VOID(frameNode);
548 ListModelNG::SetInitialIndex(frameNode, index);
549 }
550
ResetInitialIndex(ArkUINodeHandle node)551 void ResetInitialIndex(ArkUINodeHandle node)
552 {
553 auto* frameNode = reinterpret_cast<FrameNode*>(node);
554 CHECK_NULL_VOID(frameNode);
555 ListModelNG::SetInitialIndex(frameNode, 0);
556 }
557
SetListChildrenMainSize(ArkUINodeHandle node,ArkUIListChildrenMainSize option,ArkUI_Int32 unit)558 void SetListChildrenMainSize(ArkUINodeHandle node, ArkUIListChildrenMainSize option, ArkUI_Int32 unit)
559 {
560 auto* frameNode = reinterpret_cast<FrameNode*>(node);
561 CHECK_NULL_VOID(frameNode);
562 for (uint32_t i = 0; i < option->mainSize.size(); i++) {
563 if (option->mainSize[i] > 0) {
564 option->mainSize[i] =
565 Dimension(option->mainSize[i], static_cast<OHOS::Ace::DimensionUnit>(unit)).ConvertToPx();
566 }
567 }
568 if (option->defaultMainSize > 0) {
569 option->defaultMainSize =
570 Dimension(option->defaultMainSize, static_cast<OHOS::Ace::DimensionUnit>(unit)).ConvertToPx();
571 }
572 ListModelNG::SetListChildrenMainSize(frameNode, option->defaultMainSize, option->mainSize);
573 }
574
ResetListChildrenMainSize(ArkUINodeHandle node)575 void ResetListChildrenMainSize(ArkUINodeHandle node)
576 {
577 auto* frameNode = reinterpret_cast<FrameNode*>(node);
578 CHECK_NULL_VOID(frameNode);
579 ListModelNG::ResetListChildrenMainSize(frameNode);
580 }
581
SetListCloseAllSwipeActions(ArkUINodeHandle node,void * userData,void (onFinish)(void * userData))582 void SetListCloseAllSwipeActions(ArkUINodeHandle node, void* userData, void (onFinish) (void* userData))
583 {
584 auto* frameNode = reinterpret_cast<FrameNode*>(node);
585 CHECK_NULL_VOID(frameNode);
586 RefPtr<ScrollControllerBase> scrollControllerBase = ListModelNG::GetOrCreateController(frameNode);
587 if (onFinish) {
588 auto onEvent = [userData, onFinish]() {
589 onFinish(userData);
590 };
591 scrollControllerBase->CloseAllSwipeActions(std::move(onEvent));
592 } else {
593 scrollControllerBase->CloseAllSwipeActions(nullptr);
594 }
595 }
596
SetListFlingSpeedLimit(ArkUINodeHandle node,ArkUI_Float32 maxSpeed)597 void SetListFlingSpeedLimit(ArkUINodeHandle node, ArkUI_Float32 maxSpeed)
598 {
599 auto* frameNode = reinterpret_cast<FrameNode*>(node);
600 CHECK_NULL_VOID(frameNode);
601 ListModelNG::SetFlingSpeedLimit(frameNode, maxSpeed);
602 }
603
ResetListFlingSpeedLimit(ArkUINodeHandle node)604 void ResetListFlingSpeedLimit(ArkUINodeHandle node)
605 {
606 auto* frameNode = reinterpret_cast<FrameNode*>(node);
607 CHECK_NULL_VOID(frameNode);
608 ListModelNG::SetFlingSpeedLimit(frameNode, -1.0);
609 }
610
GetInitialIndex(ArkUINodeHandle node)611 ArkUI_Int32 GetInitialIndex(ArkUINodeHandle node)
612 {
613 auto* frameNode = reinterpret_cast<FrameNode*>(node);
614 CHECK_NULL_RETURN(frameNode, 0);
615 return ListModelNG::GetInitialIndex(frameNode);
616 }
617
GetlistDivider(ArkUINodeHandle node,ArkUIdividerOptions * option,ArkUI_Int32 unit)618 void GetlistDivider(ArkUINodeHandle node, ArkUIdividerOptions* option, ArkUI_Int32 unit)
619 {
620 auto* frameNode = reinterpret_cast<FrameNode*>(node);
621 CHECK_NULL_VOID(frameNode);
622 auto divider = ListModelNG::GetDivider(frameNode);
623 option->color = divider.color.GetValue();
624 option->strokeWidth = divider.strokeWidth.GetNativeValue(static_cast<DimensionUnit>(unit));
625 option->startMargin = divider.startMargin.GetNativeValue(static_cast<DimensionUnit>(unit));
626 option->endMargin = divider.endMargin.GetNativeValue(static_cast<DimensionUnit>(unit));
627 }
628
SetInitialScroller(ArkUINodeHandle node,ArkUINodeHandle controller,ArkUINodeHandle proxy)629 void SetInitialScroller(ArkUINodeHandle node, ArkUINodeHandle controller, ArkUINodeHandle proxy)
630 {
631 auto* frameNode = reinterpret_cast<FrameNode*>(node);
632 CHECK_NULL_VOID(frameNode);
633 auto listProxy = AceType::Claim(reinterpret_cast<ScrollProxy*>(proxy));
634 auto listController = AceType::Claim(reinterpret_cast<ScrollControllerBase*>(controller));
635 ListModelNG::SetScroller(frameNode, listController, listProxy);
636 }
637
ResetInitialScroller(ArkUINodeHandle node)638 void ResetInitialScroller(ArkUINodeHandle node)
639 {
640 auto* frameNode = reinterpret_cast<FrameNode*>(node);
641 CHECK_NULL_VOID(frameNode);
642 RefPtr<ScrollControllerBase> listController;
643 RefPtr<ScrollProxy> listProxy;
644 ListModelNG::SetScroller(frameNode, listController, listProxy);
645 }
646
SetListMaintainVisibleContentPosition(ArkUINodeHandle node,ArkUI_Bool enabled)647 void SetListMaintainVisibleContentPosition(ArkUINodeHandle node, ArkUI_Bool enabled)
648 {
649 auto* frameNode = reinterpret_cast<FrameNode*>(node);
650 CHECK_NULL_VOID(frameNode);
651 ListModelNG::SetListMaintainVisibleContentPosition(frameNode, enabled);
652 }
653
ResetListMaintainVisibleContentPosition(ArkUINodeHandle node)654 void ResetListMaintainVisibleContentPosition(ArkUINodeHandle node)
655 {
656 auto* frameNode = reinterpret_cast<FrameNode*>(node);
657 CHECK_NULL_VOID(frameNode);
658 ListModelNG::SetListMaintainVisibleContentPosition(frameNode, false);
659 }
660 } // namespace
661
662 namespace NodeModifier {
GetListModifier()663 const ArkUIListModifier* GetListModifier()
664 {
665 static const ArkUIListModifier modifier = { SetListLanes, ResetListLanes, SetEditMode, ResetEditMode,
666 SetMultiSelectable, ResetMultiSelectable, SetChainAnimation, ResetChainAnimation, SetCachedCount,
667 ResetCachedCount, GetEnableScrollInteraction, SetEnableScrollInteraction, ResetEnableScrollInteraction,
668 GetSticky, SetSticky, ResetSticky, GetListEdgeEffect, SetListEdgeEffect, ResetListEdgeEffect, GetListDirection,
669 SetListDirection, ResetListDirection, GetListFriction, SetListFriction, ResetListFriction,
670 GetListNestedScroll, SetListNestedScroll, ResetListNestedScroll, GetListScrollBar, SetListScrollBar,
671 ResetListScrollBar, GetListScrollBarWidth, SetListScrollBarWidth, ResetListScrollBarWidth,
672 GetListScrollBarColor, SetListScrollBarColor, ResetListScrollBarColor, GetAlignListItem, SetAlignListItem,
673 ResetAlignListItem, SetScrollSnapAlign, ResetScrollSnapAlign, SetContentStartOffset, ResetContentStartOffset,
674 SetContentEndOffset, ResetContentEndOffset, ListSetDivider, ListResetDivider, SetChainAnimationOptions,
675 ResetChainAnimationOptions, GetListSpace, SetListSpace, ResetListSpace, SetNodeAdapter, ResetNodeAdapter,
676 GetNodeAdapter, GetCachedCount, SetScrollToIndex, SetScrollBy, SetInitialIndex, ResetInitialIndex,
677 SetListChildrenMainSize, ResetListChildrenMainSize, SetListCloseAllSwipeActions,
678 SetListFlingSpeedLimit, ResetListFlingSpeedLimit, GetInitialIndex, GetlistDivider,
679 SetInitialScroller, ResetInitialScroller, SetListMaintainVisibleContentPosition,
680 ResetListMaintainVisibleContentPosition };
681 return &modifier;
682 }
683
GetCJUIListModifier()684 const CJUIListModifier* GetCJUIListModifier()
685 {
686 static const CJUIListModifier modifier = { SetListLanes, ResetListLanes, SetEditMode, ResetEditMode,
687 SetMultiSelectable, ResetMultiSelectable, SetChainAnimation, ResetChainAnimation, SetCachedCount,
688 ResetCachedCount, GetEnableScrollInteraction, SetEnableScrollInteraction, ResetEnableScrollInteraction,
689 GetSticky, SetSticky, ResetSticky, GetListEdgeEffect, SetListEdgeEffect, ResetListEdgeEffect, GetListDirection,
690 SetListDirection, ResetListDirection, GetListFriction, SetListFriction, ResetListFriction,
691 GetListNestedScroll, SetListNestedScroll, ResetListNestedScroll, GetListScrollBar, SetListScrollBar,
692 ResetListScrollBar, GetListScrollBarWidth, SetListScrollBarWidth, ResetListScrollBarWidth,
693 GetListScrollBarColor, SetListScrollBarColor, ResetListScrollBarColor, GetAlignListItem, SetAlignListItem,
694 ResetAlignListItem, SetScrollSnapAlign, ResetScrollSnapAlign, SetContentStartOffset, ResetContentStartOffset,
695 SetContentEndOffset, ResetContentEndOffset, ListSetDivider, ListResetDivider, SetChainAnimationOptions,
696 ResetChainAnimationOptions, GetListSpace, SetListSpace, ResetListSpace, SetNodeAdapter, ResetNodeAdapter,
697 GetNodeAdapter, GetCachedCount, SetScrollToIndex, SetScrollBy, SetInitialIndex, ResetInitialIndex,
698 SetListChildrenMainSize, ResetListChildrenMainSize, SetListCloseAllSwipeActions,
699 SetListFlingSpeedLimit, ResetListFlingSpeedLimit, GetInitialIndex, GetlistDivider };
700 return &modifier;
701 }
702
SetOnListScroll(ArkUINodeHandle node,void * extraParam)703 void SetOnListScroll(ArkUINodeHandle node, void* extraParam)
704 {
705 auto* frameNode = reinterpret_cast<FrameNode*>(node);
706 CHECK_NULL_VOID(frameNode);
707 auto onScroll = [node, extraParam](Dimension scrollOffset, ScrollState scrollState) {
708 ArkUINodeEvent event;
709 event.kind = COMPONENT_ASYNC_EVENT;
710 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
711 event.componentAsyncEvent.subKind = ON_LIST_SCROLL;
712 event.componentAsyncEvent.data[0].f32 = static_cast<float>(scrollOffset.Value());
713 event.componentAsyncEvent.data[1].i32 = static_cast<int>(scrollState);
714 SendArkUIAsyncEvent(&event);
715 };
716 ListModelNG::SetOnScroll(frameNode, std::move(onScroll));
717 }
718
SetOnListScrollFrameBegin(ArkUINodeHandle node,void * extraParam)719 void SetOnListScrollFrameBegin(ArkUINodeHandle node, void* extraParam)
720 {
721 auto* frameNode = reinterpret_cast<FrameNode*>(node);
722 CHECK_NULL_VOID(frameNode);
723 int32_t nodeId = frameNode->GetId();
724 auto onScrollFrameBegin = [nodeId, node, extraParam](
725 const Dimension& offset, const ScrollState& state) -> ScrollFrameResult {
726 ScrollFrameResult scrollRes { .offset = offset };
727 ArkUINodeEvent event;
728 event.kind = COMPONENT_ASYNC_EVENT;
729 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
730 event.componentAsyncEvent.subKind = ON_LIST_SCROLL_FRAME_BEGIN;
731 event.componentAsyncEvent.data[0].f32 = static_cast<float>(offset.Value());
732 event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
733 SendArkUIAsyncEvent(&event);
734 scrollRes.offset = Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::VP);
735 return scrollRes;
736 };
737 ListModelNG::SetOnScrollFrameBegin(frameNode, std::move(onScrollFrameBegin));
738 }
739
SetOnListScrollStart(ArkUINodeHandle node,void * extraParam)740 void SetOnListScrollStart(ArkUINodeHandle node, void* extraParam)
741 {
742 auto* frameNode = reinterpret_cast<FrameNode*>(node);
743 CHECK_NULL_VOID(frameNode);
744 int32_t nodeId = frameNode->GetId();
745 auto onScrollStart = [nodeId, node, extraParam]() -> void {
746 ArkUINodeEvent event;
747 event.kind = COMPONENT_ASYNC_EVENT;
748 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
749 event.componentAsyncEvent.subKind = ON_LIST_SCROLL_START;
750 SendArkUIAsyncEvent(&event);
751 };
752 ListModelNG::SetOnScrollStart(frameNode, std::move(onScrollStart));
753 }
754
SetOnListScrollStop(ArkUINodeHandle node,void * extraParam)755 void SetOnListScrollStop(ArkUINodeHandle node, void* extraParam)
756 {
757 auto* frameNode = reinterpret_cast<FrameNode*>(node);
758 CHECK_NULL_VOID(frameNode);
759 int32_t nodeId = frameNode->GetId();
760 auto onScrollStop = [nodeId, node, extraParam]() -> void {
761 ArkUINodeEvent event;
762 event.kind = COMPONENT_ASYNC_EVENT;
763 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
764 event.componentAsyncEvent.subKind = ON_LIST_SCROLL_STOP;
765 SendArkUIAsyncEvent(&event);
766 };
767 ListModelNG::SetOnScrollStop(frameNode, std::move(onScrollStop));
768 }
769
SetOnListWillScroll(ArkUINodeHandle node,void * extraParam)770 void SetOnListWillScroll(ArkUINodeHandle node, void* extraParam)
771 {
772 auto* frameNode = reinterpret_cast<FrameNode*>(node);
773 CHECK_NULL_VOID(frameNode);
774 int32_t nodeId = frameNode->GetId();
775 auto onWillScroll = [nodeId, node, extraParam](const Dimension& offset, const ScrollState& state,
776 ScrollSource source) -> ScrollFrameResult {
777 ScrollFrameResult scrollRes { .offset = offset };
778 ArkUINodeEvent event;
779 bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
780 event.kind = COMPONENT_ASYNC_EVENT;
781 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
782 event.componentAsyncEvent.subKind = ON_LIST_WILL_SCROLL;
783 event.componentAsyncEvent.data[0].f32 =
784 usePx ? static_cast<float>(offset.ConvertToPx()) : static_cast<float>(offset.Value());
785 event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
786 event.componentAsyncEvent.data[2].i32 = static_cast<int>(source);
787 SendArkUIAsyncEvent(&event);
788 scrollRes.offset =
789 Dimension(event.componentAsyncEvent.data[0].f32, usePx ? DimensionUnit::PX : DimensionUnit::VP);
790 return scrollRes;
791 };
792 ScrollableModelNG::SetOnWillScroll(frameNode, std::move(onWillScroll));
793 }
794
SetOnListDidScroll(ArkUINodeHandle node,void * extraParam)795 void SetOnListDidScroll(ArkUINodeHandle node, void* extraParam)
796 {
797 auto* frameNode = reinterpret_cast<FrameNode*>(node);
798 CHECK_NULL_VOID(frameNode);
799 int32_t nodeId = frameNode->GetId();
800 auto onDidScroll = [nodeId, node, extraParam](const Dimension& offset, const ScrollState& state) -> void {
801 ArkUINodeEvent event;
802 event.kind = COMPONENT_ASYNC_EVENT;
803 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
804 bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
805 event.componentAsyncEvent.subKind = ON_LIST_DID_SCROLL;
806 event.componentAsyncEvent.data[0].f32 =
807 usePx ? static_cast<float>(offset.ConvertToPx()) : static_cast<float>(offset.Value());
808 event.componentAsyncEvent.data[1].i32 = static_cast<int32_t>(state);
809 SendArkUIAsyncEvent(&event);
810 };
811 ScrollableModelNG::SetOnDidScroll(frameNode, std::move(onDidScroll));
812 }
813
SetOnListScrollIndex(ArkUINodeHandle node,void * extraParam)814 void SetOnListScrollIndex(ArkUINodeHandle node, void* extraParam)
815 {
816 auto* frameNode = reinterpret_cast<FrameNode*>(node);
817 CHECK_NULL_VOID(frameNode);
818 int32_t nodeId = frameNode->GetId();
819 auto onScrollIndex = [nodeId, node, extraParam](int32_t first, int32_t last, int32_t center) -> void {
820 ArkUINodeEvent event;
821 event.kind = COMPONENT_ASYNC_EVENT;
822 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
823 event.componentAsyncEvent.subKind = ON_LIST_SCROLL_INDEX;
824 event.componentAsyncEvent.data[0].i32 = first;
825 event.componentAsyncEvent.data[1].i32 = last;
826 event.componentAsyncEvent.data[2].i32 = center;
827 SendArkUIAsyncEvent(&event);
828 };
829 ListModelNG::SetOnScrollIndex(frameNode, std::move(onScrollIndex));
830 }
831
SetOnListReachStart(ArkUINodeHandle node,void * extraParam)832 void SetOnListReachStart(ArkUINodeHandle node, void* extraParam)
833 {
834 auto* frameNode = reinterpret_cast<FrameNode*>(node);
835 CHECK_NULL_VOID(frameNode);
836 auto onReachStart = [node, extraParam]() -> void {
837 ArkUINodeEvent event;
838 event.kind = COMPONENT_ASYNC_EVENT;
839 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
840 event.componentAsyncEvent.subKind = ON_LIST_REACH_START;
841 SendArkUIAsyncEvent(&event);
842 };
843 ListModelNG::SetOnReachStart(frameNode, std::move(onReachStart));
844 }
845
SetOnListReachEnd(ArkUINodeHandle node,void * extraParam)846 void SetOnListReachEnd(ArkUINodeHandle node, void* extraParam)
847 {
848 auto* frameNode = reinterpret_cast<FrameNode*>(node);
849 CHECK_NULL_VOID(frameNode);
850 auto onReachEnd = [node, extraParam]() -> void {
851 ArkUINodeEvent event;
852 event.kind = COMPONENT_ASYNC_EVENT;
853 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
854 event.componentAsyncEvent.subKind = ON_LIST_REACH_END;
855 SendArkUIAsyncEvent(&event);
856 };
857 ListModelNG::SetOnReachEnd(frameNode, std::move(onReachEnd));
858 }
859
ResetOnListScroll(ArkUINodeHandle node)860 void ResetOnListScroll(ArkUINodeHandle node)
861 {
862 auto* frameNode = reinterpret_cast<FrameNode*>(node);
863 CHECK_NULL_VOID(frameNode);
864 ListModelNG::SetOnScroll(frameNode, nullptr);
865 }
ResetOnListScrollIndex(ArkUINodeHandle node)866 void ResetOnListScrollIndex(ArkUINodeHandle node)
867 {
868 auto* frameNode = reinterpret_cast<FrameNode*>(node);
869 CHECK_NULL_VOID(frameNode);
870 ListModelNG::SetOnScrollIndex(frameNode, nullptr);
871 }
ResetOnListScrollStart(ArkUINodeHandle node)872 void ResetOnListScrollStart(ArkUINodeHandle node)
873 {
874 auto* frameNode = reinterpret_cast<FrameNode*>(node);
875 CHECK_NULL_VOID(frameNode);
876 ListModelNG::SetOnScrollStart(frameNode, nullptr);
877 }
ResetOnListScrollStop(ArkUINodeHandle node)878 void ResetOnListScrollStop(ArkUINodeHandle node)
879 {
880 auto* frameNode = reinterpret_cast<FrameNode*>(node);
881 CHECK_NULL_VOID(frameNode);
882 ListModelNG::SetOnScrollStop(frameNode, nullptr);
883 }
ResetOnListScrollFrameBegin(ArkUINodeHandle node)884 void ResetOnListScrollFrameBegin(ArkUINodeHandle node)
885 {
886 auto* frameNode = reinterpret_cast<FrameNode*>(node);
887 CHECK_NULL_VOID(frameNode);
888 ListModelNG::SetOnScrollFrameBegin(frameNode, nullptr);
889 }
ResetOnListWillScroll(ArkUINodeHandle node)890 void ResetOnListWillScroll(ArkUINodeHandle node)
891 {
892 auto* frameNode = reinterpret_cast<FrameNode*>(node);
893 CHECK_NULL_VOID(frameNode);
894 ScrollableModelNG::SetOnWillScroll(frameNode, nullptr);
895 }
ResetOnListDidScroll(ArkUINodeHandle node)896 void ResetOnListDidScroll(ArkUINodeHandle node)
897 {
898 auto* frameNode = reinterpret_cast<FrameNode*>(node);
899 CHECK_NULL_VOID(frameNode);
900 ScrollableModelNG::SetOnDidScroll(frameNode, nullptr);
901 }
ResetOnListReachStart(ArkUINodeHandle node)902 void ResetOnListReachStart(ArkUINodeHandle node)
903 {
904 auto* frameNode = reinterpret_cast<FrameNode*>(node);
905 CHECK_NULL_VOID(frameNode);
906 ListModelNG::SetOnReachStart(frameNode, nullptr);
907 }
ResetOnListReachEnd(ArkUINodeHandle node)908 void ResetOnListReachEnd(ArkUINodeHandle node)
909 {
910 auto* frameNode = reinterpret_cast<FrameNode*>(node);
911 CHECK_NULL_VOID(frameNode);
912 ListModelNG::SetOnReachEnd(frameNode, nullptr);
913 }
914 } // namespace NodeModifier
915 } // namespace OHOS::Ace::NG
916