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