1 /*
2  * Copyright (c) 2023-2024 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 "base/geometry/dimension.h"
21 #include "base/utils/utils.h"
22 #include "core/components_ng/base/frame_node.h"
23 #include "core/components_ng/pattern/scrollable/scrollable_model_ng.h"
24 #include "core/components_ng/pattern/waterflow/water_flow_model_ng.h"
25 #include "core/components_ng/pattern/waterflow/water_flow_sections.h"
26 #include "core/interfaces/arkoala/arkoala_api.h"
27 #include "core/interfaces/native/node/node_adapter_impl.h"
28 
29 namespace OHOS::Ace::NG {
30 namespace {
31 constexpr ArkUI_Float64 FRICTION_DEFAULT = -1.0;
32 constexpr ArkUI_Float64 DIMENSION_DEFAULT = 0.0;
33 const int32_t ERROR_INT_CODE = -1;
34 const float ERROR_FLOAT_CODE = -1.0f;
35 constexpr Dimension DEFAULT_FADING_EDGE_LENGTH = Dimension(32.0f, DimensionUnit::VP); // default value
36 constexpr int32_t INDEX_0 = 0;
37 constexpr int32_t INDEX_1 = 1;
38 constexpr int32_t INDEX_2 = 2;
39 std::string g_strValue;
40 
ResetColumnsTemplate(ArkUINodeHandle node)41 void ResetColumnsTemplate(ArkUINodeHandle node)
42 {
43     auto* frameNode = reinterpret_cast<FrameNode*>(node);
44     CHECK_NULL_VOID(frameNode);
45     WaterFlowModelNG::SetColumnsTemplate(frameNode, "");
46 }
47 
SetColumnsTemplate(ArkUINodeHandle node,ArkUI_CharPtr value)48 void SetColumnsTemplate(ArkUINodeHandle node, ArkUI_CharPtr value)
49 {
50     auto* frameNode = reinterpret_cast<FrameNode*>(node);
51     CHECK_NULL_VOID(frameNode);
52     WaterFlowModelNG::SetColumnsTemplate(frameNode, value);
53 }
54 
ResetRowsTemplate(ArkUINodeHandle node)55 void ResetRowsTemplate(ArkUINodeHandle node)
56 {
57     auto* frameNode = reinterpret_cast<FrameNode*>(node);
58     CHECK_NULL_VOID(frameNode);
59     WaterFlowModelNG::SetRowsTemplate(frameNode, "");
60 }
61 
SetRowsTemplate(ArkUINodeHandle node,ArkUI_CharPtr value)62 void SetRowsTemplate(ArkUINodeHandle node, ArkUI_CharPtr value)
63 {
64     auto* frameNode = reinterpret_cast<FrameNode*>(node);
65     CHECK_NULL_VOID(frameNode);
66     WaterFlowModelNG::SetRowsTemplate(frameNode, value);
67 }
68 
ResetWaterFlowEnableScrollInteraction(ArkUINodeHandle node)69 void ResetWaterFlowEnableScrollInteraction(ArkUINodeHandle node)
70 {
71     auto* frameNode = reinterpret_cast<FrameNode*>(node);
72     CHECK_NULL_VOID(frameNode);
73     WaterFlowModelNG::SetScrollEnabled(frameNode, true);
74 }
75 
SetWaterFlowEnableScrollInteraction(ArkUINodeHandle node,ArkUI_Bool value)76 void SetWaterFlowEnableScrollInteraction(ArkUINodeHandle node, ArkUI_Bool value)
77 {
78     auto* frameNode = reinterpret_cast<FrameNode*>(node);
79     CHECK_NULL_VOID(frameNode);
80     WaterFlowModelNG::SetScrollEnabled(frameNode, value);
81 }
82 
SetColumnsGap(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)83 void SetColumnsGap(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
84 {
85     auto* frameNode = reinterpret_cast<FrameNode*>(node);
86     CHECK_NULL_VOID(frameNode);
87     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
88     CalcDimension columnsGapDimension;
89     if (unitEnum == DimensionUnit::CALC) {
90         columnsGapDimension = Dimension::FromString(std::string(calcValue));
91     } else {
92         columnsGapDimension = Dimension(value, unitEnum);
93     }
94     WaterFlowModelNG::SetColumnsGap(frameNode, columnsGapDimension);
95 }
96 
ResetColumnsGap(ArkUINodeHandle node)97 void ResetColumnsGap(ArkUINodeHandle node)
98 {
99     auto* frameNode = reinterpret_cast<FrameNode*>(node);
100     CHECK_NULL_VOID(frameNode);
101     WaterFlowModelNG::SetColumnsGap(frameNode, CalcDimension(DIMENSION_DEFAULT));
102 }
103 
SetRowsGap(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)104 void SetRowsGap(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
105 {
106     auto* frameNode = reinterpret_cast<FrameNode*>(node);
107     CHECK_NULL_VOID(frameNode);
108     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
109     CalcDimension rowsGapDimension;
110     if (unitEnum == DimensionUnit::CALC) {
111         rowsGapDimension = Dimension::FromString(std::string(calcValue));
112     } else {
113         rowsGapDimension = Dimension(value, unitEnum);
114     }
115     WaterFlowModelNG::SetRowsGap(frameNode, rowsGapDimension);
116 }
117 
ResetRowsGap(ArkUINodeHandle node)118 void ResetRowsGap(ArkUINodeHandle node)
119 {
120     auto* frameNode = reinterpret_cast<FrameNode*>(node);
121     CHECK_NULL_VOID(frameNode);
122     WaterFlowModelNG::SetRowsGap(frameNode, CalcDimension(DIMENSION_DEFAULT));
123 }
124 
SetItemMinWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)125 void SetItemMinWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
126 {
127     auto* frameNode = reinterpret_cast<FrameNode*>(node);
128     CHECK_NULL_VOID(frameNode);
129     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
130     CalcDimension minWidthDimension;
131     if (unitEnum == DimensionUnit::CALC) {
132         minWidthDimension = Dimension::FromString(std::string(calcValue));
133     } else {
134         minWidthDimension = Dimension(value, unitEnum);
135     }
136     WaterFlowModelNG::SetItemMinWidth(frameNode, minWidthDimension);
137 }
138 
ResetItemMinWidth(ArkUINodeHandle node)139 void ResetItemMinWidth(ArkUINodeHandle node) {}
140 
SetItemMinHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)141 void SetItemMinHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
142 {
143     auto* frameNode = reinterpret_cast<FrameNode*>(node);
144     CHECK_NULL_VOID(frameNode);
145     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
146     CalcDimension minHeightDimension;
147     if (unitEnum == DimensionUnit::CALC) {
148         minHeightDimension = Dimension::FromString(std::string(calcValue));
149     } else {
150         minHeightDimension = Dimension(value, unitEnum);
151     }
152     WaterFlowModelNG::SetItemMinHeight(frameNode, minHeightDimension);
153 }
154 
ResetItemMinHeight(ArkUINodeHandle node)155 void ResetItemMinHeight(ArkUINodeHandle node) {}
156 
SetItemMaxWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)157 void SetItemMaxWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
158 {
159     auto* frameNode = reinterpret_cast<FrameNode*>(node);
160     CHECK_NULL_VOID(frameNode);
161     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
162     CalcDimension maxWidthDimension;
163     if (unitEnum == DimensionUnit::CALC) {
164         maxWidthDimension = Dimension::FromString(std::string(calcValue));
165     } else {
166         maxWidthDimension = Dimension(value, unitEnum);
167     }
168     WaterFlowModelNG::SetItemMaxWidth(frameNode, maxWidthDimension);
169 }
170 
ResetItemMaxWidth(ArkUINodeHandle node)171 void ResetItemMaxWidth(ArkUINodeHandle node) {}
172 
SetItemMaxHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)173 void SetItemMaxHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
174 {
175     auto* frameNode = reinterpret_cast<FrameNode*>(node);
176     CHECK_NULL_VOID(frameNode);
177     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
178     CalcDimension maxHeightDimension;
179     if (unitEnum == DimensionUnit::CALC) {
180         maxHeightDimension = Dimension::FromString(std::string(calcValue));
181     } else {
182         maxHeightDimension = Dimension(value, unitEnum);
183     }
184     WaterFlowModelNG::SetItemMaxHeight(frameNode, maxHeightDimension);
185 }
186 
ResetItemMaxHeight(ArkUINodeHandle node)187 void ResetItemMaxHeight(ArkUINodeHandle node) {}
188 
SetLayoutDirection(ArkUINodeHandle node,ArkUI_Int32 direction)189 void SetLayoutDirection(ArkUINodeHandle node, ArkUI_Int32 direction)
190 {
191     auto* frameNode = reinterpret_cast<FrameNode*>(node);
192     CHECK_NULL_VOID(frameNode);
193     WaterFlowModelNG::SetLayoutDirection(frameNode, static_cast<FlexDirection>(direction));
194 }
195 
ResetLayoutDirection(ArkUINodeHandle node)196 void ResetLayoutDirection(ArkUINodeHandle node)
197 {
198     auto* frameNode = reinterpret_cast<FrameNode*>(node);
199     CHECK_NULL_VOID(frameNode);
200     WaterFlowModelNG::SetLayoutDirection(frameNode, FlexDirection::COLUMN);
201 }
202 
SetWaterFlowNestedScroll(ArkUINodeHandle node,ArkUI_Int32 scrollForward,ArkUI_Int32 scrollBackward)203 void SetWaterFlowNestedScroll(ArkUINodeHandle node, ArkUI_Int32 scrollForward, ArkUI_Int32 scrollBackward)
204 {
205     auto* frameNode = reinterpret_cast<FrameNode*>(node);
206     CHECK_NULL_VOID(frameNode);
207     NestedScrollOptions nestedOpt = {
208         .forward = NestedScrollMode::SELF_ONLY,
209         .backward = NestedScrollMode::SELF_ONLY,
210     };
211     nestedOpt.forward = static_cast<NestedScrollMode>(scrollForward);
212     nestedOpt.backward = static_cast<NestedScrollMode>(scrollBackward);
213     WaterFlowModelNG::SetNestedScroll(frameNode, nestedOpt);
214 }
215 
ResetWaterFlowNestedScroll(ArkUINodeHandle node)216 void ResetWaterFlowNestedScroll(ArkUINodeHandle node)
217 {
218     auto* frameNode = reinterpret_cast<FrameNode*>(node);
219     CHECK_NULL_VOID(frameNode);
220     NestedScrollOptions nestedOpt = {
221         .forward = NestedScrollMode::SELF_ONLY,
222         .backward = NestedScrollMode::SELF_ONLY,
223     };
224     WaterFlowModelNG::SetNestedScroll(frameNode, nestedOpt);
225 }
226 
SetWaterFlowFriction(ArkUINodeHandle node,ArkUI_Float32 friction)227 void SetWaterFlowFriction(ArkUINodeHandle node, ArkUI_Float32 friction)
228 {
229     auto* frameNode = reinterpret_cast<FrameNode*>(node);
230     CHECK_NULL_VOID(frameNode);
231     WaterFlowModelNG::SetFriction(frameNode, friction);
232 }
233 
ResetWaterFlowFriction(ArkUINodeHandle node)234 void ResetWaterFlowFriction(ArkUINodeHandle node)
235 {
236     auto* frameNode = reinterpret_cast<FrameNode*>(node);
237     CHECK_NULL_VOID(frameNode);
238     WaterFlowModelNG::SetFriction(frameNode, FRICTION_DEFAULT);
239 }
240 
SetEdgeEffect(ArkUINodeHandle node,int32_t edgeEffect,ArkUI_Bool alwaysEnabled)241 void SetEdgeEffect(ArkUINodeHandle node, int32_t edgeEffect, ArkUI_Bool alwaysEnabled)
242 {
243     auto* frameNode = reinterpret_cast<FrameNode*>(node);
244     CHECK_NULL_VOID(frameNode);
245     WaterFlowModelNG::SetEdgeEffect(frameNode, static_cast<EdgeEffect>(edgeEffect), alwaysEnabled);
246 }
247 
ResetEdgeEffect(ArkUINodeHandle node)248 void ResetEdgeEffect(ArkUINodeHandle node)
249 {
250     auto* frameNode = reinterpret_cast<FrameNode*>(node);
251     CHECK_NULL_VOID(frameNode);
252     EdgeEffect edgeEffect = EdgeEffect::NONE;
253     ArkUI_Bool alwaysEnabled = false;
254     WaterFlowModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled);
255 }
256 
GetLayoutDirection(ArkUINodeHandle node)257 ArkUI_Int32 GetLayoutDirection(ArkUINodeHandle node)
258 {
259     auto* frameNode = reinterpret_cast<FrameNode*>(node);
260     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
261     return static_cast<ArkUI_Int32>(WaterFlowModelNG::GetLayoutDirection(frameNode));
262 }
263 
GetColumnsTemplate(ArkUINodeHandle node)264 ArkUI_CharPtr GetColumnsTemplate(ArkUINodeHandle node)
265 {
266     auto* frameNode = reinterpret_cast<FrameNode*>(node);
267     CHECK_NULL_RETURN(frameNode, nullptr);
268     g_strValue = WaterFlowModelNG::GetColumnsTemplate(frameNode);
269     return g_strValue.c_str();
270 }
271 
GetRowsTemplate(ArkUINodeHandle node)272 ArkUI_CharPtr GetRowsTemplate(ArkUINodeHandle node)
273 {
274     auto* frameNode = reinterpret_cast<FrameNode*>(node);
275     CHECK_NULL_RETURN(frameNode, nullptr);
276     g_strValue = WaterFlowModelNG::GetRowsTemplate(frameNode);
277     return g_strValue.c_str();
278 }
279 
GetColumnsGap(ArkUINodeHandle node)280 ArkUI_Float32 GetColumnsGap(ArkUINodeHandle node)
281 {
282     auto* frameNode = reinterpret_cast<FrameNode*>(node);
283     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
284     return WaterFlowModelNG::GetColumnsGap(frameNode);
285 }
286 
GetRowsGap(ArkUINodeHandle node)287 ArkUI_Float32 GetRowsGap(ArkUINodeHandle node)
288 {
289     auto* frameNode = reinterpret_cast<FrameNode*>(node);
290     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
291     return WaterFlowModelNG::GetRowsGap(frameNode);
292 }
293 
GetWaterFlowNestedScroll(ArkUINodeHandle node,ArkUI_Int32 (* values)[2])294 void GetWaterFlowNestedScroll(ArkUINodeHandle node, ArkUI_Int32 (*values)[2])
295 {
296     auto* frameNode = reinterpret_cast<FrameNode*>(node);
297     CHECK_NULL_VOID(frameNode);
298     NestedScrollOptions options = WaterFlowModelNG::GetNestedScroll(frameNode);
299     (*values)[0] = static_cast<ArkUI_Int32>(options.forward);
300     (*values)[1] = static_cast<ArkUI_Int32>(options.backward);
301 }
302 
SetNodeAdapter(ArkUINodeHandle node,ArkUINodeAdapterHandle handle)303 ArkUI_Int32 SetNodeAdapter(ArkUINodeHandle node, ArkUINodeAdapterHandle handle)
304 {
305     auto* frameNode = reinterpret_cast<FrameNode*>(node);
306     CHECK_NULL_RETURN(frameNode, ERROR_CODE_PARAM_INVALID);
307     auto hasFooter = WaterFlowModelNG::hasFooter(frameNode);
308     auto totalChildCount = hasFooter ? frameNode->TotalChildCount() - 1 : frameNode->TotalChildCount();
309     if (totalChildCount > 0) {
310         return ERROR_CODE_NATIVE_IMPL_NODE_ADAPTER_CHILD_NODE_EXIST;
311     }
312     NodeAdapter::GetNodeAdapterAPI()->attachHostNode(handle, node);
313     return ERROR_CODE_NO_ERROR;
314 }
315 
ResetNodeAdapter(ArkUINodeHandle node)316 void ResetNodeAdapter(ArkUINodeHandle node)
317 {
318     NodeAdapter::GetNodeAdapterAPI()->detachHostNode(node);
319 }
320 
GetNodeAdapter(ArkUINodeHandle node)321 ArkUINodeAdapterHandle GetNodeAdapter(ArkUINodeHandle node)
322 {
323     return NodeAdapter::GetNodeAdapterAPI()->getNodeAdapter(node);
324 }
325 
SetCachedCount(ArkUINodeHandle node,ArkUI_Int32 cachedCount)326 void SetCachedCount(ArkUINodeHandle node, ArkUI_Int32 cachedCount)
327 {
328     auto* frameNode = reinterpret_cast<FrameNode*>(node);
329     CHECK_NULL_VOID(frameNode);
330     WaterFlowModelNG::SetCachedCount(frameNode, cachedCount);
331 }
332 
ResetCachedCount(ArkUINodeHandle node)333 void ResetCachedCount(ArkUINodeHandle node)
334 {
335     auto* frameNode = reinterpret_cast<FrameNode*>(node);
336     CHECK_NULL_VOID(frameNode);
337     WaterFlowModelNG::SetCachedCount(frameNode, 1);
338 }
339 
GetCachedCount(ArkUINodeHandle node)340 ArkUI_Int32 GetCachedCount(ArkUINodeHandle node)
341 {
342     auto* frameNode = reinterpret_cast<FrameNode*>(node);
343     CHECK_NULL_RETURN(frameNode, 1);
344     return WaterFlowModelNG::GetCachedCount(frameNode);
345 }
346 
SetShowCached(ArkUINodeHandle node,ArkUI_Bool show)347 void SetShowCached(ArkUINodeHandle node, ArkUI_Bool show)
348 {
349     auto* frameNode = reinterpret_cast<FrameNode*>(node);
350     CHECK_NULL_VOID(frameNode);
351     WaterFlowModelNG::SetShowCached(frameNode, show);
352 }
353 
ResetShowCached(ArkUINodeHandle node)354 void ResetShowCached(ArkUINodeHandle node)
355 {
356     auto* frameNode = reinterpret_cast<FrameNode*>(node);
357     CHECK_NULL_VOID(frameNode);
358     WaterFlowModelNG::SetShowCached(frameNode, false);
359 }
360 
GetShowCached(ArkUINodeHandle node)361 ArkUI_Bool GetShowCached(ArkUINodeHandle node)
362 {
363     auto* frameNode = reinterpret_cast<FrameNode*>(node);
364     CHECK_NULL_RETURN(frameNode, false);
365     return WaterFlowModelNG::GetShowCached(frameNode);
366 }
367 
SetWaterFlowScrollBar(ArkUINodeHandle node,ArkUI_Int32 barState)368 void SetWaterFlowScrollBar(ArkUINodeHandle node, ArkUI_Int32 barState)
369 {
370     auto* frameNode = reinterpret_cast<FrameNode*>(node);
371     CHECK_NULL_VOID(frameNode);
372     WaterFlowModelNG::SetScrollBarMode(frameNode, static_cast<DisplayMode>(barState));
373 }
374 
ResetWaterFlowScrollBar(ArkUINodeHandle node)375 void ResetWaterFlowScrollBar(ArkUINodeHandle node)
376 {
377     auto* frameNode = reinterpret_cast<FrameNode*>(node);
378     CHECK_NULL_VOID(frameNode);
379     WaterFlowModelNG::SetScrollBarMode(frameNode, DisplayMode::AUTO);
380 }
381 
GetWaterFlowScrollBar(ArkUINodeHandle node)382 ArkUI_Int32 GetWaterFlowScrollBar(ArkUINodeHandle node)
383 {
384     auto* frameNode = reinterpret_cast<FrameNode*>(node);
385     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
386     return WaterFlowModelNG::GetScrollBarMode(frameNode);
387 }
388 
SetWaterFlowBarWidth(ArkUINodeHandle node,ArkUI_CharPtr value)389 void SetWaterFlowBarWidth(ArkUINodeHandle node, ArkUI_CharPtr value)
390 {
391     CHECK_NULL_VOID(value);
392     auto* frameNode = reinterpret_cast<FrameNode*>(node);
393     CHECK_NULL_VOID(frameNode);
394     WaterFlowModelNG::SetScrollBarWidth(frameNode, value);
395 }
396 
ResetWaterFlowBarWidth(ArkUINodeHandle node)397 void ResetWaterFlowBarWidth(ArkUINodeHandle node)
398 {
399     auto* frameNode = reinterpret_cast<FrameNode*>(node);
400     CHECK_NULL_VOID(frameNode);
401     WaterFlowModelNG::SetScrollBarWidth(frameNode, "0vp");
402 }
403 
GetWaterFlowBarWidth(ArkUINodeHandle node)404 ArkUI_Float32 GetWaterFlowBarWidth(ArkUINodeHandle node)
405 {
406     auto* frameNode = reinterpret_cast<FrameNode*>(node);
407     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
408     return WaterFlowModelNG::GetScrollBarWidth(frameNode);
409 }
410 
SetWaterFlowScrollBarColor(ArkUINodeHandle node,ArkUI_CharPtr value)411 void SetWaterFlowScrollBarColor(ArkUINodeHandle node, ArkUI_CharPtr value)
412 {
413     CHECK_NULL_VOID(value);
414     auto* frameNode = reinterpret_cast<FrameNode*>(node);
415     CHECK_NULL_VOID(frameNode);
416     WaterFlowModelNG::SetScrollBarColor(frameNode, value);
417 }
418 
ResetWaterFlowScrollBarColor(ArkUINodeHandle node)419 void ResetWaterFlowScrollBarColor(ArkUINodeHandle node)
420 {
421     auto* frameNode = reinterpret_cast<FrameNode*>(node);
422     CHECK_NULL_VOID(frameNode);
423     WaterFlowModelNG::SetScrollBarColor(frameNode, "#FF000000");
424 }
425 
GetWaterFlowScrollBarColor(ArkUINodeHandle node)426 ArkUI_Uint32 GetWaterFlowScrollBarColor(ArkUINodeHandle node)
427 {
428     auto* frameNode = reinterpret_cast<FrameNode*>(node);
429     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
430     return WaterFlowModelNG::GetScrollBarColor(frameNode);
431 }
432 
GetEdgeEffect(ArkUINodeHandle node,ArkUI_Int32 (* values)[2])433 ArkUI_Int32 GetEdgeEffect(ArkUINodeHandle node, ArkUI_Int32 (*values)[2])
434 {
435     auto* frameNode = reinterpret_cast<FrameNode*>(node);
436     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
437     (*values)[INDEX_0] = WaterFlowModelNG::GetEdgeEffect(frameNode);
438     (*values)[INDEX_1] = WaterFlowModelNG::GetEdgeEffectAlways(frameNode);
439     return INDEX_2;
440 }
441 
SetWaterFlowSectionOptions(ArkUINodeHandle node,ArkUI_Int32 start,ArkUIWaterFlowSectionOption option)442 void SetWaterFlowSectionOptions(ArkUINodeHandle node, ArkUI_Int32 start, ArkUIWaterFlowSectionOption option)
443 {
444     CHECK_NULL_VOID(option);
445     auto* frameNode = reinterpret_cast<FrameNode*>(node);
446     CHECK_NULL_VOID(frameNode);
447     auto waterFlowSections = WaterFlowModelNG::GetOrCreateWaterFlowSections(frameNode);
448 
449     const auto& sectionArray = option->sections;
450     const auto sectionsCount = sectionArray.size();
451 
452     std::vector<WaterFlowSections::Section> newSections(sectionsCount);
453 
454     for (size_t i = 0; i < sectionsCount; ++i) {
455         const auto& sectionData = sectionArray[i];
456         WaterFlowSections::Section& section = newSections[i];
457 
458         section.itemsCount = sectionData.itemsCount;
459         section.crossCount = sectionData.crossCount;
460         section.columnsGap = Dimension(sectionData.columnsGap);
461         section.rowsGap = Dimension(sectionData.rowsGap);
462 
463         NG::PaddingProperty paddings;
464         paddings.top = std::optional<CalcLength>(sectionData.margin[0]);
465         paddings.right = std::optional<CalcLength>(sectionData.margin[1]);
466         paddings.bottom = std::optional<CalcLength>(sectionData.margin[2]);
467         paddings.left = std::optional<CalcLength>(sectionData.margin[3]);
468         section.margin = paddings;
469         if (sectionData.onGetItemMainSizeByIndex) {
470             section.onGetItemMainSizeByIndex = [sectionData](int32_t value) -> float {
471                 // onGetItemMainSizeByIndex是一个返回float的函数指针
472                 using FuncType = float (*)(int32_t, void*);
473                 FuncType func = reinterpret_cast<FuncType>(sectionData.onGetItemMainSizeByIndex);
474                 float result = func(value, sectionData.userData);
475                 return result;
476             };
477         } else {
478             section.onGetItemMainSizeByIndex = nullptr;
479         }
480     }
481 
482     waterFlowSections->ReplaceFrom(start, newSections);
483 }
484 
ResetWaterFlowSectionOptions(ArkUINodeHandle node)485 void ResetWaterFlowSectionOptions(ArkUINodeHandle node)
486 {
487     auto* frameNode = reinterpret_cast<FrameNode*>(node);
488     CHECK_NULL_VOID(frameNode);
489     WaterFlowModelNG::ResetSections(frameNode);
490 }
491 
GetWaterFlowSectionOptions(ArkUINodeHandle node)492 ArkUI_WaterFlowSectionOption GetWaterFlowSectionOptions(ArkUINodeHandle node)
493 {
494     ArkUI_WaterFlowSectionOption option;
495     auto* frameNode = reinterpret_cast<FrameNode*>(node);
496     CHECK_NULL_RETURN(frameNode, option);
497     auto newSection = WaterFlowModelNG::GetOrCreateWaterFlowSections(frameNode)->GetSectionInfo();
498     auto sectionsCount = newSection.size();
499     option.sections.resize(sectionsCount);
500     for (size_t i = 0; i < sectionsCount; ++i) {
501         option.sections[i].itemsCount = newSection[i].itemsCount ? newSection[i].itemsCount : 0;
502         option.sections[i].crossCount = newSection[i].crossCount.has_value() ? newSection[i].crossCount.value() : 0;
503         option.sections[i].columnsGap = newSection[i].columnsGap.has_value() ? newSection[i].columnsGap->Value() : 0.0f;
504         option.sections[i].rowsGap = newSection[i].rowsGap.has_value() ? newSection[i].rowsGap->Value() : 0.0f;
505         option.sections[i].margin[0] =
506             newSection[i].margin->top.has_value() ? newSection[i].margin->top->GetDimension().Value() : 0.0f;
507         option.sections[i].margin[1] =
508             newSection[i].margin->right.has_value() ? newSection[i].margin->right->GetDimension().Value() : 0.0f;
509         option.sections[i].margin[2] =
510             newSection[i].margin->bottom.has_value() ? newSection[i].margin->bottom->GetDimension().Value() : 0.0f;
511         option.sections[i].margin[3] =
512             newSection[i].margin->left.has_value() ? newSection[i].margin->left->GetDimension().Value() : 0.0f;
513     }
514     return option;
515 }
516 
GetItemMinWidth(ArkUINodeHandle node,ArkUI_Int32 unit)517 ArkUI_Float32 GetItemMinWidth(ArkUINodeHandle node, ArkUI_Int32 unit)
518 {
519     auto* frameNode = reinterpret_cast<FrameNode*>(node);
520     CHECK_NULL_RETURN(frameNode, 1);
521     return WaterFlowModelNG::GetItemMinWidth(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit));
522 }
523 
GetItemMaxWidth(ArkUINodeHandle node,ArkUI_Int32 unit)524 ArkUI_Float32 GetItemMaxWidth(ArkUINodeHandle node, ArkUI_Int32 unit)
525 {
526     auto* frameNode = reinterpret_cast<FrameNode*>(node);
527     CHECK_NULL_RETURN(frameNode, 1);
528     return WaterFlowModelNG::GetItemMaxWidth(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit));
529 }
530 
GetItemMinHeight(ArkUINodeHandle node,ArkUI_Int32 unit)531 ArkUI_Float32 GetItemMinHeight(ArkUINodeHandle node, ArkUI_Int32 unit)
532 {
533     auto* frameNode = reinterpret_cast<FrameNode*>(node);
534     CHECK_NULL_RETURN(frameNode, 1);
535     return WaterFlowModelNG::GetItemMinHeight(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit));
536 }
537 
GetItemMaxHeight(ArkUINodeHandle node,ArkUI_Int32 unit)538 ArkUI_Float32 GetItemMaxHeight(ArkUINodeHandle node, ArkUI_Int32 unit)
539 {
540     auto* frameNode = reinterpret_cast<FrameNode*>(node);
541     CHECK_NULL_RETURN(frameNode, 1);
542     return WaterFlowModelNG::GetItemMaxHeight(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit));
543 }
544 
GetWaterFlowEnableScrollInteraction(ArkUINodeHandle node)545 ArkUI_Int32 GetWaterFlowEnableScrollInteraction(ArkUINodeHandle node)
546 {
547     auto* frameNode = reinterpret_cast<FrameNode*>(node);
548     CHECK_NULL_RETURN(frameNode, 1);
549     return WaterFlowModelNG::GetScrollEnabled(frameNode);
550 }
551 
GetWaterFlowFriction(ArkUINodeHandle node)552 ArkUI_Float32 GetWaterFlowFriction(ArkUINodeHandle node)
553 {
554     auto* frameNode = reinterpret_cast<FrameNode*>(node);
555     CHECK_NULL_RETURN(frameNode, 1);
556     return WaterFlowModelNG::GetFriction(frameNode);
557 }
SetScrollToIndex(ArkUINodeHandle node,ArkUI_Int32 index,ArkUI_Int32 animation,ArkUI_Int32 alignment)558 void SetScrollToIndex(ArkUINodeHandle node, ArkUI_Int32 index, ArkUI_Int32 animation, ArkUI_Int32 alignment)
559 {
560     auto* frameNode = reinterpret_cast<FrameNode*>(node);
561     CHECK_NULL_VOID(frameNode);
562     WaterFlowModelNG::SetScrollToIndex(frameNode, index, animation, alignment);
563 }
564 
SetWaterflowFooter(ArkUINodeHandle node,ArkUINodeHandle footer)565 void SetWaterflowFooter(ArkUINodeHandle node, ArkUINodeHandle footer)
566 {
567     auto* frameNode = reinterpret_cast<FrameNode*>(node);
568     CHECK_NULL_VOID(frameNode);
569     auto* footerNode = reinterpret_cast<FrameNode*>(footer);
570     CHECK_NULL_VOID(footerNode);
571     WaterFlowModelNG::SetWaterflowFooter(frameNode, footerNode);
572 }
573 
ResetWaterflowFooter(ArkUINodeHandle node)574 void ResetWaterflowFooter(ArkUINodeHandle node)
575 {
576     auto* frameNode = reinterpret_cast<FrameNode*>(node);
577     CHECK_NULL_VOID(frameNode);
578     WaterFlowModelNG::SetWaterflowFooter(frameNode, nullptr);
579 }
580 
SetWaterFlowFlingSpeedLimit(ArkUINodeHandle node,ArkUI_Float32 maxSpeed)581 void SetWaterFlowFlingSpeedLimit(ArkUINodeHandle node, ArkUI_Float32 maxSpeed)
582 {
583     auto* frameNode = reinterpret_cast<FrameNode*>(node);
584     CHECK_NULL_VOID(frameNode);
585     WaterFlowModelNG::SetFlingSpeedLimit(frameNode, maxSpeed);
586 }
587 
ResetWaterFlowFlingSpeedLimit(ArkUINodeHandle node)588 void ResetWaterFlowFlingSpeedLimit(ArkUINodeHandle node)
589 {
590     auto* frameNode = reinterpret_cast<FrameNode*>(node);
591     CHECK_NULL_VOID(frameNode);
592     WaterFlowModelNG::SetFlingSpeedLimit(frameNode, -1.0);
593 }
594 
GetScrollController(ArkUINodeHandle node)595 ArkUINodeHandle GetScrollController(ArkUINodeHandle node)
596 {
597     auto* frameNode = reinterpret_cast<FrameNode*>(node);
598     CHECK_NULL_RETURN(frameNode, nullptr);
599     auto controller = WaterFlowModelNG::GetOrCreateController(frameNode);
600     return reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(controller));
601 }
602 
SetWaterFlowScroller(ArkUINodeHandle node,ArkUINodeHandle controller,ArkUINodeHandle proxy)603 void SetWaterFlowScroller(ArkUINodeHandle node, ArkUINodeHandle controller, ArkUINodeHandle proxy)
604 {
605     auto* frameNode = reinterpret_cast<FrameNode*>(node);
606     CHECK_NULL_VOID(frameNode);
607     auto scrollController = AceType::Claim(reinterpret_cast<ScrollControllerBase*>(controller));
608     CHECK_NULL_VOID(scrollController);
609     auto scrollProxy = AceType::Claim(reinterpret_cast<ScrollProxy*>(proxy));
610     CHECK_NULL_VOID(scrollProxy);
611     WaterFlowModelNG::SetScroller(frameNode, scrollController, scrollProxy);
612 }
613 
SetWaterFlowLayoutMode(ArkUINodeHandle node,ArkUI_Uint32 layoutMode)614 void SetWaterFlowLayoutMode(ArkUINodeHandle node, ArkUI_Uint32 layoutMode)
615 {
616     auto* frameNode = reinterpret_cast<FrameNode*>(node);
617     CHECK_NULL_VOID(frameNode);
618     WaterFlowLayoutMode mode = WaterFlowLayoutMode::TOP_DOWN;
619     if (layoutMode >= static_cast<uint32_t>(WaterFlowLayoutMode::TOP_DOWN) &&
620         layoutMode <= static_cast<uint32_t>(WaterFlowLayoutMode::SLIDING_WINDOW)) {
621         mode = static_cast<WaterFlowLayoutMode>(layoutMode);
622     }
623     WaterFlowModelNG::SetLayoutMode(frameNode, mode);
624 }
625 
ResetWaterFlowLayoutMode(ArkUINodeHandle node)626 void ResetWaterFlowLayoutMode(ArkUINodeHandle node)
627 {
628     auto* frameNode = reinterpret_cast<FrameNode*>(node);
629     CHECK_NULL_VOID(frameNode);
630     WaterFlowLayoutMode mode = WaterFlowLayoutMode::TOP_DOWN;
631     WaterFlowModelNG::SetLayoutMode(frameNode, mode);
632 }
633 
ResetWaterFlowSections(ArkUINodeHandle node)634 void ResetWaterFlowSections(ArkUINodeHandle node)
635 {
636     auto* frameNode = reinterpret_cast<FrameNode*>(node);
637     CHECK_NULL_VOID(frameNode);
638     WaterFlowModelNG::ResetSections(frameNode);
639 }
640 
SetWaterFlowFadingEdge(ArkUINodeHandle node,ArkUI_Bool fadingEdge,ArkUI_Float32 fadingEdgeLengthValue,ArkUI_Int32 fadingEdgeLengthUnit)641 void SetWaterFlowFadingEdge(
642     ArkUINodeHandle node, ArkUI_Bool fadingEdge, ArkUI_Float32 fadingEdgeLengthValue, ArkUI_Int32 fadingEdgeLengthUnit)
643 {
644     auto* frameNode = reinterpret_cast<FrameNode*>(node);
645     CHECK_NULL_VOID(frameNode);
646     Dimension fadingEdgeLengthDimension =
647         Dimension(fadingEdgeLengthValue, static_cast<OHOS::Ace::DimensionUnit>(fadingEdgeLengthUnit));
648     NG::ScrollableModelNG::SetFadingEdge(frameNode, fadingEdge, fadingEdgeLengthDimension);
649 }
650 
ResetWaterFlowFadingEdge(ArkUINodeHandle node)651 void ResetWaterFlowFadingEdge(ArkUINodeHandle node)
652 {
653     auto* frameNode = reinterpret_cast<FrameNode*>(node);
654     CHECK_NULL_VOID(frameNode);
655     NG::ScrollableModelNG::SetFadingEdge(frameNode, false, DEFAULT_FADING_EDGE_LENGTH);
656 }
657 } // namespace
658 namespace NodeModifier {
GetWaterFlowModifier()659 const ArkUIWaterFlowModifier* GetWaterFlowModifier()
660 {
661     static const ArkUIWaterFlowModifier modifier = { ResetColumnsTemplate, SetColumnsTemplate, ResetRowsTemplate,
662         SetRowsTemplate, ResetWaterFlowEnableScrollInteraction, SetWaterFlowEnableScrollInteraction, SetColumnsGap,
663         ResetColumnsGap, SetRowsGap, ResetRowsGap, SetItemMinWidth, ResetItemMinWidth, SetItemMaxWidth,
664         ResetItemMaxWidth, SetItemMinHeight, ResetItemMinHeight, SetItemMaxHeight, ResetItemMaxHeight,
665         SetLayoutDirection, ResetLayoutDirection, SetWaterFlowNestedScroll, ResetWaterFlowNestedScroll,
666         SetWaterFlowFriction, ResetWaterFlowFriction, GetLayoutDirection, GetColumnsTemplate, GetRowsTemplate,
667         GetColumnsGap, GetRowsGap, GetWaterFlowNestedScroll, SetNodeAdapter, ResetNodeAdapter, GetNodeAdapter,
668         SetCachedCount, ResetCachedCount, GetCachedCount, SetShowCached, ResetShowCached, GetShowCached, SetEdgeEffect,
669         ResetEdgeEffect, SetWaterFlowScrollBar, ResetWaterFlowScrollBar, GetWaterFlowScrollBar, SetWaterFlowBarWidth,
670         ResetWaterFlowBarWidth, GetWaterFlowBarWidth, SetWaterFlowScrollBarColor, ResetWaterFlowScrollBarColor,
671         GetWaterFlowScrollBarColor, GetEdgeEffect, SetWaterFlowSectionOptions, ResetWaterFlowSectionOptions,
672         GetWaterFlowSectionOptions, GetItemMinWidth, GetItemMaxWidth, GetItemMinHeight, GetItemMaxHeight,
673         GetWaterFlowEnableScrollInteraction, GetWaterFlowFriction, SetScrollToIndex, SetWaterflowFooter,
674         ResetWaterflowFooter, SetWaterFlowFlingSpeedLimit, ResetWaterFlowFlingSpeedLimit, GetScrollController,
675         SetWaterFlowScroller, SetWaterFlowLayoutMode, ResetWaterFlowLayoutMode, ResetWaterFlowSections,
676         SetWaterFlowFadingEdge, ResetWaterFlowFadingEdge };
677     return &modifier;
678 }
679 
GetCJUIWaterFlowModifier()680 const CJUIWaterFlowModifier* GetCJUIWaterFlowModifier()
681 {
682     static const CJUIWaterFlowModifier modifier = { ResetColumnsTemplate, SetColumnsTemplate, ResetRowsTemplate,
683         SetRowsTemplate, ResetWaterFlowEnableScrollInteraction, SetWaterFlowEnableScrollInteraction, SetColumnsGap,
684         ResetColumnsGap, SetRowsGap, ResetRowsGap, SetItemMinWidth, ResetItemMinWidth, SetItemMaxWidth,
685         ResetItemMaxWidth, SetItemMinHeight, ResetItemMinHeight, SetItemMaxHeight, ResetItemMaxHeight,
686         SetLayoutDirection, ResetLayoutDirection, SetWaterFlowNestedScroll, ResetWaterFlowNestedScroll,
687         SetWaterFlowFriction, ResetWaterFlowFriction, GetLayoutDirection, GetColumnsTemplate, GetRowsTemplate,
688         GetColumnsGap, GetRowsGap, GetWaterFlowNestedScroll, SetNodeAdapter, ResetNodeAdapter, GetNodeAdapter,
689         SetCachedCount, ResetCachedCount, GetCachedCount, SetEdgeEffect, ResetEdgeEffect, SetWaterFlowScrollBar,
690         ResetWaterFlowScrollBar, GetWaterFlowScrollBar, SetWaterFlowBarWidth, ResetWaterFlowBarWidth,
691         GetWaterFlowBarWidth, SetWaterFlowScrollBarColor, ResetWaterFlowScrollBarColor, GetWaterFlowScrollBarColor,
692         GetEdgeEffect, SetWaterFlowSectionOptions, ResetWaterFlowSectionOptions, GetWaterFlowSectionOptions,
693         GetItemMinWidth, GetItemMaxWidth, GetItemMinHeight, GetItemMaxHeight, GetWaterFlowEnableScrollInteraction,
694         GetWaterFlowFriction, SetWaterflowFooter, ResetWaterflowFooter, SetScrollToIndex, SetWaterFlowFlingSpeedLimit,
695         ResetWaterFlowFlingSpeedLimit, };
696     return &modifier;
697 }
698 
SetOnWillScroll(ArkUINodeHandle node,void * extraParam)699 void SetOnWillScroll(ArkUINodeHandle node, void* extraParam)
700 {
701     auto* frameNode = reinterpret_cast<FrameNode*>(node);
702     CHECK_NULL_VOID(frameNode);
703     int32_t nodeId = frameNode->GetId();
704     auto onWillScroll = [nodeId, node, extraParam](const Dimension& offset, const ScrollState& state,
705                             ScrollSource source) -> ScrollFrameResult {
706         ScrollFrameResult scrollRes { .offset = offset };
707         ArkUINodeEvent event;
708         event.kind = COMPONENT_ASYNC_EVENT;
709         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
710         event.componentAsyncEvent.subKind = ON_WATER_FLOW_WILL_SCROLL;
711         bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
712         event.componentAsyncEvent.data[0].f32 =
713             usePx ? static_cast<float>(offset.ConvertToPx()) : static_cast<float>(offset.Value());
714         event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
715         event.componentAsyncEvent.data[2].i32 = static_cast<int>(source);
716         SendArkUIAsyncEvent(&event);
717         scrollRes.offset = Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::VP);
718         return scrollRes;
719     };
720     ScrollableModelNG::SetOnWillScroll(frameNode, std::move(onWillScroll));
721 }
722 
SetOnWaterFlowReachEnd(ArkUINodeHandle node,void * extraParam)723 void SetOnWaterFlowReachEnd(ArkUINodeHandle node, void* extraParam)
724 {
725     auto* frameNode = reinterpret_cast<FrameNode*>(node);
726     CHECK_NULL_VOID(frameNode);
727     auto onReachEnd = [node, extraParam]() -> void {
728         ArkUINodeEvent event;
729         event.kind = COMPONENT_ASYNC_EVENT;
730         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
731         event.componentAsyncEvent.subKind = ON_WATER_FLOW_REACH_END;
732         SendArkUIAsyncEvent(&event);
733     };
734     WaterFlowModelNG::SetOnReachEnd(frameNode, std::move(onReachEnd));
735 }
736 
SetOnDidScroll(ArkUINodeHandle node,void * extraParam)737 void SetOnDidScroll(ArkUINodeHandle node, void* extraParam)
738 {
739     auto* frameNode = reinterpret_cast<FrameNode*>(node);
740     CHECK_NULL_VOID(frameNode);
741     int32_t nodeId = frameNode->GetId();
742     auto setOnDidScroll = [nodeId, node, extraParam](const Dimension& offset, const ScrollState& state) -> void {
743         ArkUINodeEvent event;
744         event.kind = COMPONENT_ASYNC_EVENT;
745         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
746         bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
747         event.componentAsyncEvent.subKind = ON_WATER_FLOW_DID_SCROLL;
748         event.componentAsyncEvent.data[0].f32 =
749             usePx ? static_cast<float>(offset.ConvertToPx()) : static_cast<float>(offset.Value());
750         event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
751         SendArkUIAsyncEvent(&event);
752     };
753     ScrollableModelNG::SetOnDidScroll(frameNode, std::move(setOnDidScroll));
754 }
755 
SetOnWaterFlowScrollStart(ArkUINodeHandle node,void * extraParam)756 void SetOnWaterFlowScrollStart(ArkUINodeHandle node, void* extraParam)
757 {
758     auto* frameNode = reinterpret_cast<FrameNode*>(node);
759     CHECK_NULL_VOID(frameNode);
760     int32_t nodeId = frameNode->GetId();
761     auto onScrollStart = [nodeId, node, extraParam]() -> void {
762         ArkUINodeEvent event;
763         event.kind = COMPONENT_ASYNC_EVENT;
764         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
765         event.componentAsyncEvent.subKind = ON_WATER_FLOW_SCROLL_START;
766         SendArkUIAsyncEvent(&event);
767     };
768     WaterFlowModelNG::SetOnScrollStart(frameNode, std::move(onScrollStart));
769 }
770 
SetOnWaterFlowScrollStop(ArkUINodeHandle node,void * extraParam)771 void SetOnWaterFlowScrollStop(ArkUINodeHandle node, void* extraParam)
772 {
773     auto* frameNode = reinterpret_cast<FrameNode*>(node);
774     CHECK_NULL_VOID(frameNode);
775     int32_t nodeId = frameNode->GetId();
776     auto onScrollStop = [nodeId, node, extraParam]() -> void {
777         ArkUINodeEvent event;
778         event.kind = COMPONENT_ASYNC_EVENT;
779         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
780         event.componentAsyncEvent.subKind = ON_WATER_FLOW_SCROLL_STOP;
781         SendArkUIAsyncEvent(&event);
782     };
783     WaterFlowModelNG::SetOnScrollStop(frameNode, std::move(onScrollStop));
784 }
785 
SetOnWaterFlowScrollFrameBegin(ArkUINodeHandle node,void * extraParam)786 void SetOnWaterFlowScrollFrameBegin(ArkUINodeHandle node, void* extraParam)
787 {
788     auto* frameNode = reinterpret_cast<FrameNode*>(node);
789     CHECK_NULL_VOID(frameNode);
790     int32_t nodeId = frameNode->GetId();
791     auto onScrollFrameBegin = [nodeId, node, extraParam](
792                                   const Dimension& offset, const ScrollState& state) -> ScrollFrameResult {
793         ScrollFrameResult scrollRes { .offset = offset };
794         ArkUINodeEvent event;
795         event.kind = COMPONENT_ASYNC_EVENT;
796         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
797         event.componentAsyncEvent.subKind = ON_WATER_FLOW_SCROLL_FRAME_BEGIN;
798         bool usePx = NodeModel::UsePXUnit(reinterpret_cast<ArkUI_Node*>(extraParam));
799         event.componentAsyncEvent.data[0].f32 =
800             usePx ? static_cast<float>(offset.ConvertToPx()) : static_cast<float>(offset.Value());
801         event.componentAsyncEvent.data[1].i32 = static_cast<int>(state);
802         SendArkUIAsyncEvent(&event);
803         scrollRes.offset = usePx ? Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::PX)
804                                  : Dimension(event.componentAsyncEvent.data[0].f32, DimensionUnit::VP);
805         return scrollRes;
806     };
807     WaterFlowModelNG::SetOnScrollFrameBegin(frameNode, std::move(onScrollFrameBegin));
808 }
809 
SetOnWaterFlowScrollIndex(ArkUINodeHandle node,void * extraParam)810 void SetOnWaterFlowScrollIndex(ArkUINodeHandle node, void* extraParam)
811 {
812     auto* frameNode = reinterpret_cast<FrameNode*>(node);
813     CHECK_NULL_VOID(frameNode);
814     int32_t nodeId = frameNode->GetId();
815     auto onScrollIndex = [nodeId, node, extraParam](int32_t first, int32_t last) -> void {
816         ArkUINodeEvent event;
817         event.kind = COMPONENT_ASYNC_EVENT;
818         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
819         event.componentAsyncEvent.subKind = ON_WATER_FLOW_SCROLL_INDEX;
820         event.componentAsyncEvent.data[0].i32 = first;
821         event.componentAsyncEvent.data[1].i32 = last;
822         SendArkUIAsyncEvent(&event);
823     };
824     WaterFlowModelNG::SetOnScrollIndex(frameNode, std::move(onScrollIndex));
825 }
826 
SetOnWaterFlowReachStart(ArkUINodeHandle node,void * extraParam)827 void SetOnWaterFlowReachStart(ArkUINodeHandle node, void* extraParam)
828 {
829     auto* frameNode = reinterpret_cast<FrameNode*>(node);
830     CHECK_NULL_VOID(frameNode);
831     auto onReachStart = [node, extraParam]() -> void {
832         ArkUINodeEvent event;
833         event.kind = COMPONENT_ASYNC_EVENT;
834         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
835         event.componentAsyncEvent.subKind = ON_WATER_FLOW_REACH_START;
836         SendArkUIAsyncEvent(&event);
837     };
838     WaterFlowModelNG::SetOnReachStart(frameNode, std::move(onReachStart));
839 }
840 
ResetOnWillScroll(ArkUINodeHandle node)841 void ResetOnWillScroll(ArkUINodeHandle node)
842 {
843     auto* frameNode = reinterpret_cast<FrameNode*>(node);
844     CHECK_NULL_VOID(frameNode);
845     ScrollableModelNG::SetOnWillScroll(frameNode, nullptr);
846 }
ResetOnWaterFlowReachEnd(ArkUINodeHandle node)847 void ResetOnWaterFlowReachEnd(ArkUINodeHandle node)
848 {
849     auto* frameNode = reinterpret_cast<FrameNode*>(node);
850     CHECK_NULL_VOID(frameNode);
851     WaterFlowModelNG::SetOnReachEnd(frameNode, nullptr);
852 }
ResetOnDidScroll(ArkUINodeHandle node)853 void ResetOnDidScroll(ArkUINodeHandle node)
854 {
855     auto* frameNode = reinterpret_cast<FrameNode*>(node);
856     CHECK_NULL_VOID(frameNode);
857     ScrollableModelNG::SetOnDidScroll(frameNode, nullptr);
858 }
ResetOnWaterFlowScrollStart(ArkUINodeHandle node)859 void ResetOnWaterFlowScrollStart(ArkUINodeHandle node)
860 {
861     auto* frameNode = reinterpret_cast<FrameNode*>(node);
862     CHECK_NULL_VOID(frameNode);
863     WaterFlowModelNG::SetOnScrollStart(frameNode, nullptr);
864 }
ResetOnWaterFlowScrollStop(ArkUINodeHandle node)865 void ResetOnWaterFlowScrollStop(ArkUINodeHandle node)
866 {
867     auto* frameNode = reinterpret_cast<FrameNode*>(node);
868     CHECK_NULL_VOID(frameNode);
869     WaterFlowModelNG::SetOnScrollStop(frameNode, nullptr);
870 }
ResetOnWaterFlowScrollFrameBegin(ArkUINodeHandle node)871 void ResetOnWaterFlowScrollFrameBegin(ArkUINodeHandle node)
872 {
873     auto* frameNode = reinterpret_cast<FrameNode*>(node);
874     CHECK_NULL_VOID(frameNode);
875     WaterFlowModelNG::SetOnScrollFrameBegin(frameNode, nullptr);
876 }
ResetOnWaterFlowScrollIndex(ArkUINodeHandle node)877 void ResetOnWaterFlowScrollIndex(ArkUINodeHandle node)
878 {
879     auto* frameNode = reinterpret_cast<FrameNode*>(node);
880     CHECK_NULL_VOID(frameNode);
881     WaterFlowModelNG::SetOnScrollIndex(frameNode, nullptr);
882 }
ResetOnWaterFlowReachStart(ArkUINodeHandle node)883 void ResetOnWaterFlowReachStart(ArkUINodeHandle node)
884 {
885     auto* frameNode = reinterpret_cast<FrameNode*>(node);
886     CHECK_NULL_VOID(frameNode);
887     WaterFlowModelNG::SetOnReachStart(frameNode, nullptr);
888 }
889 } // namespace NodeModifier
890 } // namespace OHOS::Ace::NG