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