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