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/scroll/scroll_model_ng.h"
17 
18 #include "base/geometry/axis.h"
19 #include "base/memory/ace_type.h"
20 #include "base/utils/utils.h"
21 #include "core/components/common/layout/constants.h"
22 #include "core/components_ng/base/view_stack_processor.h"
23 #include "core/components_ng/pattern/scroll/scroll_event_hub.h"
24 #include "core/components_ng/pattern/scroll/scroll_pattern.h"
25 #include "core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h"
26 #include "core/components_ng/pattern/scrollable/scrollable_model_ng.h"
27 #include "core/components_ng/pattern/scrollable/scrollable_properties.h"
28 #include "core/components_v2/inspector/inspector_constants.h"
29 
30 namespace OHOS::Ace::NG {
31 namespace {
32 const std::vector<DisplayMode> DISPLAY_MODE = { DisplayMode::OFF, DisplayMode::AUTO, DisplayMode::ON };
33 }
34 
Create()35 void ScrollModelNG::Create()
36 {
37     auto* stack = ViewStackProcessor::GetInstance();
38     auto nodeId = stack->ClaimNodeId();
39     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::SCROLL_ETS_TAG, nodeId);
40     auto frameNode = FrameNode::GetOrCreateFrameNode(
41         V2::SCROLL_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ScrollPattern>(); });
42     stack->Push(frameNode);
43     auto pattern = frameNode->GetPattern<ScrollPattern>();
44     CHECK_NULL_VOID(pattern);
45     pattern->SetAlwaysEnabled(true);
46     auto positionController = AceType::MakeRefPtr<NG::ScrollableController>();
47     pattern->SetPositionController(positionController);
48     pattern->AddScrollableFrameInfo(SCROLL_FROM_NONE);
49     positionController->SetScrollPattern(pattern);
50 }
51 
CreateFrameNode(int32_t nodeId)52 RefPtr<FrameNode> ScrollModelNG::CreateFrameNode(int32_t nodeId)
53 {
54     auto frameNode = FrameNode::CreateFrameNode(
55         V2::SCROLL_ETS_TAG, nodeId, AceType::MakeRefPtr<ScrollPattern>());
56     auto pattern = frameNode->GetPattern<ScrollPattern>();
57     pattern->SetAlwaysEnabled(true);
58     auto positionController = AceType::MakeRefPtr<NG::ScrollableController>();
59     pattern->SetPositionController(positionController);
60     pattern->TriggerModifyDone();
61     pattern->AddScrollableFrameInfo(SCROLL_FROM_NONE);
62     positionController->SetScrollPattern(pattern);
63     return frameNode;
64 }
65 
GetOrCreateController()66 RefPtr<ScrollControllerBase> ScrollModelNG::GetOrCreateController()
67 {
68     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
69     CHECK_NULL_RETURN(frameNode, nullptr);
70     auto pattern = frameNode->GetPattern<ScrollPattern>();
71     CHECK_NULL_RETURN(pattern, nullptr);
72     if (!pattern->GetScrollPositionController()) {
73         auto controller = AceType::MakeRefPtr<NG::ScrollableController>();
74         pattern->SetPositionController(controller);
75     }
76     return pattern->GetScrollPositionController();
77 }
78 
SetScrollController(FrameNode * frameNode,const RefPtr<ScrollControllerBase> & scroller,const RefPtr<ScrollProxy> & proxy)79 void ScrollModelNG::SetScrollController(
80     FrameNode* frameNode, const RefPtr<ScrollControllerBase>& scroller, const RefPtr<ScrollProxy>& proxy)
81 {
82     CHECK_NULL_VOID(frameNode);
83     auto pattern = frameNode->GetPattern<ScrollPattern>();
84     CHECK_NULL_VOID(pattern);
85     auto scrollController = AceType::DynamicCast<NG::ScrollableController>(scroller);
86     CHECK_NULL_VOID(scrollController);
87     pattern->SetPositionController(scrollController);
88     scrollController->SetScrollPattern(pattern);
89     auto scrollBarProxy = AceType::DynamicCast<NG::ScrollBarProxy>(proxy);
90     CHECK_NULL_VOID(scrollBarProxy);
91     pattern->SetScrollBarProxy(scrollBarProxy);
92 }
93 
SetOnScroll(FrameNode * frameNode,NG::ScrollEvent && event)94 void ScrollModelNG::SetOnScroll(FrameNode* frameNode, NG::ScrollEvent&& event)
95 {
96     CHECK_NULL_VOID(frameNode);
97     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
98     CHECK_NULL_VOID(eventHub);
99     eventHub->SetOnScroll(std::move(event));
100 }
101 
SetOnScrollFrameBegin(FrameNode * frameNode,OnScrollFrameBeginEvent && event)102 void ScrollModelNG::SetOnScrollFrameBegin(FrameNode* frameNode, OnScrollFrameBeginEvent&& event)
103 {
104     CHECK_NULL_VOID(frameNode);
105     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
106     CHECK_NULL_VOID(eventHub);
107     eventHub->SetOnScrollFrameBegin(std::move(event));
108 }
109 
SetOnScrollStart(FrameNode * frameNode,OnScrollStartEvent && event)110 void ScrollModelNG::SetOnScrollStart(FrameNode* frameNode, OnScrollStartEvent&& event)
111 {
112     CHECK_NULL_VOID(frameNode);
113     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
114     CHECK_NULL_VOID(eventHub);
115     eventHub->SetOnScrollStart(std::move(event));
116 }
117 
SetOnScrollStop(FrameNode * frameNode,OnScrollStopEvent && event)118 void ScrollModelNG::SetOnScrollStop(FrameNode* frameNode, OnScrollStopEvent&& event)
119 {
120     CHECK_NULL_VOID(frameNode);
121     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
122     CHECK_NULL_VOID(eventHub);
123     eventHub->SetOnScrollStop(std::move(event));
124 }
125 
CreateScrollBarProxy()126 RefPtr<ScrollProxy> ScrollModelNG::CreateScrollBarProxy()
127 {
128     return AceType::MakeRefPtr<ScrollBarProxy>();
129 }
130 
GetAxis(FrameNode * frameNode)131 int32_t ScrollModelNG::GetAxis(FrameNode *frameNode)
132 {
133     CHECK_NULL_RETURN(frameNode, 0);
134     int32_t value = 0;
135     auto layoutProperty = frameNode->GetLayoutProperty<ScrollLayoutProperty>();
136     if (layoutProperty->GetAxis()) {
137         value = static_cast<int32_t>(layoutProperty->GetAxisValue());
138     }
139     return value;
140 }
141 
SetAxis(Axis axis)142 void ScrollModelNG::SetAxis(Axis axis)
143 {
144     ACE_UPDATE_LAYOUT_PROPERTY(ScrollLayoutProperty, Axis, axis);
145 }
146 
SetOnScrollBegin(OnScrollBeginEvent && event)147 void ScrollModelNG::SetOnScrollBegin(OnScrollBeginEvent&& event)
148 {
149     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
150     CHECK_NULL_VOID(frameNode);
151     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
152     CHECK_NULL_VOID(eventHub);
153     eventHub->SetOnScrollBegin(std::move(event));
154 }
155 
SetOnScrollFrameBegin(OnScrollFrameBeginEvent && event)156 void ScrollModelNG::SetOnScrollFrameBegin(OnScrollFrameBeginEvent&& event)
157 {
158     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
159     CHECK_NULL_VOID(frameNode);
160     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
161     CHECK_NULL_VOID(eventHub);
162     eventHub->SetOnScrollFrameBegin(std::move(event));
163 }
164 
SetOnScroll(NG::ScrollEvent && event)165 void ScrollModelNG::SetOnScroll(NG::ScrollEvent&& event)
166 {
167     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
168     SetOnScroll(frameNode, std::move(event));
169 }
170 
SetOnWillScroll(NG::ScrollEventWithReturn && event)171 void ScrollModelNG::SetOnWillScroll(NG::ScrollEventWithReturn&& event)
172 {
173     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
174     CHECK_NULL_VOID(frameNode);
175     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
176     CHECK_NULL_VOID(eventHub);
177     eventHub->SetOnWillScrollEvent(std::move(event));
178 }
179 
SetOnWillScroll(FrameNode * frameNode,ScrollEventWithReturn && event)180 void ScrollModelNG::SetOnWillScroll(FrameNode* frameNode, ScrollEventWithReturn&& event)
181 {
182     CHECK_NULL_VOID(frameNode);
183     const auto& eventHub = frameNode->GetEventHub<ScrollEventHub>();
184     CHECK_NULL_VOID(eventHub);
185     eventHub->SetOnWillScrollEvent(std::move(event));
186 }
187 
SetOnDidScroll(NG::ScrollEventWithState && event)188 void ScrollModelNG::SetOnDidScroll(NG::ScrollEventWithState&& event)
189 {
190     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
191     CHECK_NULL_VOID(frameNode);
192     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
193     CHECK_NULL_VOID(eventHub);
194     eventHub->SetOnDidScrollEvent(std::move(event));
195 }
196 
SetOnDidScroll(FrameNode * frameNode,ScrollEventWithState && event)197 void ScrollModelNG::SetOnDidScroll(FrameNode* frameNode, ScrollEventWithState&& event)
198 {
199     CHECK_NULL_VOID(frameNode);
200     const auto& eventHub = frameNode->GetEventHub<ScrollEventHub>();
201     CHECK_NULL_VOID(eventHub);
202     eventHub->SetOnDidScrollEvent(std::move(event));
203 }
204 
SetOnScrollEdge(NG::ScrollEdgeEvent && event)205 void ScrollModelNG::SetOnScrollEdge(NG::ScrollEdgeEvent&& event)
206 {
207     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
208     CHECK_NULL_VOID(frameNode);
209     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
210     CHECK_NULL_VOID(eventHub);
211     eventHub->SetOnScrollEdge(std::move(event));
212 }
213 
SetOnScrollEnd(NG::ScrollEndEvent && event)214 void ScrollModelNG::SetOnScrollEnd(NG::ScrollEndEvent&& event)
215 {
216     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
217     CHECK_NULL_VOID(frameNode);
218     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
219     CHECK_NULL_VOID(eventHub);
220     eventHub->SetOnScrollEnd(std::move(event));
221 }
222 
SetOnScrollStart(OnScrollStartEvent && event)223 void ScrollModelNG::SetOnScrollStart(OnScrollStartEvent&& event)
224 {
225     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
226     CHECK_NULL_VOID(frameNode);
227     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
228     CHECK_NULL_VOID(eventHub);
229     eventHub->SetOnScrollStart(std::move(event));
230 }
231 
SetOnScrollStop(OnScrollStopEvent && event)232 void ScrollModelNG::SetOnScrollStop(OnScrollStopEvent&& event)
233 {
234     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
235     CHECK_NULL_VOID(frameNode);
236     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
237     CHECK_NULL_VOID(eventHub);
238     eventHub->SetOnScrollStop(std::move(event));
239 }
240 
SetOnReachStart(OnReachEvent && onReachStart)241 void ScrollModelNG::SetOnReachStart(OnReachEvent&& onReachStart)
242 {
243     ScrollableModelNG::SetOnReachStart(std::move(onReachStart));
244 }
245 
SetOnReachStart(FrameNode * frameNode,OnReachEvent && onReachStart)246 void ScrollModelNG::SetOnReachStart(FrameNode* frameNode, OnReachEvent&& onReachStart)
247 {
248     ScrollableModelNG::SetOnReachStart(frameNode, std::move(onReachStart));
249 }
250 
SetOnReachEnd(OnReachEvent && onReachEnd)251 void ScrollModelNG::SetOnReachEnd(OnReachEvent&& onReachEnd)
252 {
253     ScrollableModelNG::SetOnReachEnd(std::move(onReachEnd));
254 }
255 
SetOnReachEnd(FrameNode * frameNode,OnReachEvent && onReachEnd)256 void ScrollModelNG::SetOnReachEnd(FrameNode* frameNode, OnReachEvent&& onReachEnd)
257 {
258     ScrollableModelNG::SetOnReachEnd(frameNode, std::move(onReachEnd));
259 }
260 
SetScrollBarProxy(const RefPtr<ScrollProxy> & proxy)261 void ScrollModelNG::SetScrollBarProxy(const RefPtr<ScrollProxy>& proxy)
262 {
263     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
264     CHECK_NULL_VOID(frameNode);
265     auto pattern = frameNode->GetPattern<ScrollPattern>();
266     CHECK_NULL_VOID(pattern);
267     auto scrollBarProxy = AceType::DynamicCast<ScrollBarProxy>(proxy);
268     CHECK_NULL_VOID(scrollBarProxy);
269     pattern->SetScrollBarProxy(scrollBarProxy);
270 }
271 
InitScrollBar(const RefPtr<ScrollBarTheme> & theme,const std::pair<bool,Color> & color,const std::pair<bool,Dimension> & width,EdgeEffect effect)272 void ScrollModelNG::InitScrollBar(const RefPtr<ScrollBarTheme>& theme, const std::pair<bool, Color>& color,
273     const std::pair<bool, Dimension>& width, EdgeEffect effect)
274 {}
275 
SetDisplayMode(int value)276 void ScrollModelNG::SetDisplayMode(int value)
277 {
278     auto displayMode = static_cast<DisplayMode>(value);
279     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarMode, displayMode);
280 }
281 
GetEnablePaging(FrameNode * frameNode)282 int32_t ScrollModelNG::GetEnablePaging(FrameNode* frameNode)
283 {
284     CHECK_NULL_RETURN(frameNode, 0.0f);
285     auto pattern = frameNode->GetPattern<ScrollPattern>();
286     CHECK_NULL_RETURN(pattern, 0.0f);
287     return static_cast<int32_t>(pattern->GetEnablePaging());
288 }
289 
SetEnablePaging(bool enablePaging)290 void ScrollModelNG::SetEnablePaging(bool enablePaging)
291 {
292     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
293     CHECK_NULL_VOID(frameNode);
294     auto pattern = frameNode->GetPattern<ScrollPattern>();
295     CHECK_NULL_VOID(pattern);
296     if (!enablePaging) {
297         pattern->SetEnablePaging(ScrollPagingStatus::INVALID);
298         return;
299     }
300     pattern->SetEnablePaging(ScrollPagingStatus::VALID);
301     pattern->SetScrollSnapUpdate(true);
302 }
303 
GetScrollBar(FrameNode * frameNode)304 int32_t ScrollModelNG::GetScrollBar(FrameNode* frameNode)
305 {
306     CHECK_NULL_RETURN(frameNode, 0);
307     return static_cast<int32_t>(frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetScrollBarMode().value());
308 }
309 
SetScrollBar(FrameNode * frameNode,DisplayMode barState)310 void ScrollModelNG::SetScrollBar(FrameNode* frameNode, DisplayMode barState)
311 {
312     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarMode, barState, frameNode);
313 }
314 
SetNestedScroll(FrameNode * frameNode,const NestedScrollOptions & nestedOpt)315 void ScrollModelNG::SetNestedScroll(FrameNode* frameNode, const NestedScrollOptions& nestedOpt)
316 {
317     CHECK_NULL_VOID(frameNode);
318     auto pattern = frameNode->GetPattern<ScrollPattern>();
319     CHECK_NULL_VOID(pattern);
320     pattern->SetNestedScroll(nestedOpt);
321 }
322 
GetFriction(FrameNode * frameNode)323 float ScrollModelNG::GetFriction(FrameNode* frameNode)
324 {
325     CHECK_NULL_RETURN(frameNode, 0.0f);
326     auto pattern = frameNode->GetPattern<ScrollPattern>();
327     CHECK_NULL_RETURN(pattern, 0.0f);
328     return pattern->GetFriction();
329 }
330 
SetFriction(FrameNode * frameNode,double friction)331 void ScrollModelNG::SetFriction(FrameNode* frameNode, double friction)
332 {
333     CHECK_NULL_VOID(frameNode);
334     auto pattern = frameNode->GetPattern<ScrollPattern>();
335     CHECK_NULL_VOID(pattern);
336     pattern->SetFriction(friction);
337 }
338 
GetScrollSnap(FrameNode * frameNode)339 ScrollSnapOptions ScrollModelNG::GetScrollSnap(FrameNode* frameNode)
340 {
341     ScrollSnapOptions snapOptions;
342     CHECK_NULL_RETURN(frameNode, snapOptions);
343     auto pattern = frameNode->GetPattern<ScrollPattern>();
344     CHECK_NULL_RETURN(pattern, snapOptions);
345     snapOptions.enableSnapToStart = pattern->GetEnableSnapToSide().first;
346     snapOptions.enableSnapToEnd = pattern->GetEnableSnapToSide().second;
347     snapOptions.snapAlign = static_cast<int32_t>(pattern->GetScrollSnapAlign());
348     snapOptions.paginationParams = pattern->GetSnapPaginations();
349     return snapOptions;
350 }
351 
SetScrollSnap(FrameNode * frameNode,ScrollSnapAlign scrollSnapAlign,const Dimension & intervalSize,const std::vector<Dimension> & snapPaginations,const std::pair<bool,bool> & enableSnapToSide)352 void ScrollModelNG::SetScrollSnap(FrameNode* frameNode, ScrollSnapAlign scrollSnapAlign, const Dimension& intervalSize,
353     const std::vector<Dimension>& snapPaginations, const std::pair<bool, bool>& enableSnapToSide)
354 {
355     CHECK_NULL_VOID(frameNode);
356     auto pattern = frameNode->GetPattern<ScrollPattern>();
357     CHECK_NULL_VOID(pattern);
358     if (pattern->GetScrollSnapAlign() != scrollSnapAlign) {
359         ACE_UPDATE_NODE_LAYOUT_PROPERTY(ScrollLayoutProperty, ScrollSnapAlign, scrollSnapAlign, frameNode);
360         pattern->SetScrollSnapUpdate(true);
361     }
362     if (scrollSnapAlign != ScrollSnapAlign::NONE) {
363         pattern->SetIntervalSize(intervalSize);
364     }
365     pattern->SetSnapPaginations(snapPaginations);
366     pattern->SetEnableSnapToSide(enableSnapToSide);
367 }
368 
GetScrollEnabled(FrameNode * frameNode)369 int32_t ScrollModelNG::GetScrollEnabled(FrameNode* frameNode)
370 {
371     CHECK_NULL_RETURN(frameNode, 0);
372     int32_t value = true;
373     auto layoutProperty = frameNode->GetLayoutProperty<ScrollLayoutProperty>();
374     if (layoutProperty->GetScrollEnabled()) {
375         value = layoutProperty->GetScrollEnabledValue();
376     }
377     return value;
378 }
379 
SetScrollEnabled(FrameNode * frameNode,bool scrollEnabled)380 void ScrollModelNG::SetScrollEnabled(FrameNode* frameNode, bool scrollEnabled)
381 {
382     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ScrollLayoutProperty, ScrollEnabled, scrollEnabled, frameNode);
383 }
384 
GetScrollBarWidth(FrameNode * frameNode)385 float ScrollModelNG::GetScrollBarWidth(FrameNode* frameNode)
386 {
387     CHECK_NULL_RETURN(frameNode, 0.0f);
388     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarWidth();
389     return value.ConvertToVp();
390 }
391 
SetScrollBarWidth(const Dimension & dimension)392 void ScrollModelNG::SetScrollBarWidth(const Dimension& dimension)
393 {
394     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarWidth, dimension);
395 }
396 
GetScrollBarColor(FrameNode * frameNode)397 uint32_t ScrollModelNG::GetScrollBarColor(FrameNode* frameNode)
398 {
399     CHECK_NULL_RETURN(frameNode, 0);
400     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarColor();
401     return value.GetValue();
402 }
403 
SetScrollBarColor(const Color & color)404 void ScrollModelNG::SetScrollBarColor(const Color& color)
405 {
406     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarColor, color);
407 }
408 
GetEdgeEffect(FrameNode * frameNode)409 int32_t ScrollModelNG::GetEdgeEffect(FrameNode* frameNode)
410 {
411     CHECK_NULL_RETURN(frameNode, 0);
412     return ScrollableModelNG::GetEdgeEffect(frameNode);
413 }
414 
GetEdgeEffectAlways(FrameNode * frameNode)415 int32_t ScrollModelNG::GetEdgeEffectAlways(FrameNode* frameNode)
416 {
417     CHECK_NULL_RETURN(frameNode, 0.0f);
418     return ScrollableModelNG::GetAlwaysEnabled(frameNode);
419 }
420 
SetEdgeEffect(EdgeEffect edgeEffect,bool alwaysEnabled)421 void ScrollModelNG::SetEdgeEffect(EdgeEffect edgeEffect, bool alwaysEnabled)
422 {
423     ScrollableModelNG::SetEdgeEffect(edgeEffect, alwaysEnabled);
424 }
425 
SetNestedScroll(const NestedScrollOptions & nestedOpt)426 void ScrollModelNG::SetNestedScroll(const NestedScrollOptions& nestedOpt)
427 {
428     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
429     CHECK_NULL_VOID(frameNode);
430     auto pattern = frameNode->GetPattern<ScrollPattern>();
431     CHECK_NULL_VOID(pattern);
432     pattern->SetNestedScroll(nestedOpt);
433 }
434 
SetScrollEnabled(bool scrollEnabled)435 void ScrollModelNG::SetScrollEnabled(bool scrollEnabled)
436 {
437     ACE_UPDATE_LAYOUT_PROPERTY(ScrollLayoutProperty, ScrollEnabled, scrollEnabled);
438 }
439 
SetFriction(double friction)440 void ScrollModelNG::SetFriction(double friction)
441 {
442     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
443     CHECK_NULL_VOID(frameNode);
444     auto pattern = frameNode->GetPattern<ScrollPattern>();
445     CHECK_NULL_VOID(pattern);
446     pattern->SetFriction(friction);
447 }
448 
SetScrollSnap(ScrollSnapAlign scrollSnapAlign,const Dimension & intervalSize,const std::vector<Dimension> & snapPaginations,const std::pair<bool,bool> & enableSnapToSide)449 void ScrollModelNG::SetScrollSnap(ScrollSnapAlign scrollSnapAlign, const Dimension& intervalSize,
450     const std::vector<Dimension>& snapPaginations, const std::pair<bool, bool>& enableSnapToSide)
451 {
452     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
453     CHECK_NULL_VOID(frameNode);
454     auto pattern = frameNode->GetPattern<ScrollPattern>();
455     CHECK_NULL_VOID(pattern);
456     if (pattern->GetScrollSnapAlign() != scrollSnapAlign) {
457         ACE_UPDATE_LAYOUT_PROPERTY(ScrollLayoutProperty, ScrollSnapAlign, scrollSnapAlign);
458         pattern->SetScrollSnapUpdate(true);
459     }
460     if (scrollSnapAlign != ScrollSnapAlign::NONE) {
461         pattern->SetIntervalSize(intervalSize);
462     }
463     pattern->SetSnapPaginations(snapPaginations);
464     pattern->SetEnableSnapToSide(enableSnapToSide);
465 }
466 
SetAxis(FrameNode * frameNode,Axis axis)467 void ScrollModelNG::SetAxis(FrameNode* frameNode, Axis axis)
468 {
469     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ScrollLayoutProperty, Axis, axis, frameNode);
470     CHECK_NULL_VOID(frameNode);
471     auto pattern = frameNode->GetPattern<ScrollPattern>();
472     CHECK_NULL_VOID(pattern);
473     pattern->SetAxis(axis);
474 }
475 
SetScrollBarColor(FrameNode * frameNode,const Color & color)476 void ScrollModelNG::SetScrollBarColor(FrameNode* frameNode, const Color& color)
477 {
478     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarColor, color, frameNode);
479 }
480 
SetScrollBarWidth(FrameNode * frameNode,const Dimension & dimension)481 void ScrollModelNG::SetScrollBarWidth(FrameNode* frameNode, const Dimension& dimension)
482 {
483     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarWidth, dimension, frameNode);
484 }
485 
SetEdgeEffect(FrameNode * frameNode,const EdgeEffect & edgeEffect,bool alwaysEnabled)486 void ScrollModelNG::SetEdgeEffect(FrameNode* frameNode, const EdgeEffect& edgeEffect, bool alwaysEnabled)
487 {
488     ScrollableModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled);
489 }
490 
SetEnablePaging(FrameNode * frameNode,bool enablePaging)491 void ScrollModelNG::SetEnablePaging(FrameNode* frameNode, bool enablePaging)
492 {
493     CHECK_NULL_VOID(frameNode);
494     auto pattern = frameNode->GetPattern<ScrollPattern>();
495     CHECK_NULL_VOID(pattern);
496     if (!enablePaging) {
497         pattern->SetEnablePaging(ScrollPagingStatus::INVALID);
498         return;
499     }
500     pattern->SetEnablePaging(ScrollPagingStatus::VALID);
501     pattern->SetScrollSnapUpdate(true);
502 }
503 
GetOrCreateController(FrameNode * frameNode)504 RefPtr<ScrollControllerBase> ScrollModelNG::GetOrCreateController(FrameNode* frameNode)
505 {
506     CHECK_NULL_RETURN(frameNode, nullptr);
507     auto pattern = frameNode->GetPattern<ScrollPattern>();
508     CHECK_NULL_RETURN(pattern, nullptr);
509     if (!pattern->GetScrollPositionController()) {
510         auto controller = AceType::MakeRefPtr<NG::ScrollableController>();
511         pattern->SetPositionController(controller);
512     }
513     return pattern->GetScrollPositionController();
514 }
515 
SetOnScrollEdge(FrameNode * frameNode,NG::ScrollEdgeEvent && event)516 void ScrollModelNG::SetOnScrollEdge(FrameNode* frameNode, NG::ScrollEdgeEvent&& event)
517 {
518     CHECK_NULL_VOID(frameNode);
519     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
520     CHECK_NULL_VOID(eventHub);
521     eventHub->SetOnScrollEdge(std::move(event));
522 }
523 
GetNestedScroll(FrameNode * frameNode)524 NestedScrollOptions ScrollModelNG::GetNestedScroll(FrameNode* frameNode)
525 {
526     NestedScrollOptions defaultOptions;
527     CHECK_NULL_RETURN(frameNode, defaultOptions);
528     auto pattern = frameNode->GetPattern<ScrollPattern>();
529     CHECK_NULL_RETURN(pattern, defaultOptions);
530     return pattern->GetNestedScroll();
531 }
532 
GetOnScrollEdge(FrameNode * frameNode)533 ScrollEdgeType ScrollModelNG::GetOnScrollEdge(FrameNode* frameNode)
534 {
535     CHECK_NULL_RETURN(frameNode, ScrollEdgeType::SCROLL_TOP);
536     auto pattern = frameNode->GetPattern<ScrollablePattern>();
537     Axis axis = pattern->GetAxis();
538 
539     switch (axis) {
540         case Axis::VERTICAL:
541             if (pattern->IsAtTop()) {
542                 return ScrollEdgeType::SCROLL_TOP;
543             }
544             if (pattern->IsAtBottom()) {
545                 return ScrollEdgeType::SCROLL_BOTTOM;
546             }
547             break;
548         case Axis::HORIZONTAL:
549             if (pattern->IsAtTop()) {
550                 return ScrollEdgeType::SCROLL_LEFT;
551             }
552             if (pattern->IsAtBottom()) {
553                 return ScrollEdgeType::SCROLL_RIGHT;
554             }
555             break;
556         default:
557             break;
558     }
559     return ScrollEdgeType::SCROLL_NONE;
560 }
561 
SetInitialOffset(const OffsetT<CalcDimension> & offset)562 void ScrollModelNG::SetInitialOffset(const OffsetT<CalcDimension>& offset)
563 {
564     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
565     CHECK_NULL_VOID(frameNode);
566     auto pattern = frameNode->GetPattern<ScrollPattern>();
567     CHECK_NULL_VOID(pattern);
568     pattern->SetInitialOffset(offset);
569 }
570 
SetInitialOffset(FrameNode * frameNode,const OffsetT<CalcDimension> & offset)571 void ScrollModelNG::SetInitialOffset(FrameNode* frameNode, const OffsetT<CalcDimension>& offset)
572 {
573     CHECK_NULL_VOID(frameNode);
574     auto pattern = frameNode->GetPattern<ScrollPattern>();
575     CHECK_NULL_VOID(pattern);
576     pattern->SetInitialOffset(offset);
577 }
578 
SetScrollBarProxy(FrameNode * frameNode,const RefPtr<ScrollProxy> & proxy)579 void ScrollModelNG::SetScrollBarProxy(FrameNode* frameNode, const RefPtr<ScrollProxy>& proxy)
580 {
581     CHECK_NULL_VOID(frameNode);
582     auto pattern = frameNode->GetPattern<ScrollPattern>();
583     CHECK_NULL_VOID(pattern);
584     auto scrollBarProxy = AceType::DynamicCast<ScrollBarProxy>(proxy);
585     CHECK_NULL_VOID(scrollBarProxy);
586     pattern->SetScrollBarProxy(scrollBarProxy);
587 }
588 } // namespace OHOS::Ace::NG
589