1 /*
2  * Copyright (c) 2023 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/waterflow/water_flow_model_ng.h"
17 
18 #include <string>
19 
20 #include "base/geometry/dimension.h"
21 #include "core/components_ng/base/view_stack_processor.h"
22 #include "core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h"
23 #include "core/components_ng/pattern/scrollable/scrollable_controller.h"
24 #include "core/components_ng/pattern/scrollable/scrollable_model_ng.h"
25 #include "core/components_ng/pattern/waterflow/water_flow_pattern.h"
26 #include "core/components_v2/inspector/inspector_constants.h"
27 
28 namespace OHOS::Ace::NG {
Create()29 void WaterFlowModelNG::Create()
30 {
31     auto* stack = ViewStackProcessor::GetInstance();
32     auto nodeId = stack->ClaimNodeId();
33     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::WATERFLOW_ETS_TAG, nodeId);
34     auto frameNode = FrameNode::GetOrCreateFrameNode(
35         V2::WATERFLOW_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<WaterFlowPattern>(); });
36     stack->Push(frameNode);
37 }
38 
CreateFrameNode(int32_t nodeId)39 RefPtr<FrameNode> WaterFlowModelNG::CreateFrameNode(int32_t nodeId)
40 {
41     auto frameNode = FrameNode::CreateFrameNode(V2::WATERFLOW_ETS_TAG, nodeId, AceType::MakeRefPtr<WaterFlowPattern>());
42     return frameNode;
43 }
44 
GetOrCreateController(FrameNode * frameNode)45 RefPtr<ScrollControllerBase> WaterFlowModelNG::GetOrCreateController(FrameNode* frameNode)
46 {
47     CHECK_NULL_RETURN(frameNode, nullptr);
48     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
49     CHECK_NULL_RETURN(pattern, nullptr);
50     if (!pattern->GetPositionController()) {
51         auto controller = AceType::MakeRefPtr<ScrollableController>();
52         pattern->SetPositionController(controller);
53         controller->SetScrollPattern(pattern);
54         pattern->TriggerModifyDone();
55     }
56     return pattern->GetPositionController();
57 }
58 
SetFooter(std::function<void ()> && footer)59 void WaterFlowModelNG::SetFooter(std::function<void()>&& footer)
60 {
61     RefPtr<NG::UINode> footerNode;
62     if (footer) {
63         NG::ScopedViewStackProcessor builderViewStackProcessor;
64         footer();
65         footerNode = NG::ViewStackProcessor::GetInstance()->Finish();
66     }
67     CHECK_NULL_VOID(footerNode);
68     auto* frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
69     CHECK_NULL_VOID(frameNode);
70     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
71     CHECK_NULL_VOID(pattern);
72     pattern->AddFooter(footerNode);
73 }
74 
CreateScrollController()75 RefPtr<ScrollControllerBase> WaterFlowModelNG::CreateScrollController()
76 {
77     return AceType::MakeRefPtr<ScrollableController>();
78 }
79 
CreateScrollBarProxy()80 RefPtr<ScrollProxy> WaterFlowModelNG::CreateScrollBarProxy()
81 {
82     return AceType::MakeRefPtr<NG::ScrollBarProxy>();
83 }
84 
SetScroller(RefPtr<ScrollControllerBase> scroller,RefPtr<ScrollProxy> proxy)85 void WaterFlowModelNG::SetScroller(RefPtr<ScrollControllerBase> scroller, RefPtr<ScrollProxy> proxy)
86 {
87     auto waterFlow = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<WaterFlowPattern>();
88     CHECK_NULL_VOID(waterFlow);
89     waterFlow->SetPositionController(AceType::DynamicCast<ScrollableController>(scroller));
90     waterFlow->SetScrollBarProxy(AceType::DynamicCast<ScrollBarProxy>(proxy));
91 }
92 
SetLayoutMode(WaterFlowLayoutMode mode)93 void WaterFlowModelNG::SetLayoutMode(WaterFlowLayoutMode mode)
94 {
95     auto waterFlow = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<WaterFlowPattern>();
96     CHECK_NULL_VOID(waterFlow);
97     waterFlow->SetLayoutMode(mode);
98 }
99 
SetColumnsTemplate(const std::string & value)100 void WaterFlowModelNG::SetColumnsTemplate(const std::string& value)
101 {
102     if (value.empty()) {
103         TAG_LOGW(AceLogTag::ACE_WATERFLOW, "Columns Template [%{public}s] is not valid.", value.c_str());
104         ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ColumnsTemplate, "1fr");
105         return;
106     }
107     ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ColumnsTemplate, value);
108 }
109 
SetRowsTemplate(const std::string & value)110 void WaterFlowModelNG::SetRowsTemplate(const std::string& value)
111 {
112     if (value.empty()) {
113         TAG_LOGW(AceLogTag::ACE_WATERFLOW, "Rows Template [%{public}s] is not valid.", value.c_str());
114         ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, RowsTemplate, "1fr");
115         return;
116     }
117     ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, RowsTemplate, value);
118 }
119 
SetItemMinWidth(const Dimension & minWidth)120 void WaterFlowModelNG::SetItemMinWidth(const Dimension& minWidth)
121 {
122     if (!ViewStackProcessor::GetInstance()->IsCurrentVisualStateProcess()) {
123         return;
124     }
125     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
126     CHECK_NULL_VOID(frameNode);
127     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
128     CHECK_NULL_VOID(layoutProperty);
129     layoutProperty->UpdateItemMinSize(CalcSize(CalcLength(minWidth), std::nullopt));
130 }
131 
SetItemMinHeight(const Dimension & minHeight)132 void WaterFlowModelNG::SetItemMinHeight(const Dimension& minHeight)
133 {
134     if (!ViewStackProcessor::GetInstance()->IsCurrentVisualStateProcess()) {
135         return;
136     }
137     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
138     CHECK_NULL_VOID(frameNode);
139     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
140     CHECK_NULL_VOID(layoutProperty);
141     layoutProperty->UpdateItemMinSize(CalcSize(std::nullopt, CalcLength(minHeight)));
142 }
143 
SetItemMaxWidth(const Dimension & maxWidth)144 void WaterFlowModelNG::SetItemMaxWidth(const Dimension& maxWidth)
145 {
146     if (!ViewStackProcessor::GetInstance()->IsCurrentVisualStateProcess()) {
147         return;
148     }
149     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
150     CHECK_NULL_VOID(frameNode);
151     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
152     CHECK_NULL_VOID(layoutProperty);
153     layoutProperty->UpdateItemMaxSize(CalcSize(CalcLength(maxWidth), std::nullopt));
154 }
155 
SetItemMaxHeight(const Dimension & maxHeight)156 void WaterFlowModelNG::SetItemMaxHeight(const Dimension& maxHeight)
157 {
158     if (!ViewStackProcessor::GetInstance()->IsCurrentVisualStateProcess()) {
159         return;
160     }
161     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
162     CHECK_NULL_VOID(frameNode);
163     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
164     CHECK_NULL_VOID(layoutProperty);
165     layoutProperty->UpdateItemMaxSize(CalcSize(std::nullopt, CalcLength(maxHeight)));
166 }
167 
SetColumnsGap(const Dimension & value)168 void WaterFlowModelNG::SetColumnsGap(const Dimension& value)
169 {
170     if (value.IsNonNegative()) {
171         ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ColumnsGap, value);
172     }
173 }
174 
SetRowsGap(const Dimension & value)175 void WaterFlowModelNG::SetRowsGap(const Dimension& value)
176 {
177     if (value.IsNonNegative()) {
178         ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, RowsGap, value);
179     }
180 }
181 
SetLayoutDirection(FlexDirection value)182 void WaterFlowModelNG::SetLayoutDirection(FlexDirection value)
183 {
184     ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, WaterflowDirection, value);
185 }
186 
SetNestedScroll(const NestedScrollOptions & nestedOpt)187 void WaterFlowModelNG::SetNestedScroll(const NestedScrollOptions& nestedOpt)
188 {
189     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
190     CHECK_NULL_VOID(frameNode);
191     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
192     CHECK_NULL_VOID(pattern);
193     pattern->SetNestedScroll(nestedOpt);
194 }
195 
SetScrollEnabled(bool scrollEnabled)196 void WaterFlowModelNG::SetScrollEnabled(bool scrollEnabled)
197 {
198     ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ScrollEnabled, scrollEnabled);
199 }
200 
SetOnReachStart(OnReachEvent && onReachStart)201 void WaterFlowModelNG::SetOnReachStart(OnReachEvent&& onReachStart)
202 {
203     ScrollableModelNG::SetOnReachStart(std::move(onReachStart));
204 }
205 
SetOnReachStart(FrameNode * frameNode,OnReachEvent && onReachStart)206 void WaterFlowModelNG::SetOnReachStart(FrameNode* frameNode, OnReachEvent&& onReachStart)
207 {
208     ScrollableModelNG::SetOnReachStart(frameNode, std::move(onReachStart));
209 }
210 
SetOnReachEnd(OnReachEvent && onReachEnd)211 void WaterFlowModelNG::SetOnReachEnd(OnReachEvent&& onReachEnd)
212 {
213     ScrollableModelNG::SetOnReachEnd(std::move(onReachEnd));
214 }
215 
SetOnReachEnd(FrameNode * frameNode,OnReachEvent && onReachEnd)216 void WaterFlowModelNG::SetOnReachEnd(FrameNode* frameNode, OnReachEvent&& onReachEnd)
217 {
218     ScrollableModelNG::SetOnReachEnd(frameNode, std::move(onReachEnd));
219 }
220 
SetOnScrollFrameBegin(OnScrollFrameBeginEvent && ScrollFrameBegin)221 void WaterFlowModelNG::SetOnScrollFrameBegin(OnScrollFrameBeginEvent&& ScrollFrameBegin)
222 {
223     ScrollableModelNG::SetOnScrollFrameBegin(std::move(ScrollFrameBegin));
224 }
225 
SetOnScrollFrameBegin(FrameNode * frameNode,OnScrollFrameBeginEvent && ScrollFrameBegin)226 void WaterFlowModelNG::SetOnScrollFrameBegin(FrameNode* frameNode, OnScrollFrameBeginEvent&& ScrollFrameBegin)
227 {
228     ScrollableModelNG::SetOnScrollFrameBegin(frameNode, std::move(ScrollFrameBegin));
229 }
230 
SetOnScroll(std::function<void (Dimension,ScrollState)> && onScroll)231 void WaterFlowModelNG::SetOnScroll(std::function<void(Dimension, ScrollState)>&& onScroll)
232 {
233     ScrollableModelNG::SetOnScroll(std::move(onScroll));
234 }
235 
SetOnScroll(FrameNode * frameNode,std::function<void (Dimension,ScrollState)> && onScroll)236 void WaterFlowModelNG::SetOnScroll(FrameNode* frameNode, std::function<void(Dimension, ScrollState)>&& onScroll)
237 {
238     ScrollableModelNG::SetOnScroll(frameNode, std::move(onScroll));
239 }
240 
SetOnScrollStart(OnScrollStartEvent && onScrollStart)241 void WaterFlowModelNG::SetOnScrollStart(OnScrollStartEvent&& onScrollStart)
242 {
243     ScrollableModelNG::SetOnScrollStart(std::move(onScrollStart));
244 }
245 
SetOnScrollStart(FrameNode * frameNode,OnScrollStartEvent && onScrollStart)246 void WaterFlowModelNG::SetOnScrollStart(FrameNode* frameNode, OnScrollStartEvent&& onScrollStart)
247 {
248     ScrollableModelNG::SetOnScrollStart(frameNode, std::move(onScrollStart));
249 }
250 
SetOnScrollStop(OnScrollStopEvent && onScrollStop)251 void WaterFlowModelNG::SetOnScrollStop(OnScrollStopEvent&& onScrollStop)
252 {
253     ScrollableModelNG::SetOnScrollStop(std::move(onScrollStop));
254 }
255 
SetOnScrollStop(FrameNode * frameNode,OnScrollStopEvent && onScrollStop)256 void WaterFlowModelNG::SetOnScrollStop(FrameNode* frameNode, OnScrollStopEvent&& onScrollStop)
257 {
258     ScrollableModelNG::SetOnScrollStop(frameNode, std::move(onScrollStop));
259 }
260 
SetOnScrollIndex(ScrollIndexFunc && onScrollIndex)261 void WaterFlowModelNG::SetOnScrollIndex(ScrollIndexFunc&& onScrollIndex)
262 {
263     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
264     CHECK_NULL_VOID(frameNode);
265     auto eventHub = frameNode->GetEventHub<WaterFlowEventHub>();
266     CHECK_NULL_VOID(eventHub);
267     eventHub->SetOnScrollIndex(std::move(onScrollIndex));
268 }
269 
SetOnScrollIndex(FrameNode * frameNode,ScrollIndexFunc && onScrollIndex)270 void WaterFlowModelNG::SetOnScrollIndex(FrameNode* frameNode, ScrollIndexFunc&& onScrollIndex)
271 {
272     CHECK_NULL_VOID(frameNode);
273     auto eventHub = frameNode->GetEventHub<WaterFlowEventHub>();
274     CHECK_NULL_VOID(eventHub);
275     eventHub->SetOnScrollIndex(std::move(onScrollIndex));
276 }
277 
SetFriction(double friction)278 void WaterFlowModelNG::SetFriction(double friction)
279 {
280     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
281     CHECK_NULL_VOID(frameNode);
282     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
283     CHECK_NULL_VOID(pattern);
284     pattern->SetFriction(friction);
285 }
286 
SetCachedCount(int32_t value,bool show)287 void WaterFlowModelNG::SetCachedCount(int32_t value, bool show)
288 {
289     ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, CachedCount, value);
290     ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ShowCachedItems, show);
291 }
292 
SetCachedCount(FrameNode * frameNode,int32_t value)293 void WaterFlowModelNG::SetCachedCount(FrameNode* frameNode, int32_t value)
294 {
295     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, CachedCount, value, frameNode);
296 }
297 
GetCachedCount(FrameNode * frameNode)298 int32_t WaterFlowModelNG::GetCachedCount(FrameNode* frameNode)
299 {
300     int32_t cachedCount = 1;
301     CHECK_NULL_RETURN(frameNode, cachedCount);
302     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
303     int32_t defCachedCount = pattern != nullptr ? pattern->GetDefaultCachedCount() : 1;
304     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, CachedCount, cachedCount, frameNode,
305         defCachedCount);
306     return cachedCount;
307 }
308 
SetShowCached(FrameNode * frameNode,bool show)309 void WaterFlowModelNG::SetShowCached(FrameNode* frameNode, bool show)
310 {
311     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ShowCachedItems, show, frameNode);
312 }
313 
GetShowCached(FrameNode * frameNode)314 int32_t WaterFlowModelNG::GetShowCached(FrameNode* frameNode)
315 {
316     bool show = false;
317     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, ShowCachedItems, show, frameNode, false);
318     return show;
319 }
320 
SetEdgeEffect(EdgeEffect edgeEffect,bool alwaysEnabled)321 void WaterFlowModelNG::SetEdgeEffect(EdgeEffect edgeEffect, bool alwaysEnabled)
322 {
323     ScrollableModelNG::SetEdgeEffect(edgeEffect, alwaysEnabled);
324 }
325 
SetScrollBarMode(DisplayMode value)326 void WaterFlowModelNG::SetScrollBarMode(DisplayMode value)
327 {
328     ScrollableModelNG::SetScrollBarMode(value);
329 }
330 
SetScrollBarMode(FrameNode * frameNode,DisplayMode value)331 void WaterFlowModelNG::SetScrollBarMode(FrameNode* frameNode, DisplayMode value)
332 {
333     ScrollableModelNG::SetScrollBarMode(frameNode, static_cast<int32_t>(value));
334 }
335 
GetScrollBarMode(FrameNode * frameNode)336 int32_t WaterFlowModelNG::GetScrollBarMode(FrameNode* frameNode)
337 {
338     CHECK_NULL_RETURN(frameNode, 0);
339     return static_cast<int32_t>(
340         frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetScrollBarMode().value_or(DisplayMode::AUTO));
341 }
342 
SetScrollBarColor(const std::string & value)343 void WaterFlowModelNG::SetScrollBarColor(const std::string& value)
344 {
345     ScrollableModelNG::SetScrollBarColor(value);
346 }
347 
SetScrollBarColor(FrameNode * frameNode,const std::string & value)348 void WaterFlowModelNG::SetScrollBarColor(FrameNode* frameNode, const std::string& value)
349 {
350     ScrollableModelNG::SetScrollBarColor(frameNode, value);
351 }
352 
GetScrollBarColor(FrameNode * frameNode)353 uint32_t WaterFlowModelNG::GetScrollBarColor(FrameNode* frameNode)
354 {
355     CHECK_NULL_RETURN(frameNode, 0);
356     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarColor();
357     return value.GetValue();
358 }
359 
SetScrollBarWidth(const std::string & value)360 void WaterFlowModelNG::SetScrollBarWidth(const std::string& value)
361 {
362     ScrollableModelNG::SetScrollBarWidth(value);
363 }
364 
SetScrollBarWidth(FrameNode * frameNode,const std::string & value)365 void WaterFlowModelNG::SetScrollBarWidth(FrameNode* frameNode, const std::string& value)
366 {
367     ScrollableModelNG::SetScrollBarWidth(frameNode, value);
368 }
369 
GetScrollBarWidth(FrameNode * frameNode)370 float WaterFlowModelNG::GetScrollBarWidth(FrameNode* frameNode)
371 {
372     CHECK_NULL_RETURN(frameNode, 0.0f);
373     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarWidth();
374     return value.ConvertToVp();
375 }
376 
GetOrCreateWaterFlowSections()377 RefPtr<WaterFlowSections> WaterFlowModelNG::GetOrCreateWaterFlowSections()
378 {
379     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
380     CHECK_NULL_RETURN(frameNode, nullptr);
381     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
382     CHECK_NULL_RETURN(pattern, nullptr);
383     return pattern->GetOrCreateWaterFlowSections();
384 }
385 
GetOrCreateWaterFlowSections(FrameNode * frameNode)386 RefPtr<WaterFlowSections> WaterFlowModelNG::GetOrCreateWaterFlowSections(FrameNode* frameNode)
387 {
388     CHECK_NULL_RETURN(frameNode, nullptr);
389     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
390     CHECK_NULL_RETURN(pattern, nullptr);
391     return pattern->GetOrCreateWaterFlowSections();
392 }
393 
ResetSections()394 void WaterFlowModelNG::ResetSections()
395 {
396     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
397     CHECK_NULL_VOID(frameNode);
398     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
399     CHECK_NULL_VOID(pattern);
400     pattern->ResetSections();
401 }
402 
ResetSections(FrameNode * frameNode)403 void WaterFlowModelNG::ResetSections(FrameNode* frameNode)
404 {
405     CHECK_NULL_VOID(frameNode);
406     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
407     CHECK_NULL_VOID(pattern);
408     pattern->ResetSections();
409 }
410 
SetColumnsTemplate(FrameNode * frameNode,const std::string & value)411 void WaterFlowModelNG::SetColumnsTemplate(FrameNode* frameNode, const std::string& value)
412 {
413     CHECK_NULL_VOID(frameNode);
414     if (value.empty()) {
415         ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ColumnsTemplate, "1fr", frameNode);
416         return;
417     }
418     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ColumnsTemplate, value, frameNode);
419 }
420 
SetRowsTemplate(FrameNode * frameNode,const std::string & value)421 void WaterFlowModelNG::SetRowsTemplate(FrameNode* frameNode, const std::string& value)
422 {
423     CHECK_NULL_VOID(frameNode);
424     if (value.empty()) {
425         ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, RowsTemplate, "1fr", frameNode);
426         return;
427     }
428     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, RowsTemplate, value, frameNode);
429 }
430 
SetScrollEnabled(FrameNode * frameNode,bool scrollEnabled)431 void WaterFlowModelNG::SetScrollEnabled(FrameNode* frameNode, bool scrollEnabled)
432 {
433     CHECK_NULL_VOID(frameNode);
434     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ScrollEnabled, scrollEnabled, frameNode);
435 }
436 
SetColumnsGap(FrameNode * frameNode,const Dimension & value)437 void WaterFlowModelNG::SetColumnsGap(FrameNode* frameNode, const Dimension& value)
438 {
439     if (value.IsNonNegative()) {
440         ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ColumnsGap, value, frameNode);
441     }
442 }
SetRowsGap(FrameNode * frameNode,const Dimension & value)443 void WaterFlowModelNG::SetRowsGap(FrameNode* frameNode, const Dimension& value)
444 {
445     if (value.IsNonNegative()) {
446         ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, RowsGap, value, frameNode);
447     }
448 }
449 
SetItemMinWidth(FrameNode * frameNode,const Dimension & minWidth)450 void WaterFlowModelNG::SetItemMinWidth(FrameNode* frameNode, const Dimension& minWidth)
451 {
452     CHECK_NULL_VOID(frameNode);
453     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
454     CHECK_NULL_VOID(layoutProperty);
455     layoutProperty->UpdateItemMinSize(CalcSize(CalcLength(minWidth), std::nullopt));
456 }
457 
SetItemMinHeight(FrameNode * frameNode,const Dimension & minHeight)458 void WaterFlowModelNG::SetItemMinHeight(FrameNode* frameNode, const Dimension& minHeight)
459 {
460     CHECK_NULL_VOID(frameNode);
461     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
462     CHECK_NULL_VOID(layoutProperty);
463     layoutProperty->UpdateItemMinSize(CalcSize(std::nullopt, CalcLength(minHeight)));
464 }
465 
SetItemMaxWidth(FrameNode * frameNode,const Dimension & maxWidth)466 void WaterFlowModelNG::SetItemMaxWidth(FrameNode* frameNode, const Dimension& maxWidth)
467 {
468     CHECK_NULL_VOID(frameNode);
469     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
470     CHECK_NULL_VOID(layoutProperty);
471     layoutProperty->UpdateItemMaxSize(CalcSize(CalcLength(maxWidth), std::nullopt));
472 }
473 
SetItemMaxHeight(FrameNode * frameNode,const Dimension & maxHeight)474 void WaterFlowModelNG::SetItemMaxHeight(FrameNode* frameNode, const Dimension& maxHeight)
475 {
476     CHECK_NULL_VOID(frameNode);
477     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
478     CHECK_NULL_VOID(layoutProperty);
479     layoutProperty->UpdateItemMaxSize(CalcSize(std::nullopt, CalcLength(maxHeight)));
480 }
481 
SetLayoutDirection(FrameNode * frameNode,FlexDirection value)482 void WaterFlowModelNG::SetLayoutDirection(FrameNode* frameNode, FlexDirection value)
483 {
484     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, WaterflowDirection, value, frameNode);
485 }
486 
SetNestedScroll(FrameNode * frameNode,const NestedScrollOptions & nestedOpt)487 void WaterFlowModelNG::SetNestedScroll(FrameNode* frameNode, const NestedScrollOptions& nestedOpt)
488 {
489     CHECK_NULL_VOID(frameNode);
490     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
491     CHECK_NULL_VOID(pattern);
492     pattern->SetNestedScroll(nestedOpt);
493 }
494 
SetFriction(FrameNode * frameNode,double friction)495 void WaterFlowModelNG::SetFriction(FrameNode* frameNode, double friction)
496 {
497     CHECK_NULL_VOID(frameNode);
498     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
499     CHECK_NULL_VOID(pattern);
500     pattern->SetFriction(friction);
501 }
502 
GetLayoutDirection(FrameNode * frameNode)503 FlexDirection WaterFlowModelNG::GetLayoutDirection(FrameNode* frameNode)
504 {
505     FlexDirection value = FlexDirection::COLUMN;
506     CHECK_NULL_RETURN(frameNode, value);
507     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
508         WaterFlowLayoutProperty, WaterflowDirection, value, frameNode, value);
509     return value;
510 }
511 
GetColumnsTemplate(FrameNode * frameNode)512 std::string WaterFlowModelNG::GetColumnsTemplate(FrameNode* frameNode)
513 {
514     CHECK_NULL_RETURN(frameNode, nullptr);
515     std::string value = "1fr";
516     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, ColumnsTemplate, value, frameNode, value);
517     return value;
518 }
519 
GetRowsTemplate(FrameNode * frameNode)520 std::string WaterFlowModelNG::GetRowsTemplate(FrameNode* frameNode)
521 {
522     std::string value = "1fr";
523     CHECK_NULL_RETURN(frameNode, nullptr);
524     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, RowsTemplate, value, frameNode, value);
525     return value;
526 }
527 
GetColumnsGap(FrameNode * frameNode)528 float WaterFlowModelNG::GetColumnsGap(FrameNode* frameNode)
529 {
530     Dimension value;
531     CHECK_NULL_RETURN(frameNode, value.Value());
532     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, ColumnsGap, value, frameNode, value);
533     return value.Value();
534 }
535 
GetRowsGap(FrameNode * frameNode)536 float WaterFlowModelNG::GetRowsGap(FrameNode* frameNode)
537 {
538     Dimension value;
539     CHECK_NULL_RETURN(frameNode, value.Value());
540     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, RowsGap, value, frameNode, value);
541     return value.Value();
542 }
543 
GetNestedScroll(FrameNode * frameNode)544 NestedScrollOptions WaterFlowModelNG::GetNestedScroll(FrameNode* frameNode)
545 {
546     NestedScrollOptions defaultOptions;
547     CHECK_NULL_RETURN(frameNode, defaultOptions);
548     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
549     CHECK_NULL_RETURN(pattern, defaultOptions);
550     return pattern->GetNestedScroll();
551 }
552 
SetEdgeEffect(FrameNode * frameNode,EdgeEffect edgeEffect,bool alwaysEnabled)553 void WaterFlowModelNG::SetEdgeEffect(FrameNode* frameNode, EdgeEffect edgeEffect, bool alwaysEnabled)
554 {
555     ScrollableModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled);
556 }
GetFriction(FrameNode * frameNode)557 float WaterFlowModelNG::GetFriction(FrameNode* frameNode)
558 {
559     double value = 0.0;
560     CHECK_NULL_RETURN(frameNode, value);
561     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
562     CHECK_NULL_RETURN(pattern, value);
563     return pattern->GetFriction();
564 }
565 
GetEdgeEffect(FrameNode * frameNode)566 int32_t WaterFlowModelNG::GetEdgeEffect(FrameNode* frameNode)
567 {
568     CHECK_NULL_RETURN(frameNode, 0);
569     return ScrollableModelNG::GetEdgeEffect(frameNode);
570 }
571 
GetEdgeEffectAlways(FrameNode * frameNode)572 int32_t WaterFlowModelNG::GetEdgeEffectAlways(FrameNode* frameNode)
573 {
574     CHECK_NULL_RETURN(frameNode, 0.0f);
575     return ScrollableModelNG::GetAlwaysEnabled(frameNode);
576 }
577 
GetItemMinWidth(FrameNode * frameNode)578 Dimension WaterFlowModelNG::GetItemMinWidth(FrameNode* frameNode)
579 {
580     Dimension value = Dimension(0.0f);
581     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
582     CHECK_NULL_RETURN(layoutProperty, value);
583     auto size = layoutProperty->GetItemMinSize();
584     if (size.has_value()) {
585         auto width = size->Width();
586         if (width.has_value()) {
587             return width.value().GetDimension();
588         }
589     }
590     return value;
591 }
592 
GetItemMaxWidth(FrameNode * frameNode)593 Dimension WaterFlowModelNG::GetItemMaxWidth(FrameNode* frameNode)
594 {
595     Dimension value = Dimension(0.0f);
596     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
597     CHECK_NULL_RETURN(layoutProperty, value);
598     auto size = layoutProperty->GetItemMaxSize();
599     if (size.has_value()) {
600         auto width = size->Width();
601         if (width.has_value()) {
602             return width.value().GetDimension();
603         }
604     }
605     return value;
606 }
607 
GetItemMinHeight(FrameNode * frameNode)608 Dimension WaterFlowModelNG::GetItemMinHeight(FrameNode* frameNode)
609 {
610     Dimension value = Dimension(0.0f);
611     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
612     CHECK_NULL_RETURN(layoutProperty, value);
613     auto size = layoutProperty->GetItemMinSize();
614     if (size.has_value()) {
615         auto height = size->Height();
616         if (height.has_value()) {
617             return height.value().GetDimension();
618         }
619     }
620     return value;
621 }
622 
GetItemMaxHeight(FrameNode * frameNode)623 Dimension WaterFlowModelNG::GetItemMaxHeight(FrameNode* frameNode)
624 {
625     Dimension value = Dimension(0.0f);
626     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
627     CHECK_NULL_RETURN(layoutProperty, value);
628     auto size = layoutProperty->GetItemMaxSize();
629     if (size.has_value()) {
630         auto height = size->Height();
631         if (height.has_value()) {
632             return height.value().GetDimension();
633         }
634     }
635     return value;
636 }
637 
GetScrollEnabled(FrameNode * frameNode)638 bool WaterFlowModelNG::GetScrollEnabled(FrameNode* frameNode)
639 {
640     bool value = true;
641     CHECK_NULL_RETURN(frameNode, value);
642     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, ScrollEnabled, value, frameNode, value);
643     return value;
644 }
645 
SetScrollToIndex(FrameNode * frameNode,int32_t index,int32_t animation,int32_t alignment)646 void WaterFlowModelNG::SetScrollToIndex(FrameNode* frameNode, int32_t index, int32_t animation, int32_t alignment)
647 {
648     CHECK_NULL_VOID(frameNode);
649     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
650     CHECK_NULL_VOID(pattern);
651     pattern->ScrollToIndex(index, animation, static_cast<ScrollAlign>(alignment));
652 }
653 
SetWaterflowFooter(FrameNode * frameNode,FrameNode * footerNode)654 void WaterFlowModelNG::SetWaterflowFooter(FrameNode* frameNode, FrameNode* footerNode)
655 {
656     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
657     CHECK_NULL_VOID(pattern);
658     pattern->AddFooter(AceType::Claim<UINode>(footerNode));
659 }
660 
hasFooter(FrameNode * frameNode)661 bool WaterFlowModelNG::hasFooter(FrameNode* frameNode)
662 {
663     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
664     CHECK_NULL_RETURN(pattern, false);
665     return pattern->hasFooter();
666 }
667 
SetFlingSpeedLimit(FrameNode * frameNode,double maxSpeed)668 void WaterFlowModelNG::SetFlingSpeedLimit(FrameNode* frameNode, double maxSpeed)
669 {
670     ScrollableModelNG::SetMaxFlingSpeed(frameNode, maxSpeed);
671 }
672 
SetScroller(FrameNode * frameNode,RefPtr<ScrollControllerBase> scroller,RefPtr<ScrollProxy> proxy)673 void WaterFlowModelNG::SetScroller(
674     FrameNode* frameNode, RefPtr<ScrollControllerBase> scroller, RefPtr<ScrollProxy> proxy)
675 {
676     CHECK_NULL_VOID(frameNode);
677     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
678     CHECK_NULL_VOID(pattern);
679     pattern->SetPositionController(AceType::DynamicCast<ScrollableController>(scroller));
680     pattern->SetScrollBarProxy(AceType::DynamicCast<ScrollBarProxy>(proxy));
681 }
682 
SetLayoutMode(FrameNode * frameNode,WaterFlowLayoutMode mode)683 void WaterFlowModelNG::SetLayoutMode(FrameNode* frameNode, WaterFlowLayoutMode mode)
684 {
685     CHECK_NULL_VOID(frameNode);
686     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
687     CHECK_NULL_VOID(pattern);
688     pattern->SetLayoutMode(mode);
689 }
690 } // namespace OHOS::Ace::NG
691