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