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