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