• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)287 void WaterFlowModelNG::SetCachedCount(int32_t value)
288 {
289     ACE_UPDATE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, CachedCount, value);
290 }
291 
SetCachedCount(FrameNode * frameNode,int32_t value)292 void WaterFlowModelNG::SetCachedCount(FrameNode* frameNode, int32_t value)
293 {
294     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, CachedCount, value, frameNode);
295 }
296 
GetCachedCount(FrameNode * frameNode)297 int32_t WaterFlowModelNG::GetCachedCount(FrameNode* frameNode)
298 {
299     int32_t cachedCount = 1;
300     CHECK_NULL_RETURN(frameNode, cachedCount);
301     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
302     int32_t defCachedCount = pattern != nullptr ? pattern->GetDefaultCachedCount() : 1;
303     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, CachedCount, cachedCount, frameNode,
304         defCachedCount);
305     return cachedCount;
306 }
307 
SetEdgeEffect(EdgeEffect edgeEffect,bool alwaysEnabled)308 void WaterFlowModelNG::SetEdgeEffect(EdgeEffect edgeEffect, bool alwaysEnabled)
309 {
310     ScrollableModelNG::SetEdgeEffect(edgeEffect, alwaysEnabled);
311 }
312 
SetScrollBarMode(DisplayMode value)313 void WaterFlowModelNG::SetScrollBarMode(DisplayMode value)
314 {
315     ScrollableModelNG::SetScrollBarMode(value);
316 }
317 
SetScrollBarMode(FrameNode * frameNode,DisplayMode value)318 void WaterFlowModelNG::SetScrollBarMode(FrameNode* frameNode, DisplayMode value)
319 {
320     ScrollableModelNG::SetScrollBarMode(frameNode, static_cast<int32_t>(value));
321 }
322 
GetScrollBarMode(FrameNode * frameNode)323 int32_t WaterFlowModelNG::GetScrollBarMode(FrameNode* frameNode)
324 {
325     CHECK_NULL_RETURN(frameNode, 0);
326     return static_cast<int32_t>(
327         frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetScrollBarMode().value_or(DisplayMode::AUTO));
328 }
329 
SetScrollBarColor(const std::string & value)330 void WaterFlowModelNG::SetScrollBarColor(const std::string& value)
331 {
332     ScrollableModelNG::SetScrollBarColor(value);
333 }
334 
SetScrollBarColor(FrameNode * frameNode,const std::string & value)335 void WaterFlowModelNG::SetScrollBarColor(FrameNode* frameNode, const std::string& value)
336 {
337     ScrollableModelNG::SetScrollBarColor(frameNode, value);
338 }
339 
GetScrollBarColor(FrameNode * frameNode)340 uint32_t WaterFlowModelNG::GetScrollBarColor(FrameNode* frameNode)
341 {
342     CHECK_NULL_RETURN(frameNode, 0);
343     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarColor();
344     return value.GetValue();
345 }
346 
SetScrollBarWidth(const std::string & value)347 void WaterFlowModelNG::SetScrollBarWidth(const std::string& value)
348 {
349     ScrollableModelNG::SetScrollBarWidth(value);
350 }
351 
SetScrollBarWidth(FrameNode * frameNode,const std::string & value)352 void WaterFlowModelNG::SetScrollBarWidth(FrameNode* frameNode, const std::string& value)
353 {
354     ScrollableModelNG::SetScrollBarWidth(frameNode, value);
355 }
356 
GetScrollBarWidth(FrameNode * frameNode)357 float WaterFlowModelNG::GetScrollBarWidth(FrameNode* frameNode)
358 {
359     CHECK_NULL_RETURN(frameNode, 0.0f);
360     auto value = frameNode->GetPaintProperty<ScrollablePaintProperty>()->GetBarWidth();
361     return value.ConvertToVp();
362 }
363 
GetOrCreateWaterFlowSections()364 RefPtr<WaterFlowSections> WaterFlowModelNG::GetOrCreateWaterFlowSections()
365 {
366     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
367     CHECK_NULL_RETURN(frameNode, nullptr);
368     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
369     CHECK_NULL_RETURN(pattern, nullptr);
370     return pattern->GetOrCreateWaterFlowSections();
371 }
372 
GetOrCreateWaterFlowSections(FrameNode * frameNode)373 RefPtr<WaterFlowSections> WaterFlowModelNG::GetOrCreateWaterFlowSections(FrameNode* frameNode)
374 {
375     CHECK_NULL_RETURN(frameNode, nullptr);
376     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
377     CHECK_NULL_RETURN(pattern, nullptr);
378     return pattern->GetOrCreateWaterFlowSections();
379 }
380 
ResetSections()381 void WaterFlowModelNG::ResetSections()
382 {
383     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
384     CHECK_NULL_VOID(frameNode);
385     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
386     CHECK_NULL_VOID(pattern);
387     pattern->ResetSections();
388 }
389 
ResetSections(FrameNode * frameNode)390 void WaterFlowModelNG::ResetSections(FrameNode* frameNode)
391 {
392     CHECK_NULL_VOID(frameNode);
393     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
394     CHECK_NULL_VOID(pattern);
395     pattern->ResetSections();
396 }
397 
SetColumnsTemplate(FrameNode * frameNode,const std::string & value)398 void WaterFlowModelNG::SetColumnsTemplate(FrameNode* frameNode, const std::string& value)
399 {
400     CHECK_NULL_VOID(frameNode);
401     if (value.empty()) {
402         ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ColumnsTemplate, "1fr", frameNode);
403         return;
404     }
405     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ColumnsTemplate, value, frameNode);
406 }
407 
SetRowsTemplate(FrameNode * frameNode,const std::string & value)408 void WaterFlowModelNG::SetRowsTemplate(FrameNode* frameNode, const std::string& value)
409 {
410     CHECK_NULL_VOID(frameNode);
411     if (value.empty()) {
412         ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, RowsTemplate, "1fr", frameNode);
413         return;
414     }
415     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, RowsTemplate, value, frameNode);
416 }
417 
SetScrollEnabled(FrameNode * frameNode,bool scrollEnabled)418 void WaterFlowModelNG::SetScrollEnabled(FrameNode* frameNode, bool scrollEnabled)
419 {
420     CHECK_NULL_VOID(frameNode);
421     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ScrollEnabled, scrollEnabled, frameNode);
422 }
423 
SetColumnsGap(FrameNode * frameNode,const Dimension & value)424 void WaterFlowModelNG::SetColumnsGap(FrameNode* frameNode, const Dimension& value)
425 {
426     if (value.IsNonNegative()) {
427         ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, ColumnsGap, value, frameNode);
428     }
429 }
SetRowsGap(FrameNode * frameNode,const Dimension & value)430 void WaterFlowModelNG::SetRowsGap(FrameNode* frameNode, const Dimension& value)
431 {
432     if (value.IsNonNegative()) {
433         ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, RowsGap, value, frameNode);
434     }
435 }
436 
SetItemMinWidth(FrameNode * frameNode,const Dimension & minWidth)437 void WaterFlowModelNG::SetItemMinWidth(FrameNode* frameNode, const Dimension& minWidth)
438 {
439     CHECK_NULL_VOID(frameNode);
440     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
441     CHECK_NULL_VOID(layoutProperty);
442     layoutProperty->UpdateItemMinSize(CalcSize(CalcLength(minWidth), std::nullopt));
443 }
444 
SetItemMinHeight(FrameNode * frameNode,const Dimension & minHeight)445 void WaterFlowModelNG::SetItemMinHeight(FrameNode* frameNode, const Dimension& minHeight)
446 {
447     CHECK_NULL_VOID(frameNode);
448     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
449     CHECK_NULL_VOID(layoutProperty);
450     layoutProperty->UpdateItemMinSize(CalcSize(std::nullopt, CalcLength(minHeight)));
451 }
452 
SetItemMaxWidth(FrameNode * frameNode,const Dimension & maxWidth)453 void WaterFlowModelNG::SetItemMaxWidth(FrameNode* frameNode, const Dimension& maxWidth)
454 {
455     CHECK_NULL_VOID(frameNode);
456     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
457     CHECK_NULL_VOID(layoutProperty);
458     layoutProperty->UpdateItemMaxSize(CalcSize(CalcLength(maxWidth), std::nullopt));
459 }
460 
SetItemMaxHeight(FrameNode * frameNode,const Dimension & maxHeight)461 void WaterFlowModelNG::SetItemMaxHeight(FrameNode* frameNode, const Dimension& maxHeight)
462 {
463     CHECK_NULL_VOID(frameNode);
464     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
465     CHECK_NULL_VOID(layoutProperty);
466     layoutProperty->UpdateItemMaxSize(CalcSize(std::nullopt, CalcLength(maxHeight)));
467 }
468 
SetLayoutDirection(FrameNode * frameNode,FlexDirection value)469 void WaterFlowModelNG::SetLayoutDirection(FrameNode* frameNode, FlexDirection value)
470 {
471     ACE_UPDATE_NODE_LAYOUT_PROPERTY(WaterFlowLayoutProperty, WaterflowDirection, value, frameNode);
472 }
473 
SetNestedScroll(FrameNode * frameNode,const NestedScrollOptions & nestedOpt)474 void WaterFlowModelNG::SetNestedScroll(FrameNode* frameNode, const NestedScrollOptions& nestedOpt)
475 {
476     CHECK_NULL_VOID(frameNode);
477     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
478     CHECK_NULL_VOID(pattern);
479     pattern->SetNestedScroll(nestedOpt);
480 }
481 
SetFriction(FrameNode * frameNode,double friction)482 void WaterFlowModelNG::SetFriction(FrameNode* frameNode, double friction)
483 {
484     CHECK_NULL_VOID(frameNode);
485     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
486     CHECK_NULL_VOID(pattern);
487     pattern->SetFriction(friction);
488 }
489 
GetLayoutDirection(FrameNode * frameNode)490 FlexDirection WaterFlowModelNG::GetLayoutDirection(FrameNode* frameNode)
491 {
492     FlexDirection value = FlexDirection::COLUMN;
493     CHECK_NULL_RETURN(frameNode, value);
494     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
495         WaterFlowLayoutProperty, WaterflowDirection, value, frameNode, value);
496     return value;
497 }
498 
GetColumnsTemplate(FrameNode * frameNode)499 std::string WaterFlowModelNG::GetColumnsTemplate(FrameNode* frameNode)
500 {
501     CHECK_NULL_RETURN(frameNode, nullptr);
502     std::string value = "1fr";
503     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, ColumnsTemplate, value, frameNode, value);
504     return value;
505 }
506 
GetRowsTemplate(FrameNode * frameNode)507 std::string WaterFlowModelNG::GetRowsTemplate(FrameNode* frameNode)
508 {
509     std::string value = "1fr";
510     CHECK_NULL_RETURN(frameNode, nullptr);
511     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, RowsTemplate, value, frameNode, value);
512     return value;
513 }
514 
GetColumnsGap(FrameNode * frameNode)515 float WaterFlowModelNG::GetColumnsGap(FrameNode* frameNode)
516 {
517     Dimension value;
518     CHECK_NULL_RETURN(frameNode, value.Value());
519     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, ColumnsGap, value, frameNode, value);
520     return value.Value();
521 }
522 
GetRowsGap(FrameNode * frameNode)523 float WaterFlowModelNG::GetRowsGap(FrameNode* frameNode)
524 {
525     Dimension value;
526     CHECK_NULL_RETURN(frameNode, value.Value());
527     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, RowsGap, value, frameNode, value);
528     return value.Value();
529 }
530 
GetNestedScroll(FrameNode * frameNode)531 NestedScrollOptions WaterFlowModelNG::GetNestedScroll(FrameNode* frameNode)
532 {
533     NestedScrollOptions defaultOptions;
534     CHECK_NULL_RETURN(frameNode, defaultOptions);
535     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
536     CHECK_NULL_RETURN(pattern, defaultOptions);
537     return pattern->GetNestedScroll();
538 }
539 
SetEdgeEffect(FrameNode * frameNode,EdgeEffect edgeEffect,bool alwaysEnabled)540 void WaterFlowModelNG::SetEdgeEffect(FrameNode* frameNode, EdgeEffect edgeEffect, bool alwaysEnabled)
541 {
542     ScrollableModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled);
543 }
GetFriction(FrameNode * frameNode)544 float WaterFlowModelNG::GetFriction(FrameNode* frameNode)
545 {
546     double value = 0.0;
547     CHECK_NULL_RETURN(frameNode, value);
548     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
549     CHECK_NULL_RETURN(pattern, value);
550     return pattern->GetFriction();
551 }
552 
GetEdgeEffect(FrameNode * frameNode)553 int32_t WaterFlowModelNG::GetEdgeEffect(FrameNode* frameNode)
554 {
555     CHECK_NULL_RETURN(frameNode, 0);
556     return ScrollableModelNG::GetEdgeEffect(frameNode);
557 }
558 
GetEdgeEffectAlways(FrameNode * frameNode)559 int32_t WaterFlowModelNG::GetEdgeEffectAlways(FrameNode* frameNode)
560 {
561     CHECK_NULL_RETURN(frameNode, 0.0f);
562     return ScrollableModelNG::GetAlwaysEnabled(frameNode);
563 }
564 
GetItemMinWidth(FrameNode * frameNode)565 Dimension WaterFlowModelNG::GetItemMinWidth(FrameNode* frameNode)
566 {
567     Dimension value = Dimension(0.0f);
568     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
569     CHECK_NULL_RETURN(layoutProperty, value);
570     auto size = layoutProperty->GetItemMinSize();
571     if (size.has_value()) {
572         auto width = size->Width();
573         if (width.has_value()) {
574             return width.value().GetDimension();
575         }
576     }
577     return value;
578 }
579 
GetItemMaxWidth(FrameNode * frameNode)580 Dimension WaterFlowModelNG::GetItemMaxWidth(FrameNode* frameNode)
581 {
582     Dimension value = Dimension(0.0f);
583     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
584     CHECK_NULL_RETURN(layoutProperty, value);
585     auto size = layoutProperty->GetItemMaxSize();
586     if (size.has_value()) {
587         auto width = size->Width();
588         if (width.has_value()) {
589             return width.value().GetDimension();
590         }
591     }
592     return value;
593 }
594 
GetItemMinHeight(FrameNode * frameNode)595 Dimension WaterFlowModelNG::GetItemMinHeight(FrameNode* frameNode)
596 {
597     Dimension value = Dimension(0.0f);
598     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
599     CHECK_NULL_RETURN(layoutProperty, value);
600     auto size = layoutProperty->GetItemMinSize();
601     if (size.has_value()) {
602         auto height = size->Height();
603         if (height.has_value()) {
604             return height.value().GetDimension();
605         }
606     }
607     return value;
608 }
609 
GetItemMaxHeight(FrameNode * frameNode)610 Dimension WaterFlowModelNG::GetItemMaxHeight(FrameNode* frameNode)
611 {
612     Dimension value = Dimension(0.0f);
613     auto layoutProperty = frameNode->GetLayoutProperty<WaterFlowLayoutProperty>();
614     CHECK_NULL_RETURN(layoutProperty, value);
615     auto size = layoutProperty->GetItemMaxSize();
616     if (size.has_value()) {
617         auto height = size->Height();
618         if (height.has_value()) {
619             return height.value().GetDimension();
620         }
621     }
622     return value;
623 }
624 
GetScrollEnabled(FrameNode * frameNode)625 bool WaterFlowModelNG::GetScrollEnabled(FrameNode* frameNode)
626 {
627     bool value = true;
628     CHECK_NULL_RETURN(frameNode, value);
629     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(WaterFlowLayoutProperty, ScrollEnabled, value, frameNode, value);
630     return value;
631 }
632 
SetScrollToIndex(FrameNode * frameNode,int32_t index,int32_t animation,int32_t alignment)633 void WaterFlowModelNG::SetScrollToIndex(FrameNode* frameNode, int32_t index, int32_t animation, int32_t alignment)
634 {
635     CHECK_NULL_VOID(frameNode);
636     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
637     CHECK_NULL_VOID(pattern);
638     pattern->ScrollToIndex(index, animation, static_cast<ScrollAlign>(alignment));
639 }
640 
SetWaterflowFooter(FrameNode * frameNode,FrameNode * footerNode)641 void WaterFlowModelNG::SetWaterflowFooter(FrameNode* frameNode, FrameNode* footerNode)
642 {
643     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
644     CHECK_NULL_VOID(pattern);
645     pattern->AddFooter(AceType::Claim<UINode>(footerNode));
646 }
647 
hasFooter(FrameNode * frameNode)648 bool WaterFlowModelNG::hasFooter(FrameNode* frameNode)
649 {
650     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
651     CHECK_NULL_RETURN(pattern, false);
652     return pattern->hasFooter();
653 }
654 
SetFlingSpeedLimit(FrameNode * frameNode,double maxSpeed)655 void WaterFlowModelNG::SetFlingSpeedLimit(FrameNode* frameNode, double maxSpeed)
656 {
657     ScrollableModelNG::SetMaxFlingSpeed(frameNode, maxSpeed);
658 }
659 
SetScroller(FrameNode * frameNode,RefPtr<ScrollControllerBase> scroller,RefPtr<ScrollProxy> proxy)660 void WaterFlowModelNG::SetScroller(
661     FrameNode* frameNode, RefPtr<ScrollControllerBase> scroller, RefPtr<ScrollProxy> proxy)
662 {
663     CHECK_NULL_VOID(frameNode);
664     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
665     CHECK_NULL_VOID(pattern);
666     pattern->SetPositionController(AceType::DynamicCast<ScrollableController>(scroller));
667     pattern->SetScrollBarProxy(AceType::DynamicCast<ScrollBarProxy>(proxy));
668 }
669 
SetLayoutMode(FrameNode * frameNode,WaterFlowLayoutMode mode)670 void WaterFlowModelNG::SetLayoutMode(FrameNode* frameNode, WaterFlowLayoutMode mode)
671 {
672     CHECK_NULL_VOID(frameNode);
673     auto pattern = frameNode->GetPattern<WaterFlowPattern>();
674     CHECK_NULL_VOID(pattern);
675     pattern->SetLayoutMode(mode);
676 }
677 } // namespace OHOS::Ace::NG
678