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