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