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 constexpr Dimension DEFAULT_FADING_EDGE_LENGTH = Dimension(32.0f, DimensionUnit::VP); // default value
45 
46 constexpr int32_t ERROR_INT_CODE = -1;
47 constexpr int32_t CALL_STROKE_WIDTH = 0;
48 constexpr int32_t CALL_START_MARGIN = 1;
49 constexpr int32_t CALL_END_MARGIN = 2;
50 constexpr int32_t INDEX_0 = 0;
51 constexpr int32_t INDEX_1 = 1;
52 constexpr int32_t INDEX_2 = 2;
53 
SetListLanes(ArkUINodeHandle node,ArkUI_Int32 lanesNum,const struct ArkUIDimensionType * minLengthType,const struct ArkUIDimensionType * maxLengthType,const struct ArkUIDimensionType * gutterType)54 void SetListLanes(ArkUINodeHandle node, ArkUI_Int32 lanesNum, const struct ArkUIDimensionType* minLengthType,
55     const struct ArkUIDimensionType* maxLengthType, const struct ArkUIDimensionType* gutterType)
56 {
57     auto* frameNode = reinterpret_cast<FrameNode*>(node);
58     CHECK_NULL_VOID(frameNode);
59     if (lanesNum > 0) {
60         ListModelNG::SetLanes(frameNode, lanesNum);
61         Dimension minLength =
62             Dimension(minLengthType->value, static_cast<OHOS::Ace::DimensionUnit>(minLengthType->units));
63         Dimension maxLength =
64             Dimension(maxLengthType->value, static_cast<OHOS::Ace::DimensionUnit>(maxLengthType->units));
65         ListModelNG::SetLaneConstrain(frameNode, minLength, maxLength);
66     } else {
67         Dimension minLength =
68             Dimension(minLengthType->value, static_cast<OHOS::Ace::DimensionUnit>(minLengthType->units));
69         Dimension maxLength =
70             Dimension(maxLengthType->value, static_cast<OHOS::Ace::DimensionUnit>(maxLengthType->units));
71         ListModelNG::SetLaneConstrain(frameNode, minLength, maxLength);
72         ListModelNG::SetLanes(frameNode, 1);
73     }
74 
75     Dimension gutter = Dimension(gutterType->value, static_cast<OHOS::Ace::DimensionUnit>(gutterType->units));
76     ListModelNG::SetLaneGutter(frameNode, gutter);
77 }
78 
ResetListLanes(ArkUINodeHandle node)79 void ResetListLanes(ArkUINodeHandle node)
80 {
81     auto* frameNode = reinterpret_cast<FrameNode*>(node);
82     CHECK_NULL_VOID(frameNode);
83     ListModelNG::SetLanes(frameNode, 1);
84     ListModelNG::SetLaneGutter(frameNode, Dimension(0));
85 }
86 
SetEditMode(ArkUINodeHandle node,ArkUI_Bool editMode)87 void SetEditMode(ArkUINodeHandle node, ArkUI_Bool editMode)
88 {
89     auto* frameNode = reinterpret_cast<FrameNode*>(node);
90     CHECK_NULL_VOID(frameNode);
91     ListModelNG::SetEditMode(frameNode, editMode);
92 }
93 
ResetEditMode(ArkUINodeHandle node)94 void ResetEditMode(ArkUINodeHandle node)
95 {
96     auto* frameNode = reinterpret_cast<FrameNode*>(node);
97     CHECK_NULL_VOID(frameNode);
98     ListModelNG::SetEditMode(frameNode, false);
99 }
100 
SetMultiSelectable(ArkUINodeHandle node,ArkUI_Bool selectable)101 void SetMultiSelectable(ArkUINodeHandle node, ArkUI_Bool selectable)
102 {
103     auto* frameNode = reinterpret_cast<FrameNode*>(node);
104     CHECK_NULL_VOID(frameNode);
105     ListModelNG::SetMultiSelectable(frameNode, selectable);
106 }
107 
ResetMultiSelectable(ArkUINodeHandle node)108 void ResetMultiSelectable(ArkUINodeHandle node)
109 {
110     auto* frameNode = reinterpret_cast<FrameNode*>(node);
111     CHECK_NULL_VOID(frameNode);
112     ListModelNG::SetMultiSelectable(frameNode, false);
113 }
114 
SetChainAnimation(ArkUINodeHandle node,ArkUI_Bool chainAnimation)115 void SetChainAnimation(ArkUINodeHandle node, ArkUI_Bool chainAnimation)
116 {
117     auto* frameNode = reinterpret_cast<FrameNode*>(node);
118     CHECK_NULL_VOID(frameNode);
119     ListModelNG::SetChainAnimation(frameNode, chainAnimation);
120 }
121 
ResetChainAnimation(ArkUINodeHandle node)122 void ResetChainAnimation(ArkUINodeHandle node)
123 {
124     auto* frameNode = reinterpret_cast<FrameNode*>(node);
125     CHECK_NULL_VOID(frameNode);
126     ListModelNG::SetChainAnimation(frameNode, false);
127 }
128 
SetCachedCount(ArkUINodeHandle node,ArkUI_Int32 cachedCount)129 void SetCachedCount(ArkUINodeHandle node, ArkUI_Int32 cachedCount)
130 {
131     auto* frameNode = reinterpret_cast<FrameNode*>(node);
132     CHECK_NULL_VOID(frameNode);
133     if (cachedCount < 0) {
134         cachedCount = 1;
135     }
136     ListModelNG::SetCachedCount(frameNode, cachedCount);
137 }
138 
ResetCachedCount(ArkUINodeHandle node)139 void ResetCachedCount(ArkUINodeHandle node)
140 {
141     auto* frameNode = reinterpret_cast<FrameNode*>(node);
142     CHECK_NULL_VOID(frameNode);
143     ListModelNG::SetCachedCount(frameNode, DEFAULT_CACHED_COUNT);
144 }
145 
GetEnableScrollInteraction(ArkUINodeHandle node)146 ArkUI_Bool GetEnableScrollInteraction(ArkUINodeHandle node)
147 {
148     auto* frameNode = reinterpret_cast<FrameNode*>(node);
149     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
150     return ListModelNG::GetScrollEnabled(frameNode);
151 }
152 
SetEnableScrollInteraction(ArkUINodeHandle node,ArkUI_Bool enableScrollInteraction)153 void SetEnableScrollInteraction(ArkUINodeHandle node, ArkUI_Bool enableScrollInteraction)
154 {
155     auto* frameNode = reinterpret_cast<FrameNode*>(node);
156     CHECK_NULL_VOID(frameNode);
157     ListModelNG::SetScrollEnabled(frameNode, enableScrollInteraction);
158 }
159 
ResetEnableScrollInteraction(ArkUINodeHandle node)160 void ResetEnableScrollInteraction(ArkUINodeHandle node)
161 {
162     auto* frameNode = reinterpret_cast<FrameNode*>(node);
163     CHECK_NULL_VOID(frameNode);
164     ListModelNG::SetScrollEnabled(frameNode, DEFAULT_SCROLL_ENABLE);
165 }
166 
GetSticky(ArkUINodeHandle node)167 ArkUI_Int32 GetSticky(ArkUINodeHandle node)
168 {
169     auto* frameNode = reinterpret_cast<FrameNode*>(node);
170     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
171     return ListModelNG::GetSticky(frameNode);
172 }
173 
SetSticky(ArkUINodeHandle node,ArkUI_Int32 stickyStyle)174 void SetSticky(ArkUINodeHandle node, ArkUI_Int32 stickyStyle)
175 {
176     auto* frameNode = reinterpret_cast<FrameNode*>(node);
177     CHECK_NULL_VOID(frameNode);
178     ListModelNG::SetSticky(frameNode, stickyStyle);
179 }
180 
ResetSticky(ArkUINodeHandle node)181 void ResetSticky(ArkUINodeHandle node)
182 {
183     auto* frameNode = reinterpret_cast<FrameNode*>(node);
184     CHECK_NULL_VOID(frameNode);
185     ListModelNG::SetSticky(frameNode, DEFAULT_STICKY_STYLE);
186 }
187 
GetListSpace(ArkUINodeHandle node)188 ArkUI_Float32 GetListSpace(ArkUINodeHandle node)
189 {
190     auto* frameNode = reinterpret_cast<FrameNode*>(node);
191     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
192     return ListModelNG::GetListSpace(frameNode);
193 }
194 
SetListSpace(ArkUINodeHandle node,ArkUI_Float32 space)195 void SetListSpace(ArkUINodeHandle node, ArkUI_Float32 space)
196 {
197     auto* frameNode = reinterpret_cast<FrameNode*>(node);
198     CHECK_NULL_VOID(frameNode);
199     ListModelNG::SetListSpace(frameNode, Dimension(space, DimensionUnit::VP));
200 }
201 
ResetListSpace(ArkUINodeHandle node)202 void ResetListSpace(ArkUINodeHandle node)
203 {
204     auto* frameNode = reinterpret_cast<FrameNode*>(node);
205     CHECK_NULL_VOID(frameNode);
206     ListModelNG::SetListSpace(frameNode, Dimension(0, DimensionUnit::VP));
207 }
208 
GetListEdgeEffect(ArkUINodeHandle node,ArkUI_Int32 (* values)[2])209 ArkUI_Int32 GetListEdgeEffect(ArkUINodeHandle node, ArkUI_Int32 (*values)[2])
210 {
211     auto* frameNode = reinterpret_cast<FrameNode*>(node);
212     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
213     (*values)[INDEX_0] = ListModelNG::GetEdgeEffect(frameNode);
214     (*values)[INDEX_1] = ListModelNG::GetEdgeEffectAlways(frameNode);
215     return INDEX_2;
216 }
217 
SetListEdgeEffect(ArkUINodeHandle node,ArkUI_Int32 edgeEffect,ArkUI_Bool alwaysEnabled)218 void SetListEdgeEffect(ArkUINodeHandle node, ArkUI_Int32 edgeEffect, ArkUI_Bool alwaysEnabled)
219 {
220     auto* frameNode = reinterpret_cast<FrameNode*>(node);
221     CHECK_NULL_VOID(frameNode);
222     ListModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled);
223 }
224 
ResetListEdgeEffect(ArkUINodeHandle node)225 void ResetListEdgeEffect(ArkUINodeHandle node)
226 {
227     auto* frameNode = reinterpret_cast<FrameNode*>(node);
228     CHECK_NULL_VOID(frameNode);
229     ListModelNG::SetEdgeEffect(frameNode, DEFAULT_EDGE_EFFECT, false);
230 }
231 
GetListDirection(ArkUINodeHandle node)232 ArkUI_Int32 GetListDirection(ArkUINodeHandle node)
233 {
234     auto* frameNode = reinterpret_cast<FrameNode*>(node);
235     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
236     return ListModelNG::GetListDirection(frameNode);
237 }
238 
SetListDirection(ArkUINodeHandle node,ArkUI_Int32 axis)239 void SetListDirection(ArkUINodeHandle node, ArkUI_Int32 axis)
240 {
241     auto* frameNode = reinterpret_cast<FrameNode*>(node);
242     CHECK_NULL_VOID(frameNode);
243     ListModelNG::SetListDirection(frameNode, axis);
244 }
245 
ResetListDirection(ArkUINodeHandle node)246 void ResetListDirection(ArkUINodeHandle node)
247 {
248     auto* frameNode = reinterpret_cast<FrameNode*>(node);
249     CHECK_NULL_VOID(frameNode);
250     ListModelNG::SetListDirection(frameNode, DEFAULT_DIRECTION);
251 }
252 
GetListFriction(ArkUINodeHandle node)253 ArkUI_Float32 GetListFriction(ArkUINodeHandle node)
254 {
255     auto* frameNode = reinterpret_cast<FrameNode*>(node);
256     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
257     return ListModelNG::GetListFriction(frameNode);
258 }
259 
SetListFriction(ArkUINodeHandle node,ArkUI_Float32 friction)260 void SetListFriction(ArkUINodeHandle node, ArkUI_Float32 friction)
261 {
262     auto* frameNode = reinterpret_cast<FrameNode*>(node);
263     CHECK_NULL_VOID(frameNode);
264     ListModelNG::SetListFriction(frameNode, friction);
265 }
266 
ResetListFriction(ArkUINodeHandle node)267 void ResetListFriction(ArkUINodeHandle node)
268 {
269     auto* frameNode = reinterpret_cast<FrameNode*>(node);
270     CHECK_NULL_VOID(frameNode);
271     double friction = -1.0;
272     ListModelNG::SetListFriction(frameNode, friction);
273 }
274 
GetListNestedScroll(ArkUINodeHandle node,ArkUI_Int32 (* values)[2])275 void GetListNestedScroll(ArkUINodeHandle node, ArkUI_Int32 (*values)[2])
276 {
277     auto* frameNode = reinterpret_cast<FrameNode*>(node);
278     CHECK_NULL_VOID(frameNode);
279     NestedScrollOptions options = ListModelNG::GetListNestedScroll(frameNode);
280     (*values)[0] = static_cast<ArkUI_Int32>(options.forward);
281     (*values)[1] = static_cast<ArkUI_Int32>(options.backward);
282 }
283 
SetListNestedScroll(ArkUINodeHandle node,ArkUI_Int32 forward,ArkUI_Int32 backward)284 void SetListNestedScroll(ArkUINodeHandle node, ArkUI_Int32 forward, ArkUI_Int32 backward)
285 {
286     NestedScrollOptions opt = {
287         .forward = static_cast<NestedScrollMode>(forward),
288         .backward = static_cast<NestedScrollMode>(backward),
289     };
290     auto* frameNode = reinterpret_cast<FrameNode*>(node);
291     CHECK_NULL_VOID(frameNode);
292     ListModelNG::SetListNestedScroll(frameNode, opt);
293 }
294 
ResetListNestedScroll(ArkUINodeHandle node)295 void ResetListNestedScroll(ArkUINodeHandle node)
296 {
297     auto* frameNode = reinterpret_cast<FrameNode*>(node);
298     CHECK_NULL_VOID(frameNode);
299     const NestedScrollOptions nestedOpt = {
300         .forward = NestedScrollMode::SELF_ONLY,
301         .backward = NestedScrollMode::SELF_ONLY,
302     };
303     ListModelNG::SetListNestedScroll(frameNode, nestedOpt);
304 }
305 
GetListScrollBar(ArkUINodeHandle node)306 ArkUI_Int32 GetListScrollBar(ArkUINodeHandle node)
307 {
308     auto* frameNode = reinterpret_cast<FrameNode*>(node);
309     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
310     return ListModelNG::GetListScrollBar(frameNode);
311 }
312 
SetListScrollBar(ArkUINodeHandle node,ArkUI_Int32 barState)313 void SetListScrollBar(ArkUINodeHandle node, ArkUI_Int32 barState)
314 {
315     auto* frameNode = reinterpret_cast<FrameNode*>(node);
316     CHECK_NULL_VOID(frameNode);
317     ListModelNG::SetListScrollBar(frameNode, barState);
318 }
319 
ResetListScrollBar(ArkUINodeHandle node)320 void ResetListScrollBar(ArkUINodeHandle node)
321 {
322     auto* frameNode = reinterpret_cast<FrameNode*>(node);
323     CHECK_NULL_VOID(frameNode);
324     ListModelNG::SetListScrollBar(frameNode, DEFAULT_SCROLL_BAR);
325 }
326 
GetListScrollBarWidth(ArkUINodeHandle node)327 ArkUI_Float32 GetListScrollBarWidth(ArkUINodeHandle node)
328 {
329     auto* frameNode = reinterpret_cast<FrameNode*>(node);
330     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
331     return ListModelNG::GetScrollBarWidth(frameNode);
332 }
333 
SetListScrollBarWidth(ArkUINodeHandle node,ArkUI_CharPtr value)334 void SetListScrollBarWidth(ArkUINodeHandle node, ArkUI_CharPtr value)
335 {
336     CHECK_NULL_VOID(value);
337     auto* frameNode = reinterpret_cast<FrameNode*>(node);
338     CHECK_NULL_VOID(frameNode);
339     ListModelNG::SetListScrollBarWidth(frameNode, value);
340 }
341 
ResetListScrollBarWidth(ArkUINodeHandle node)342 void ResetListScrollBarWidth(ArkUINodeHandle node)
343 {
344     auto* frameNode = reinterpret_cast<FrameNode*>(node);
345     CHECK_NULL_VOID(frameNode);
346     ListModelNG::SetListScrollBarWidth(frameNode, "0vp");
347 }
348 
GetListScrollBarColor(ArkUINodeHandle node)349 ArkUI_Uint32 GetListScrollBarColor(ArkUINodeHandle node)
350 {
351     auto* frameNode = reinterpret_cast<FrameNode*>(node);
352     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
353     return ListModelNG::GetScrollBarColor(frameNode);
354 }
355 
SetListScrollBarColor(ArkUINodeHandle node,ArkUI_CharPtr value)356 void SetListScrollBarColor(ArkUINodeHandle node, ArkUI_CharPtr value)
357 {
358     CHECK_NULL_VOID(value);
359     auto* frameNode = reinterpret_cast<FrameNode*>(node);
360     CHECK_NULL_VOID(frameNode);
361     ListModelNG::SetListScrollBarColor(frameNode, value);
362 }
363 
ResetListScrollBarColor(ArkUINodeHandle node)364 void ResetListScrollBarColor(ArkUINodeHandle node)
365 {
366     auto* frameNode = reinterpret_cast<FrameNode*>(node);
367     CHECK_NULL_VOID(frameNode);
368     ListModelNG::SetListScrollBarColor(frameNode, "#FF000000");
369 }
370 
GetAlignListItem(ArkUINodeHandle node)371 ArkUI_Int32 GetAlignListItem(ArkUINodeHandle node)
372 {
373     auto* frameNode = reinterpret_cast<FrameNode*>(node);
374     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
375     return ListModelNG::GetListItemAlign(frameNode);
376 }
377 
SetAlignListItem(ArkUINodeHandle node,ArkUI_Int32 listItemAlign)378 void SetAlignListItem(ArkUINodeHandle node, ArkUI_Int32 listItemAlign)
379 {
380     auto* frameNode = reinterpret_cast<FrameNode*>(node);
381     CHECK_NULL_VOID(frameNode);
382     ListModelNG::SetListItemAlign(frameNode, static_cast<V2::ListItemAlign>(listItemAlign));
383 }
384 
ResetAlignListItem(ArkUINodeHandle node)385 void ResetAlignListItem(ArkUINodeHandle node)
386 {
387     auto* frameNode = reinterpret_cast<FrameNode*>(node);
388     CHECK_NULL_VOID(frameNode);
389     ListModelNG::SetListItemAlign(frameNode, V2::ListItemAlign::START);
390 }
391 
SetScrollSnapAlign(ArkUINodeHandle node,ArkUI_Int32 scrollSnapAlign)392 void SetScrollSnapAlign(ArkUINodeHandle node, ArkUI_Int32 scrollSnapAlign)
393 {
394     auto* frameNode = reinterpret_cast<FrameNode*>(node);
395     CHECK_NULL_VOID(frameNode);
396     ListModelNG::SetScrollSnapAlign(frameNode, static_cast<V2::ScrollSnapAlign>(scrollSnapAlign));
397 }
398 
ResetScrollSnapAlign(ArkUINodeHandle node)399 void ResetScrollSnapAlign(ArkUINodeHandle node)
400 {
401     auto* frameNode = reinterpret_cast<FrameNode*>(node);
402     CHECK_NULL_VOID(frameNode);
403     ListModelNG::SetScrollSnapAlign(frameNode, V2::ScrollSnapAlign::NONE);
404 }
405 
SetContentStartOffset(ArkUINodeHandle node,ArkUI_Float32 startOffset)406 void SetContentStartOffset(ArkUINodeHandle node, ArkUI_Float32 startOffset)
407 {
408     auto* frameNode = reinterpret_cast<FrameNode*>(node);
409     CHECK_NULL_VOID(frameNode);
410     ListModelNG::SetContentStartOffset(frameNode, startOffset);
411 }
412 
ResetContentStartOffset(ArkUINodeHandle node)413 void ResetContentStartOffset(ArkUINodeHandle node)
414 {
415     auto* frameNode = reinterpret_cast<FrameNode*>(node);
416     CHECK_NULL_VOID(frameNode);
417     ListModelNG::SetContentStartOffset(frameNode, DEFAULT_OFFSET);
418 }
419 
SetContentEndOffset(ArkUINodeHandle node,ArkUI_Float32 endOffset)420 void SetContentEndOffset(ArkUINodeHandle node, ArkUI_Float32 endOffset)
421 {
422     auto* frameNode = reinterpret_cast<FrameNode*>(node);
423     CHECK_NULL_VOID(frameNode);
424     ListModelNG::SetContentEndOffset(frameNode, endOffset);
425 }
426 
ResetContentEndOffset(ArkUINodeHandle node)427 void ResetContentEndOffset(ArkUINodeHandle node)
428 {
429     auto* frameNode = reinterpret_cast<FrameNode*>(node);
430     CHECK_NULL_VOID(frameNode);
431     ListModelNG::SetContentEndOffset(frameNode, DEFAULT_OFFSET);
432 }
433 
ListSetDivider(ArkUINodeHandle node,ArkUI_Uint32 color,const ArkUI_Float32 * values,const int32_t * units,ArkUI_Int32 length)434 void ListSetDivider(
435     ArkUINodeHandle node, ArkUI_Uint32 color, const ArkUI_Float32* values, const int32_t* units, ArkUI_Int32 length)
436 {
437     auto* frameNode = reinterpret_cast<FrameNode*>(node);
438     CHECK_NULL_VOID(frameNode);
439 
440     if (length != DEFAULT_DIVIDER_VALUES_COUNT) {
441         return;
442     }
443 
444     V2::ItemDivider divider;
445     divider.color = Color(color);
446     divider.strokeWidth =
447         Dimension(values[CALL_STROKE_WIDTH], static_cast<OHOS::Ace::DimensionUnit>(units[CALL_STROKE_WIDTH]));
448     divider.startMargin =
449         Dimension(values[CALL_START_MARGIN], static_cast<OHOS::Ace::DimensionUnit>(units[CALL_START_MARGIN]));
450     divider.endMargin =
451         Dimension(values[CALL_END_MARGIN], static_cast<OHOS::Ace::DimensionUnit>(units[CALL_END_MARGIN]));
452 
453     ListModelNG::SetDivider(frameNode, divider);
454 }
455 
ListResetDivider(ArkUINodeHandle node)456 void ListResetDivider(ArkUINodeHandle node)
457 {
458     auto* frameNode = reinterpret_cast<FrameNode*>(node);
459     CHECK_NULL_VOID(frameNode);
460     const V2::ItemDivider divider;
461 
462     ListModelNG::SetDivider(frameNode, divider);
463 }
464 
SetChainAnimationOptions(ArkUINodeHandle node,const struct ArkUIChainAnimationOptionsType * chainAnimationOptions)465 void SetChainAnimationOptions(ArkUINodeHandle node, const struct ArkUIChainAnimationOptionsType* chainAnimationOptions)
466 {
467     auto* frameNode = reinterpret_cast<FrameNode*>(node);
468     CHECK_NULL_VOID(frameNode);
469 
470     ChainAnimationOptions options;
471     options.minSpace = CalcDimension(
472         chainAnimationOptions->minSpace, static_cast<OHOS::Ace::DimensionUnit>(chainAnimationOptions->minSpaceUnits));
473     options.maxSpace = CalcDimension(
474         chainAnimationOptions->maxSpace, static_cast<OHOS::Ace::DimensionUnit>(chainAnimationOptions->maxSpaceUnits));
475     options.conductivity = chainAnimationOptions->conductivity;
476     options.intensity = chainAnimationOptions->intensity;
477     options.edgeEffect = chainAnimationOptions->edgeEffect;
478     options.stiffness = chainAnimationOptions->stiffness;
479     options.damping = chainAnimationOptions->damping;
480     ListModelNG::SetChainAnimationOptions(frameNode, options);
481 }
482 
ResetChainAnimationOptions(ArkUINodeHandle node)483 void ResetChainAnimationOptions(ArkUINodeHandle node)
484 {
485     auto* frameNode = reinterpret_cast<FrameNode*>(node);
486     CHECK_NULL_VOID(frameNode);
487     RefPtr<ListTheme> listTheme = GetTheme<ListTheme>();
488     CHECK_NULL_VOID(listTheme);
489     ChainAnimationOptions options = {
490         .minSpace = listTheme->GetChainMinSpace(),
491         .maxSpace = listTheme->GetChainMaxSpace(),
492         .conductivity = listTheme->GetChainConductivity(),
493         .intensity = listTheme->GetChainIntensity(),
494         .edgeEffect = 0,
495         .stiffness = listTheme->GetChainStiffness(),
496         .damping = listTheme->GetChainDamping(),
497     };
498 
499     ListModelNG::SetChainAnimationOptions(frameNode, options);
500 }
501 
SetNodeAdapter(ArkUINodeHandle node,ArkUINodeAdapterHandle handle)502 ArkUI_Int32 SetNodeAdapter(ArkUINodeHandle node, ArkUINodeAdapterHandle handle)
503 {
504     auto* frameNode = reinterpret_cast<FrameNode*>(node);
505     CHECK_NULL_RETURN(frameNode, ERROR_CODE_PARAM_INVALID);
506     auto totalChildCount = frameNode->TotalChildCount();
507     if (totalChildCount > 0) {
508         return ERROR_CODE_NATIVE_IMPL_NODE_ADAPTER_CHILD_NODE_EXIST;
509     }
510     NodeAdapter::GetNodeAdapterAPI()->attachHostNode(handle, node);
511     return ERROR_CODE_NO_ERROR;
512 }
513 
ResetNodeAdapter(ArkUINodeHandle node)514 void ResetNodeAdapter(ArkUINodeHandle node)
515 {
516     NodeAdapter::GetNodeAdapterAPI()->detachHostNode(node);
517 }
518 
GetNodeAdapter(ArkUINodeHandle node)519 ArkUINodeAdapterHandle GetNodeAdapter(ArkUINodeHandle node)
520 {
521     return NodeAdapter::GetNodeAdapterAPI()->getNodeAdapter(node);
522 }
523 
GetCachedCount(ArkUINodeHandle node)524 ArkUI_Int32 GetCachedCount(ArkUINodeHandle node)
525 {
526     auto* frameNode = reinterpret_cast<FrameNode*>(node);
527     CHECK_NULL_RETURN(frameNode, 1);
528     return ListModelNG::GetCachedCount(frameNode);
529 }
530 
SetScrollToIndex(ArkUINodeHandle node,ArkUI_Int32 index,ArkUI_Int32 animation,ArkUI_Int32 alignment)531 void SetScrollToIndex(ArkUINodeHandle node, ArkUI_Int32 index, ArkUI_Int32 animation, ArkUI_Int32 alignment)
532 {
533     auto* frameNode = reinterpret_cast<FrameNode*>(node);
534     CHECK_NULL_VOID(frameNode);
535     ListModelNG::SetScrollToIndex(frameNode, index, animation, alignment);
536 }
537 
SetScrollBy(ArkUINodeHandle node,ArkUI_Float64 x,ArkUI_Float64 y)538 void SetScrollBy(ArkUINodeHandle node, ArkUI_Float64 x, ArkUI_Float64 y)
539 {
540     auto* frameNode = reinterpret_cast<FrameNode*>(node);
541     CHECK_NULL_VOID(frameNode);
542     ListModelNG::SetScrollBy(frameNode, x, y);
543 }
544 
SetInitialIndex(ArkUINodeHandle node,ArkUI_Int32 index)545 void SetInitialIndex(ArkUINodeHandle node, ArkUI_Int32 index)
546 {
547     auto* frameNode = reinterpret_cast<FrameNode*>(node);
548     CHECK_NULL_VOID(frameNode);
549     ListModelNG::SetInitialIndex(frameNode, index);
550 }
551 
ResetInitialIndex(ArkUINodeHandle node)552 void ResetInitialIndex(ArkUINodeHandle node)
553 {
554     auto* frameNode = reinterpret_cast<FrameNode*>(node);
555     CHECK_NULL_VOID(frameNode);
556     ListModelNG::SetInitialIndex(frameNode, 0);
557 }
558 
SetListChildrenMainSize(ArkUINodeHandle node,ArkUIListChildrenMainSize option,ArkUI_Int32 unit)559 void SetListChildrenMainSize(ArkUINodeHandle node, ArkUIListChildrenMainSize option, ArkUI_Int32 unit)
560 {
561     auto* frameNode = reinterpret_cast<FrameNode*>(node);
562     CHECK_NULL_VOID(frameNode);
563     for (uint32_t i = 0; i < option->mainSize.size(); i++) {
564         if (option->mainSize[i] > 0) {
565             option->mainSize[i] =
566                 Dimension(option->mainSize[i], static_cast<OHOS::Ace::DimensionUnit>(unit)).ConvertToPx();
567         }
568     }
569     if (option->defaultMainSize > 0) {
570         option->defaultMainSize =
571             Dimension(option->defaultMainSize, static_cast<OHOS::Ace::DimensionUnit>(unit)).ConvertToPx();
572     }
573     ListModelNG::SetListChildrenMainSize(frameNode, option->defaultMainSize, option->mainSize);
574 }
575 
ResetListChildrenMainSize(ArkUINodeHandle node)576 void ResetListChildrenMainSize(ArkUINodeHandle node)
577 {
578     auto* frameNode = reinterpret_cast<FrameNode*>(node);
579     CHECK_NULL_VOID(frameNode);
580     ListModelNG::ResetListChildrenMainSize(frameNode);
581 }
582 
SetListCloseAllSwipeActions(ArkUINodeHandle node,void * userData,void (onFinish)(void * userData))583 void SetListCloseAllSwipeActions(ArkUINodeHandle node, void* userData, void (onFinish) (void* userData))
584 {
585     auto* frameNode = reinterpret_cast<FrameNode*>(node);
586     CHECK_NULL_VOID(frameNode);
587     RefPtr<ScrollControllerBase> scrollControllerBase = ListModelNG::GetOrCreateController(frameNode);
588     if (onFinish) {
589         auto onEvent = [userData, onFinish]() {
590             onFinish(userData);
591         };
592         scrollControllerBase->CloseAllSwipeActions(std::move(onEvent));
593     } else {
594         scrollControllerBase->CloseAllSwipeActions(nullptr);
595     }
596 }
597 
SetListFlingSpeedLimit(ArkUINodeHandle node,ArkUI_Float32 maxSpeed)598 void SetListFlingSpeedLimit(ArkUINodeHandle node, ArkUI_Float32 maxSpeed)
599 {
600     auto* frameNode = reinterpret_cast<FrameNode*>(node);
601     CHECK_NULL_VOID(frameNode);
602     ListModelNG::SetFlingSpeedLimit(frameNode, maxSpeed);
603 }
604 
ResetListFlingSpeedLimit(ArkUINodeHandle node)605 void ResetListFlingSpeedLimit(ArkUINodeHandle node)
606 {
607     auto* frameNode = reinterpret_cast<FrameNode*>(node);
608     CHECK_NULL_VOID(frameNode);
609     ListModelNG::SetFlingSpeedLimit(frameNode, -1.0);
610 }
611 
GetInitialIndex(ArkUINodeHandle node)612 ArkUI_Int32 GetInitialIndex(ArkUINodeHandle node)
613 {
614     auto* frameNode = reinterpret_cast<FrameNode*>(node);
615     CHECK_NULL_RETURN(frameNode, 0);
616     return ListModelNG::GetInitialIndex(frameNode);
617 }
618 
GetlistDivider(ArkUINodeHandle node,ArkUIdividerOptions * option,ArkUI_Int32 unit)619 void GetlistDivider(ArkUINodeHandle node, ArkUIdividerOptions* option, ArkUI_Int32 unit)
620 {
621     auto* frameNode = reinterpret_cast<FrameNode*>(node);
622     CHECK_NULL_VOID(frameNode);
623     auto divider = ListModelNG::GetDivider(frameNode);
624     option->color = divider.color.GetValue();
625     option->strokeWidth = divider.strokeWidth.GetNativeValue(static_cast<DimensionUnit>(unit));
626     option->startMargin = divider.startMargin.GetNativeValue(static_cast<DimensionUnit>(unit));
627     option->endMargin = divider.endMargin.GetNativeValue(static_cast<DimensionUnit>(unit));
628 }
629 
SetInitialScroller(ArkUINodeHandle node,ArkUINodeHandle controller,ArkUINodeHandle proxy)630 void SetInitialScroller(ArkUINodeHandle node, ArkUINodeHandle controller, ArkUINodeHandle proxy)
631 {
632     auto* frameNode = reinterpret_cast<FrameNode*>(node);
633     CHECK_NULL_VOID(frameNode);
634     auto listProxy = AceType::Claim(reinterpret_cast<ScrollProxy*>(proxy));
635     auto listController = AceType::Claim(reinterpret_cast<ScrollControllerBase*>(controller));
636     ListModelNG::SetScroller(frameNode, listController, listProxy);
637 }
638 
ResetInitialScroller(ArkUINodeHandle node)639 void ResetInitialScroller(ArkUINodeHandle node)
640 {
641     auto* frameNode = reinterpret_cast<FrameNode*>(node);
642     CHECK_NULL_VOID(frameNode);
643     RefPtr<ScrollControllerBase> listController;
644     RefPtr<ScrollProxy> listProxy;
645     ListModelNG::SetScroller(frameNode, listController, listProxy);
646 }
647 
SetListMaintainVisibleContentPosition(ArkUINodeHandle node,ArkUI_Bool enabled)648 void SetListMaintainVisibleContentPosition(ArkUINodeHandle node, ArkUI_Bool enabled)
649 {
650     auto* frameNode = reinterpret_cast<FrameNode*>(node);
651     CHECK_NULL_VOID(frameNode);
652     ListModelNG::SetListMaintainVisibleContentPosition(frameNode, enabled);
653 }
654 
ResetListMaintainVisibleContentPosition(ArkUINodeHandle node)655 void ResetListMaintainVisibleContentPosition(ArkUINodeHandle node)
656 {
657     auto* frameNode = reinterpret_cast<FrameNode*>(node);
658     CHECK_NULL_VOID(frameNode);
659     ListModelNG::SetListMaintainVisibleContentPosition(frameNode, false);
660 }
661 
SetListFadingEdge(ArkUINodeHandle node,ArkUI_Bool fadingEdge,ArkUI_Float32 fadingEdgeLengthValue,ArkUI_Int32 fadingEdgeLengthUnit)662 void SetListFadingEdge(
663     ArkUINodeHandle node, ArkUI_Bool fadingEdge, ArkUI_Float32 fadingEdgeLengthValue, ArkUI_Int32 fadingEdgeLengthUnit)
664 {
665     auto* frameNode = reinterpret_cast<FrameNode*>(node);
666     CHECK_NULL_VOID(frameNode);
667     Dimension fadingEdgeLengthDimension =
668         Dimension(fadingEdgeLengthValue, static_cast<OHOS::Ace::DimensionUnit>(fadingEdgeLengthUnit));
669     NG::ScrollableModelNG::SetFadingEdge(frameNode, fadingEdge, fadingEdgeLengthDimension);
670 }
671 
ResetListFadingEdge(ArkUINodeHandle node)672 void ResetListFadingEdge(ArkUINodeHandle node)
673 {
674     auto* frameNode = reinterpret_cast<FrameNode*>(node);
675     CHECK_NULL_VOID(frameNode);
676     NG::ScrollableModelNG::SetFadingEdge(frameNode, false, DEFAULT_FADING_EDGE_LENGTH);
677 }
678 
SetShowCached(ArkUINodeHandle node,ArkUI_Bool show)679 void SetShowCached(ArkUINodeHandle node, ArkUI_Bool show)
680 {
681     auto* frameNode = reinterpret_cast<FrameNode*>(node);
682     CHECK_NULL_VOID(frameNode);
683     ListModelNG::SetShowCached(frameNode, show);
684 }
685 
ResetShowCached(ArkUINodeHandle node)686 void ResetShowCached(ArkUINodeHandle node)
687 {
688     auto* frameNode = reinterpret_cast<FrameNode*>(node);
689     CHECK_NULL_VOID(frameNode);
690     ListModelNG::SetShowCached(frameNode, false);
691 }
692 
GetShowCached(ArkUINodeHandle node)693 ArkUI_Bool GetShowCached(ArkUINodeHandle node)
694 {
695     auto* frameNode = reinterpret_cast<FrameNode*>(node);
696     CHECK_NULL_RETURN(frameNode, false);
697     return ListModelNG::GetShowCached(frameNode);
698 }
699 } // namespace
700 
701 namespace NodeModifier {
GetListModifier()702 const ArkUIListModifier* GetListModifier()
703 {
704     static const ArkUIListModifier modifier = { SetListLanes, ResetListLanes, SetEditMode, ResetEditMode,
705         SetMultiSelectable, ResetMultiSelectable, SetChainAnimation, ResetChainAnimation, SetCachedCount,
706         ResetCachedCount, GetEnableScrollInteraction, SetEnableScrollInteraction, ResetEnableScrollInteraction,
707         GetSticky, SetSticky, ResetSticky, GetListEdgeEffect, SetListEdgeEffect, ResetListEdgeEffect, GetListDirection,
708         SetListDirection, ResetListDirection, GetListFriction, SetListFriction, ResetListFriction,
709         GetListNestedScroll, SetListNestedScroll, ResetListNestedScroll, GetListScrollBar, SetListScrollBar,
710         ResetListScrollBar, GetListScrollBarWidth, SetListScrollBarWidth, ResetListScrollBarWidth,
711         GetListScrollBarColor, SetListScrollBarColor, ResetListScrollBarColor, GetAlignListItem, SetAlignListItem,
712         ResetAlignListItem, SetScrollSnapAlign, ResetScrollSnapAlign, SetContentStartOffset, ResetContentStartOffset,
713         SetContentEndOffset, ResetContentEndOffset, ListSetDivider, ListResetDivider, SetChainAnimationOptions,
714         ResetChainAnimationOptions, GetListSpace, SetListSpace, ResetListSpace, SetNodeAdapter, ResetNodeAdapter,
715         GetNodeAdapter, GetCachedCount, SetScrollToIndex, SetScrollBy, SetInitialIndex, ResetInitialIndex,
716         SetListChildrenMainSize, ResetListChildrenMainSize, SetListCloseAllSwipeActions,
717         SetListFlingSpeedLimit, ResetListFlingSpeedLimit, GetInitialIndex, GetlistDivider,
718         SetInitialScroller, ResetInitialScroller, SetListMaintainVisibleContentPosition,
719         ResetListMaintainVisibleContentPosition, SetListFadingEdge, ResetListFadingEdge,
720         SetShowCached, ResetShowCached, GetShowCached, SetOnListScrollIndexCallBack,
721         SetOnScrollVisibleContentChange, SetOnItemMove, SetOnItemDragStart, SetOnItemDragEnter, SetOnItemDragMove,
722         SetOnItemDragLeave, SetOnItemDrop, SetOnListScrollFrameBeginCallBack, SetOnListWillScrollCallBack,
723         SetOnListDidScrollCallBack, SetOnListReachStartCallBack, SetOnListReachEndCallBack,
724         SetOnListScrollStartCallBack, SetOnListScrollStopCallBack, ResetOnListScrollIndex,
725         ResetOnScrollVisibleContentChange, ResetOnItemMove, ResetOnItemDragStart, ResetOnItemDragEnter,
726         ResetOnItemDragMove, ResetOnItemDragLeave, ResetOnItemDrop, ResetOnListScrollStart,
727         ResetOnListScrollStop, ResetOnListScrollFrameBegin, ResetOnListWillScroll, ResetOnListDidScroll,
728         ResetOnListReachStart, ResetOnListReachEnd };
729     return &modifier;
730 }
731 
GetCJUIListModifier()732 const CJUIListModifier* GetCJUIListModifier()
733 {
734     static const CJUIListModifier modifier = { SetListLanes, ResetListLanes, SetEditMode, ResetEditMode,
735         SetMultiSelectable, ResetMultiSelectable, SetChainAnimation, ResetChainAnimation, SetCachedCount,
736         ResetCachedCount, GetEnableScrollInteraction, SetEnableScrollInteraction, ResetEnableScrollInteraction,
737         GetSticky, SetSticky, ResetSticky, GetListEdgeEffect, SetListEdgeEffect, ResetListEdgeEffect, GetListDirection,
738         SetListDirection, ResetListDirection, GetListFriction, SetListFriction, ResetListFriction,
739         GetListNestedScroll, SetListNestedScroll, ResetListNestedScroll, GetListScrollBar, SetListScrollBar,
740         ResetListScrollBar, GetListScrollBarWidth, SetListScrollBarWidth, ResetListScrollBarWidth,
741         GetListScrollBarColor, SetListScrollBarColor, ResetListScrollBarColor, GetAlignListItem, SetAlignListItem,
742         ResetAlignListItem, SetScrollSnapAlign, ResetScrollSnapAlign, SetContentStartOffset, ResetContentStartOffset,
743         SetContentEndOffset, ResetContentEndOffset, ListSetDivider, ListResetDivider, SetChainAnimationOptions,
744         ResetChainAnimationOptions, GetListSpace, SetListSpace, ResetListSpace, SetNodeAdapter, ResetNodeAdapter,
745         GetNodeAdapter, GetCachedCount, SetScrollToIndex, SetScrollBy, SetInitialIndex, ResetInitialIndex,
746         SetListChildrenMainSize, ResetListChildrenMainSize, SetListCloseAllSwipeActions,
747         SetListFlingSpeedLimit, ResetListFlingSpeedLimit, GetInitialIndex, GetlistDivider };
748     return &modifier;
749 }
750 
SetOnListScroll(ArkUINodeHandle node,void * extraParam)751 void SetOnListScroll(ArkUINodeHandle node, void* extraParam)
752 {
753     auto* frameNode = reinterpret_cast<FrameNode*>(node);
754     CHECK_NULL_VOID(frameNode);
755     auto onScroll = [node, extraParam](Dimension scrollOffset, ScrollState scrollState) {
756         ArkUINodeEvent event;
757         event.kind = COMPONENT_ASYNC_EVENT;
758         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
759         event.componentAsyncEvent.subKind = ON_LIST_SCROLL;
760         event.componentAsyncEvent.data[0].f32 = static_cast<float>(scrollOffset.Value());
761         event.componentAsyncEvent.data[1].i32 = static_cast<int>(scrollState);
762         SendArkUIAsyncEvent(&event);
763     };
764     ListModelNG::SetOnScroll(frameNode, std::move(onScroll));
765 }
766 
SetOnListScrollFrameBegin(ArkUINodeHandle node,void * extraParam)767 void SetOnListScrollFrameBegin(ArkUINodeHandle node, void* extraParam)
768 {
769     auto* frameNode = reinterpret_cast<FrameNode*>(node);
770     CHECK_NULL_VOID(frameNode);
771     int32_t nodeId = frameNode->GetId();
772     auto onScrollFrameBegin = [nodeId, node, extraParam](
773                                   const Dimension& offset, const ScrollState& state) -> ScrollFrameResult {
774         ScrollFrameResult scrollRes { .offset = offset };
775         ArkUINodeEvent event;
776         event.kind = COMPONENT_ASYNC_EVENT;
777         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
778         event.componentAsyncEvent.subKind = ON_LIST_SCROLL_FRAME_BEGIN;
779         event.componentAsyncEvent.data[0].f32 = static_cast<float>(offset.Value());
780         event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
781         SendArkUIAsyncEvent(&event);
782         scrollRes.offset = Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::VP);
783         return scrollRes;
784     };
785     ListModelNG::SetOnScrollFrameBegin(frameNode, std::move(onScrollFrameBegin));
786 }
787 
SetOnListScrollStart(ArkUINodeHandle node,void * extraParam)788 void SetOnListScrollStart(ArkUINodeHandle node, void* extraParam)
789 {
790     auto* frameNode = reinterpret_cast<FrameNode*>(node);
791     CHECK_NULL_VOID(frameNode);
792     int32_t nodeId = frameNode->GetId();
793     auto onScrollStart = [nodeId, node, extraParam]() -> void {
794         ArkUINodeEvent event;
795         event.kind = COMPONENT_ASYNC_EVENT;
796         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
797         event.componentAsyncEvent.subKind = ON_LIST_SCROLL_START;
798         SendArkUIAsyncEvent(&event);
799     };
800     ListModelNG::SetOnScrollStart(frameNode, std::move(onScrollStart));
801 }
802 
SetOnListScrollStop(ArkUINodeHandle node,void * extraParam)803 void SetOnListScrollStop(ArkUINodeHandle node, void* extraParam)
804 {
805     auto* frameNode = reinterpret_cast<FrameNode*>(node);
806     CHECK_NULL_VOID(frameNode);
807     int32_t nodeId = frameNode->GetId();
808     auto onScrollStop = [nodeId, node, extraParam]() -> void {
809         ArkUINodeEvent event;
810         event.kind = COMPONENT_ASYNC_EVENT;
811         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
812         event.componentAsyncEvent.subKind = ON_LIST_SCROLL_STOP;
813         SendArkUIAsyncEvent(&event);
814     };
815     ListModelNG::SetOnScrollStop(frameNode, std::move(onScrollStop));
816 }
817 
SetOnListWillScroll(ArkUINodeHandle node,void * extraParam)818 void SetOnListWillScroll(ArkUINodeHandle node, void* extraParam)
819 {
820     auto* frameNode = reinterpret_cast<FrameNode*>(node);
821     CHECK_NULL_VOID(frameNode);
822     int32_t nodeId = frameNode->GetId();
823     auto onWillScroll = [nodeId, node, extraParam](const Dimension& offset, const ScrollState& state,
824                             ScrollSource source) -> ScrollFrameResult {
825         ScrollFrameResult scrollRes { .offset = offset };
826         ArkUINodeEvent event;
827         bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
828         event.kind = COMPONENT_ASYNC_EVENT;
829         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
830         event.componentAsyncEvent.subKind = ON_LIST_WILL_SCROLL;
831         event.componentAsyncEvent.data[0].f32 =
832             usePx ? static_cast<float>(offset.ConvertToPx()) : static_cast<float>(offset.Value());
833         event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
834         event.componentAsyncEvent.data[2].i32 = static_cast<int>(source);
835         SendArkUIAsyncEvent(&event);
836         scrollRes.offset =
837             Dimension(event.componentAsyncEvent.data[0].f32, usePx ? DimensionUnit::PX : DimensionUnit::VP);
838         return scrollRes;
839     };
840     ScrollableModelNG::SetOnWillScroll(frameNode, std::move(onWillScroll));
841 }
842 
SetOnListDidScroll(ArkUINodeHandle node,void * extraParam)843 void SetOnListDidScroll(ArkUINodeHandle node, void* extraParam)
844 {
845     auto* frameNode = reinterpret_cast<FrameNode*>(node);
846     CHECK_NULL_VOID(frameNode);
847     int32_t nodeId = frameNode->GetId();
848     auto onDidScroll = [nodeId, node, extraParam](const Dimension& offset, const ScrollState& state) -> void {
849         ArkUINodeEvent event;
850         event.kind = COMPONENT_ASYNC_EVENT;
851         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
852         bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
853         event.componentAsyncEvent.subKind = ON_LIST_DID_SCROLL;
854         event.componentAsyncEvent.data[0].f32 =
855             usePx ? static_cast<float>(offset.ConvertToPx()) : static_cast<float>(offset.Value());
856         event.componentAsyncEvent.data[1].i32 = static_cast<int32_t>(state);
857         SendArkUIAsyncEvent(&event);
858     };
859     ScrollableModelNG::SetOnDidScroll(frameNode, std::move(onDidScroll));
860 }
861 
SetOnListScrollIndex(ArkUINodeHandle node,void * extraParam)862 void SetOnListScrollIndex(ArkUINodeHandle node, void* extraParam)
863 {
864     auto* frameNode = reinterpret_cast<FrameNode*>(node);
865     CHECK_NULL_VOID(frameNode);
866     int32_t nodeId = frameNode->GetId();
867     auto onScrollIndex = [nodeId, node, extraParam](int32_t first, int32_t last, int32_t center) -> void {
868         ArkUINodeEvent event;
869         event.kind = COMPONENT_ASYNC_EVENT;
870         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
871         event.componentAsyncEvent.subKind = ON_LIST_SCROLL_INDEX;
872         event.componentAsyncEvent.data[0].i32 = first;
873         event.componentAsyncEvent.data[1].i32 = last;
874         event.componentAsyncEvent.data[2].i32 = center;
875         SendArkUIAsyncEvent(&event);
876     };
877     ListModelNG::SetOnScrollIndex(frameNode, std::move(onScrollIndex));
878 }
879 
SetOnListReachStart(ArkUINodeHandle node,void * extraParam)880 void SetOnListReachStart(ArkUINodeHandle node, void* extraParam)
881 {
882     auto* frameNode = reinterpret_cast<FrameNode*>(node);
883     CHECK_NULL_VOID(frameNode);
884     auto onReachStart = [node, extraParam]() -> void {
885         ArkUINodeEvent event;
886         event.kind = COMPONENT_ASYNC_EVENT;
887         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
888         event.componentAsyncEvent.subKind = ON_LIST_REACH_START;
889         SendArkUIAsyncEvent(&event);
890     };
891     ListModelNG::SetOnReachStart(frameNode, std::move(onReachStart));
892 }
893 
SetOnListReachEnd(ArkUINodeHandle node,void * extraParam)894 void SetOnListReachEnd(ArkUINodeHandle node, void* extraParam)
895 {
896     auto* frameNode = reinterpret_cast<FrameNode*>(node);
897     CHECK_NULL_VOID(frameNode);
898     auto onReachEnd = [node, extraParam]() -> void {
899         ArkUINodeEvent event;
900         event.kind = COMPONENT_ASYNC_EVENT;
901         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
902         event.componentAsyncEvent.subKind = ON_LIST_REACH_END;
903         SendArkUIAsyncEvent(&event);
904     };
905     ListModelNG::SetOnReachEnd(frameNode, std::move(onReachEnd));
906 }
907 
SetOnListScrollIndexCallBack(ArkUINodeHandle node,void * extraParam)908 void SetOnListScrollIndexCallBack(ArkUINodeHandle node, void* extraParam)
909 {
910     auto* frameNode = reinterpret_cast<FrameNode*>(node);
911     CHECK_NULL_VOID(frameNode);
912     if (extraParam) {
913         auto onScrollIndex = reinterpret_cast<OnScrollIndexEvent*>(extraParam);
914         ListModelNG::SetOnScrollIndex(frameNode, std::move(*onScrollIndex));
915     } else {
916         ListModelNG::SetOnScrollIndex(frameNode, nullptr);
917     }
918 }
919 
SetOnScrollVisibleContentChange(ArkUINodeHandle node,void * extraParam)920 void SetOnScrollVisibleContentChange(ArkUINodeHandle node, void* extraParam)
921 {
922     auto* frameNode = reinterpret_cast<FrameNode*>(node);
923     CHECK_NULL_VOID(frameNode);
924     if (extraParam) {
925         auto onScrollVisibleContentChange = reinterpret_cast<OnScrollVisibleContentChangeEvent*>(extraParam);
926         ListModelNG::SetOnScrollVisibleContentChange(frameNode, std::move(*onScrollVisibleContentChange));
927     } else {
928         ListModelNG::SetOnScrollVisibleContentChange(frameNode, nullptr);
929     }
930 }
931 
SetOnItemMove(ArkUINodeHandle node,void * extraParam)932 void SetOnItemMove(ArkUINodeHandle node, void* extraParam)
933 {
934     auto* frameNode = reinterpret_cast<FrameNode*>(node);
935     CHECK_NULL_VOID(frameNode);
936     if (extraParam) {
937         auto onItemMove = reinterpret_cast<OnItemMoveEvent*>(extraParam);
938         ListModelNG::SetOnItemMove(frameNode, std::move(*onItemMove));
939     } else {
940         ListModelNG::SetOnItemMove(frameNode, nullptr);
941     }
942 }
943 
SetOnItemDragStart(ArkUINodeHandle node,void * extraParam)944 void SetOnItemDragStart(ArkUINodeHandle node, void* extraParam)
945 {
946     auto* frameNode = reinterpret_cast<FrameNode*>(node);
947     CHECK_NULL_VOID(frameNode);
948     if (extraParam) {
949         auto onItemDragStart = reinterpret_cast<OnItemDragStartFunc*>(extraParam);
950         ListModelNG::SetOnItemDragStart(frameNode, std::move(*onItemDragStart));
951     } else {
952         ListModelNG::SetOnItemDragStart(frameNode, nullptr);
953     }
954 }
955 
SetOnItemDragEnter(ArkUINodeHandle node,void * extraParam)956 void SetOnItemDragEnter(ArkUINodeHandle node, void* extraParam)
957 {
958     auto* frameNode = reinterpret_cast<FrameNode*>(node);
959     CHECK_NULL_VOID(frameNode);
960     if (extraParam) {
961         auto onItemDragEnter = reinterpret_cast<OnItemDragEnterFunc*>(extraParam);
962         ListModelNG::SetOnItemDragEnter(frameNode, std::move(*onItemDragEnter));
963     } else {
964         ListModelNG::SetOnItemDragEnter(frameNode, nullptr);
965     }
966 }
967 
SetOnItemDragMove(ArkUINodeHandle node,void * extraParam)968 void SetOnItemDragMove(ArkUINodeHandle node, void* extraParam)
969 {
970     auto* frameNode = reinterpret_cast<FrameNode*>(node);
971     CHECK_NULL_VOID(frameNode);
972     if (extraParam) {
973         auto onItemDragMove = reinterpret_cast<OnItemDragMoveFunc*>(extraParam);
974         ListModelNG::SetOnItemDragMove(frameNode, std::move(*onItemDragMove));
975     } else {
976         ListModelNG::SetOnItemDragMove(frameNode, nullptr);
977     }
978 }
979 
SetOnItemDragLeave(ArkUINodeHandle node,void * extraParam)980 void SetOnItemDragLeave(ArkUINodeHandle node, void* extraParam)
981 {
982     auto* frameNode = reinterpret_cast<FrameNode*>(node);
983     CHECK_NULL_VOID(frameNode);
984     if (extraParam) {
985         auto onItemDragLeave = reinterpret_cast<OnItemDragLeaveFunc*>(extraParam);
986         ListModelNG::SetOnItemDragLeave(frameNode, std::move(*onItemDragLeave));
987     } else {
988         ListModelNG::SetOnItemDragLeave(frameNode, nullptr);
989     }
990 }
991 
SetOnItemDrop(ArkUINodeHandle node,void * extraParam)992 void SetOnItemDrop(ArkUINodeHandle node, void* extraParam)
993 {
994     auto* frameNode = reinterpret_cast<FrameNode*>(node);
995     CHECK_NULL_VOID(frameNode);
996     if (extraParam) {
997         auto onItemDrop = reinterpret_cast<OnItemDropFunc*>(extraParam);
998         ListModelNG::SetOnItemDrop(frameNode, std::move(*onItemDrop));
999     } else {
1000         ListModelNG::SetOnItemDrop(frameNode, nullptr);
1001     }
1002 }
1003 
SetOnListScrollFrameBeginCallBack(ArkUINodeHandle node,void * extraParam)1004 void SetOnListScrollFrameBeginCallBack(ArkUINodeHandle node, void* extraParam)
1005 {
1006     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1007     CHECK_NULL_VOID(frameNode);
1008     if (extraParam) {
1009         auto onScrollFrameBegin = reinterpret_cast<OnScrollFrameBeginEvent*>(extraParam);
1010         ListModelNG::SetOnScrollFrameBegin(frameNode, std::move(*onScrollFrameBegin));
1011     } else {
1012         ListModelNG::SetOnScrollFrameBegin(frameNode, nullptr);
1013     }
1014 }
1015 
SetOnListWillScrollCallBack(ArkUINodeHandle node,void * extraParam)1016 void SetOnListWillScrollCallBack(ArkUINodeHandle node, void* extraParam)
1017 {
1018     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1019     CHECK_NULL_VOID(frameNode);
1020     if (extraParam) {
1021         auto onWillScroll = reinterpret_cast<OnWillScrollEvent*>(extraParam);
1022         ScrollableModelNG::SetOnWillScroll(frameNode, std::move(*onWillScroll));
1023     } else {
1024         ScrollableModelNG::SetOnWillScroll(frameNode, nullptr);
1025     }
1026 }
1027 
SetOnListDidScrollCallBack(ArkUINodeHandle node,void * extraParam)1028 void SetOnListDidScrollCallBack(ArkUINodeHandle node, void* extraParam)
1029 {
1030     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1031     CHECK_NULL_VOID(frameNode);
1032     if (extraParam) {
1033         auto onDidScroll = reinterpret_cast<OnScrollEvent*>(extraParam);
1034         ScrollableModelNG::SetOnDidScroll(frameNode, std::move(*onDidScroll));
1035     } else {
1036         ScrollableModelNG::SetOnDidScroll(frameNode, nullptr);
1037     }
1038 }
1039 
SetOnListReachStartCallBack(ArkUINodeHandle node,void * extraParam)1040 void SetOnListReachStartCallBack(ArkUINodeHandle node, void* extraParam)
1041 {
1042     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1043     CHECK_NULL_VOID(frameNode);
1044     if (extraParam) {
1045         auto onReachStart = reinterpret_cast<OnReachEvent*>(extraParam);
1046         ListModelNG::SetOnReachStart(frameNode, std::move(*onReachStart));
1047     } else {
1048         ListModelNG::SetOnReachStart(frameNode, nullptr);
1049     }
1050 }
1051 
SetOnListReachEndCallBack(ArkUINodeHandle node,void * extraParam)1052 void SetOnListReachEndCallBack(ArkUINodeHandle node, void* extraParam)
1053 {
1054     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1055     CHECK_NULL_VOID(frameNode);
1056     if (extraParam) {
1057         auto onReachEnd = reinterpret_cast<OnReachEvent*>(extraParam);
1058         ListModelNG::SetOnReachEnd(frameNode, std::move(*onReachEnd));
1059     } else {
1060         ListModelNG::SetOnReachEnd(frameNode, nullptr);
1061     }
1062 }
1063 
SetOnListScrollStartCallBack(ArkUINodeHandle node,void * extraParam)1064 void SetOnListScrollStartCallBack(ArkUINodeHandle node, void* extraParam)
1065 {
1066     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1067     CHECK_NULL_VOID(frameNode);
1068     if (extraParam) {
1069         auto onScrollStart = reinterpret_cast<OnScrollStartEvent*>(extraParam);
1070         ListModelNG::SetOnScrollStart(frameNode, std::move(*onScrollStart));
1071     } else {
1072         ListModelNG::SetOnScrollStart(frameNode, nullptr);
1073     }
1074 }
1075 
SetOnListScrollStopCallBack(ArkUINodeHandle node,void * extraParam)1076 void SetOnListScrollStopCallBack(ArkUINodeHandle node, void* extraParam)
1077 {
1078     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1079     CHECK_NULL_VOID(frameNode);
1080     if (extraParam) {
1081         auto onScrollStop = reinterpret_cast<OnScrollStopEvent*>(extraParam);
1082         ListModelNG::SetOnScrollStop(frameNode, std::move(*onScrollStop));
1083     } else {
1084         ListModelNG::SetOnScrollStop(frameNode, nullptr);
1085     }
1086 }
1087 
ResetOnListScroll(ArkUINodeHandle node)1088 void ResetOnListScroll(ArkUINodeHandle node)
1089 {
1090     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1091     CHECK_NULL_VOID(frameNode);
1092     ListModelNG::SetOnScroll(frameNode, nullptr);
1093 }
1094 
ResetOnListScrollIndex(ArkUINodeHandle node)1095 void ResetOnListScrollIndex(ArkUINodeHandle node)
1096 {
1097     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1098     CHECK_NULL_VOID(frameNode);
1099     ListModelNG::SetOnScrollIndex(frameNode, nullptr);
1100 }
1101 
ResetOnScrollVisibleContentChange(ArkUINodeHandle node)1102 void ResetOnScrollVisibleContentChange(ArkUINodeHandle node)
1103 {
1104     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1105     CHECK_NULL_VOID(frameNode);
1106     ListModelNG::SetOnScrollVisibleContentChange(frameNode, nullptr);
1107 }
1108 
ResetOnItemMove(ArkUINodeHandle node)1109 void ResetOnItemMove(ArkUINodeHandle node)
1110 {
1111     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1112     CHECK_NULL_VOID(frameNode);
1113     ListModelNG::SetOnItemMove(frameNode, nullptr);
1114 }
1115 
ResetOnItemDragStart(ArkUINodeHandle node)1116 void ResetOnItemDragStart(ArkUINodeHandle node)
1117 {
1118     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1119     CHECK_NULL_VOID(frameNode);
1120     ListModelNG::SetOnItemDragStart(frameNode, nullptr);
1121 }
1122 
ResetOnItemDragEnter(ArkUINodeHandle node)1123 void ResetOnItemDragEnter(ArkUINodeHandle node)
1124 {
1125     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1126     CHECK_NULL_VOID(frameNode);
1127     ListModelNG::SetOnItemDragEnter(frameNode, nullptr);
1128 }
1129 
ResetOnItemDragMove(ArkUINodeHandle node)1130 void ResetOnItemDragMove(ArkUINodeHandle node)
1131 {
1132     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1133     CHECK_NULL_VOID(frameNode);
1134     ListModelNG::SetOnItemDragMove(frameNode, nullptr);
1135 }
1136 
ResetOnItemDragLeave(ArkUINodeHandle node)1137 void ResetOnItemDragLeave(ArkUINodeHandle node)
1138 {
1139     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1140     CHECK_NULL_VOID(frameNode);
1141     ListModelNG::SetOnItemDragLeave(frameNode, nullptr);
1142 }
1143 
ResetOnItemDrop(ArkUINodeHandle node)1144 void ResetOnItemDrop(ArkUINodeHandle node)
1145 {
1146     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1147     CHECK_NULL_VOID(frameNode);
1148     ListModelNG::SetOnItemDrop(frameNode, nullptr);
1149 }
1150 
ResetOnListScrollStart(ArkUINodeHandle node)1151 void ResetOnListScrollStart(ArkUINodeHandle node)
1152 {
1153     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1154     CHECK_NULL_VOID(frameNode);
1155     ListModelNG::SetOnScrollStart(frameNode, nullptr);
1156 }
1157 
ResetOnListScrollStop(ArkUINodeHandle node)1158 void ResetOnListScrollStop(ArkUINodeHandle node)
1159 {
1160     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1161     CHECK_NULL_VOID(frameNode);
1162     ListModelNG::SetOnScrollStop(frameNode, nullptr);
1163 }
1164 
ResetOnListScrollFrameBegin(ArkUINodeHandle node)1165 void ResetOnListScrollFrameBegin(ArkUINodeHandle node)
1166 {
1167     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1168     CHECK_NULL_VOID(frameNode);
1169     ListModelNG::SetOnScrollFrameBegin(frameNode, nullptr);
1170 }
1171 
ResetOnListWillScroll(ArkUINodeHandle node)1172 void ResetOnListWillScroll(ArkUINodeHandle node)
1173 {
1174     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1175     CHECK_NULL_VOID(frameNode);
1176     ScrollableModelNG::SetOnWillScroll(frameNode, nullptr);
1177 }
1178 
ResetOnListDidScroll(ArkUINodeHandle node)1179 void ResetOnListDidScroll(ArkUINodeHandle node)
1180 {
1181     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1182     CHECK_NULL_VOID(frameNode);
1183     ScrollableModelNG::SetOnDidScroll(frameNode, nullptr);
1184 }
1185 
ResetOnListReachStart(ArkUINodeHandle node)1186 void ResetOnListReachStart(ArkUINodeHandle node)
1187 {
1188     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1189     CHECK_NULL_VOID(frameNode);
1190     ListModelNG::SetOnReachStart(frameNode, nullptr);
1191 }
1192 
ResetOnListReachEnd(ArkUINodeHandle node)1193 void ResetOnListReachEnd(ArkUINodeHandle node)
1194 {
1195     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1196     CHECK_NULL_VOID(frameNode);
1197     ListModelNG::SetOnReachEnd(frameNode, nullptr);
1198 }
1199 } // namespace NodeModifier
1200 } // namespace OHOS::Ace::NG
1201