• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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