• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "core/components_ng/pattern/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     pattern->SetIntervalSize(intervalSize);
363     pattern->SetSnapPaginations(snapPaginations);
364     pattern->SetEnableSnapToSide(enableSnapToSide);
365 }
366 
GetScrollEnabled(FrameNode * frameNode)367 int32_t ScrollModelNG::GetScrollEnabled(FrameNode* frameNode)
368 {
369     CHECK_NULL_RETURN(frameNode, 0);
370     int32_t value = true;
371     auto layoutProperty = frameNode->GetLayoutProperty<ScrollLayoutProperty>();
372     if (layoutProperty->GetScrollEnabled()) {
373         value = layoutProperty->GetScrollEnabledValue();
374     }
375     return value;
376 }
377 
SetScrollEnabled(FrameNode * frameNode,bool scrollEnabled)378 void ScrollModelNG::SetScrollEnabled(FrameNode* frameNode, bool scrollEnabled)
379 {
380     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ScrollLayoutProperty, ScrollEnabled, scrollEnabled, frameNode);
381 }
382 
GetScrollBarWidth(FrameNode * frameNode)383 float ScrollModelNG::GetScrollBarWidth(FrameNode* frameNode)
384 {
385     CHECK_NULL_RETURN(frameNode, 0.0f);
386     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarWidth();
387     return value.ConvertToVp();
388 }
389 
SetScrollBarWidth(const Dimension & dimension)390 void ScrollModelNG::SetScrollBarWidth(const Dimension& dimension)
391 {
392     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarWidth, dimension);
393 }
394 
GetScrollBarColor(FrameNode * frameNode)395 uint32_t ScrollModelNG::GetScrollBarColor(FrameNode* frameNode)
396 {
397     CHECK_NULL_RETURN(frameNode, 0);
398     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarColor();
399     return value.GetValue();
400 }
401 
SetScrollBarColor(const Color & color)402 void ScrollModelNG::SetScrollBarColor(const Color& color)
403 {
404     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarColor, color);
405 }
406 
GetEdgeEffect(FrameNode * frameNode)407 int32_t ScrollModelNG::GetEdgeEffect(FrameNode* frameNode)
408 {
409     CHECK_NULL_RETURN(frameNode, 0);
410     return ScrollableModelNG::GetEdgeEffect(frameNode);
411 }
412 
GetEdgeEffectAlways(FrameNode * frameNode)413 int32_t ScrollModelNG::GetEdgeEffectAlways(FrameNode* frameNode)
414 {
415     CHECK_NULL_RETURN(frameNode, 0.0f);
416     return ScrollableModelNG::GetAlwaysEnabled(frameNode);
417 }
418 
SetEdgeEffect(EdgeEffect edgeEffect,bool alwaysEnabled)419 void ScrollModelNG::SetEdgeEffect(EdgeEffect edgeEffect, bool alwaysEnabled)
420 {
421     ScrollableModelNG::SetEdgeEffect(edgeEffect, alwaysEnabled);
422 }
423 
SetNestedScroll(const NestedScrollOptions & nestedOpt)424 void ScrollModelNG::SetNestedScroll(const NestedScrollOptions& nestedOpt)
425 {
426     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
427     CHECK_NULL_VOID(frameNode);
428     auto pattern = frameNode->GetPattern<ScrollPattern>();
429     CHECK_NULL_VOID(pattern);
430     pattern->SetNestedScroll(nestedOpt);
431 }
432 
SetScrollEnabled(bool scrollEnabled)433 void ScrollModelNG::SetScrollEnabled(bool scrollEnabled)
434 {
435     ACE_UPDATE_LAYOUT_PROPERTY(ScrollLayoutProperty, ScrollEnabled, scrollEnabled);
436 }
437 
SetFriction(double friction)438 void ScrollModelNG::SetFriction(double friction)
439 {
440     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
441     CHECK_NULL_VOID(frameNode);
442     auto pattern = frameNode->GetPattern<ScrollPattern>();
443     CHECK_NULL_VOID(pattern);
444     pattern->SetFriction(friction);
445 }
446 
SetScrollSnap(ScrollSnapAlign scrollSnapAlign,const Dimension & intervalSize,const std::vector<Dimension> & snapPaginations,const std::pair<bool,bool> & enableSnapToSide)447 void ScrollModelNG::SetScrollSnap(ScrollSnapAlign scrollSnapAlign, const Dimension& intervalSize,
448     const std::vector<Dimension>& snapPaginations, const std::pair<bool, bool>& enableSnapToSide)
449 {
450     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
451     CHECK_NULL_VOID(frameNode);
452     auto pattern = frameNode->GetPattern<ScrollPattern>();
453     CHECK_NULL_VOID(pattern);
454     if (pattern->GetScrollSnapAlign() != scrollSnapAlign) {
455         ACE_UPDATE_LAYOUT_PROPERTY(ScrollLayoutProperty, ScrollSnapAlign, scrollSnapAlign);
456         pattern->SetScrollSnapUpdate(true);
457     }
458     pattern->SetIntervalSize(intervalSize);
459     pattern->SetSnapPaginations(snapPaginations);
460     pattern->SetEnableSnapToSide(enableSnapToSide);
461 }
462 
SetAxis(FrameNode * frameNode,Axis axis)463 void ScrollModelNG::SetAxis(FrameNode* frameNode, Axis axis)
464 {
465     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ScrollLayoutProperty, Axis, axis, frameNode);
466     CHECK_NULL_VOID(frameNode);
467     auto pattern = frameNode->GetPattern<ScrollPattern>();
468     CHECK_NULL_VOID(pattern);
469     pattern->SetAxis(axis);
470 }
471 
SetScrollBarColor(FrameNode * frameNode,const Color & color)472 void ScrollModelNG::SetScrollBarColor(FrameNode* frameNode, const Color& color)
473 {
474     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarColor, color, frameNode);
475 }
476 
SetScrollBarWidth(FrameNode * frameNode,const Dimension & dimension)477 void ScrollModelNG::SetScrollBarWidth(FrameNode* frameNode, const Dimension& dimension)
478 {
479     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarWidth, dimension, frameNode);
480 }
481 
SetEdgeEffect(FrameNode * frameNode,const EdgeEffect & edgeEffect,bool alwaysEnabled)482 void ScrollModelNG::SetEdgeEffect(FrameNode* frameNode, const EdgeEffect& edgeEffect, bool alwaysEnabled)
483 {
484     ScrollableModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled);
485 }
486 
SetEnablePaging(FrameNode * frameNode,bool enablePaging)487 void ScrollModelNG::SetEnablePaging(FrameNode* frameNode, bool enablePaging)
488 {
489     CHECK_NULL_VOID(frameNode);
490     auto pattern = frameNode->GetPattern<ScrollPattern>();
491     CHECK_NULL_VOID(pattern);
492     if (!enablePaging) {
493         pattern->SetEnablePaging(ScrollPagingStatus::INVALID);
494         return;
495     }
496     pattern->SetEnablePaging(ScrollPagingStatus::VALID);
497     pattern->SetScrollSnapUpdate(true);
498 }
499 
GetOrCreateController(FrameNode * frameNode)500 RefPtr<ScrollControllerBase> ScrollModelNG::GetOrCreateController(FrameNode* frameNode)
501 {
502     CHECK_NULL_RETURN(frameNode, nullptr);
503     auto pattern = frameNode->GetPattern<ScrollPattern>();
504     CHECK_NULL_RETURN(pattern, nullptr);
505     if (!pattern->GetScrollPositionController()) {
506         auto controller = AceType::MakeRefPtr<NG::ScrollableController>();
507         pattern->SetPositionController(controller);
508     }
509     return pattern->GetScrollPositionController();
510 }
511 
SetOnScrollEdge(FrameNode * frameNode,NG::ScrollEdgeEvent && event)512 void ScrollModelNG::SetOnScrollEdge(FrameNode* frameNode, NG::ScrollEdgeEvent&& event)
513 {
514     CHECK_NULL_VOID(frameNode);
515     auto eventHub = frameNode->GetEventHub<ScrollEventHub>();
516     CHECK_NULL_VOID(eventHub);
517     eventHub->SetOnScrollEdge(std::move(event));
518 }
519 
GetNestedScroll(FrameNode * frameNode)520 NestedScrollOptions ScrollModelNG::GetNestedScroll(FrameNode* frameNode)
521 {
522     NestedScrollOptions defaultOptions;
523     CHECK_NULL_RETURN(frameNode, defaultOptions);
524     auto pattern = frameNode->GetPattern<ScrollPattern>();
525     CHECK_NULL_RETURN(pattern, defaultOptions);
526     return pattern->GetNestedScroll();
527 }
528 
GetOnScrollEdge(FrameNode * frameNode)529 ScrollEdgeType ScrollModelNG::GetOnScrollEdge(FrameNode* frameNode)
530 {
531     CHECK_NULL_RETURN(frameNode, ScrollEdgeType::SCROLL_TOP);
532     auto pattern = frameNode->GetPattern<ScrollablePattern>();
533     Axis axis = pattern->GetAxis();
534 
535     switch (axis) {
536         case Axis::VERTICAL:
537             if (pattern->IsAtTop()) {
538                 return ScrollEdgeType::SCROLL_TOP;
539             }
540             if (pattern->IsAtBottom()) {
541                 return ScrollEdgeType::SCROLL_BOTTOM;
542             }
543             break;
544         case Axis::HORIZONTAL:
545             if (pattern->IsAtTop()) {
546                 return ScrollEdgeType::SCROLL_LEFT;
547             }
548             if (pattern->IsAtBottom()) {
549                 return ScrollEdgeType::SCROLL_RIGHT;
550             }
551             break;
552         default:
553             break;
554     }
555     return ScrollEdgeType::SCROLL_NONE;
556 }
557 
SetInitialOffset(const OffsetT<CalcDimension> & offset)558 void ScrollModelNG::SetInitialOffset(const OffsetT<CalcDimension>& offset)
559 {
560     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
561     CHECK_NULL_VOID(frameNode);
562     auto pattern = frameNode->GetPattern<ScrollPattern>();
563     CHECK_NULL_VOID(pattern);
564     pattern->SetInitialOffset(offset);
565 }
566 
SetInitialOffset(FrameNode * frameNode,const OffsetT<CalcDimension> & offset)567 void ScrollModelNG::SetInitialOffset(FrameNode* frameNode, const OffsetT<CalcDimension>& offset)
568 {
569     CHECK_NULL_VOID(frameNode);
570     auto pattern = frameNode->GetPattern<ScrollPattern>();
571     CHECK_NULL_VOID(pattern);
572     pattern->SetInitialOffset(offset);
573 }
574 
SetScrollBarProxy(FrameNode * frameNode,const RefPtr<ScrollProxy> & proxy)575 void ScrollModelNG::SetScrollBarProxy(FrameNode* frameNode, const RefPtr<ScrollProxy>& proxy)
576 {
577     CHECK_NULL_VOID(frameNode);
578     auto pattern = frameNode->GetPattern<ScrollPattern>();
579     CHECK_NULL_VOID(pattern);
580     auto scrollBarProxy = AceType::DynamicCast<ScrollBarProxy>(proxy);
581     CHECK_NULL_VOID(scrollBarProxy);
582     pattern->SetScrollBarProxy(scrollBarProxy);
583 }
584 } // namespace OHOS::Ace::NG
585