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 
SetListNestedScroll(FrameNode * frameNode,const NestedScrollOptions & nestedOpt)570 void ListModelNG::SetListNestedScroll(FrameNode* frameNode, const NestedScrollOptions& nestedOpt)
571 {
572     CHECK_NULL_VOID(frameNode);
573     auto pattern = frameNode->GetPattern<ListPattern>();
574     CHECK_NULL_VOID(pattern);
575     pattern->SetNestedScroll(nestedOpt);
576 }
577 
GetListNestedScroll(FrameNode * frameNode)578 NestedScrollOptions ListModelNG::GetListNestedScroll(FrameNode* frameNode)
579 {
580     NestedScrollOptions defaultOptions;
581     CHECK_NULL_RETURN(frameNode, defaultOptions);
582     auto pattern = frameNode->GetPattern<ListPattern>();
583     CHECK_NULL_RETURN(pattern, defaultOptions);
584     return pattern->GetNestedScroll();
585 }
586 
GetListScrollBar(FrameNode * frameNode)587 int32_t ListModelNG::GetListScrollBar(FrameNode* frameNode)
588 {
589     CHECK_NULL_RETURN(frameNode, 0);
590     return static_cast<int32_t>(frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetScrollBarMode().value());
591 }
592 
SetListScrollBar(FrameNode * frameNode,int32_t barState)593 void ListModelNG::SetListScrollBar(FrameNode* frameNode, int32_t barState)
594 {
595     int32_t displayNumber;
596     DisplayMode mode;
597     if (barState < 0 || barState >= static_cast<int32_t>(DISPLAY_MODE.size())) {
598         auto list = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ListPattern>();
599         if (!list) {
600             mode = DisplayMode::AUTO;
601         } else {
602             mode = list->GetDefaultScrollBarDisplayMode();
603         }
604         displayNumber = static_cast<int32_t>(mode);
605     } else {
606         displayNumber = barState;
607     }
608     ScrollableModelNG::SetScrollBarMode(frameNode, displayNumber);
609 }
610 
GetScrollBarWidth(FrameNode * frameNode)611 float ListModelNG::GetScrollBarWidth(FrameNode* frameNode)
612 {
613     CHECK_NULL_RETURN(frameNode, 0.0f);
614     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarWidth();
615     return value.ConvertToVp();
616 }
617 
SetListScrollBarWidth(FrameNode * frameNode,const std::string & value)618 void ListModelNG::SetListScrollBarWidth(FrameNode* frameNode, const std::string& value)
619 {
620     ScrollableModelNG::SetScrollBarWidth(frameNode, value);
621 }
622 
GetScrollBarColor(FrameNode * frameNode)623 uint32_t ListModelNG::GetScrollBarColor(FrameNode* frameNode)
624 {
625     CHECK_NULL_RETURN(frameNode, 0);
626     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarColor();
627     return value.GetValue();
628 }
629 
SetListScrollBarColor(FrameNode * frameNode,const std::string & value)630 void ListModelNG::SetListScrollBarColor(FrameNode* frameNode, const std::string& value)
631 {
632     ScrollableModelNG::SetScrollBarColor(frameNode, value);
633 }
634 
SetLanes(FrameNode * frameNode,int32_t lanes)635 void ListModelNG::SetLanes(FrameNode* frameNode, int32_t lanes)
636 {
637     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, Lanes, lanes, frameNode);
638 }
639 
SetLaneConstrain(FrameNode * frameNode,const Dimension & laneMinLength,const Dimension & laneMaxLength)640 void ListModelNG::SetLaneConstrain(FrameNode* frameNode, const Dimension& laneMinLength, const Dimension& laneMaxLength)
641 {
642     SetLaneMinLength(frameNode, laneMinLength);
643     SetLaneMaxLength(frameNode, laneMaxLength);
644 }
645 
SetLaneMinLength(FrameNode * frameNode,const Dimension & laneMinLength)646 void ListModelNG::SetLaneMinLength(FrameNode* frameNode, const Dimension& laneMinLength)
647 {
648     if (laneMinLength.IsValid()) {
649         ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, LaneMinLength, laneMinLength, frameNode);
650     } else {
651         ACE_RESET_NODE_LAYOUT_PROPERTY_WITH_FLAG(ListLayoutProperty, LaneMinLength, PROPERTY_UPDATE_MEASURE, frameNode);
652     }
653 }
654 
SetLaneMaxLength(FrameNode * frameNode,const Dimension & laneMaxLength)655 void ListModelNG::SetLaneMaxLength(FrameNode* frameNode, const Dimension& laneMaxLength)
656 {
657     if (laneMaxLength.IsValid()) {
658         ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, LaneMaxLength, laneMaxLength, frameNode);
659     } else {
660         ACE_RESET_NODE_LAYOUT_PROPERTY_WITH_FLAG(ListLayoutProperty, LaneMaxLength, PROPERTY_UPDATE_MEASURE, frameNode);
661     }
662 }
663 
SetLaneGutter(FrameNode * frameNode,const Dimension & laneGutter)664 void ListModelNG::SetLaneGutter(FrameNode* frameNode, const Dimension& laneGutter)
665 {
666     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, LaneGutter, laneGutter, frameNode);
667 }
668 
GetListItemAlign(FrameNode * frameNode)669 int32_t ListModelNG::GetListItemAlign(FrameNode* frameNode)
670 {
671     CHECK_NULL_RETURN(frameNode, 0);
672     return static_cast<int32_t>(
673         frameNode->GetLayoutProperty<ListLayoutProperty>()->GetListItemAlignValue(V2::ListItemAlign::START));
674 }
675 
SetListItemAlign(FrameNode * frameNode,V2::ListItemAlign listItemAlign)676 void ListModelNG::SetListItemAlign(FrameNode* frameNode, V2::ListItemAlign listItemAlign)
677 {
678     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ListItemAlign, listItemAlign, frameNode);
679 }
680 
GetListSpace(FrameNode * frameNode)681 float ListModelNG::GetListSpace(FrameNode* frameNode)
682 {
683     CHECK_NULL_RETURN(frameNode, 0.0f);
684     auto value = frameNode->GetLayoutProperty<ListLayoutProperty>()->GetSpaceValue();
685     return value.ConvertToVp();
686 }
687 
SetListSpace(FrameNode * frameNode,const Dimension & space)688 void ListModelNG::SetListSpace(FrameNode* frameNode, const Dimension& space)
689 {
690     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, Space, space, frameNode);
691 }
692 
GetEdgeEffect(FrameNode * frameNode)693 int32_t ListModelNG::GetEdgeEffect(FrameNode* frameNode)
694 {
695     CHECK_NULL_RETURN(frameNode, 0);
696     return ScrollableModelNG::GetEdgeEffect(frameNode);
697 }
698 
GetEdgeEffectAlways(FrameNode * frameNode)699 int32_t ListModelNG::GetEdgeEffectAlways(FrameNode* frameNode)
700 {
701     CHECK_NULL_RETURN(frameNode, 0.0f);
702     return ScrollableModelNG::GetAlwaysEnabled(frameNode);
703 }
704 
SetScrollSnapAlign(FrameNode * frameNode,V2::ScrollSnapAlign scrollSnapAlign)705 void ListModelNG::SetScrollSnapAlign(FrameNode* frameNode, V2::ScrollSnapAlign scrollSnapAlign)
706 {
707     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ScrollSnapAlign, scrollSnapAlign, frameNode);
708 }
709 
SetContentStartOffset(FrameNode * frameNode,float startOffset)710 void ListModelNG::SetContentStartOffset(FrameNode* frameNode, float startOffset)
711 {
712     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ContentStartOffset, startOffset, frameNode);
713 }
714 
SetContentEndOffset(FrameNode * frameNode,float endOffset)715 void ListModelNG::SetContentEndOffset(FrameNode* frameNode, float endOffset)
716 {
717     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ContentEndOffset, endOffset, frameNode);
718 }
719 
SetDivider(FrameNode * frameNode,const V2::ItemDivider & divider)720 void ListModelNG::SetDivider(FrameNode* frameNode, const V2::ItemDivider& divider)
721 {
722     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ListLayoutProperty, Divider, divider, frameNode);
723 }
724 
SetChainAnimationOptions(FrameNode * frameNode,const ChainAnimationOptions & options)725 void ListModelNG::SetChainAnimationOptions(FrameNode* frameNode, const ChainAnimationOptions& options)
726 {
727     CHECK_NULL_VOID(frameNode);
728     auto pattern = frameNode->GetPattern<ListPattern>();
729     CHECK_NULL_VOID(pattern);
730     pattern->SetChainAnimationOptions(options);
731 }
732 
GetDisplayMode() const733 DisplayMode ListModelNG::GetDisplayMode() const
734 {
735     auto list = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ListPattern>();
736     CHECK_NULL_RETURN(list, DisplayMode::AUTO);
737     return list->GetDefaultScrollBarDisplayMode();
738 }
739 
SetOnScroll(FrameNode * frameNode,OnScrollEvent && onScroll)740 void ListModelNG::SetOnScroll(FrameNode* frameNode, OnScrollEvent&& onScroll)
741 {
742     CHECK_NULL_VOID(frameNode);
743     const auto& eventHub = frameNode->GetEventHub<ListEventHub>();
744     CHECK_NULL_VOID(eventHub);
745     eventHub->SetOnDidScroll(std::move(onScroll));
746 }
747 
SetOnScrollFrameBegin(FrameNode * frameNode,OnScrollFrameBeginEvent && onScrollFrameBegin)748 void ListModelNG::SetOnScrollFrameBegin(FrameNode* frameNode, OnScrollFrameBeginEvent&& onScrollFrameBegin)
749 {
750     CHECK_NULL_VOID(frameNode);
751     const auto& eventHub = frameNode->GetEventHub<ListEventHub>();
752     CHECK_NULL_VOID(eventHub);
753     eventHub->SetOnScrollFrameBegin(std::move(onScrollFrameBegin));
754 }
755 
SetOnScrollStart(FrameNode * frameNode,OnScrollStartEvent && onScrollStart)756 void ListModelNG::SetOnScrollStart(FrameNode* frameNode, OnScrollStartEvent&& onScrollStart)
757 {
758     CHECK_NULL_VOID(frameNode);
759     const auto& eventHub = frameNode->GetEventHub<ListEventHub>();
760     CHECK_NULL_VOID(eventHub);
761     eventHub->SetOnScrollStart(std::move(onScrollStart));
762 }
763 
SetOnScrollStop(FrameNode * frameNode,OnScrollStopEvent && onScrollStop)764 void ListModelNG::SetOnScrollStop(FrameNode* frameNode, OnScrollStopEvent&& onScrollStop)
765 {
766     CHECK_NULL_VOID(frameNode);
767     const auto& eventHub = frameNode->GetEventHub<ListEventHub>();
768     CHECK_NULL_VOID(eventHub);
769     eventHub->SetOnScrollStop(std::move(onScrollStop));
770 }
771 
SetScrollToIndex(FrameNode * frameNode,int32_t index,int32_t animation,int32_t alignment)772 void ListModelNG::SetScrollToIndex(FrameNode* frameNode, int32_t index, int32_t animation, int32_t alignment)
773 {
774     CHECK_NULL_VOID(frameNode);
775     auto pattern = frameNode->GetPattern<ListPattern>();
776     CHECK_NULL_VOID(pattern);
777     pattern->ScrollToIndex(index, animation, static_cast<ScrollAlign>(alignment));
778 }
779 
SetScrollBy(FrameNode * frameNode,double x,double y)780 void ListModelNG::SetScrollBy(FrameNode* frameNode, double x, double y)
781 {
782     CHECK_NULL_VOID(frameNode);
783     auto pattern = frameNode->GetPattern<ListPattern>();
784     CHECK_NULL_VOID(pattern);
785     pattern->StopAnimate();
786     auto offset = pattern->GetAxis() == Axis::VERTICAL ? y : x;
787     if (NearZero(offset)) {
788         return;
789     }
790     pattern->UpdateCurrentOffset(-offset, SCROLL_FROM_JUMP);
791 }
792 
SetFlingSpeedLimit(FrameNode * frameNode,double maxSpeed)793 void ListModelNG::SetFlingSpeedLimit(FrameNode* frameNode, double maxSpeed)
794 {
795     ScrollableModelNG::SetMaxFlingSpeed(frameNode, maxSpeed);
796 }
797 
GetOrCreateListChildrenMainSize()798 RefPtr<ListChildrenMainSize> ListModelNG::GetOrCreateListChildrenMainSize()
799 {
800     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
801     CHECK_NULL_RETURN(frameNode, nullptr);
802     auto pattern = frameNode->GetPattern<ListPattern>();
803     CHECK_NULL_RETURN(pattern, nullptr);
804     return pattern->GetOrCreateListChildrenMainSize();
805 }
806 
SetListChildrenMainSize(FrameNode * frameNode,float defaultSize,const std::vector<float> & mainSize)807 void ListModelNG::SetListChildrenMainSize(
808     FrameNode* frameNode, float defaultSize, const std::vector<float>& mainSize)
809 {
810     CHECK_NULL_VOID(frameNode);
811     auto pattern = frameNode->GetPattern<ListPattern>();
812     CHECK_NULL_VOID(pattern);
813     pattern->SetListChildrenMainSize(defaultSize, mainSize);
814 }
815 
ResetListChildrenMainSize(FrameNode * frameNode)816 void ListModelNG::ResetListChildrenMainSize(FrameNode* frameNode)
817 {
818     CHECK_NULL_VOID(frameNode);
819     auto pattern = frameNode->GetPattern<ListPattern>();
820     CHECK_NULL_VOID(pattern);
821     pattern->ResetChildrenSize();
822 }
823 
GetInitialIndex(FrameNode * frameNode)824 int32_t ListModelNG::GetInitialIndex(FrameNode* frameNode)
825 {
826     int32_t value = 0;
827     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ListLayoutProperty, InitialIndex, value, frameNode, value);
828     return value;
829 }
830 
GetDivider(FrameNode * frameNode)831 V2::ItemDivider ListModelNG::GetDivider(FrameNode* frameNode)
832 {
833     V2::ItemDivider value;
834     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ListLayoutProperty, Divider, value, frameNode, value);
835     return value;
836 }
837 
SetScroller(FrameNode * frameNode,RefPtr<ScrollControllerBase> scroller,RefPtr<ScrollProxy> proxy)838 void ListModelNG::SetScroller(FrameNode* frameNode, RefPtr<ScrollControllerBase> scroller, RefPtr<ScrollProxy> proxy)
839 {
840     CHECK_NULL_VOID(frameNode);
841     auto pattern = frameNode->GetPattern<ListPattern>();
842     CHECK_NULL_VOID(pattern);
843     pattern->SetPositionController(AceType::DynamicCast<ListPositionController>(scroller));
844     pattern->SetScrollBarProxy(AceType::DynamicCast<ScrollBarProxy>(proxy));
845 }
846 
SetOnScrollVisibleContentChange(FrameNode * frameNode,OnScrollVisibleContentChangeEvent && onScrollVisibleContentChange)847 void ListModelNG::SetOnScrollVisibleContentChange(
848     FrameNode* frameNode, OnScrollVisibleContentChangeEvent&& onScrollVisibleContentChange)
849 {
850     CHECK_NULL_VOID(frameNode);
851     auto eventHub = frameNode->GetEventHub<ListEventHub>();
852     CHECK_NULL_VOID(eventHub);
853     eventHub->SetOnScrollVisibleContentChange(std::move(onScrollVisibleContentChange));
854 }
855 
SetOnItemMove(FrameNode * frameNode,OnItemMoveEvent && onItemMove)856 void ListModelNG::SetOnItemMove(FrameNode* frameNode, OnItemMoveEvent&& onItemMove)
857 {
858     CHECK_NULL_VOID(frameNode);
859     auto eventHub = frameNode->GetEventHub<ListEventHub>();
860     CHECK_NULL_VOID(eventHub);
861     eventHub->SetOnItemMove(std::move(onItemMove));
862 
863     AddDragFrameNodeToManager(frameNode);
864 }
865 
SetOnItemDragStart(FrameNode * frameNode,OnItemDragStartFunc && onItemDragStart)866 void ListModelNG::SetOnItemDragStart(FrameNode* frameNode, OnItemDragStartFunc&& onItemDragStart)
867 {
868     CHECK_NULL_VOID(frameNode);
869     auto eventHub = frameNode->GetEventHub<ListEventHub>();
870     CHECK_NULL_VOID(eventHub);
871     auto onDragStart =
872         [func = std::move(onItemDragStart)](const ItemDragInfo& dragInfo, int32_t index) -> RefPtr<AceType> {
873         ScopedViewStackProcessor builderViewStackProcessor;
874         {
875             return func(dragInfo, index);
876         }
877     };
878     eventHub->SetOnItemDragStart(onDragStart);
879 
880     auto gestureEventHub = eventHub->GetOrCreateGestureEventHub();
881     CHECK_NULL_VOID(gestureEventHub);
882     eventHub->InitItemDragEvent(gestureEventHub);
883 
884     AddDragFrameNodeToManager(frameNode);
885 }
886 
SetOnItemDragEnter(FrameNode * frameNode,OnItemDragEnterFunc && onItemDragEnter)887 void ListModelNG::SetOnItemDragEnter(FrameNode* frameNode, OnItemDragEnterFunc&& onItemDragEnter)
888 {
889     CHECK_NULL_VOID(frameNode);
890     auto eventHub = frameNode->GetEventHub<ListEventHub>();
891     CHECK_NULL_VOID(eventHub);
892     eventHub->SetOnItemDragEnter(std::move(onItemDragEnter));
893 
894     AddDragFrameNodeToManager(frameNode);
895 }
896 
SetOnItemDragLeave(FrameNode * frameNode,OnItemDragLeaveFunc && onItemDragLeave)897 void ListModelNG::SetOnItemDragLeave(FrameNode* frameNode, OnItemDragLeaveFunc&& onItemDragLeave)
898 {
899     CHECK_NULL_VOID(frameNode);
900     auto eventHub = frameNode->GetEventHub<ListEventHub>();
901     CHECK_NULL_VOID(eventHub);
902     eventHub->SetOnItemDragLeave(std::move(onItemDragLeave));
903 
904     AddDragFrameNodeToManager(frameNode);
905 }
906 
SetOnItemDragMove(FrameNode * frameNode,OnItemDragMoveFunc && onItemDragMove)907 void ListModelNG::SetOnItemDragMove(FrameNode* frameNode, OnItemDragMoveFunc&& onItemDragMove)
908 {
909     CHECK_NULL_VOID(frameNode);
910     auto eventHub = frameNode->GetEventHub<ListEventHub>();
911     CHECK_NULL_VOID(eventHub);
912     eventHub->SetOnItemDragMove(std::move(onItemDragMove));
913 
914     AddDragFrameNodeToManager(frameNode);
915 }
916 
SetOnItemDrop(FrameNode * frameNode,OnItemDropFunc && onItemDrop)917 void ListModelNG::SetOnItemDrop(FrameNode* frameNode, OnItemDropFunc&& onItemDrop)
918 {
919     CHECK_NULL_VOID(frameNode);
920     auto eventHub = frameNode->GetEventHub<ListEventHub>();
921     CHECK_NULL_VOID(eventHub);
922     eventHub->SetOnItemDrop(std::move(onItemDrop));
923 
924     AddDragFrameNodeToManager(frameNode);
925 }
926 
AddDragFrameNodeToManager(FrameNode * frameNode)927 void ListModelNG::AddDragFrameNodeToManager(FrameNode* frameNode)
928 {
929     CHECK_NULL_VOID(frameNode);
930     auto pipeline = frameNode->GetContext();
931     CHECK_NULL_VOID(pipeline);
932     auto dragDropManager = pipeline->GetDragDropManager();
933     CHECK_NULL_VOID(dragDropManager);
934 
935     dragDropManager->AddListDragFrameNode(frameNode->GetId(), AceType::WeakClaim(frameNode));
936 }
937 } // namespace OHOS::Ace::NG
938