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