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