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