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