1 /*
2  * Copyright (c) 2023-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/scrollable/scrollable_model_ng.h"
17 
18 #include "base/utils/utils.h"
19 #include "core/components_ng/base/view_stack_processor.h"
20 #include "core/components_ng/pattern/scrollable/scrollable_event_hub.h"
21 #include "core/components_ng/pattern/scrollable/scrollable_pattern.h"
22 
23 namespace OHOS::Ace::NG {
SetEdgeEffect(EdgeEffect edgeEffect,bool alwaysEnabled)24 void ScrollableModelNG::SetEdgeEffect(EdgeEffect edgeEffect, bool alwaysEnabled)
25 {
26     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
27     CHECK_NULL_VOID(frameNode);
28     auto pattern = frameNode->GetPattern<ScrollablePattern>();
29     CHECK_NULL_VOID(pattern);
30     pattern->SetEdgeEffect(edgeEffect, alwaysEnabled);
31     frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
32 }
33 
SetScrollBarMode(DisplayMode value)34 void ScrollableModelNG::SetScrollBarMode(DisplayMode value)
35 {
36     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarMode, value);
37 }
38 
SetScrollBarColor(const std::string & value)39 void ScrollableModelNG::SetScrollBarColor(const std::string& value)
40 {
41     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarColor, Color::FromString(value));
42 }
43 
SetScrollBarWidth(const std::string & value)44 void ScrollableModelNG::SetScrollBarWidth(const std::string& value)
45 {
46     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarWidth, StringUtils::StringToDimensionWithUnit(value));
47 }
48 
SetOnScroll(OnScrollEvent && onScroll)49 void ScrollableModelNG::SetOnScroll(OnScrollEvent&& onScroll)
50 {
51     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
52     CHECK_NULL_VOID(frameNode);
53     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
54     CHECK_NULL_VOID(eventHub);
55     eventHub->SetOnScroll(std::move(onScroll));
56 }
57 
SetOnScroll(FrameNode * frameNode,OnScrollEvent && onScroll)58 void ScrollableModelNG::SetOnScroll(FrameNode* frameNode, OnScrollEvent&& onScroll)
59 {
60     CHECK_NULL_VOID(frameNode);
61     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
62     CHECK_NULL_VOID(eventHub);
63     eventHub->SetOnScroll(std::move(onScroll));
64 }
65 
SetOnWillScroll(OnWillScrollEvent && onScroll)66 void ScrollableModelNG::SetOnWillScroll(OnWillScrollEvent&& onScroll)
67 {
68     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
69     CHECK_NULL_VOID(frameNode);
70     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
71     CHECK_NULL_VOID(eventHub);
72     eventHub->SetOnWillScroll(std::move(onScroll));
73 }
74 
SetOnWillScroll(FrameNode * frameNode,OnWillScrollEvent && event)75 void ScrollableModelNG::SetOnWillScroll(FrameNode* frameNode, OnWillScrollEvent&& event)
76 {
77     CHECK_NULL_VOID(frameNode);
78     const auto& eventHub = frameNode->GetEventHub<ScrollableEventHub>();
79     CHECK_NULL_VOID(eventHub);
80     eventHub->SetOnWillScroll(std::move(event));
81 }
82 
SetOnDidScroll(OnScrollEvent && onScroll)83 void ScrollableModelNG::SetOnDidScroll(OnScrollEvent&& onScroll)
84 {
85     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
86     CHECK_NULL_VOID(frameNode);
87     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
88     CHECK_NULL_VOID(eventHub);
89     eventHub->SetOnDidScroll(std::move(onScroll));
90 }
91 
SetOnDidScroll(FrameNode * frameNode,OnScrollEvent && onScroll)92 void ScrollableModelNG::SetOnDidScroll(FrameNode* frameNode, OnScrollEvent&& onScroll)
93 {
94     CHECK_NULL_VOID(frameNode);
95     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
96     CHECK_NULL_VOID(eventHub);
97     eventHub->SetOnDidScroll(std::move(onScroll));
98 }
99 
SetOnScrollStart(OnScrollStartEvent && onScrollStart)100 void ScrollableModelNG::SetOnScrollStart(OnScrollStartEvent&& onScrollStart)
101 {
102     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
103     CHECK_NULL_VOID(frameNode);
104     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
105     CHECK_NULL_VOID(eventHub);
106     eventHub->SetOnScrollStart(std::move(onScrollStart));
107 }
108 
SetOnScrollStart(FrameNode * frameNode,OnScrollStartEvent && onScrollStart)109 void ScrollableModelNG::SetOnScrollStart(FrameNode* frameNode, OnScrollStartEvent&& onScrollStart)
110 {
111     CHECK_NULL_VOID(frameNode);
112     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
113     CHECK_NULL_VOID(eventHub);
114     eventHub->SetOnScrollStart(std::move(onScrollStart));
115 }
116 
SetOnScrollStop(OnScrollStopEvent && onScrollStop)117 void ScrollableModelNG::SetOnScrollStop(OnScrollStopEvent&& onScrollStop)
118 {
119     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
120     CHECK_NULL_VOID(frameNode);
121     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
122     CHECK_NULL_VOID(eventHub);
123     eventHub->SetOnScrollStop(std::move(onScrollStop));
124 }
125 
SetOnScrollStop(FrameNode * frameNode,OnScrollStopEvent && onScrollStop)126 void ScrollableModelNG::SetOnScrollStop(FrameNode* frameNode, OnScrollStopEvent&& onScrollStop)
127 {
128     CHECK_NULL_VOID(frameNode);
129     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
130     CHECK_NULL_VOID(eventHub);
131     eventHub->SetOnScrollStop(std::move(onScrollStop));
132 }
133 
SetOnReachStart(OnReachEvent && onReachStart)134 void ScrollableModelNG::SetOnReachStart(OnReachEvent&& onReachStart)
135 {
136     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
137     CHECK_NULL_VOID(frameNode);
138     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
139     CHECK_NULL_VOID(eventHub);
140     eventHub->SetOnReachStart(std::move(onReachStart));
141 }
142 
SetOnReachStart(FrameNode * frameNode,OnReachEvent && onReachStart)143 void ScrollableModelNG::SetOnReachStart(FrameNode* frameNode, OnReachEvent&& onReachStart)
144 {
145     CHECK_NULL_VOID(frameNode);
146     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
147     CHECK_NULL_VOID(eventHub);
148     eventHub->SetOnReachStart(std::move(onReachStart));
149 }
150 
SetOnReachEnd(OnReachEvent && onReachEnd)151 void ScrollableModelNG::SetOnReachEnd(OnReachEvent&& onReachEnd)
152 {
153     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
154     CHECK_NULL_VOID(frameNode);
155     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
156     CHECK_NULL_VOID(eventHub);
157     eventHub->SetOnReachEnd(std::move(onReachEnd));
158 }
159 
SetOnScrollFrameBegin(OnScrollFrameBeginEvent && ScrollFrameBegin)160 void ScrollableModelNG::SetOnScrollFrameBegin(OnScrollFrameBeginEvent&& ScrollFrameBegin)
161 {
162     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
163     CHECK_NULL_VOID(frameNode);
164     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
165     CHECK_NULL_VOID(eventHub);
166     eventHub->SetOnScrollFrameBegin(std::move(ScrollFrameBegin));
167 }
168 
SetOnScrollFrameBegin(FrameNode * frameNode,OnScrollFrameBeginEvent && ScrollFrameBegin)169 void ScrollableModelNG::SetOnScrollFrameBegin(FrameNode* frameNode, OnScrollFrameBeginEvent&& ScrollFrameBegin)
170 {
171     CHECK_NULL_VOID(frameNode);
172     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
173     CHECK_NULL_VOID(eventHub);
174     eventHub->SetOnScrollFrameBegin(std::move(ScrollFrameBegin));
175 }
176 
SetFadingEdge(bool fadingEdge,const Dimension & fadingEdgeLength)177 void ScrollableModelNG::SetFadingEdge(bool fadingEdge, const Dimension& fadingEdgeLength)
178 {
179     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, FadingEdge, fadingEdge);
180     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, FadingEdgeLength, fadingEdgeLength);
181 }
182 
SetFadingEdge(FrameNode * frameNode,bool fadingEdge,const Dimension & fadingEdgeLength)183 void ScrollableModelNG::SetFadingEdge(FrameNode* frameNode, bool fadingEdge, const Dimension& fadingEdgeLength)
184 {
185     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, FadingEdge, fadingEdge, frameNode);
186     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, FadingEdgeLength, fadingEdgeLength, frameNode);
187 }
188 
SetEdgeEffect(FrameNode * frameNode,EdgeEffect edgeEffect,bool alwaysEnabled)189 void ScrollableModelNG::SetEdgeEffect(FrameNode* frameNode, EdgeEffect edgeEffect, bool alwaysEnabled)
190 {
191     CHECK_NULL_VOID(frameNode);
192     auto pattern = frameNode->GetPattern<ScrollablePattern>();
193     CHECK_NULL_VOID(pattern);
194     pattern->SetEdgeEffect(edgeEffect, alwaysEnabled);
195     frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
196 }
197 
SetScrollBarMode(FrameNode * frameNode,int32_t displayNumber)198 void ScrollableModelNG::SetScrollBarMode(FrameNode* frameNode, int32_t displayNumber)
199 {
200     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarMode,
201         static_cast<DisplayMode>(displayNumber), frameNode);
202 }
203 
SetScrollBarWidth(FrameNode * frameNode,const std::string & value)204 void ScrollableModelNG::SetScrollBarWidth(FrameNode* frameNode, const std::string& value)
205 {
206     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarWidth,
207         StringUtils::StringToDimensionWithUnit(value), frameNode);
208 }
209 
SetScrollBarColor(FrameNode * frameNode,const std::string & value)210 void ScrollableModelNG::SetScrollBarColor(FrameNode* frameNode, const std::string& value)
211 {
212     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarColor, Color::FromString(value), frameNode);
213 }
214 
SetMaxFlingSpeed(double max)215 void ScrollableModelNG::SetMaxFlingSpeed(double max)
216 {
217     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
218     CHECK_NULL_VOID(frameNode);
219     auto pattern = frameNode->GetPattern<ScrollablePattern>();
220     CHECK_NULL_VOID(pattern);
221     pattern->SetMaxFlingVelocity(max);
222 }
223 
GetEdgeEffect(FrameNode * frameNode)224 int32_t ScrollableModelNG::GetEdgeEffect(FrameNode* frameNode)
225 {
226     CHECK_NULL_RETURN(frameNode, 0);
227     const auto& pattern = frameNode->GetPattern<ScrollablePattern>();
228     CHECK_NULL_RETURN(pattern, 0);
229     return static_cast<int32_t>(pattern->GetEdgeEffect());
230 }
231 
GetAlwaysEnabled(FrameNode * frameNode)232 int32_t ScrollableModelNG::GetAlwaysEnabled(FrameNode* frameNode)
233 {
234     CHECK_NULL_RETURN(frameNode, 0);
235     const auto& pattern = frameNode->GetPattern<ScrollablePattern>();
236     CHECK_NULL_RETURN(pattern, 0);
237     return pattern->GetAlwaysEnabled();
238 }
239 
SetOnReachEnd(FrameNode * frameNode,OnReachEvent && onReachEnd)240 void ScrollableModelNG::SetOnReachEnd(FrameNode* frameNode, OnReachEvent&& onReachEnd)
241 {
242     CHECK_NULL_VOID(frameNode);
243     auto eventHub = frameNode->GetEventHub<ScrollableEventHub>();
244     CHECK_NULL_VOID(eventHub);
245     eventHub->SetOnReachEnd(std::move(onReachEnd));
246 }
247 
SetMaxFlingSpeed(FrameNode * frameNode,double max)248 void ScrollableModelNG::SetMaxFlingSpeed(FrameNode* frameNode, double max)
249 {
250     CHECK_NULL_VOID(frameNode);
251     auto pattern = frameNode->GetPattern<ScrollablePattern>();
252     CHECK_NULL_VOID(pattern);
253     pattern->SetMaxFlingVelocity(max);
254 }
255 
GetFadingEdge(FrameNode * frameNode)256 bool ScrollableModelNG::GetFadingEdge(FrameNode* frameNode)
257 {
258     CHECK_NULL_RETURN(frameNode, false);
259     auto paintProperty = frameNode->GetPaintProperty<ScrollablePaintProperty>();
260     CHECK_NULL_RETURN(paintProperty, false);
261     return paintProperty->GetFadingEdge().value_or(false);
262 }
263 
GetFadingEdgeLength(FrameNode * frameNode)264 float ScrollableModelNG::GetFadingEdgeLength(FrameNode* frameNode)
265 {
266     CHECK_NULL_RETURN(frameNode, DEFAULT_FADING_EDGE_LENGTH_SCROLLABLE.Value());
267     auto paintProperty = frameNode->GetPaintProperty<ScrollablePaintProperty>();
268     CHECK_NULL_RETURN(paintProperty, DEFAULT_FADING_EDGE_LENGTH_SCROLLABLE.Value());
269     return paintProperty->GetFadingEdgeLength().value_or(DEFAULT_FADING_EDGE_LENGTH_SCROLLABLE).Value();
270 }
271 
SetContentClip(ContentClipMode mode,const RefPtr<ShapeRect> & shape)272 void ScrollableModelNG::SetContentClip(ContentClipMode mode, const RefPtr<ShapeRect>& shape)
273 {
274     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ContentClip, std::make_pair(mode, shape));
275 }
276 
SetContentClip(FrameNode * frameNode,ContentClipMode mode,const RefPtr<ShapeRect> & rect)277 void ScrollableModelNG::SetContentClip(FrameNode* frameNode, ContentClipMode mode, const RefPtr<ShapeRect>& rect)
278 {
279     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ContentClip, std::make_pair(mode, rect), frameNode);
280 }
281 } // namespace OHOS::Ace::NG
282