• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 
16 #include "core/components_ng/pattern/list/list_model_ng.h"
17 
18 #include <cstdint>
19 
20 #include "base/utils/utils.h"
21 #include "core/components_ng/base/frame_node.h"
22 #include "core/components_ng/base/view_stack_processor.h"
23 #include "core/components_ng/pattern/list/list_layout_property.h"
24 #include "core/components_ng/pattern/list/list_pattern.h"
25 #include "core/components_ng/pattern/list/list_position_controller.h"
26 #include "core/components_ng/pattern/scroll/inner/scroll_bar.h"
27 #include "core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h"
28 #include "core/components_ng/pattern/scrollable/scrollable_model_ng.h"
29 #include "core/components_v2/inspector/inspector_constants.h"
30 #include "core/components_v2/list/list_properties.h"
31 
32 namespace OHOS::Ace::NG {
33 
34 const std::vector<DisplayMode> DISPLAY_MODE = { DisplayMode::OFF, DisplayMode::AUTO, DisplayMode::ON };
35 
Create()36 void ListModelNG::Create()
37 {
38     auto* stack = ViewStackProcessor::GetInstance();
39     auto nodeId = stack->ClaimNodeId();
40     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::LIST_ETS_TAG, nodeId);
41     auto frameNode =
42         FrameNode::GetOrCreateFrameNode(V2::LIST_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ListPattern>(); });
43     stack->Push(frameNode);
44     auto pattern = frameNode->GetPattern<ListPattern>();
45     CHECK_NULL_VOID(pattern);
46     pattern->AddScrollableFrameInfo(SCROLL_FROM_NONE);
47 }
48 
CreateFrameNode(int32_t nodeId)49 RefPtr<FrameNode> ListModelNG::CreateFrameNode(int32_t nodeId)
50 {
51     auto frameNode = FrameNode::CreateFrameNode(V2::LIST_ETS_TAG, nodeId, AceType::MakeRefPtr<ListPattern>());
52     auto pattern = frameNode->GetPattern<ListPattern>();
53     CHECK_NULL_RETURN(pattern, frameNode);
54     pattern->AddScrollableFrameInfo(SCROLL_FROM_NONE);
55     return frameNode;
56 }
57 
GetOrCreateController(FrameNode * frameNode)58 RefPtr<ScrollControllerBase> ListModelNG::GetOrCreateController(FrameNode* frameNode)
59 {
60     CHECK_NULL_RETURN(frameNode, nullptr);
61     auto pattern = frameNode->GetPattern<ListPattern>();
62     CHECK_NULL_RETURN(pattern, nullptr);
63     if (!pattern->GetPositionController()) {
64         auto controller = AceType::MakeRefPtr<NG::ListPositionController>();
65         pattern->SetPositionController(controller);
66         controller->SetScrollPattern(pattern);
67         pattern->TriggerModifyDone();
68     }
69     return pattern->GetPositionController();
70 }
71 
ScrollToEdge(FrameNode * frameNode,ScrollEdgeType scrollEdgeType,bool smooth)72 void ListModelNG::ScrollToEdge(FrameNode* frameNode, ScrollEdgeType scrollEdgeType, bool smooth)
73 {
74     CHECK_NULL_VOID(frameNode);
75     auto pattern = frameNode->GetPattern<ListPattern>();
76     CHECK_NULL_VOID(pattern);
77     if (pattern->GetAxis() != Axis::NONE) {
78         pattern->ScrollToEdge(scrollEdgeType, smooth);
79     }
80 }
81 
SetSpace(const Dimension & space)82 void ListModelNG::SetSpace(const Dimension& space)
83 {
84     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, Space, space);
85 }
86 
SetInitialIndex(int32_t initialIndex)87 void ListModelNG::SetInitialIndex(int32_t initialIndex)
88 {
89     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, InitialIndex, initialIndex);
90 }
91 
SetContentStartOffset(float startOffset)92 void ListModelNG::SetContentStartOffset(float startOffset)
93 {
94     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, ContentStartOffset, startOffset);
95 }
96 
SetContentEndOffset(float endOffset)97 void ListModelNG::SetContentEndOffset(float endOffset)
98 {
99     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, ContentEndOffset, endOffset);
100 }
101 
CreateScrollController()102 RefPtr<ScrollControllerBase> ListModelNG::CreateScrollController()
103 {
104     return AceType::MakeRefPtr<NG::ListPositionController>();
105 }
106 
SetScroller(RefPtr<ScrollControllerBase> scroller,RefPtr<ScrollProxy> proxy)107 void ListModelNG::SetScroller(RefPtr<ScrollControllerBase> scroller, RefPtr<ScrollProxy> proxy)
108 {
109     auto list = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ListPattern>();
110     CHECK_NULL_VOID(list);
111     list->SetPositionController(AceType::DynamicCast<ListPositionController>(scroller));
112     list->SetScrollBarProxy(AceType::DynamicCast<ScrollBarProxy>(proxy));
113 }
114 
SetListDirection(Axis axis)115 void ListModelNG::SetListDirection(Axis axis)
116 {
117     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, ListDirection, axis);
118 }
119 
SetScrollBar(DisplayMode scrollBar)120 void ListModelNG::SetScrollBar(DisplayMode scrollBar)
121 {
122     ScrollableModelNG::SetScrollBarMode(scrollBar);
123 }
124 
SetScrollBarColor(const std::string & value)125 void ListModelNG::SetScrollBarColor(const std::string& value)
126 {
127     ScrollableModelNG::SetScrollBarColor(value);
128 }
SetScrollBarWidth(const std::string & value)129 void ListModelNG::SetScrollBarWidth(const std::string& value)
130 {
131     ScrollableModelNG::SetScrollBarWidth(value);
132 }
133 
SetEdgeEffect(EdgeEffect edgeEffect,bool alwaysEnabled)134 void ListModelNG::SetEdgeEffect(EdgeEffect edgeEffect, bool alwaysEnabled)
135 {
136     ScrollableModelNG::SetEdgeEffect(edgeEffect, alwaysEnabled);
137 }
138 
SetEditMode(bool editMode)139 void ListModelNG::SetEditMode(bool editMode)
140 {
141     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, EditMode, editMode);
142 }
143 
SetDivider(const V2::ItemDivider & divider)144 void ListModelNG::SetDivider(const V2::ItemDivider& divider)
145 {
146     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, Divider, divider);
147 }
148 
SetChainAnimation(bool enableChainAnimation)149 void ListModelNG::SetChainAnimation(bool enableChainAnimation)
150 {
151     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, ChainAnimation, enableChainAnimation);
152 }
153 
SetChainAnimationOptions(const ChainAnimationOptions & options)154 void ListModelNG::SetChainAnimationOptions(const ChainAnimationOptions& options)
155 {
156     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
157     CHECK_NULL_VOID(frameNode);
158     auto pattern = frameNode->GetPattern<ListPattern>();
159     CHECK_NULL_VOID(pattern);
160     pattern->SetChainAnimationOptions(options);
161 }
162 
SetLanes(int32_t lanes)163 void ListModelNG::SetLanes(int32_t lanes)
164 {
165     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, Lanes, lanes);
166 }
167 
SetLaneConstrain(const Dimension & laneMinLength,const Dimension & laneMaxLength)168 void ListModelNG::SetLaneConstrain(const Dimension& laneMinLength, const Dimension& laneMaxLength)
169 {
170     SetLaneMinLength(laneMinLength);
171     SetLaneMaxLength(laneMaxLength);
172 }
173 
SetLaneMinLength(const Dimension & laneMinLength)174 void ListModelNG::SetLaneMinLength(const Dimension& laneMinLength)
175 {
176     if (laneMinLength.IsValid()) {
177         ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, LaneMinLength, laneMinLength);
178     } else {
179         ACE_RESET_LAYOUT_PROPERTY_WITH_FLAG(ListLayoutProperty, LaneMinLength, PROPERTY_UPDATE_MEASURE);
180     }
181 }
182 
SetLaneMaxLength(const Dimension & laneMaxLength)183 void ListModelNG::SetLaneMaxLength(const Dimension& laneMaxLength)
184 {
185     if (laneMaxLength.IsValid()) {
186         ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, LaneMaxLength, laneMaxLength);
187     } else {
188         ACE_RESET_LAYOUT_PROPERTY_WITH_FLAG(ListLayoutProperty, LaneMaxLength, PROPERTY_UPDATE_MEASURE);
189     }
190 }
191 
SetLaneGutter(const Dimension & laneGutter)192 void ListModelNG::SetLaneGutter(const Dimension& laneGutter)
193 {
194     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, LaneGutter, laneGutter);
195 }
196 
SetListItemAlign(V2::ListItemAlign listItemAlign)197 void ListModelNG::SetListItemAlign(V2::ListItemAlign listItemAlign)
198 {
199     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, ListItemAlign, listItemAlign);
200 }
201 
SetCachedCount(int32_t cachedCount,bool show)202 void ListModelNG::SetCachedCount(int32_t cachedCount, bool show)
203 {
204     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, CachedCount, cachedCount);
205     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, ShowCachedItems, show);
206 }
207 
GetSticky(FrameNode * frameNode)208 int32_t ListModelNG::GetSticky(FrameNode* frameNode)
209 {
210     CHECK_NULL_RETURN(frameNode, 0);
211     return static_cast<int32_t>(frameNode->GetLayoutProperty<ListLayoutProperty>()->GetStickyStyleValue());
212 }
213 
SetSticky(V2::StickyStyle stickyStyle)214 void ListModelNG::SetSticky(V2::StickyStyle stickyStyle)
215 {
216     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, StickyStyle, stickyStyle);
217 }
218 
SetScrollSnapAlign(V2::ScrollSnapAlign scrollSnapAlign)219 void ListModelNG::SetScrollSnapAlign(V2::ScrollSnapAlign scrollSnapAlign)
220 {
221     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, ScrollSnapAlign, scrollSnapAlign);
222 }
223 
SetNestedScroll(const NestedScrollOptions & nestedOpt)224 void ListModelNG::SetNestedScroll(const NestedScrollOptions& nestedOpt)
225 {
226     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
227     CHECK_NULL_VOID(frameNode);
228     auto pattern = frameNode->GetPattern<ListPattern>();
229     CHECK_NULL_VOID(pattern);
230     pattern->SetNestedScroll(nestedOpt);
231 }
232 
SetMultiSelectable(bool selectable)233 void ListModelNG::SetMultiSelectable(bool selectable)
234 {
235     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
236     CHECK_NULL_VOID(frameNode);
237     auto pattern = frameNode->GetPattern<ListPattern>();
238     CHECK_NULL_VOID(pattern);
239     pattern->SetMultiSelectable(selectable);
240 }
241 
GetScrollEnabled(FrameNode * frameNode)242 int32_t ListModelNG::GetScrollEnabled(FrameNode* frameNode)
243 {
244     CHECK_NULL_RETURN(frameNode, 0);
245     int32_t value = true;
246     auto layoutProperty = frameNode->GetLayoutProperty<ListLayoutProperty>();
247     if (layoutProperty->GetScrollEnabled()) {
248         value = layoutProperty->GetScrollEnabledValue();
249     }
250     return value;
251 }
252 
SetScrollEnabled(bool scrollEnabled)253 void ListModelNG::SetScrollEnabled(bool scrollEnabled)
254 {
255     ACE_UPDATE_LAYOUT_PROPERTY(ListLayoutProperty, ScrollEnabled, scrollEnabled);
256 }
257 
SetFriction(double friction)258 void ListModelNG::SetFriction(double friction)
259 {
260     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
261     CHECK_NULL_VOID(frameNode);
262     auto pattern = frameNode->GetPattern<ListPattern>();
263     CHECK_NULL_VOID(pattern);
264     pattern->SetFriction(friction);
265 }
266 
SetMaintainVisibleContentPosition(bool enabled)267 void ListModelNG::SetMaintainVisibleContentPosition(bool enabled)
268 {
269     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
270     CHECK_NULL_VOID(frameNode);
271     auto pattern = frameNode->GetPattern<ListPattern>();
272     CHECK_NULL_VOID(pattern);
273     pattern->SetMaintainVisibleContentPosition(enabled);
274 }
275 
SetOnScroll(OnScrollEvent && onScroll)276 void ListModelNG::SetOnScroll(OnScrollEvent&& onScroll)
277 {
278     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
279     CHECK_NULL_VOID(frameNode);
280     auto eventHub = frameNode->GetEventHub<ListEventHub>();
281     CHECK_NULL_VOID(eventHub);
282     eventHub->SetOnScroll(std::move(onScroll));
283 }
284 
SetOnScrollBegin(OnScrollBeginEvent && onScrollBegin)285 void ListModelNG::SetOnScrollBegin(OnScrollBeginEvent&& onScrollBegin)
286 {
287     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
288     CHECK_NULL_VOID(frameNode);
289     auto eventHub = frameNode->GetEventHub<ListEventHub>();
290     CHECK_NULL_VOID(eventHub);
291     eventHub->SetOnScrollBegin(std::move(onScrollBegin));
292 }
293 
SetOnScrollFrameBegin(OnScrollFrameBeginEvent && onScrollFrameBegin)294 void ListModelNG::SetOnScrollFrameBegin(OnScrollFrameBeginEvent&& onScrollFrameBegin)
295 {
296     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
297     CHECK_NULL_VOID(frameNode);
298     auto eventHub = frameNode->GetEventHub<ListEventHub>();
299     CHECK_NULL_VOID(eventHub);
300     eventHub->SetOnScrollFrameBegin(std::move(onScrollFrameBegin));
301 }
302 
SetOnScrollStart(OnScrollStartEvent && onScrollStart)303 void ListModelNG::SetOnScrollStart(OnScrollStartEvent&& onScrollStart)
304 {
305     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
306     CHECK_NULL_VOID(frameNode);
307     auto eventHub = frameNode->GetEventHub<ListEventHub>();
308     CHECK_NULL_VOID(eventHub);
309     eventHub->SetOnScrollStart(std::move(onScrollStart));
310 }
311 
SetOnScrollStop(OnScrollStopEvent && onScrollStop)312 void ListModelNG::SetOnScrollStop(OnScrollStopEvent&& onScrollStop)
313 {
314     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
315     CHECK_NULL_VOID(frameNode);
316     auto eventHub = frameNode->GetEventHub<ListEventHub>();
317     CHECK_NULL_VOID(eventHub);
318     eventHub->SetOnScrollStop(std::move(onScrollStop));
319 }
320 
SetOnScrollIndex(OnScrollIndexEvent && onScrollIndex)321 void ListModelNG::SetOnScrollIndex(OnScrollIndexEvent&& onScrollIndex)
322 {
323     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
324     CHECK_NULL_VOID(frameNode);
325     auto eventHub = frameNode->GetEventHub<ListEventHub>();
326     CHECK_NULL_VOID(eventHub);
327     eventHub->SetOnScrollIndex(std::move(onScrollIndex));
328 }
329 
SetOnScrollIndex(FrameNode * frameNode,OnScrollIndexEvent && onScrollIndex)330 void ListModelNG::SetOnScrollIndex(FrameNode* frameNode, OnScrollIndexEvent&& onScrollIndex)
331 {
332     CHECK_NULL_VOID(frameNode);
333     auto eventHub = frameNode->GetEventHub<ListEventHub>();
334     CHECK_NULL_VOID(eventHub);
335     eventHub->SetOnScrollIndex(std::move(onScrollIndex));
336 }
337 
SetOnScrollVisibleContentChange(OnScrollVisibleContentChangeEvent && onScrollVisibleContentChange)338 void ListModelNG::SetOnScrollVisibleContentChange(OnScrollVisibleContentChangeEvent&& onScrollVisibleContentChange)
339 {
340     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
341     CHECK_NULL_VOID(frameNode);
342     auto eventHub = frameNode->GetEventHub<ListEventHub>();
343     CHECK_NULL_VOID(eventHub);
344     eventHub->SetOnScrollVisibleContentChange(std::move(onScrollVisibleContentChange));
345 }
346 
SetOnReachStart(OnReachEvent && onReachStart)347 void ListModelNG::SetOnReachStart(OnReachEvent&& onReachStart)
348 {
349     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
350     CHECK_NULL_VOID(frameNode);
351     auto eventHub = frameNode->GetEventHub<ListEventHub>();
352     CHECK_NULL_VOID(eventHub);
353     eventHub->SetOnReachStart(std::move(onReachStart));
354 }
355 
SetOnReachStart(FrameNode * frameNode,OnReachEvent && onReachStart)356 void ListModelNG::SetOnReachStart(FrameNode* frameNode, OnReachEvent&& onReachStart)
357 {
358     CHECK_NULL_VOID(frameNode);
359     auto eventHub = frameNode->GetEventHub<ListEventHub>();
360     CHECK_NULL_VOID(eventHub);
361     eventHub->SetOnReachStart(std::move(onReachStart));
362 }
363 
SetOnReachEnd(OnReachEvent && onReachEnd)364 void ListModelNG::SetOnReachEnd(OnReachEvent&& onReachEnd)
365 {
366     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
367     CHECK_NULL_VOID(frameNode);
368     auto eventHub = frameNode->GetEventHub<ListEventHub>();
369     CHECK_NULL_VOID(eventHub);
370     eventHub->SetOnReachEnd(std::move(onReachEnd));
371 }
372 
SetOnReachEnd(FrameNode * frameNode,OnReachEvent && onReachEnd)373 void ListModelNG::SetOnReachEnd(FrameNode* frameNode, OnReachEvent&& onReachEnd)
374 {
375     CHECK_NULL_VOID(frameNode);
376     auto eventHub = frameNode->GetEventHub<ListEventHub>();
377     CHECK_NULL_VOID(eventHub);
378     eventHub->SetOnReachEnd(std::move(onReachEnd));
379 }
380 
SetOnItemMove(OnItemMoveEvent && onItemMove)381 void ListModelNG::SetOnItemMove(OnItemMoveEvent&& onItemMove)
382 {
383     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
384     CHECK_NULL_VOID(frameNode);
385     auto eventHub = frameNode->GetEventHub<ListEventHub>();
386     CHECK_NULL_VOID(eventHub);
387     eventHub->SetOnItemMove(std::move(onItemMove));
388 
389     AddDragFrameNodeToManager();
390 }
391 
SetOnItemDragStart(OnItemDragStartFunc && onItemDragStart)392 void ListModelNG::SetOnItemDragStart(OnItemDragStartFunc&& onItemDragStart)
393 {
394     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
395     CHECK_NULL_VOID(frameNode);
396     auto eventHub = frameNode->GetEventHub<ListEventHub>();
397     CHECK_NULL_VOID(eventHub);
398     auto onDragStart =
399         [func = std::move(onItemDragStart)](const ItemDragInfo& dragInfo, int32_t index) -> RefPtr<AceType> {
400         ScopedViewStackProcessor builderViewStackProcessor;
401         {
402             return func(dragInfo, index);
403         }
404     };
405     eventHub->SetOnItemDragStart(onDragStart);
406 
407     auto gestureEventHub = eventHub->GetOrCreateGestureEventHub();
408     CHECK_NULL_VOID(gestureEventHub);
409     eventHub->InitItemDragEvent(gestureEventHub);
410 
411     AddDragFrameNodeToManager();
412 }
413 
SetOnItemDragEnter(OnItemDragEnterFunc && onItemDragEnter)414 void ListModelNG::SetOnItemDragEnter(OnItemDragEnterFunc&& onItemDragEnter)
415 {
416     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
417     CHECK_NULL_VOID(frameNode);
418     auto eventHub = frameNode->GetEventHub<ListEventHub>();
419     CHECK_NULL_VOID(eventHub);
420     eventHub->SetOnItemDragEnter(std::move(onItemDragEnter));
421 
422     AddDragFrameNodeToManager();
423 }
424 
SetOnItemDragLeave(OnItemDragLeaveFunc && onItemDragLeave)425 void ListModelNG::SetOnItemDragLeave(OnItemDragLeaveFunc&& onItemDragLeave)
426 {
427     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
428     CHECK_NULL_VOID(frameNode);
429     auto eventHub = frameNode->GetEventHub<ListEventHub>();
430     CHECK_NULL_VOID(eventHub);
431     eventHub->SetOnItemDragLeave(std::move(onItemDragLeave));
432 
433     AddDragFrameNodeToManager();
434 }
435 
SetOnItemDragMove(OnItemDragMoveFunc && onItemDragMove)436 void ListModelNG::SetOnItemDragMove(OnItemDragMoveFunc&& onItemDragMove)
437 {
438     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
439     CHECK_NULL_VOID(frameNode);
440     auto eventHub = frameNode->GetEventHub<ListEventHub>();
441     CHECK_NULL_VOID(eventHub);
442     eventHub->SetOnItemDragMove(std::move(onItemDragMove));
443 
444     AddDragFrameNodeToManager();
445 }
446 
SetOnItemDrop(OnItemDropFunc && onItemDrop)447 void ListModelNG::SetOnItemDrop(OnItemDropFunc&& onItemDrop)
448 {
449     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
450     CHECK_NULL_VOID(frameNode);
451     auto eventHub = frameNode->GetEventHub<ListEventHub>();
452     CHECK_NULL_VOID(eventHub);
453     eventHub->SetOnItemDrop(std::move(onItemDrop));
454 
455     AddDragFrameNodeToManager();
456 }
457 
AddDragFrameNodeToManager() const458 void ListModelNG::AddDragFrameNodeToManager() const
459 {
460     auto pipeline = PipelineContext::GetCurrentContext();
461     CHECK_NULL_VOID(pipeline);
462     auto dragDropManager = pipeline->GetDragDropManager();
463     CHECK_NULL_VOID(dragDropManager);
464     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
465     CHECK_NULL_VOID(frameNode);
466 
467     dragDropManager->AddListDragFrameNode(frameNode->GetId(), AceType::WeakClaim(frameNode));
468 }
469 
SetInitialIndex(FrameNode * frameNode,int32_t initialIndex)470 void ListModelNG::SetInitialIndex(FrameNode* frameNode, int32_t initialIndex)
471 {
472     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, InitialIndex, initialIndex, frameNode);
473 }
474 
SetEditMode(FrameNode * frameNode,bool editMode)475 void ListModelNG::SetEditMode(FrameNode* frameNode, bool editMode)
476 {
477     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, EditMode, editMode, frameNode);
478 }
479 
SetMultiSelectable(FrameNode * frameNode,bool selectable)480 void ListModelNG::SetMultiSelectable(FrameNode* frameNode, bool selectable)
481 {
482     auto pattern = frameNode->GetPattern<ListPattern>();
483     CHECK_NULL_VOID(pattern);
484     pattern->SetMultiSelectable(selectable);
485 }
486 
SetChainAnimation(FrameNode * frameNode,bool chainAnimation)487 void ListModelNG::SetChainAnimation(FrameNode* frameNode, bool chainAnimation)
488 {
489     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ChainAnimation, chainAnimation, frameNode);
490 }
491 
SetCachedCount(FrameNode * frameNode,int32_t cachedCount)492 void ListModelNG::SetCachedCount(FrameNode* frameNode, int32_t cachedCount)
493 {
494     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, CachedCount, cachedCount, frameNode);
495 }
496 
SetShowCached(FrameNode * frameNode,bool show)497 void ListModelNG::SetShowCached(FrameNode* frameNode, bool show)
498 {
499     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ShowCachedItems, show, frameNode);
500 }
501 
GetCachedCount(FrameNode * frameNode)502 int32_t ListModelNG::GetCachedCount(FrameNode* frameNode)
503 {
504     int32_t cachedCount = 1;
505     CHECK_NULL_RETURN(frameNode, cachedCount);
506     auto property = frameNode->GetLayoutPropertyPtr<ListLayoutProperty>();
507     CHECK_NULL_RETURN(property, cachedCount);
508     return property->GetCachedCountWithDefault();
509 }
510 
GetShowCached(FrameNode * frameNode)511 bool ListModelNG::GetShowCached(FrameNode* frameNode)
512 {
513     bool show = false;
514     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ListLayoutProperty, ShowCachedItems, show, frameNode, false);
515     return show;
516 }
517 
SetScrollEnabled(FrameNode * frameNode,bool enableScrollInteraction)518 void ListModelNG::SetScrollEnabled(FrameNode* frameNode, bool enableScrollInteraction)
519 {
520     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ScrollEnabled, enableScrollInteraction, frameNode);
521 }
522 
SetSticky(FrameNode * frameNode,int32_t stickyStyle)523 void ListModelNG::SetSticky(FrameNode* frameNode, int32_t stickyStyle)
524 {
525     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, StickyStyle,
526         static_cast<V2::StickyStyle>(stickyStyle), frameNode);
527 }
528 
SetEdgeEffect(FrameNode * frameNode,int32_t edgeEffect,bool alwaysEnabled)529 void ListModelNG::SetEdgeEffect(FrameNode* frameNode, int32_t edgeEffect, bool alwaysEnabled)
530 {
531     ScrollableModelNG::SetEdgeEffect(frameNode, static_cast<EdgeEffect>(edgeEffect), alwaysEnabled);
532 }
533 
GetListDirection(FrameNode * frameNode)534 int32_t ListModelNG::GetListDirection(FrameNode* frameNode)
535 {
536     CHECK_NULL_RETURN(frameNode, 0);
537     return static_cast<int32_t>(frameNode->GetLayoutProperty<ListLayoutProperty>()->GetListDirection().value());
538 }
539 
SetListDirection(FrameNode * frameNode,int32_t axis)540 void ListModelNG::SetListDirection(FrameNode* frameNode, int32_t axis)
541 {
542     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ListDirection, static_cast<Axis>(axis), frameNode);
543 }
544 
GetListFriction(FrameNode * frameNode)545 float ListModelNG::GetListFriction(FrameNode* frameNode)
546 {
547     CHECK_NULL_RETURN(frameNode, 0);
548     return frameNode->GetPattern<ListPattern>()->GetFriction();
549 }
550 
SetListFriction(FrameNode * frameNode,double friction)551 void ListModelNG::SetListFriction(FrameNode* frameNode, double friction)
552 {
553     CHECK_NULL_VOID(frameNode);
554     auto pattern = frameNode->GetPattern<ListPattern>();
555     CHECK_NULL_VOID(pattern);
556     if (LessOrEqual(friction, 0.0)) {
557         pattern->SetFriction(FRICTION);
558     }
559     pattern->SetFriction(friction);
560 }
561 
SetListMaintainVisibleContentPosition(FrameNode * frameNode,bool enabled)562 void ListModelNG::SetListMaintainVisibleContentPosition(FrameNode* frameNode, bool enabled)
563 {
564     CHECK_NULL_VOID(frameNode);
565     auto pattern = frameNode->GetPattern<ListPattern>();
566     CHECK_NULL_VOID(pattern);
567     pattern->SetMaintainVisibleContentPosition(enabled);
568 }
569 
GetListMaintainVisibleContentPosition(FrameNode * frameNode)570 bool ListModelNG::GetListMaintainVisibleContentPosition(FrameNode* frameNode)
571 {
572     CHECK_NULL_RETURN(frameNode, false);
573     auto pattern = frameNode->GetPattern<ListPattern>();
574     CHECK_NULL_RETURN(pattern, false);
575     std::optional<bool> maintainVisibleContentPosition = pattern->GetMaintainVisibleContentPosition();
576     return maintainVisibleContentPosition.value_or(false);
577 }
578 
SetListNestedScroll(FrameNode * frameNode,const NestedScrollOptions & nestedOpt)579 void ListModelNG::SetListNestedScroll(FrameNode* frameNode, const NestedScrollOptions& nestedOpt)
580 {
581     CHECK_NULL_VOID(frameNode);
582     auto pattern = frameNode->GetPattern<ListPattern>();
583     CHECK_NULL_VOID(pattern);
584     pattern->SetNestedScroll(nestedOpt);
585 }
586 
GetListNestedScroll(FrameNode * frameNode)587 NestedScrollOptions ListModelNG::GetListNestedScroll(FrameNode* frameNode)
588 {
589     NestedScrollOptions defaultOptions;
590     CHECK_NULL_RETURN(frameNode, defaultOptions);
591     auto pattern = frameNode->GetPattern<ListPattern>();
592     CHECK_NULL_RETURN(pattern, defaultOptions);
593     return pattern->GetNestedScroll();
594 }
595 
GetListScrollBar(FrameNode * frameNode)596 int32_t ListModelNG::GetListScrollBar(FrameNode* frameNode)
597 {
598     CHECK_NULL_RETURN(frameNode, 0);
599     return static_cast<int32_t>(frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetScrollBarMode().value());
600 }
601 
SetListScrollBar(FrameNode * frameNode,int32_t barState)602 void ListModelNG::SetListScrollBar(FrameNode* frameNode, int32_t barState)
603 {
604     int32_t displayNumber;
605     DisplayMode mode;
606     if (barState < 0 || barState >= static_cast<int32_t>(DISPLAY_MODE.size())) {
607         auto list = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ListPattern>();
608         if (!list) {
609             mode = DisplayMode::AUTO;
610         } else {
611             mode = list->GetDefaultScrollBarDisplayMode();
612         }
613         displayNumber = static_cast<int32_t>(mode);
614     } else {
615         displayNumber = barState;
616     }
617     ScrollableModelNG::SetScrollBarMode(frameNode, displayNumber);
618 }
619 
GetScrollBarWidth(FrameNode * frameNode)620 float ListModelNG::GetScrollBarWidth(FrameNode* frameNode)
621 {
622     CHECK_NULL_RETURN(frameNode, 0.0f);
623     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarWidth();
624     return value.ConvertToVp();
625 }
626 
SetListScrollBarWidth(FrameNode * frameNode,const std::string & value)627 void ListModelNG::SetListScrollBarWidth(FrameNode* frameNode, const std::string& value)
628 {
629     ScrollableModelNG::SetScrollBarWidth(frameNode, value);
630 }
631 
GetScrollBarColor(FrameNode * frameNode)632 uint32_t ListModelNG::GetScrollBarColor(FrameNode* frameNode)
633 {
634     CHECK_NULL_RETURN(frameNode, 0);
635     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarColor();
636     return value.GetValue();
637 }
638 
SetListScrollBarColor(FrameNode * frameNode,const std::string & value)639 void ListModelNG::SetListScrollBarColor(FrameNode* frameNode, const std::string& value)
640 {
641     ScrollableModelNG::SetScrollBarColor(frameNode, value);
642 }
643 
SetLanes(FrameNode * frameNode,int32_t lanes)644 void ListModelNG::SetLanes(FrameNode* frameNode, int32_t lanes)
645 {
646     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, Lanes, lanes, frameNode);
647 }
648 
GetLanes(FrameNode * frameNode)649 int32_t ListModelNG::GetLanes(FrameNode* frameNode)
650 {
651     CHECK_NULL_RETURN(frameNode, 0);
652     return static_cast<int32_t>(frameNode->GetLayoutProperty<ListLayoutProperty>()->GetLanes().value_or(1));
653 }
654 
SetLaneConstrain(FrameNode * frameNode,const Dimension & laneMinLength,const Dimension & laneMaxLength)655 void ListModelNG::SetLaneConstrain(FrameNode* frameNode, const Dimension& laneMinLength, const Dimension& laneMaxLength)
656 {
657     SetLaneMinLength(frameNode, laneMinLength);
658     SetLaneMaxLength(frameNode, laneMaxLength);
659 }
660 
SetLaneMinLength(FrameNode * frameNode,const Dimension & laneMinLength)661 void ListModelNG::SetLaneMinLength(FrameNode* frameNode, const Dimension& laneMinLength)
662 {
663     if (laneMinLength.IsValid()) {
664         ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, LaneMinLength, laneMinLength, frameNode);
665     } else {
666         ACE_RESET_NODE_LAYOUT_PROPERTY_WITH_FLAG(ListLayoutProperty, LaneMinLength, PROPERTY_UPDATE_MEASURE, frameNode);
667     }
668 }
669 
GetLaneMinLength(FrameNode * frameNode)670 float ListModelNG::GetLaneMinLength(FrameNode* frameNode)
671 {
672     CHECK_NULL_RETURN(frameNode, 0);
673     Dimension laneMinLength = 0.0_vp;
674     return frameNode->GetLayoutProperty<ListLayoutProperty>()->GetLaneMinLength().value_or(laneMinLength).Value();
675 }
676 
SetLaneMaxLength(FrameNode * frameNode,const Dimension & laneMaxLength)677 void ListModelNG::SetLaneMaxLength(FrameNode* frameNode, const Dimension& laneMaxLength)
678 {
679     if (laneMaxLength.IsValid()) {
680         ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, LaneMaxLength, laneMaxLength, frameNode);
681     } else {
682         ACE_RESET_NODE_LAYOUT_PROPERTY_WITH_FLAG(ListLayoutProperty, LaneMaxLength, PROPERTY_UPDATE_MEASURE, frameNode);
683     }
684 }
685 
GetLaneMaxLength(FrameNode * frameNode)686 float ListModelNG::GetLaneMaxLength(FrameNode* frameNode)
687 {
688     CHECK_NULL_RETURN(frameNode, 0);
689     Dimension laneMaxLength = 0.0_vp;
690     return frameNode->GetLayoutProperty<ListLayoutProperty>()->GetLaneMaxLength().value_or(laneMaxLength).Value();
691 }
692 
SetLaneGutter(FrameNode * frameNode,const Dimension & laneGutter)693 void ListModelNG::SetLaneGutter(FrameNode* frameNode, const Dimension& laneGutter)
694 {
695     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, LaneGutter, laneGutter, frameNode);
696 }
697 
GetLaneGutter(FrameNode * frameNode)698 float ListModelNG::GetLaneGutter(FrameNode* frameNode)
699 {
700     CHECK_NULL_RETURN(frameNode, 0);
701     Dimension laneLaneGutter = 0.0_vp;
702     return frameNode->GetLayoutProperty<ListLayoutProperty>()->GetLaneGutter().value_or(laneLaneGutter).Value();
703 }
704 
GetListItemAlign(FrameNode * frameNode)705 int32_t ListModelNG::GetListItemAlign(FrameNode* frameNode)
706 {
707     CHECK_NULL_RETURN(frameNode, 0);
708     return static_cast<int32_t>(
709         frameNode->GetLayoutProperty<ListLayoutProperty>()->GetListItemAlignValue(V2::ListItemAlign::START));
710 }
711 
SetListItemAlign(FrameNode * frameNode,V2::ListItemAlign listItemAlign)712 void ListModelNG::SetListItemAlign(FrameNode* frameNode, V2::ListItemAlign listItemAlign)
713 {
714     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ListItemAlign, listItemAlign, frameNode);
715 }
716 
GetListSpace(FrameNode * frameNode)717 float ListModelNG::GetListSpace(FrameNode* frameNode)
718 {
719     CHECK_NULL_RETURN(frameNode, 0.0f);
720     auto value = frameNode->GetLayoutProperty<ListLayoutProperty>()->GetSpaceValue();
721     return value.ConvertToVp();
722 }
723 
SetListSpace(FrameNode * frameNode,const Dimension & space)724 void ListModelNG::SetListSpace(FrameNode* frameNode, const Dimension& space)
725 {
726     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, Space, space, frameNode);
727 }
728 
GetEdgeEffect(FrameNode * frameNode)729 int32_t ListModelNG::GetEdgeEffect(FrameNode* frameNode)
730 {
731     CHECK_NULL_RETURN(frameNode, 0);
732     return ScrollableModelNG::GetEdgeEffect(frameNode);
733 }
734 
GetEdgeEffectAlways(FrameNode * frameNode)735 int32_t ListModelNG::GetEdgeEffectAlways(FrameNode* frameNode)
736 {
737     CHECK_NULL_RETURN(frameNode, 0.0f);
738     return ScrollableModelNG::GetAlwaysEnabled(frameNode);
739 }
740 
SetScrollSnapAlign(FrameNode * frameNode,V2::ScrollSnapAlign scrollSnapAlign)741 void ListModelNG::SetScrollSnapAlign(FrameNode* frameNode, V2::ScrollSnapAlign scrollSnapAlign)
742 {
743     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ScrollSnapAlign, scrollSnapAlign, frameNode);
744 }
745 
GetScrollSnapAlign(FrameNode * frameNode)746 int32_t ListModelNG::GetScrollSnapAlign(FrameNode* frameNode)
747 {
748     CHECK_NULL_RETURN(frameNode, 0);
749     auto layoutProperty = frameNode->GetLayoutProperty<ListLayoutProperty>();
750     return static_cast<int32_t>(layoutProperty->GetScrollSnapAlign().value_or(V2::ScrollSnapAlign::NONE));
751 }
752 
SetContentStartOffset(FrameNode * frameNode,float startOffset)753 void ListModelNG::SetContentStartOffset(FrameNode* frameNode, float startOffset)
754 {
755     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ContentStartOffset, startOffset, frameNode);
756 }
757 
GetContentStartOffset(FrameNode * frameNode)758 float ListModelNG::GetContentStartOffset(FrameNode* frameNode)
759 {
760     CHECK_NULL_RETURN(frameNode, 0);
761     auto layoutProperty = frameNode->GetLayoutProperty<ListLayoutProperty>();
762     return static_cast<float>(layoutProperty->GetContentStartOffset().value_or(0.0f));
763 }
764 
SetContentEndOffset(FrameNode * frameNode,float endOffset)765 void ListModelNG::SetContentEndOffset(FrameNode* frameNode, float endOffset)
766 {
767     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ContentEndOffset, endOffset, frameNode);
768 }
769 
GetContentEndOffset(FrameNode * frameNode)770 float ListModelNG::GetContentEndOffset(FrameNode* frameNode)
771 {
772     CHECK_NULL_RETURN(frameNode, 0);
773     auto layoutProperty = frameNode->GetLayoutProperty<ListLayoutProperty>();
774     return static_cast<float>(layoutProperty->GetContentEndOffset().value_or(0.0f));
775 }
776 
SetDivider(FrameNode * frameNode,const V2::ItemDivider & divider)777 void ListModelNG::SetDivider(FrameNode* frameNode, const V2::ItemDivider& divider)
778 {
779     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, Divider, divider, frameNode);
780 }
781 
SetChainAnimationOptions(FrameNode * frameNode,const ChainAnimationOptions & options)782 void ListModelNG::SetChainAnimationOptions(FrameNode* frameNode, const ChainAnimationOptions& options)
783 {
784     CHECK_NULL_VOID(frameNode);
785     auto pattern = frameNode->GetPattern<ListPattern>();
786     CHECK_NULL_VOID(pattern);
787     pattern->SetChainAnimationOptions(options);
788 }
789 
GetDisplayMode() const790 DisplayMode ListModelNG::GetDisplayMode() const
791 {
792     auto list = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ListPattern>();
793     CHECK_NULL_RETURN(list, DisplayMode::AUTO);
794     return list->GetDefaultScrollBarDisplayMode();
795 }
796 
SetOnScroll(FrameNode * frameNode,OnScrollEvent && onScroll)797 void ListModelNG::SetOnScroll(FrameNode* frameNode, OnScrollEvent&& onScroll)
798 {
799     CHECK_NULL_VOID(frameNode);
800     const auto& eventHub = frameNode->GetEventHub<ListEventHub>();
801     CHECK_NULL_VOID(eventHub);
802     eventHub->SetOnDidScroll(std::move(onScroll));
803 }
804 
SetOnScrollFrameBegin(FrameNode * frameNode,OnScrollFrameBeginEvent && onScrollFrameBegin)805 void ListModelNG::SetOnScrollFrameBegin(FrameNode* frameNode, OnScrollFrameBeginEvent&& onScrollFrameBegin)
806 {
807     CHECK_NULL_VOID(frameNode);
808     const auto& eventHub = frameNode->GetEventHub<ListEventHub>();
809     CHECK_NULL_VOID(eventHub);
810     eventHub->SetOnScrollFrameBegin(std::move(onScrollFrameBegin));
811 }
812 
SetOnScrollStart(FrameNode * frameNode,OnScrollStartEvent && onScrollStart)813 void ListModelNG::SetOnScrollStart(FrameNode* frameNode, OnScrollStartEvent&& onScrollStart)
814 {
815     CHECK_NULL_VOID(frameNode);
816     const auto& eventHub = frameNode->GetEventHub<ListEventHub>();
817     CHECK_NULL_VOID(eventHub);
818     eventHub->SetOnScrollStart(std::move(onScrollStart));
819 }
820 
SetOnScrollStop(FrameNode * frameNode,OnScrollStopEvent && onScrollStop)821 void ListModelNG::SetOnScrollStop(FrameNode* frameNode, OnScrollStopEvent&& onScrollStop)
822 {
823     CHECK_NULL_VOID(frameNode);
824     const auto& eventHub = frameNode->GetEventHub<ListEventHub>();
825     CHECK_NULL_VOID(eventHub);
826     eventHub->SetOnScrollStop(std::move(onScrollStop));
827 }
828 
SetScrollToIndex(FrameNode * frameNode,int32_t index,int32_t animation,int32_t alignment,std::optional<float> extraOffset)829 void ListModelNG::SetScrollToIndex(
830     FrameNode* frameNode, int32_t index, int32_t animation, int32_t alignment, std::optional<float> extraOffset)
831 {
832     CHECK_NULL_VOID(frameNode);
833     auto pattern = frameNode->GetPattern<ListPattern>();
834     CHECK_NULL_VOID(pattern);
835     pattern->ScrollToIndex(index, animation, static_cast<ScrollAlign>(alignment), extraOffset);
836 }
837 
SetScrollBy(FrameNode * frameNode,double x,double y)838 void ListModelNG::SetScrollBy(FrameNode* frameNode, double x, double y)
839 {
840     CHECK_NULL_VOID(frameNode);
841     auto pattern = frameNode->GetPattern<ListPattern>();
842     CHECK_NULL_VOID(pattern);
843     pattern->StopAnimate();
844     auto offset = pattern->GetAxis() == Axis::VERTICAL ? y : x;
845     if (NearZero(offset)) {
846         return;
847     }
848     pattern->UpdateCurrentOffset(-offset, SCROLL_FROM_JUMP);
849 }
850 
SetFlingSpeedLimit(FrameNode * frameNode,double maxSpeed)851 void ListModelNG::SetFlingSpeedLimit(FrameNode* frameNode, double maxSpeed)
852 {
853     ScrollableModelNG::SetMaxFlingSpeed(frameNode, maxSpeed);
854 }
855 
GetOrCreateListChildrenMainSize()856 RefPtr<ListChildrenMainSize> ListModelNG::GetOrCreateListChildrenMainSize()
857 {
858     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
859     CHECK_NULL_RETURN(frameNode, nullptr);
860     auto pattern = frameNode->GetPattern<ListPattern>();
861     CHECK_NULL_RETURN(pattern, nullptr);
862     return pattern->GetOrCreateListChildrenMainSize();
863 }
864 
SetListChildrenMainSize(FrameNode * frameNode,float defaultSize,const std::vector<float> & mainSize)865 void ListModelNG::SetListChildrenMainSize(
866     FrameNode* frameNode, float defaultSize, const std::vector<float>& mainSize)
867 {
868     CHECK_NULL_VOID(frameNode);
869     auto pattern = frameNode->GetPattern<ListPattern>();
870     CHECK_NULL_VOID(pattern);
871     pattern->SetListChildrenMainSize(defaultSize, mainSize);
872 }
873 
ResetListChildrenMainSize(FrameNode * frameNode)874 void ListModelNG::ResetListChildrenMainSize(FrameNode* frameNode)
875 {
876     CHECK_NULL_VOID(frameNode);
877     auto pattern = frameNode->GetPattern<ListPattern>();
878     CHECK_NULL_VOID(pattern);
879     pattern->ResetChildrenSize();
880 }
881 
GetInitialIndex(FrameNode * frameNode)882 int32_t ListModelNG::GetInitialIndex(FrameNode* frameNode)
883 {
884     int32_t value = 0;
885     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ListLayoutProperty, InitialIndex, value, frameNode, value);
886     return value;
887 }
888 
GetDivider(FrameNode * frameNode)889 V2::ItemDivider ListModelNG::GetDivider(FrameNode* frameNode)
890 {
891     V2::ItemDivider value;
892     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ListLayoutProperty, Divider, value, frameNode, value);
893     return value;
894 }
895 
SetScroller(FrameNode * frameNode,RefPtr<ScrollControllerBase> scroller,RefPtr<ScrollProxy> proxy)896 void ListModelNG::SetScroller(FrameNode* frameNode, RefPtr<ScrollControllerBase> scroller, RefPtr<ScrollProxy> proxy)
897 {
898     CHECK_NULL_VOID(frameNode);
899     auto pattern = frameNode->GetPattern<ListPattern>();
900     CHECK_NULL_VOID(pattern);
901     pattern->SetPositionController(AceType::DynamicCast<ListPositionController>(scroller));
902     pattern->SetScrollBarProxy(AceType::DynamicCast<ScrollBarProxy>(proxy));
903 }
904 
SetOnScrollVisibleContentChange(FrameNode * frameNode,OnScrollVisibleContentChangeEvent && onScrollVisibleContentChange)905 void ListModelNG::SetOnScrollVisibleContentChange(
906     FrameNode* frameNode, OnScrollVisibleContentChangeEvent&& onScrollVisibleContentChange)
907 {
908     CHECK_NULL_VOID(frameNode);
909     auto eventHub = frameNode->GetEventHub<ListEventHub>();
910     CHECK_NULL_VOID(eventHub);
911     eventHub->SetOnScrollVisibleContentChange(std::move(onScrollVisibleContentChange));
912 }
913 
SetOnItemMove(FrameNode * frameNode,OnItemMoveEvent && onItemMove)914 void ListModelNG::SetOnItemMove(FrameNode* frameNode, OnItemMoveEvent&& onItemMove)
915 {
916     CHECK_NULL_VOID(frameNode);
917     auto eventHub = frameNode->GetEventHub<ListEventHub>();
918     CHECK_NULL_VOID(eventHub);
919     eventHub->SetOnItemMove(std::move(onItemMove));
920 
921     AddDragFrameNodeToManager(frameNode);
922 }
923 
SetOnItemDragStart(FrameNode * frameNode,OnItemDragStartFunc && onItemDragStart)924 void ListModelNG::SetOnItemDragStart(FrameNode* frameNode, OnItemDragStartFunc&& onItemDragStart)
925 {
926     CHECK_NULL_VOID(frameNode);
927     auto eventHub = frameNode->GetEventHub<ListEventHub>();
928     CHECK_NULL_VOID(eventHub);
929     auto onDragStart =
930         [func = std::move(onItemDragStart)](const ItemDragInfo& dragInfo, int32_t index) -> RefPtr<AceType> {
931         ScopedViewStackProcessor builderViewStackProcessor;
932         {
933             return func(dragInfo, index);
934         }
935     };
936     eventHub->SetOnItemDragStart(onDragStart);
937 
938     auto gestureEventHub = eventHub->GetOrCreateGestureEventHub();
939     CHECK_NULL_VOID(gestureEventHub);
940     eventHub->InitItemDragEvent(gestureEventHub);
941 
942     AddDragFrameNodeToManager(frameNode);
943 }
944 
SetOnItemDragEnter(FrameNode * frameNode,OnItemDragEnterFunc && onItemDragEnter)945 void ListModelNG::SetOnItemDragEnter(FrameNode* frameNode, OnItemDragEnterFunc&& onItemDragEnter)
946 {
947     CHECK_NULL_VOID(frameNode);
948     auto eventHub = frameNode->GetEventHub<ListEventHub>();
949     CHECK_NULL_VOID(eventHub);
950     eventHub->SetOnItemDragEnter(std::move(onItemDragEnter));
951 
952     AddDragFrameNodeToManager(frameNode);
953 }
954 
SetOnItemDragLeave(FrameNode * frameNode,OnItemDragLeaveFunc && onItemDragLeave)955 void ListModelNG::SetOnItemDragLeave(FrameNode* frameNode, OnItemDragLeaveFunc&& onItemDragLeave)
956 {
957     CHECK_NULL_VOID(frameNode);
958     auto eventHub = frameNode->GetEventHub<ListEventHub>();
959     CHECK_NULL_VOID(eventHub);
960     eventHub->SetOnItemDragLeave(std::move(onItemDragLeave));
961 
962     AddDragFrameNodeToManager(frameNode);
963 }
964 
SetOnItemDragMove(FrameNode * frameNode,OnItemDragMoveFunc && onItemDragMove)965 void ListModelNG::SetOnItemDragMove(FrameNode* frameNode, OnItemDragMoveFunc&& onItemDragMove)
966 {
967     CHECK_NULL_VOID(frameNode);
968     auto eventHub = frameNode->GetEventHub<ListEventHub>();
969     CHECK_NULL_VOID(eventHub);
970     eventHub->SetOnItemDragMove(std::move(onItemDragMove));
971 
972     AddDragFrameNodeToManager(frameNode);
973 }
974 
SetOnItemDrop(FrameNode * frameNode,OnItemDropFunc && onItemDrop)975 void ListModelNG::SetOnItemDrop(FrameNode* frameNode, OnItemDropFunc&& onItemDrop)
976 {
977     CHECK_NULL_VOID(frameNode);
978     auto eventHub = frameNode->GetEventHub<ListEventHub>();
979     CHECK_NULL_VOID(eventHub);
980     eventHub->SetOnItemDrop(std::move(onItemDrop));
981 
982     AddDragFrameNodeToManager(frameNode);
983 }
984 
AddDragFrameNodeToManager(FrameNode * frameNode)985 void ListModelNG::AddDragFrameNodeToManager(FrameNode* frameNode)
986 {
987     CHECK_NULL_VOID(frameNode);
988     auto pipeline = frameNode->GetContext();
989     CHECK_NULL_VOID(pipeline);
990     auto dragDropManager = pipeline->GetDragDropManager();
991     CHECK_NULL_VOID(dragDropManager);
992 
993     dragDropManager->AddListDragFrameNode(frameNode->GetId(), AceType::WeakClaim(frameNode));
994 }
995 
ScrollToItemInGroup(FrameNode * frameNode,int32_t index,int32_t indexInGroup,bool smooth,ScrollAlign align)996 void ListModelNG::ScrollToItemInGroup(
997     FrameNode* frameNode, int32_t index, int32_t indexInGroup, bool smooth, ScrollAlign align)
998 {
999     CHECK_NULL_VOID(frameNode);
1000     auto listPattern = frameNode->GetPattern<ListPattern>();
1001     CHECK_NULL_VOID(listPattern);
1002     if (align == ScrollAlign::NONE) {
1003         align = ScrollAlign::START;
1004     }
1005     listPattern->ScrollToItemInGroup(index, indexInGroup, smooth, align);
1006 }
1007 } // namespace OHOS::Ace::NG
1008