• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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 #include "core/interfaces/native/node/water_flow_modifier.h"
16 
17 #include "interfaces/native/node/node_model.h"
18 #include "interfaces/native/node/waterflow_section_option.h"
19 
20 #include "core/components_ng/pattern/scrollable/scrollable_model_ng.h"
21 #include "core/components_ng/pattern/waterflow/water_flow_model_ng.h"
22 #include "core/interfaces/native/node/node_adapter_impl.h"
23 
24 namespace OHOS::Ace::NG {
25 namespace {
26 constexpr ArkUI_Float64 FRICTION_DEFAULT = -1.0;
27 constexpr ArkUI_Float64 DIMENSION_DEFAULT = 0.0;
28 const int32_t ERROR_INT_CODE = -1;
29 const float ERROR_FLOAT_CODE = -1.0f;
30 constexpr Dimension DEFAULT_FADING_EDGE_LENGTH = Dimension(32.0f, DimensionUnit::VP); // default value
31 constexpr int32_t INDEX_0 = 0;
32 constexpr int32_t INDEX_1 = 1;
33 constexpr int32_t INDEX_2 = 2;
34 std::string g_strValue;
35 
ResetColumnsTemplate(ArkUINodeHandle node)36 void ResetColumnsTemplate(ArkUINodeHandle node)
37 {
38     auto* frameNode = reinterpret_cast<FrameNode*>(node);
39     CHECK_NULL_VOID(frameNode);
40     WaterFlowModelNG::SetColumnsTemplate(frameNode, "");
41 }
42 
SetColumnsTemplate(ArkUINodeHandle node,ArkUI_CharPtr value)43 void SetColumnsTemplate(ArkUINodeHandle node, ArkUI_CharPtr value)
44 {
45     auto* frameNode = reinterpret_cast<FrameNode*>(node);
46     CHECK_NULL_VOID(frameNode);
47     WaterFlowModelNG::SetColumnsTemplate(frameNode, value);
48 }
49 
ResetRowsTemplate(ArkUINodeHandle node)50 void ResetRowsTemplate(ArkUINodeHandle node)
51 {
52     auto* frameNode = reinterpret_cast<FrameNode*>(node);
53     CHECK_NULL_VOID(frameNode);
54     WaterFlowModelNG::SetRowsTemplate(frameNode, "");
55 }
56 
SetRowsTemplate(ArkUINodeHandle node,ArkUI_CharPtr value)57 void SetRowsTemplate(ArkUINodeHandle node, ArkUI_CharPtr value)
58 {
59     auto* frameNode = reinterpret_cast<FrameNode*>(node);
60     CHECK_NULL_VOID(frameNode);
61     WaterFlowModelNG::SetRowsTemplate(frameNode, value);
62 }
63 
ResetWaterFlowEnableScrollInteraction(ArkUINodeHandle node)64 void ResetWaterFlowEnableScrollInteraction(ArkUINodeHandle node)
65 {
66     auto* frameNode = reinterpret_cast<FrameNode*>(node);
67     CHECK_NULL_VOID(frameNode);
68     WaterFlowModelNG::SetScrollEnabled(frameNode, true);
69 }
70 
SetWaterFlowEnableScrollInteraction(ArkUINodeHandle node,ArkUI_Bool value)71 void SetWaterFlowEnableScrollInteraction(ArkUINodeHandle node, ArkUI_Bool value)
72 {
73     auto* frameNode = reinterpret_cast<FrameNode*>(node);
74     CHECK_NULL_VOID(frameNode);
75     WaterFlowModelNG::SetScrollEnabled(frameNode, value);
76 }
77 
SetColumnsGap(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)78 void SetColumnsGap(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
79 {
80     auto* frameNode = reinterpret_cast<FrameNode*>(node);
81     CHECK_NULL_VOID(frameNode);
82     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
83     CalcDimension columnsGapDimension;
84     if (unitEnum == DimensionUnit::CALC) {
85         columnsGapDimension = Dimension::FromString(std::string(calcValue));
86     } else {
87         columnsGapDimension = Dimension(value, unitEnum);
88     }
89     WaterFlowModelNG::SetColumnsGap(frameNode, columnsGapDimension);
90 }
91 
ResetColumnsGap(ArkUINodeHandle node)92 void ResetColumnsGap(ArkUINodeHandle node)
93 {
94     auto* frameNode = reinterpret_cast<FrameNode*>(node);
95     CHECK_NULL_VOID(frameNode);
96     WaterFlowModelNG::SetColumnsGap(frameNode, CalcDimension(DIMENSION_DEFAULT));
97 }
98 
SetRowsGap(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)99 void SetRowsGap(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
100 {
101     auto* frameNode = reinterpret_cast<FrameNode*>(node);
102     CHECK_NULL_VOID(frameNode);
103     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
104     CalcDimension rowsGapDimension;
105     if (unitEnum == DimensionUnit::CALC) {
106         rowsGapDimension = Dimension::FromString(std::string(calcValue));
107     } else {
108         rowsGapDimension = Dimension(value, unitEnum);
109     }
110     WaterFlowModelNG::SetRowsGap(frameNode, rowsGapDimension);
111 }
112 
ResetRowsGap(ArkUINodeHandle node)113 void ResetRowsGap(ArkUINodeHandle node)
114 {
115     auto* frameNode = reinterpret_cast<FrameNode*>(node);
116     CHECK_NULL_VOID(frameNode);
117     WaterFlowModelNG::SetRowsGap(frameNode, CalcDimension(DIMENSION_DEFAULT));
118 }
119 
SetItemMinWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)120 void SetItemMinWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
121 {
122     auto* frameNode = reinterpret_cast<FrameNode*>(node);
123     CHECK_NULL_VOID(frameNode);
124     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
125     CalcDimension minWidthDimension;
126     if (unitEnum == DimensionUnit::CALC) {
127         minWidthDimension = Dimension::FromString(std::string(calcValue));
128     } else {
129         minWidthDimension = Dimension(value, unitEnum);
130     }
131     WaterFlowModelNG::SetItemMinWidth(frameNode, minWidthDimension);
132 }
133 
ResetItemMinWidth(ArkUINodeHandle node)134 void ResetItemMinWidth(ArkUINodeHandle node) {}
135 
SetItemMinHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)136 void SetItemMinHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
137 {
138     auto* frameNode = reinterpret_cast<FrameNode*>(node);
139     CHECK_NULL_VOID(frameNode);
140     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
141     CalcDimension minHeightDimension;
142     if (unitEnum == DimensionUnit::CALC) {
143         minHeightDimension = Dimension::FromString(std::string(calcValue));
144     } else {
145         minHeightDimension = Dimension(value, unitEnum);
146     }
147     WaterFlowModelNG::SetItemMinHeight(frameNode, minHeightDimension);
148 }
149 
ResetItemMinHeight(ArkUINodeHandle node)150 void ResetItemMinHeight(ArkUINodeHandle node) {}
151 
SetItemMaxWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)152 void SetItemMaxWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
153 {
154     auto* frameNode = reinterpret_cast<FrameNode*>(node);
155     CHECK_NULL_VOID(frameNode);
156     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
157     CalcDimension maxWidthDimension;
158     if (unitEnum == DimensionUnit::CALC) {
159         maxWidthDimension = Dimension::FromString(std::string(calcValue));
160     } else {
161         maxWidthDimension = Dimension(value, unitEnum);
162     }
163     WaterFlowModelNG::SetItemMaxWidth(frameNode, maxWidthDimension);
164 }
165 
ResetItemMaxWidth(ArkUINodeHandle node)166 void ResetItemMaxWidth(ArkUINodeHandle node) {}
167 
SetItemMaxHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)168 void SetItemMaxHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
169 {
170     auto* frameNode = reinterpret_cast<FrameNode*>(node);
171     CHECK_NULL_VOID(frameNode);
172     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
173     CalcDimension maxHeightDimension;
174     if (unitEnum == DimensionUnit::CALC) {
175         maxHeightDimension = Dimension::FromString(std::string(calcValue));
176     } else {
177         maxHeightDimension = Dimension(value, unitEnum);
178     }
179     WaterFlowModelNG::SetItemMaxHeight(frameNode, maxHeightDimension);
180 }
181 
ResetItemMaxHeight(ArkUINodeHandle node)182 void ResetItemMaxHeight(ArkUINodeHandle node) {}
183 
SetLayoutDirection(ArkUINodeHandle node,ArkUI_Int32 direction)184 void SetLayoutDirection(ArkUINodeHandle node, ArkUI_Int32 direction)
185 {
186     auto* frameNode = reinterpret_cast<FrameNode*>(node);
187     CHECK_NULL_VOID(frameNode);
188     WaterFlowModelNG::SetLayoutDirection(frameNode, static_cast<FlexDirection>(direction));
189 }
190 
ResetLayoutDirection(ArkUINodeHandle node)191 void ResetLayoutDirection(ArkUINodeHandle node)
192 {
193     auto* frameNode = reinterpret_cast<FrameNode*>(node);
194     CHECK_NULL_VOID(frameNode);
195     WaterFlowModelNG::SetLayoutDirection(frameNode, FlexDirection::COLUMN);
196 }
197 
SetWaterFlowNestedScroll(ArkUINodeHandle node,ArkUI_Int32 scrollForward,ArkUI_Int32 scrollBackward)198 void SetWaterFlowNestedScroll(ArkUINodeHandle node, ArkUI_Int32 scrollForward, ArkUI_Int32 scrollBackward)
199 {
200     auto* frameNode = reinterpret_cast<FrameNode*>(node);
201     CHECK_NULL_VOID(frameNode);
202     NestedScrollOptions nestedOpt = {
203         .forward = NestedScrollMode::SELF_ONLY,
204         .backward = NestedScrollMode::SELF_ONLY,
205     };
206     nestedOpt.forward = static_cast<NestedScrollMode>(scrollForward);
207     nestedOpt.backward = static_cast<NestedScrollMode>(scrollBackward);
208     WaterFlowModelNG::SetNestedScroll(frameNode, nestedOpt);
209 }
210 
ResetWaterFlowNestedScroll(ArkUINodeHandle node)211 void ResetWaterFlowNestedScroll(ArkUINodeHandle node)
212 {
213     auto* frameNode = reinterpret_cast<FrameNode*>(node);
214     CHECK_NULL_VOID(frameNode);
215     NestedScrollOptions nestedOpt = {
216         .forward = NestedScrollMode::SELF_ONLY,
217         .backward = NestedScrollMode::SELF_ONLY,
218     };
219     WaterFlowModelNG::SetNestedScroll(frameNode, nestedOpt);
220 }
221 
SetWaterFlowFriction(ArkUINodeHandle node,ArkUI_Float32 friction,void * frictionRawPtr)222 void SetWaterFlowFriction(ArkUINodeHandle node, ArkUI_Float32 friction, void* frictionRawPtr)
223 {
224     auto* frameNode = reinterpret_cast<FrameNode*>(node);
225     CHECK_NULL_VOID(frameNode);
226     WaterFlowModelNG::SetFriction(frameNode, friction);
227 
228     if (SystemProperties::ConfigChangePerform()) {
229         auto* friction = reinterpret_cast<ResourceObject*>(frictionRawPtr);
230         auto frictionResObj = AceType::Claim(friction);
231         WaterFlowModelNG::ParseResObjFriction(frameNode, frictionResObj);
232     }
233 }
234 
ResetWaterFlowFriction(ArkUINodeHandle node)235 void ResetWaterFlowFriction(ArkUINodeHandle node)
236 {
237     auto* frameNode = reinterpret_cast<FrameNode*>(node);
238     CHECK_NULL_VOID(frameNode);
239     WaterFlowModelNG::SetFriction(frameNode, FRICTION_DEFAULT);
240     if (SystemProperties::ConfigChangePerform()) {
241         WaterFlowModelNG::ParseResObjFriction(frameNode, nullptr);
242     }
243 }
244 
SetEdgeEffect(ArkUINodeHandle node,int32_t edgeEffect,ArkUI_Bool alwaysEnabled,ArkUI_Int32 edge)245 void SetEdgeEffect(ArkUINodeHandle node, int32_t edgeEffect, ArkUI_Bool alwaysEnabled, ArkUI_Int32 edge)
246 {
247     auto* frameNode = reinterpret_cast<FrameNode*>(node);
248     CHECK_NULL_VOID(frameNode);
249     WaterFlowModelNG::SetEdgeEffect(
250         frameNode, static_cast<EdgeEffect>(edgeEffect), alwaysEnabled, static_cast<EffectEdge>(edge));
251 }
252 
ResetEdgeEffect(ArkUINodeHandle node)253 void ResetEdgeEffect(ArkUINodeHandle node)
254 {
255     auto* frameNode = reinterpret_cast<FrameNode*>(node);
256     CHECK_NULL_VOID(frameNode);
257     EdgeEffect edgeEffect = EdgeEffect::NONE;
258     ArkUI_Bool alwaysEnabled = false;
259     WaterFlowModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled, EffectEdge::ALL);
260 }
261 
GetLayoutDirection(ArkUINodeHandle node)262 ArkUI_Int32 GetLayoutDirection(ArkUINodeHandle node)
263 {
264     auto* frameNode = reinterpret_cast<FrameNode*>(node);
265     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
266     return static_cast<ArkUI_Int32>(WaterFlowModelNG::GetLayoutDirection(frameNode));
267 }
268 
GetColumnsTemplate(ArkUINodeHandle node)269 ArkUI_CharPtr GetColumnsTemplate(ArkUINodeHandle node)
270 {
271     auto* frameNode = reinterpret_cast<FrameNode*>(node);
272     CHECK_NULL_RETURN(frameNode, nullptr);
273     g_strValue = WaterFlowModelNG::GetColumnsTemplate(frameNode);
274     return g_strValue.c_str();
275 }
276 
GetRowsTemplate(ArkUINodeHandle node)277 ArkUI_CharPtr GetRowsTemplate(ArkUINodeHandle node)
278 {
279     auto* frameNode = reinterpret_cast<FrameNode*>(node);
280     CHECK_NULL_RETURN(frameNode, nullptr);
281     g_strValue = WaterFlowModelNG::GetRowsTemplate(frameNode);
282     return g_strValue.c_str();
283 }
284 
GetColumnsGap(ArkUINodeHandle node)285 ArkUI_Float32 GetColumnsGap(ArkUINodeHandle node)
286 {
287     auto* frameNode = reinterpret_cast<FrameNode*>(node);
288     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
289     return WaterFlowModelNG::GetColumnsGap(frameNode);
290 }
291 
GetRowsGap(ArkUINodeHandle node)292 ArkUI_Float32 GetRowsGap(ArkUINodeHandle node)
293 {
294     auto* frameNode = reinterpret_cast<FrameNode*>(node);
295     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
296     return WaterFlowModelNG::GetRowsGap(frameNode);
297 }
298 
GetWaterFlowNestedScroll(ArkUINodeHandle node,ArkUI_Int32 (* values)[2])299 void GetWaterFlowNestedScroll(ArkUINodeHandle node, ArkUI_Int32 (*values)[2])
300 {
301     auto* frameNode = reinterpret_cast<FrameNode*>(node);
302     CHECK_NULL_VOID(frameNode);
303     NestedScrollOptions options = WaterFlowModelNG::GetNestedScroll(frameNode);
304     (*values)[0] = static_cast<ArkUI_Int32>(options.forward);
305     (*values)[1] = static_cast<ArkUI_Int32>(options.backward);
306 }
307 
SetNodeAdapter(ArkUINodeHandle node,ArkUINodeAdapterHandle handle)308 ArkUI_Int32 SetNodeAdapter(ArkUINodeHandle node, ArkUINodeAdapterHandle handle)
309 {
310     auto* frameNode = reinterpret_cast<FrameNode*>(node);
311     CHECK_NULL_RETURN(frameNode, ERROR_CODE_PARAM_INVALID);
312     auto hasFooter = WaterFlowModelNG::hasFooter(frameNode);
313     auto totalChildCount = hasFooter ? frameNode->TotalChildCount() - 1 : frameNode->TotalChildCount();
314     if (totalChildCount > 0) {
315         return ERROR_CODE_NATIVE_IMPL_NODE_ADAPTER_CHILD_NODE_EXIST;
316     }
317     NodeAdapter::GetNodeAdapterAPI()->attachHostNode(handle, node);
318     return ERROR_CODE_NO_ERROR;
319 }
320 
ResetNodeAdapter(ArkUINodeHandle node)321 void ResetNodeAdapter(ArkUINodeHandle node)
322 {
323     NodeAdapter::GetNodeAdapterAPI()->detachHostNode(node);
324 }
325 
GetNodeAdapter(ArkUINodeHandle node)326 ArkUINodeAdapterHandle GetNodeAdapter(ArkUINodeHandle node)
327 {
328     return NodeAdapter::GetNodeAdapterAPI()->getNodeAdapter(node);
329 }
330 
SetCachedCount(ArkUINodeHandle node,ArkUI_Int32 cachedCount)331 void SetCachedCount(ArkUINodeHandle node, ArkUI_Int32 cachedCount)
332 {
333     auto* frameNode = reinterpret_cast<FrameNode*>(node);
334     CHECK_NULL_VOID(frameNode);
335     WaterFlowModelNG::SetCachedCount(frameNode, cachedCount);
336 }
337 
ResetCachedCount(ArkUINodeHandle node)338 void ResetCachedCount(ArkUINodeHandle node)
339 {
340     auto* frameNode = reinterpret_cast<FrameNode*>(node);
341     CHECK_NULL_VOID(frameNode);
342     WaterFlowModelNG::SetCachedCount(frameNode, 1);
343 }
344 
GetCachedCount(ArkUINodeHandle node)345 ArkUI_Int32 GetCachedCount(ArkUINodeHandle node)
346 {
347     auto* frameNode = reinterpret_cast<FrameNode*>(node);
348     CHECK_NULL_RETURN(frameNode, 1);
349     return WaterFlowModelNG::GetCachedCount(frameNode);
350 }
351 
SetShowCached(ArkUINodeHandle node,ArkUI_Bool show)352 void SetShowCached(ArkUINodeHandle node, ArkUI_Bool show)
353 {
354     auto* frameNode = reinterpret_cast<FrameNode*>(node);
355     CHECK_NULL_VOID(frameNode);
356     WaterFlowModelNG::SetShowCached(frameNode, show);
357 }
358 
ResetShowCached(ArkUINodeHandle node)359 void ResetShowCached(ArkUINodeHandle node)
360 {
361     auto* frameNode = reinterpret_cast<FrameNode*>(node);
362     CHECK_NULL_VOID(frameNode);
363     WaterFlowModelNG::SetShowCached(frameNode, false);
364 }
365 
GetShowCached(ArkUINodeHandle node)366 ArkUI_Bool GetShowCached(ArkUINodeHandle node)
367 {
368     auto* frameNode = reinterpret_cast<FrameNode*>(node);
369     CHECK_NULL_RETURN(frameNode, false);
370     return WaterFlowModelNG::GetShowCached(frameNode);
371 }
372 
SetWaterFlowSyncLoad(ArkUINodeHandle node,ArkUI_Bool syncLoad)373 void SetWaterFlowSyncLoad(ArkUINodeHandle node, ArkUI_Bool syncLoad)
374 {
375     auto* frameNode = reinterpret_cast<FrameNode*>(node);
376     CHECK_NULL_VOID(frameNode);
377     WaterFlowModelNG::SetSyncLoad(frameNode, syncLoad);
378 }
379 
ResetWaterFlowSyncLoad(ArkUINodeHandle node)380 void ResetWaterFlowSyncLoad(ArkUINodeHandle node)
381 {
382     auto* frameNode = reinterpret_cast<FrameNode*>(node);
383     CHECK_NULL_VOID(frameNode);
384     WaterFlowModelNG::SetSyncLoad(frameNode, true);
385 }
386 
GetWaterFlowSyncLoad(ArkUINodeHandle node)387 ArkUI_Bool GetWaterFlowSyncLoad(ArkUINodeHandle node)
388 {
389     auto* frameNode = reinterpret_cast<FrameNode*>(node);
390     CHECK_NULL_RETURN(frameNode, 1);
391     return WaterFlowModelNG::GetSyncLoad(frameNode);
392 }
393 
SetWaterFlowScrollBar(ArkUINodeHandle node,ArkUI_Int32 barState)394 void SetWaterFlowScrollBar(ArkUINodeHandle node, ArkUI_Int32 barState)
395 {
396     auto* frameNode = reinterpret_cast<FrameNode*>(node);
397     CHECK_NULL_VOID(frameNode);
398     WaterFlowModelNG::SetScrollBarMode(frameNode, static_cast<DisplayMode>(barState));
399 }
400 
ResetWaterFlowScrollBar(ArkUINodeHandle node)401 void ResetWaterFlowScrollBar(ArkUINodeHandle node)
402 {
403     auto* frameNode = reinterpret_cast<FrameNode*>(node);
404     CHECK_NULL_VOID(frameNode);
405     WaterFlowModelNG::SetScrollBarMode(frameNode, DisplayMode::AUTO);
406 }
407 
GetWaterFlowScrollBar(ArkUINodeHandle node)408 ArkUI_Int32 GetWaterFlowScrollBar(ArkUINodeHandle node)
409 {
410     auto* frameNode = reinterpret_cast<FrameNode*>(node);
411     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
412     return WaterFlowModelNG::GetScrollBarMode(frameNode);
413 }
414 
SetWaterFlowBarWidth(ArkUINodeHandle node,ArkUI_CharPtr value)415 void SetWaterFlowBarWidth(ArkUINodeHandle node, ArkUI_CharPtr value)
416 {
417     CHECK_NULL_VOID(value);
418     auto* frameNode = reinterpret_cast<FrameNode*>(node);
419     CHECK_NULL_VOID(frameNode);
420     WaterFlowModelNG::SetScrollBarWidth(frameNode, value);
421 }
422 
ResetWaterFlowBarWidth(ArkUINodeHandle node)423 void ResetWaterFlowBarWidth(ArkUINodeHandle node)
424 {
425     auto* frameNode = reinterpret_cast<FrameNode*>(node);
426     CHECK_NULL_VOID(frameNode);
427     ScrollableModelNG::ResetScrollBarWidth(frameNode);
428 }
429 
GetWaterFlowBarWidth(ArkUINodeHandle node)430 ArkUI_Float32 GetWaterFlowBarWidth(ArkUINodeHandle node)
431 {
432     auto* frameNode = reinterpret_cast<FrameNode*>(node);
433     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
434     return WaterFlowModelNG::GetScrollBarWidth(frameNode);
435 }
436 
CreateWaterFlowScrollBarColorWithResourceObj(ArkUINodeHandle node,void * colorRawPtr)437 void CreateWaterFlowScrollBarColorWithResourceObj(ArkUINodeHandle node, void* colorRawPtr)
438 {
439     CHECK_NULL_VOID(SystemProperties::ConfigChangePerform());
440     auto* frameNode = reinterpret_cast<FrameNode*>(node);
441     CHECK_NULL_VOID(frameNode);
442     auto* colorPtr = reinterpret_cast<ResourceObject*>(colorRawPtr);
443     auto colorResObj = AceType::Claim(colorPtr);
444     WaterFlowModelNG::ParseResObjScrollBarColor(frameNode, colorResObj);
445 }
446 
SetWaterFlowScrollBarColor(ArkUINodeHandle node,ArkUI_CharPtr value)447 void SetWaterFlowScrollBarColor(ArkUINodeHandle node, ArkUI_CharPtr value)
448 {
449     CHECK_NULL_VOID(value);
450     auto* frameNode = reinterpret_cast<FrameNode*>(node);
451     CHECK_NULL_VOID(frameNode);
452     WaterFlowModelNG::SetScrollBarColor(frameNode, value);
453 }
454 
ResetWaterFlowScrollBarColor(ArkUINodeHandle node)455 void ResetWaterFlowScrollBarColor(ArkUINodeHandle node)
456 {
457     auto* frameNode = reinterpret_cast<FrameNode*>(node);
458     CHECK_NULL_VOID(frameNode);
459     ScrollableModelNG::ResetScrollBarColor(frameNode);
460 
461     CreateWaterFlowScrollBarColorWithResourceObj(node, nullptr);
462 }
463 
GetWaterFlowScrollBarColor(ArkUINodeHandle node)464 ArkUI_Uint32 GetWaterFlowScrollBarColor(ArkUINodeHandle node)
465 {
466     auto* frameNode = reinterpret_cast<FrameNode*>(node);
467     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
468     return WaterFlowModelNG::GetScrollBarColor(frameNode);
469 }
470 
GetEdgeEffect(ArkUINodeHandle node,ArkUI_Int32 (* values)[2])471 ArkUI_Int32 GetEdgeEffect(ArkUINodeHandle node, ArkUI_Int32 (*values)[2])
472 {
473     auto* frameNode = reinterpret_cast<FrameNode*>(node);
474     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
475     (*values)[INDEX_0] = WaterFlowModelNG::GetEdgeEffect(frameNode);
476     (*values)[INDEX_1] = WaterFlowModelNG::GetEdgeEffectAlways(frameNode);
477     return INDEX_2;
478 }
479 
SetWaterFlowSectionOptions(ArkUINodeHandle node,ArkUI_Int32 start,ArkUIWaterFlowSectionOption option)480 void SetWaterFlowSectionOptions(ArkUINodeHandle node, ArkUI_Int32 start, ArkUIWaterFlowSectionOption option)
481 {
482     CHECK_NULL_VOID(option);
483     auto* frameNode = reinterpret_cast<FrameNode*>(node);
484     CHECK_NULL_VOID(frameNode);
485     auto waterFlowSections = WaterFlowModelNG::GetOrCreateWaterFlowSections(frameNode);
486 
487     const auto& sectionArray = option->sections;
488     const auto sectionsCount = sectionArray.size();
489 
490     std::vector<WaterFlowSections::Section> newSections(sectionsCount);
491 
492     for (size_t i = 0; i < sectionsCount; ++i) {
493         const auto& sectionData = sectionArray[i];
494         WaterFlowSections::Section& section = newSections[i];
495 
496         section.itemsCount = sectionData.itemsCount;
497         section.crossCount = sectionData.crossCount;
498         section.columnsGap = Dimension(sectionData.columnsGap);
499         section.rowsGap = Dimension(sectionData.rowsGap);
500 
501         NG::PaddingProperty paddings;
502         paddings.top = std::optional<CalcLength>(sectionData.margin[0]);
503         paddings.right = std::optional<CalcLength>(sectionData.margin[1]);
504         paddings.bottom = std::optional<CalcLength>(sectionData.margin[2]);
505         paddings.left = std::optional<CalcLength>(sectionData.margin[3]);
506         section.margin = paddings;
507         if (sectionData.onGetItemMainSizeByIndex) {
508             section.onGetItemMainSizeByIndex = [sectionData](int32_t value) -> float {
509                 // onGetItemMainSizeByIndex是一个返回float的函数指针
510                 using FuncType = float (*)(int32_t, void*);
511                 FuncType func = reinterpret_cast<FuncType>(sectionData.onGetItemMainSizeByIndex);
512                 float result = func(value, sectionData.userData);
513                 return result;
514             };
515         } else {
516             section.onGetItemMainSizeByIndex = nullptr;
517         }
518     }
519 
520     waterFlowSections->ReplaceFrom(start, newSections);
521 }
522 
ResetWaterFlowSectionOptions(ArkUINodeHandle node)523 void ResetWaterFlowSectionOptions(ArkUINodeHandle node)
524 {
525     auto* frameNode = reinterpret_cast<FrameNode*>(node);
526     CHECK_NULL_VOID(frameNode);
527     WaterFlowModelNG::ResetSections(frameNode);
528 }
529 
GetWaterFlowSectionOptions(ArkUINodeHandle node)530 ArkUI_WaterFlowSectionOption GetWaterFlowSectionOptions(ArkUINodeHandle node)
531 {
532     ArkUI_WaterFlowSectionOption option;
533     auto* frameNode = reinterpret_cast<FrameNode*>(node);
534     CHECK_NULL_RETURN(frameNode, option);
535     auto sections = WaterFlowModelNG::GetOrCreateWaterFlowSections(frameNode);
536     CHECK_NULL_RETURN(sections, option);
537     auto newSection = sections->GetSectionInfo();
538     auto sectionsCount = newSection.size();
539     option.sections.resize(sectionsCount);
540     for (size_t i = 0; i < sectionsCount; ++i) {
541         option.sections[i].itemsCount = newSection[i].itemsCount ? newSection[i].itemsCount : 0;
542         option.sections[i].crossCount = newSection[i].crossCount.has_value() ? newSection[i].crossCount.value() : 0;
543         option.sections[i].columnsGap = newSection[i].columnsGap.has_value() ? newSection[i].columnsGap->Value() : 0.0f;
544         option.sections[i].rowsGap = newSection[i].rowsGap.has_value() ? newSection[i].rowsGap->Value() : 0.0f;
545         option.sections[i].margin[0] =
546             newSection[i].margin->top.has_value() ? newSection[i].margin->top->GetDimension().Value() : 0.0f;
547         option.sections[i].margin[1] =
548             newSection[i].margin->right.has_value() ? newSection[i].margin->right->GetDimension().Value() : 0.0f;
549         option.sections[i].margin[2] =
550             newSection[i].margin->bottom.has_value() ? newSection[i].margin->bottom->GetDimension().Value() : 0.0f;
551         option.sections[i].margin[3] =
552             newSection[i].margin->left.has_value() ? newSection[i].margin->left->GetDimension().Value() : 0.0f;
553     }
554     return option;
555 }
556 
GetItemMinWidth(ArkUINodeHandle node,ArkUI_Int32 unit)557 ArkUI_Float32 GetItemMinWidth(ArkUINodeHandle node, ArkUI_Int32 unit)
558 {
559     auto* frameNode = reinterpret_cast<FrameNode*>(node);
560     CHECK_NULL_RETURN(frameNode, 1);
561     return WaterFlowModelNG::GetItemMinWidth(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit));
562 }
563 
GetItemMaxWidth(ArkUINodeHandle node,ArkUI_Int32 unit)564 ArkUI_Float32 GetItemMaxWidth(ArkUINodeHandle node, ArkUI_Int32 unit)
565 {
566     auto* frameNode = reinterpret_cast<FrameNode*>(node);
567     CHECK_NULL_RETURN(frameNode, 1);
568     return WaterFlowModelNG::GetItemMaxWidth(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit));
569 }
570 
GetItemMinHeight(ArkUINodeHandle node,ArkUI_Int32 unit)571 ArkUI_Float32 GetItemMinHeight(ArkUINodeHandle node, ArkUI_Int32 unit)
572 {
573     auto* frameNode = reinterpret_cast<FrameNode*>(node);
574     CHECK_NULL_RETURN(frameNode, 1);
575     return WaterFlowModelNG::GetItemMinHeight(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit));
576 }
577 
GetItemMaxHeight(ArkUINodeHandle node,ArkUI_Int32 unit)578 ArkUI_Float32 GetItemMaxHeight(ArkUINodeHandle node, ArkUI_Int32 unit)
579 {
580     auto* frameNode = reinterpret_cast<FrameNode*>(node);
581     CHECK_NULL_RETURN(frameNode, 1);
582     return WaterFlowModelNG::GetItemMaxHeight(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit));
583 }
584 
GetWaterFlowEnableScrollInteraction(ArkUINodeHandle node)585 ArkUI_Int32 GetWaterFlowEnableScrollInteraction(ArkUINodeHandle node)
586 {
587     auto* frameNode = reinterpret_cast<FrameNode*>(node);
588     CHECK_NULL_RETURN(frameNode, 1);
589     return WaterFlowModelNG::GetScrollEnabled(frameNode);
590 }
591 
GetWaterFlowFriction(ArkUINodeHandle node)592 ArkUI_Float32 GetWaterFlowFriction(ArkUINodeHandle node)
593 {
594     auto* frameNode = reinterpret_cast<FrameNode*>(node);
595     CHECK_NULL_RETURN(frameNode, 1);
596     return WaterFlowModelNG::GetFriction(frameNode);
597 }
SetScrollToIndex(ArkUINodeHandle node,ArkUI_Int32 index,ArkUI_Int32 animation,ArkUI_Int32 alignment)598 void SetScrollToIndex(ArkUINodeHandle node, ArkUI_Int32 index, ArkUI_Int32 animation, ArkUI_Int32 alignment)
599 {
600     auto* frameNode = reinterpret_cast<FrameNode*>(node);
601     CHECK_NULL_VOID(frameNode);
602     WaterFlowModelNG::SetScrollToIndex(frameNode, index, animation, alignment);
603 }
604 
SetWaterflowFooter(ArkUINodeHandle node,ArkUINodeHandle footer)605 void SetWaterflowFooter(ArkUINodeHandle node, ArkUINodeHandle footer)
606 {
607     auto* frameNode = reinterpret_cast<FrameNode*>(node);
608     CHECK_NULL_VOID(frameNode);
609     auto* footerNode = reinterpret_cast<FrameNode*>(footer);
610     CHECK_NULL_VOID(footerNode);
611     WaterFlowModelNG::SetWaterflowFooter(frameNode, footerNode);
612 }
613 
ResetWaterflowFooter(ArkUINodeHandle node)614 void ResetWaterflowFooter(ArkUINodeHandle node)
615 {
616     auto* frameNode = reinterpret_cast<FrameNode*>(node);
617     CHECK_NULL_VOID(frameNode);
618     WaterFlowModelNG::SetWaterflowFooter(frameNode, nullptr);
619 }
620 
SetWaterFlowFlingSpeedLimit(ArkUINodeHandle node,ArkUI_Float32 maxSpeed)621 void SetWaterFlowFlingSpeedLimit(ArkUINodeHandle node, ArkUI_Float32 maxSpeed)
622 {
623     auto* frameNode = reinterpret_cast<FrameNode*>(node);
624     CHECK_NULL_VOID(frameNode);
625     WaterFlowModelNG::SetFlingSpeedLimit(frameNode, maxSpeed);
626 }
627 
ResetWaterFlowFlingSpeedLimit(ArkUINodeHandle node)628 void ResetWaterFlowFlingSpeedLimit(ArkUINodeHandle node)
629 {
630     auto* frameNode = reinterpret_cast<FrameNode*>(node);
631     CHECK_NULL_VOID(frameNode);
632     WaterFlowModelNG::SetFlingSpeedLimit(frameNode, -1.0);
633 }
634 
GetScrollController(ArkUINodeHandle node)635 ArkUINodeHandle GetScrollController(ArkUINodeHandle node)
636 {
637     auto* frameNode = reinterpret_cast<FrameNode*>(node);
638     CHECK_NULL_RETURN(frameNode, nullptr);
639     auto controller = WaterFlowModelNG::GetOrCreateController(frameNode);
640     return reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(controller));
641 }
642 
SetWaterFlowScroller(ArkUINodeHandle node,ArkUINodeHandle controller,ArkUINodeHandle proxy)643 void SetWaterFlowScroller(ArkUINodeHandle node, ArkUINodeHandle controller, ArkUINodeHandle proxy)
644 {
645     auto* frameNode = reinterpret_cast<FrameNode*>(node);
646     CHECK_NULL_VOID(frameNode);
647     auto scrollController = AceType::Claim(reinterpret_cast<ScrollControllerBase*>(controller));
648     CHECK_NULL_VOID(scrollController);
649     auto scrollProxy = AceType::Claim(reinterpret_cast<ScrollProxy*>(proxy));
650     CHECK_NULL_VOID(scrollProxy);
651     WaterFlowModelNG::SetScroller(frameNode, scrollController, scrollProxy);
652 }
653 
GetWaterFlowLayoutMode(ArkUINodeHandle node)654 ArkUI_Int32 GetWaterFlowLayoutMode(ArkUINodeHandle node)
655 {
656     auto* frameNode = reinterpret_cast<FrameNode*>(node);
657     CHECK_NULL_RETURN(frameNode, 1);
658     return static_cast<int32_t>(WaterFlowModelNG::GetLayoutMode(frameNode));
659 }
660 
SetWaterFlowLayoutMode(ArkUINodeHandle node,ArkUI_Uint32 layoutMode)661 void SetWaterFlowLayoutMode(ArkUINodeHandle node, ArkUI_Uint32 layoutMode)
662 {
663     auto* frameNode = reinterpret_cast<FrameNode*>(node);
664     CHECK_NULL_VOID(frameNode);
665     WaterFlowLayoutMode mode = WaterFlowLayoutMode::TOP_DOWN;
666     if (layoutMode >= static_cast<uint32_t>(WaterFlowLayoutMode::TOP_DOWN) &&
667         layoutMode <= static_cast<uint32_t>(WaterFlowLayoutMode::SLIDING_WINDOW)) {
668         mode = static_cast<WaterFlowLayoutMode>(layoutMode);
669     }
670     WaterFlowModelNG::SetLayoutMode(frameNode, mode);
671 }
672 
ResetWaterFlowLayoutMode(ArkUINodeHandle node)673 void ResetWaterFlowLayoutMode(ArkUINodeHandle node)
674 {
675     auto* frameNode = reinterpret_cast<FrameNode*>(node);
676     CHECK_NULL_VOID(frameNode);
677     WaterFlowLayoutMode mode = WaterFlowLayoutMode::TOP_DOWN;
678     WaterFlowModelNG::SetLayoutMode(frameNode, mode);
679 }
680 
ResetWaterFlowSections(ArkUINodeHandle node)681 void ResetWaterFlowSections(ArkUINodeHandle node)
682 {
683     auto* frameNode = reinterpret_cast<FrameNode*>(node);
684     CHECK_NULL_VOID(frameNode);
685     WaterFlowModelNG::ResetSections(frameNode);
686 }
687 
SetWaterFlowFadingEdge(ArkUINodeHandle node,ArkUI_Bool fadingEdge,ArkUI_Float32 fadingEdgeLengthValue,ArkUI_Int32 fadingEdgeLengthUnit)688 void SetWaterFlowFadingEdge(
689     ArkUINodeHandle node, ArkUI_Bool fadingEdge, ArkUI_Float32 fadingEdgeLengthValue, ArkUI_Int32 fadingEdgeLengthUnit)
690 {
691     auto* frameNode = reinterpret_cast<FrameNode*>(node);
692     CHECK_NULL_VOID(frameNode);
693     Dimension fadingEdgeLengthDimension =
694         Dimension(fadingEdgeLengthValue, static_cast<OHOS::Ace::DimensionUnit>(fadingEdgeLengthUnit));
695     NG::ScrollableModelNG::SetFadingEdge(frameNode, fadingEdge, fadingEdgeLengthDimension);
696 }
697 
ResetWaterFlowFadingEdge(ArkUINodeHandle node)698 void ResetWaterFlowFadingEdge(ArkUINodeHandle node)
699 {
700     auto* frameNode = reinterpret_cast<FrameNode*>(node);
701     CHECK_NULL_VOID(frameNode);
702     NG::ScrollableModelNG::SetFadingEdge(frameNode, false, DEFAULT_FADING_EDGE_LENGTH);
703 }
704 } // namespace
705 namespace NodeModifier {
GetWaterFlowModifier()706 const ArkUIWaterFlowModifier* GetWaterFlowModifier()
707 {
708     CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
709     static const ArkUIWaterFlowModifier modifier = {
710         .resetColumnsTemplate = ResetColumnsTemplate,
711         .setColumnsTemplate = SetColumnsTemplate,
712         .resetRowsTemplate = ResetRowsTemplate,
713         .setRowsTemplate = SetRowsTemplate,
714         .resetWaterFlowEnableScrollInteraction = ResetWaterFlowEnableScrollInteraction,
715         .setWaterFlowEnableScrollInteraction = SetWaterFlowEnableScrollInteraction,
716         .setColumnsGap = SetColumnsGap,
717         .resetColumnsGap = ResetColumnsGap,
718         .setRowsGap = SetRowsGap,
719         .resetRowsGap = ResetRowsGap,
720         .setItemMinWidth = SetItemMinWidth,
721         .resetItemMinWidth = ResetItemMinWidth,
722         .setItemMaxWidth = SetItemMaxWidth,
723         .resetItemMaxWidth = ResetItemMaxWidth,
724         .setItemMinHeight = SetItemMinHeight,
725         .resetItemMinHeight = ResetItemMinHeight,
726         .setItemMaxHeight = SetItemMaxHeight,
727         .resetItemMaxHeight = ResetItemMaxHeight,
728         .setLayoutDirection = SetLayoutDirection,
729         .resetLayoutDirection = ResetLayoutDirection,
730         .setWaterFlowNestedScroll = SetWaterFlowNestedScroll,
731         .resetWaterFlowNestedScroll = ResetWaterFlowNestedScroll,
732         .setWaterFlowFriction = SetWaterFlowFriction,
733         .resetWaterFlowFriction = ResetWaterFlowFriction,
734         .getLayoutDirection = GetLayoutDirection,
735         .getColumnsTemplate = GetColumnsTemplate,
736         .getRowsTemplate = GetRowsTemplate,
737         .getColumnsGap = GetColumnsGap,
738         .getRowsGap = GetRowsGap,
739         .getWaterFlowNestedScroll = GetWaterFlowNestedScroll,
740         .setNodeAdapter = SetNodeAdapter,
741         .resetNodeAdapter = ResetNodeAdapter,
742         .getNodeAdapter = GetNodeAdapter,
743         .setCachedCount = SetCachedCount,
744         .resetCachedCount = ResetCachedCount,
745         .getCachedCount = GetCachedCount,
746         .setShowCached = SetShowCached,
747         .resetShowCached = ResetShowCached,
748         .getShowCached = GetShowCached,
749         .setSyncLoad = SetWaterFlowSyncLoad,
750         .resetSyncLoad = ResetWaterFlowSyncLoad,
751         .getSyncLoad = GetWaterFlowSyncLoad,
752         .setEdgeEffect = SetEdgeEffect,
753         .resetEdgeEffect = ResetEdgeEffect,
754         .setWaterFlowScrollBar = SetWaterFlowScrollBar,
755         .resetWaterFlowScrollBar = ResetWaterFlowScrollBar,
756         .getWaterFlowScrollBar = GetWaterFlowScrollBar,
757         .setWaterFlowScrollBarWidth = SetWaterFlowBarWidth,
758         .resetWaterFlowScrollBarWidth = ResetWaterFlowBarWidth,
759         .getWaterFlowScrollBarWidth = GetWaterFlowBarWidth,
760         .setWaterFlowScrollBarColor = SetWaterFlowScrollBarColor,
761         .resetWaterFlowScrollBarColor = ResetWaterFlowScrollBarColor,
762         .getWaterFlowScrollBarColor = GetWaterFlowScrollBarColor,
763         .getEdgeEffect = GetEdgeEffect,
764         .setSectionOption = SetWaterFlowSectionOptions,
765         .resetSectionOption = ResetWaterFlowSectionOptions,
766         .getSectionOption = GetWaterFlowSectionOptions,
767         .getItemMinWidth = GetItemMinWidth,
768         .getItemMaxWidth = GetItemMaxWidth,
769         .getItemMinHeight = GetItemMinHeight,
770         .getItemMaxHeight = GetItemMaxHeight,
771         .getWaterFlowEnableScrollInteraction = GetWaterFlowEnableScrollInteraction,
772         .getWaterFlowFriction = GetWaterFlowFriction,
773         .setScrollToIndex = SetScrollToIndex,
774         .setWaterflowFooter = SetWaterflowFooter,
775         .resetWaterflowFooter = ResetWaterflowFooter,
776         .getScrollController = GetScrollController,
777         .setWaterFlowScroller = SetWaterFlowScroller,
778         .getWaterFlowLayoutMode = GetWaterFlowLayoutMode,
779         .setWaterFlowLayoutMode = SetWaterFlowLayoutMode,
780         .resetWaterFlowLayoutMode = ResetWaterFlowLayoutMode,
781         .resetWaterFlowSections = ResetWaterFlowSections,
782         .setWaterFlowFadingEdge = SetWaterFlowFadingEdge,
783         .resetWaterFlowFadingEdge = ResetWaterFlowFadingEdge,
784         .setOnWaterFlowScrollIndexCallBack = SetOnWaterFlowScrollIndexCallBack,
785         .resetOnWaterFlowScrollIndex = ResetOnWaterFlowScrollIndex,
786         .createWaterFlowScrollBarColorWithResourceObj = CreateWaterFlowScrollBarColorWithResourceObj,
787     };
788     CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
789     return &modifier;
790 }
791 
GetCJUIWaterFlowModifier()792 const CJUIWaterFlowModifier* GetCJUIWaterFlowModifier()
793 {
794     CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
795     static const CJUIWaterFlowModifier modifier = {
796         .resetColumnsTemplate = ResetColumnsTemplate,
797         .setColumnsTemplate = SetColumnsTemplate,
798         .resetRowsTemplate = ResetRowsTemplate,
799         .setRowsTemplate = SetRowsTemplate,
800         .resetWaterFlowEnableScrollInteraction = ResetWaterFlowEnableScrollInteraction,
801         .setWaterFlowEnableScrollInteraction = SetWaterFlowEnableScrollInteraction,
802         .setColumnsGap = SetColumnsGap,
803         .resetColumnsGap = ResetColumnsGap,
804         .setRowsGap = SetRowsGap,
805         .resetRowsGap = ResetRowsGap,
806         .setItemMinWidth = SetItemMinWidth,
807         .resetItemMinWidth = ResetItemMinWidth,
808         .setItemMaxWidth = SetItemMaxWidth,
809         .resetItemMaxWidth = ResetItemMaxWidth,
810         .setItemMinHeight = SetItemMinHeight,
811         .resetItemMinHeight = ResetItemMinHeight,
812         .setItemMaxHeight = SetItemMaxHeight,
813         .resetItemMaxHeight = ResetItemMaxHeight,
814         .setLayoutDirection = SetLayoutDirection,
815         .resetLayoutDirection = ResetLayoutDirection,
816         .setWaterFlowNestedScroll = SetWaterFlowNestedScroll,
817         .resetWaterFlowNestedScroll = ResetWaterFlowNestedScroll,
818         .setWaterFlowFriction = SetWaterFlowFriction,
819         .resetWaterFlowFriction = ResetWaterFlowFriction,
820         .getLayoutDirection = GetLayoutDirection,
821         .getColumnsTemplate = GetColumnsTemplate,
822         .getRowsTemplate = GetRowsTemplate,
823         .getColumnsGap = GetColumnsGap,
824         .getRowsGap = GetRowsGap,
825         .getWaterFlowNestedScroll = GetWaterFlowNestedScroll,
826         .setNodeAdapter = SetNodeAdapter,
827         .resetNodeAdapter = ResetNodeAdapter,
828         .getNodeAdapter = GetNodeAdapter,
829         .setCachedCount = SetCachedCount,
830         .resetCachedCount = ResetCachedCount,
831         .getCachedCount = GetCachedCount,
832         .setEdgeEffect = SetEdgeEffect,
833         .resetEdgeEffect = ResetEdgeEffect,
834         .setWaterFlowScrollBar = SetWaterFlowScrollBar,
835         .resetWaterFlowScrollBar = ResetWaterFlowScrollBar,
836         .getWaterFlowScrollBar = GetWaterFlowScrollBar,
837         .setWaterFlowScrollBarWidth = SetWaterFlowBarWidth,
838         .resetWaterFlowScrollBarWidth = ResetWaterFlowBarWidth,
839         .getWaterFlowScrollBarWidth = GetWaterFlowBarWidth,
840         .setWaterFlowScrollBarColor = SetWaterFlowScrollBarColor,
841         .resetWaterFlowScrollBarColor = ResetWaterFlowScrollBarColor,
842         .getWaterFlowScrollBarColor = GetWaterFlowScrollBarColor,
843         .getEdgeEffect = GetEdgeEffect,
844         .setSectionOption = SetWaterFlowSectionOptions,
845         .resetSectionOption = ResetWaterFlowSectionOptions,
846         .getSectionOption = GetWaterFlowSectionOptions,
847         .getItemMinWidth = GetItemMinWidth,
848         .getItemMaxWidth = GetItemMaxWidth,
849         .getItemMinHeight = GetItemMinHeight,
850         .getItemMaxHeight = GetItemMaxHeight,
851         .getWaterFlowEnableScrollInteraction = GetWaterFlowEnableScrollInteraction,
852         .getWaterFlowFriction = GetWaterFlowFriction,
853         .setWaterflowFooter = SetWaterflowFooter,
854         .resetWaterflowFooter = ResetWaterflowFooter,
855         .setScrollToIndex = SetScrollToIndex,
856         .setWaterFlowFlingSpeedLimit = SetWaterFlowFlingSpeedLimit,
857         .resetWaterFlowFlingSpeedLimit = ResetWaterFlowFlingSpeedLimit,
858     };
859     CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
860     return &modifier;
861 }
862 
SetOnWillScroll(ArkUINodeHandle node,void * extraParam)863 void SetOnWillScroll(ArkUINodeHandle node, void* extraParam)
864 {
865     auto* frameNode = reinterpret_cast<FrameNode*>(node);
866     CHECK_NULL_VOID(frameNode);
867     int32_t nodeId = frameNode->GetId();
868     auto onWillScroll = [nodeId, node, extraParam](const Dimension& offset, const ScrollState& state,
869                             ScrollSource source) -> ScrollFrameResult {
870         ScrollFrameResult scrollRes { .offset = offset };
871         ArkUINodeEvent event;
872         event.kind = COMPONENT_ASYNC_EVENT;
873         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
874         event.componentAsyncEvent.subKind = ON_WATER_FLOW_WILL_SCROLL;
875         bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
876         event.componentAsyncEvent.data[0].f32 =
877             usePx ? static_cast<float>(offset.ConvertToPx()) : static_cast<float>(offset.Value());
878         event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
879         event.componentAsyncEvent.data[2].i32 = static_cast<int>(source);
880         SendArkUISyncEvent(&event);
881         scrollRes.offset = Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::VP);
882         return scrollRes;
883     };
884     ScrollableModelNG::SetOnWillScroll(frameNode, std::move(onWillScroll));
885 }
886 
SetOnWaterFlowReachEnd(ArkUINodeHandle node,void * extraParam)887 void SetOnWaterFlowReachEnd(ArkUINodeHandle node, void* extraParam)
888 {
889     auto* frameNode = reinterpret_cast<FrameNode*>(node);
890     CHECK_NULL_VOID(frameNode);
891     auto onReachEnd = [node, extraParam]() -> void {
892         ArkUINodeEvent event;
893         event.kind = COMPONENT_ASYNC_EVENT;
894         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
895         event.componentAsyncEvent.subKind = ON_WATER_FLOW_REACH_END;
896         SendArkUISyncEvent(&event);
897     };
898     WaterFlowModelNG::SetOnReachEnd(frameNode, std::move(onReachEnd));
899 }
900 
SetOnDidScroll(ArkUINodeHandle node,void * extraParam)901 void SetOnDidScroll(ArkUINodeHandle node, void* extraParam)
902 {
903     auto* frameNode = reinterpret_cast<FrameNode*>(node);
904     CHECK_NULL_VOID(frameNode);
905     int32_t nodeId = frameNode->GetId();
906     auto setOnDidScroll = [nodeId, node, extraParam](const Dimension& offset, const ScrollState& state) -> void {
907         ArkUINodeEvent event;
908         event.kind = COMPONENT_ASYNC_EVENT;
909         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
910         bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
911         event.componentAsyncEvent.subKind = ON_WATER_FLOW_DID_SCROLL;
912         event.componentAsyncEvent.data[0].f32 =
913             usePx ? static_cast<float>(offset.ConvertToPx()) : static_cast<float>(offset.Value());
914         event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
915         SendArkUISyncEvent(&event);
916     };
917     ScrollableModelNG::SetOnDidScroll(frameNode, std::move(setOnDidScroll));
918 }
919 
SetOnWaterFlowScrollStart(ArkUINodeHandle node,void * extraParam)920 void SetOnWaterFlowScrollStart(ArkUINodeHandle node, void* extraParam)
921 {
922     auto* frameNode = reinterpret_cast<FrameNode*>(node);
923     CHECK_NULL_VOID(frameNode);
924     int32_t nodeId = frameNode->GetId();
925     auto onScrollStart = [nodeId, node, extraParam]() -> void {
926         ArkUINodeEvent event;
927         event.kind = COMPONENT_ASYNC_EVENT;
928         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
929         event.componentAsyncEvent.subKind = ON_WATER_FLOW_SCROLL_START;
930         SendArkUISyncEvent(&event);
931     };
932     WaterFlowModelNG::SetOnScrollStart(frameNode, std::move(onScrollStart));
933 }
934 
SetOnWaterFlowScrollStop(ArkUINodeHandle node,void * extraParam)935 void SetOnWaterFlowScrollStop(ArkUINodeHandle node, void* extraParam)
936 {
937     auto* frameNode = reinterpret_cast<FrameNode*>(node);
938     CHECK_NULL_VOID(frameNode);
939     int32_t nodeId = frameNode->GetId();
940     auto onScrollStop = [nodeId, node, extraParam]() -> void {
941         ArkUINodeEvent event;
942         event.kind = COMPONENT_ASYNC_EVENT;
943         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
944         event.componentAsyncEvent.subKind = ON_WATER_FLOW_SCROLL_STOP;
945         SendArkUISyncEvent(&event);
946     };
947     WaterFlowModelNG::SetOnScrollStop(frameNode, std::move(onScrollStop));
948 }
949 
SetOnWaterFlowScrollFrameBegin(ArkUINodeHandle node,void * extraParam)950 void SetOnWaterFlowScrollFrameBegin(ArkUINodeHandle node, void* extraParam)
951 {
952     auto* frameNode = reinterpret_cast<FrameNode*>(node);
953     CHECK_NULL_VOID(frameNode);
954     int32_t nodeId = frameNode->GetId();
955     auto onScrollFrameBegin = [nodeId, node, extraParam](
956                                   const Dimension& offset, const ScrollState& state) -> ScrollFrameResult {
957         ScrollFrameResult scrollRes { .offset = offset };
958         ArkUINodeEvent event;
959         event.kind = COMPONENT_ASYNC_EVENT;
960         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
961         event.componentAsyncEvent.subKind = ON_WATER_FLOW_SCROLL_FRAME_BEGIN;
962         bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
963         event.componentAsyncEvent.data[0].f32 =
964             usePx ? static_cast<float>(offset.ConvertToPx()) : static_cast<float>(offset.Value());
965         event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
966         SendArkUISyncEvent(&event);
967         scrollRes.offset = usePx ? Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::PX)
968                                  : Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::VP);
969         return scrollRes;
970     };
971     WaterFlowModelNG::SetOnScrollFrameBegin(frameNode, std::move(onScrollFrameBegin));
972 }
973 
SetOnWaterFlowScrollIndex(ArkUINodeHandle node,void * extraParam)974 void SetOnWaterFlowScrollIndex(ArkUINodeHandle node, void* extraParam)
975 {
976     auto* frameNode = reinterpret_cast<FrameNode*>(node);
977     CHECK_NULL_VOID(frameNode);
978     int32_t nodeId = frameNode->GetId();
979     auto onScrollIndex = [nodeId, node, extraParam](int32_t first, int32_t last) -> void {
980         ArkUINodeEvent event;
981         event.kind = COMPONENT_ASYNC_EVENT;
982         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
983         event.componentAsyncEvent.subKind = ON_WATER_FLOW_SCROLL_INDEX;
984         event.componentAsyncEvent.data[0].i32 = first;
985         event.componentAsyncEvent.data[1].i32 = last;
986         SendArkUISyncEvent(&event);
987     };
988     WaterFlowModelNG::SetOnScrollIndex(frameNode, std::move(onScrollIndex));
989 }
990 
SetOnWaterFlowScrollIndexCallBack(ArkUINodeHandle node,void * extraParam)991 void SetOnWaterFlowScrollIndexCallBack(ArkUINodeHandle node, void* extraParam)
992 {
993     auto* frameNode = reinterpret_cast<FrameNode*>(node);
994     CHECK_NULL_VOID(frameNode);
995     if (extraParam) {
996         auto onScrollIndex = reinterpret_cast<ScrollIndexFunc*>(extraParam);
997         WaterFlowModelNG::SetOnScrollIndex(frameNode, std::move(*onScrollIndex));
998     } else {
999         WaterFlowModelNG::SetOnScrollIndex(frameNode, nullptr);
1000     }
1001 }
1002 
SetOnWaterFlowReachStart(ArkUINodeHandle node,void * extraParam)1003 void SetOnWaterFlowReachStart(ArkUINodeHandle node, void* extraParam)
1004 {
1005     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1006     CHECK_NULL_VOID(frameNode);
1007     auto onReachStart = [node, extraParam]() -> void {
1008         ArkUINodeEvent event;
1009         event.kind = COMPONENT_ASYNC_EVENT;
1010         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
1011         event.componentAsyncEvent.subKind = ON_WATER_FLOW_REACH_START;
1012         SendArkUISyncEvent(&event);
1013     };
1014     WaterFlowModelNG::SetOnReachStart(frameNode, std::move(onReachStart));
1015 }
1016 
ResetOnWillScroll(ArkUINodeHandle node)1017 void ResetOnWillScroll(ArkUINodeHandle node)
1018 {
1019     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1020     CHECK_NULL_VOID(frameNode);
1021     ScrollableModelNG::SetOnWillScroll(frameNode, nullptr);
1022 }
ResetOnWaterFlowReachEnd(ArkUINodeHandle node)1023 void ResetOnWaterFlowReachEnd(ArkUINodeHandle node)
1024 {
1025     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1026     CHECK_NULL_VOID(frameNode);
1027     WaterFlowModelNG::SetOnReachEnd(frameNode, nullptr);
1028 }
ResetOnDidScroll(ArkUINodeHandle node)1029 void ResetOnDidScroll(ArkUINodeHandle node)
1030 {
1031     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1032     CHECK_NULL_VOID(frameNode);
1033     ScrollableModelNG::SetOnDidScroll(frameNode, nullptr);
1034 }
ResetOnWaterFlowScrollStart(ArkUINodeHandle node)1035 void ResetOnWaterFlowScrollStart(ArkUINodeHandle node)
1036 {
1037     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1038     CHECK_NULL_VOID(frameNode);
1039     WaterFlowModelNG::SetOnScrollStart(frameNode, nullptr);
1040 }
ResetOnWaterFlowScrollStop(ArkUINodeHandle node)1041 void ResetOnWaterFlowScrollStop(ArkUINodeHandle node)
1042 {
1043     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1044     CHECK_NULL_VOID(frameNode);
1045     WaterFlowModelNG::SetOnScrollStop(frameNode, nullptr);
1046 }
ResetOnWaterFlowScrollFrameBegin(ArkUINodeHandle node)1047 void ResetOnWaterFlowScrollFrameBegin(ArkUINodeHandle node)
1048 {
1049     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1050     CHECK_NULL_VOID(frameNode);
1051     WaterFlowModelNG::SetOnScrollFrameBegin(frameNode, nullptr);
1052 }
ResetOnWaterFlowScrollIndex(ArkUINodeHandle node)1053 void ResetOnWaterFlowScrollIndex(ArkUINodeHandle node)
1054 {
1055     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1056     CHECK_NULL_VOID(frameNode);
1057     WaterFlowModelNG::SetOnScrollIndex(frameNode, nullptr);
1058 }
ResetOnWaterFlowReachStart(ArkUINodeHandle node)1059 void ResetOnWaterFlowReachStart(ArkUINodeHandle node)
1060 {
1061     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1062     CHECK_NULL_VOID(frameNode);
1063     WaterFlowModelNG::SetOnReachStart(frameNode, nullptr);
1064 }
1065 } // namespace NodeModifier
1066 } // namespace OHOS::Ace::NG
1067