1 /*
2  * Copyright (c) 2023 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 "grid_modifier.h"
16 
17 #include <unordered_map>
18 
19 #include "core/components/scroll/scroll_bar_theme.h"
20 #include "core/components_ng/pattern/grid/grid_model_ng.h"
21 #include "core/components_ng/base/ui_node.h"
22 #include "core/components_ng/pattern/scrollable/scrollable_model_ng.h"
23 #include "core/pipeline_ng/pipeline_context.h"
24 #include "core/interfaces/native/node/node_adapter_impl.h"
25 
26 namespace OHOS::Ace::NG {
27 const std::string DEFAULT_ROWS_TEMPLATE = "1fr";
28 const std::string DEFAULT_COLUMNS_TEMPLATE = "1fr";
29 constexpr Dimension DEFAULT_COLUMNS_GAP = 0.0_fp;
30 constexpr Dimension DEFAULT_ROWS_GAP = 0.0_fp;
31 constexpr DisplayMode DEFAULT_SCROLL_BAR = DisplayMode::AUTO;
32 constexpr Dimension DEFAULT_SCROLL_BAR_WIDTH = 4.0_vp;
33 constexpr int32_t DEFAULT_CACHED_COUNT = 1;
34 constexpr bool DEFAULT_EDIT_MODE = false;
35 constexpr FlexDirection DEFAULT_LAYOUT_DIRECTION = FlexDirection::ROW;
36 constexpr int32_t DEFAULT_MAX_COUNT = Infinity<int32_t>();
37 constexpr int32_t DEFAULT_MIN_COUNT = 1;
38 constexpr int32_t DEFAULT_CELL_LENGTH = 0;
39 constexpr bool DEFAULT_MULTI_SELECTABLE = false;
40 constexpr bool DEFAULT_SUPPORT_ANIMATION = false;
41 constexpr Dimension DEFAULT_FADING_EDGE_LENGTH = Dimension(32.0f, DimensionUnit::VP); // default value
42 const float ERROR_FLOAT_CODE = -1.0f;
43 std::string g_strValue;
44 
SetGridColumnsTemplate(ArkUINodeHandle node,const char * columnsTemplate)45 void SetGridColumnsTemplate(ArkUINodeHandle node, const char* columnsTemplate)
46 {
47     auto* frameNode = reinterpret_cast<FrameNode*>(node);
48     CHECK_NULL_VOID(frameNode);
49     GridModelNG::SetColumnsTemplate(frameNode, std::string(columnsTemplate));
50 }
51 
ResetGridColumnsTemplate(ArkUINodeHandle node)52 void ResetGridColumnsTemplate(ArkUINodeHandle node)
53 {
54     auto* frameNode = reinterpret_cast<FrameNode*>(node);
55     CHECK_NULL_VOID(frameNode);
56     GridModelNG::SetColumnsTemplate(frameNode, DEFAULT_COLUMNS_TEMPLATE);
57 }
SetGridRowsTemplate(ArkUINodeHandle node,const char * rowsTemplate)58 void SetGridRowsTemplate(ArkUINodeHandle node, const char* rowsTemplate)
59 {
60     auto* frameNode = reinterpret_cast<FrameNode*>(node);
61     CHECK_NULL_VOID(frameNode);
62     GridModelNG::SetRowsTemplate(frameNode, std::string(rowsTemplate));
63 }
64 
ResetGridRowsTemplate(ArkUINodeHandle node)65 void ResetGridRowsTemplate(ArkUINodeHandle node)
66 {
67     auto* frameNode = reinterpret_cast<FrameNode*>(node);
68     CHECK_NULL_VOID(frameNode);
69     GridModelNG::SetRowsTemplate(frameNode, DEFAULT_ROWS_TEMPLATE);
70 }
SetGridColumnsGap(ArkUINodeHandle node,const struct ArkUIResourceLength * columnsGap)71 void SetGridColumnsGap(ArkUINodeHandle node, const struct ArkUIResourceLength* columnsGap)
72 {
73     auto* frameNode = reinterpret_cast<FrameNode*>(node);
74     CHECK_NULL_VOID(frameNode);
75     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(columnsGap->unit);
76     Dimension gap;
77     if (unitEnum == DimensionUnit::CALC) {
78         gap = CalcDimension(columnsGap->string, DimensionUnit::CALC);
79     } else {
80         gap = CalcDimension(columnsGap->value, unitEnum);
81     }
82     if (LessOrEqual(gap.Value(), 0.0)) {
83         gap = 0.0_px;
84     }
85     GridModelNG::SetColumnsGap(frameNode, gap);
86 }
87 
ResetGridColumnsGap(ArkUINodeHandle node)88 void ResetGridColumnsGap(ArkUINodeHandle node)
89 {
90     auto* frameNode = reinterpret_cast<FrameNode*>(node);
91     CHECK_NULL_VOID(frameNode);
92     GridModelNG::SetColumnsGap(frameNode, DEFAULT_COLUMNS_GAP);
93 }
94 
SetGridRowsGap(ArkUINodeHandle node,const struct ArkUIResourceLength * rowsGap)95 void SetGridRowsGap(ArkUINodeHandle node, const struct ArkUIResourceLength* rowsGap)
96 {
97     auto* frameNode = reinterpret_cast<FrameNode*>(node);
98     CHECK_NULL_VOID(frameNode);
99     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(rowsGap->unit);
100     Dimension gap;
101     if (unitEnum == DimensionUnit::CALC) {
102         gap = CalcDimension(rowsGap->string, DimensionUnit::CALC);
103     } else {
104         gap = CalcDimension(rowsGap->value, unitEnum);
105     }
106     if (LessOrEqual(gap.Value(), 0.0)) {
107         gap = 0.0_px;
108     }
109     GridModelNG::SetRowsGap(frameNode, gap);
110 }
111 
ResetGridRowsGap(ArkUINodeHandle node)112 void ResetGridRowsGap(ArkUINodeHandle node)
113 {
114     auto* frameNode = reinterpret_cast<FrameNode*>(node);
115     CHECK_NULL_VOID(frameNode);
116     GridModelNG::SetRowsGap(frameNode, DEFAULT_ROWS_GAP);
117 }
118 
SetGridScrollBar(ArkUINodeHandle node,int32_t scrollBar)119 void SetGridScrollBar(ArkUINodeHandle node, int32_t scrollBar)
120 {
121     auto* frameNode = reinterpret_cast<FrameNode*>(node);
122     CHECK_NULL_VOID(frameNode);
123     DisplayMode mode = static_cast<DisplayMode>(scrollBar);
124     GridModelNG::SetScrollBarMode(frameNode, mode);
125 }
126 
ResetGridScrollBar(ArkUINodeHandle node)127 void ResetGridScrollBar(ArkUINodeHandle node)
128 {
129     auto* frameNode = reinterpret_cast<FrameNode*>(node);
130     CHECK_NULL_VOID(frameNode);
131     GridModelNG::SetScrollBarMode(frameNode, DEFAULT_SCROLL_BAR);
132 }
133 
SetGridScrollBarWidth(ArkUINodeHandle node,ArkUI_Float32 value,int32_t unit)134 void SetGridScrollBarWidth(ArkUINodeHandle node, ArkUI_Float32 value, int32_t unit)
135 {
136     auto* frameNode = reinterpret_cast<FrameNode*>(node);
137     CHECK_NULL_VOID(frameNode);
138     Dimension scrollBarWidth = Dimension(value, static_cast<OHOS::Ace::DimensionUnit>(unit));
139     GridModelNG::SetScrollBarWidth(frameNode, scrollBarWidth);
140 }
141 
ResetGridScrollBarWidth(ArkUINodeHandle node)142 void ResetGridScrollBarWidth(ArkUINodeHandle node)
143 {
144     auto* frameNode = reinterpret_cast<FrameNode*>(node);
145     CHECK_NULL_VOID(frameNode);
146     GridModelNG::SetScrollBarWidth(frameNode, DEFAULT_SCROLL_BAR_WIDTH);
147 }
148 
SetGridScrollBarColor(ArkUINodeHandle node,uint32_t scrollBarColor)149 void SetGridScrollBarColor(ArkUINodeHandle node, uint32_t scrollBarColor)
150 {
151     auto* frameNode = reinterpret_cast<FrameNode*>(node);
152     CHECK_NULL_VOID(frameNode);
153     GridModelNG::SetScrollBarColor(frameNode, Color(scrollBarColor));
154 }
155 
ResetGridScrollBarColor(ArkUINodeHandle node)156 void ResetGridScrollBarColor(ArkUINodeHandle node)
157 {
158     auto* frameNode = reinterpret_cast<FrameNode*>(node);
159     CHECK_NULL_VOID(frameNode);
160     auto* context = frameNode->GetContext();
161     CHECK_NULL_VOID(context);
162     auto themeManager = context->GetThemeManager();
163     CHECK_NULL_VOID(themeManager);
164     auto scrollBarTheme = themeManager->GetTheme<ScrollBarTheme>();
165     GridModelNG::SetScrollBarColor(frameNode, scrollBarTheme->GetForegroundColor());
166 }
167 
SetGridCachedCount(ArkUINodeHandle node,int32_t cachedCount)168 void SetGridCachedCount(ArkUINodeHandle node, int32_t cachedCount)
169 {
170     auto* frameNode = reinterpret_cast<FrameNode*>(node);
171     CHECK_NULL_VOID(frameNode);
172     GridModelNG::SetCachedCount(frameNode, cachedCount);
173 }
174 
ResetGridCachedCount(ArkUINodeHandle node)175 void ResetGridCachedCount(ArkUINodeHandle node)
176 {
177     auto* frameNode = reinterpret_cast<FrameNode*>(node);
178     CHECK_NULL_VOID(frameNode);
179     GridModelNG::SetCachedCount(frameNode, DEFAULT_CACHED_COUNT);
180 }
181 
SetGridEditMode(ArkUINodeHandle node,ArkUI_Bool editMode)182 void SetGridEditMode(ArkUINodeHandle node, ArkUI_Bool editMode)
183 {
184     auto* frameNode = reinterpret_cast<FrameNode*>(node);
185     CHECK_NULL_VOID(frameNode);
186     GridModelNG::SetEditable(frameNode, editMode);
187 }
188 
ResetGridEditMode(ArkUINodeHandle node)189 void ResetGridEditMode(ArkUINodeHandle node)
190 {
191     auto* frameNode = reinterpret_cast<FrameNode*>(node);
192     CHECK_NULL_VOID(frameNode);
193     GridModelNG::SetEditable(frameNode, DEFAULT_EDIT_MODE);
194 }
195 
SetGridMultiSelectable(ArkUINodeHandle node,ArkUI_Bool multiSelectable)196 void SetGridMultiSelectable(ArkUINodeHandle node, ArkUI_Bool multiSelectable)
197 {
198     auto* frameNode = reinterpret_cast<FrameNode*>(node);
199     CHECK_NULL_VOID(frameNode);
200     GridModelNG::SetMultiSelectable(frameNode, multiSelectable);
201 }
202 
ResetGridMultiSelectable(ArkUINodeHandle node)203 void ResetGridMultiSelectable(ArkUINodeHandle node)
204 {
205     auto* frameNode = reinterpret_cast<FrameNode*>(node);
206     CHECK_NULL_VOID(frameNode);
207     GridModelNG::SetMultiSelectable(frameNode, DEFAULT_MULTI_SELECTABLE);
208 }
209 
SetGridMaxCount(ArkUINodeHandle node,int32_t maxCount)210 void SetGridMaxCount(ArkUINodeHandle node, int32_t maxCount)
211 {
212     auto* frameNode = reinterpret_cast<FrameNode*>(node);
213     CHECK_NULL_VOID(frameNode);
214     GridModelNG::SetMaxCount(frameNode, maxCount);
215 }
216 
ResetGridMaxCount(ArkUINodeHandle node)217 void ResetGridMaxCount(ArkUINodeHandle node)
218 {
219     auto* frameNode = reinterpret_cast<FrameNode*>(node);
220     CHECK_NULL_VOID(frameNode);
221     GridModelNG::SetMaxCount(frameNode, DEFAULT_MAX_COUNT);
222 }
223 
SetGridMinCount(ArkUINodeHandle node,int32_t minCount)224 void SetGridMinCount(ArkUINodeHandle node, int32_t minCount)
225 {
226     auto* frameNode = reinterpret_cast<FrameNode*>(node);
227     CHECK_NULL_VOID(frameNode);
228     GridModelNG::SetMinCount(frameNode, minCount);
229 }
230 
ResetGridMinCount(ArkUINodeHandle node)231 void ResetGridMinCount(ArkUINodeHandle node)
232 {
233     auto* frameNode = reinterpret_cast<FrameNode*>(node);
234     CHECK_NULL_VOID(frameNode);
235     GridModelNG::SetMinCount(frameNode, DEFAULT_MIN_COUNT);
236 }
237 
SetGridCellLength(ArkUINodeHandle node,int32_t cellLength)238 void SetGridCellLength(ArkUINodeHandle node, int32_t cellLength)
239 {
240     auto* frameNode = reinterpret_cast<FrameNode*>(node);
241     CHECK_NULL_VOID(frameNode);
242     GridModelNG::SetCellLength(frameNode, cellLength);
243 }
244 
ResetGridCellLength(ArkUINodeHandle node)245 void ResetGridCellLength(ArkUINodeHandle node)
246 {
247     auto* frameNode = reinterpret_cast<FrameNode*>(node);
248     CHECK_NULL_VOID(frameNode);
249     GridModelNG::SetCellLength(frameNode, DEFAULT_CELL_LENGTH);
250 }
251 
SetGridLayoutDirection(ArkUINodeHandle node,int32_t layoutDirection)252 void SetGridLayoutDirection(ArkUINodeHandle node, int32_t layoutDirection)
253 {
254     auto* frameNode = reinterpret_cast<FrameNode*>(node);
255     CHECK_NULL_VOID(frameNode);
256     FlexDirection direction = static_cast<FlexDirection>(layoutDirection);
257     GridModelNG::SetLayoutDirection(frameNode, direction);
258 }
259 
ResetGridLayoutDirection(ArkUINodeHandle node)260 void ResetGridLayoutDirection(ArkUINodeHandle node)
261 {
262     auto* frameNode = reinterpret_cast<FrameNode*>(node);
263     CHECK_NULL_VOID(frameNode);
264     GridModelNG::SetLayoutDirection(frameNode, DEFAULT_LAYOUT_DIRECTION);
265 }
266 
SetGridSupportAnimation(ArkUINodeHandle node,ArkUI_Bool supportAnimation)267 void SetGridSupportAnimation(ArkUINodeHandle node, ArkUI_Bool supportAnimation)
268 {
269     auto* frameNode = reinterpret_cast<FrameNode*>(node);
270     CHECK_NULL_VOID(frameNode);
271     GridModelNG::SetSupportAnimation(frameNode, supportAnimation);
272 }
273 
ResetGridSupportAnimation(ArkUINodeHandle node)274 void ResetGridSupportAnimation(ArkUINodeHandle node)
275 {
276     auto* frameNode = reinterpret_cast<FrameNode*>(node);
277     CHECK_NULL_VOID(frameNode);
278     GridModelNG::SetSupportAnimation(frameNode, DEFAULT_SUPPORT_ANIMATION);
279 }
280 
SetEdgeEffect(ArkUINodeHandle node,int32_t edgeEffect,ArkUI_Bool alwaysEnabled)281 void SetEdgeEffect(ArkUINodeHandle node, int32_t edgeEffect, ArkUI_Bool alwaysEnabled)
282 {
283     auto* frameNode = reinterpret_cast<FrameNode*>(node);
284     CHECK_NULL_VOID(frameNode);
285     GridModelNG::SetEdgeEffect(frameNode, static_cast<EdgeEffect>(edgeEffect), alwaysEnabled);
286 }
287 
ResetEdgeEffect(ArkUINodeHandle node)288 void ResetEdgeEffect(ArkUINodeHandle node)
289 {
290     auto* frameNode = reinterpret_cast<FrameNode*>(node);
291     CHECK_NULL_VOID(frameNode);
292     EdgeEffect edgeEffect = EdgeEffect::NONE;
293     ArkUI_Bool alwaysEnabled = false;
294     GridModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled);
295 }
296 
SetNestedScroll(ArkUINodeHandle node,int32_t forward,int32_t backward)297 void SetNestedScroll(ArkUINodeHandle node, int32_t forward, int32_t backward)
298 {
299     NestedScrollOptions opt = {
300         .forward = static_cast<NestedScrollMode>(forward),
301         .backward = static_cast<NestedScrollMode>(backward),
302     };
303     auto* frameNode = reinterpret_cast<FrameNode*>(node);
304     CHECK_NULL_VOID(frameNode);
305     GridModelNG::SetNestedScroll(frameNode, opt);
306 }
307 
ResetNestedScroll(ArkUINodeHandle node)308 void ResetNestedScroll(ArkUINodeHandle node)
309 {
310     auto* frameNode = reinterpret_cast<FrameNode*>(node);
311     CHECK_NULL_VOID(frameNode);
312     const NestedScrollOptions nestedOpt = {
313         .forward = NestedScrollMode::SELF_ONLY,
314         .backward = NestedScrollMode::SELF_ONLY,
315     };
316     GridModelNG::SetNestedScroll(frameNode, nestedOpt);
317 }
318 
SetEnableScroll(ArkUINodeHandle node,ArkUI_Bool ScrollEnabled)319 void SetEnableScroll(ArkUINodeHandle node, ArkUI_Bool ScrollEnabled)
320 {
321     auto* frameNode = reinterpret_cast<FrameNode*>(node);
322     CHECK_NULL_VOID(frameNode);
323     GridModelNG::SetScrollEnabled(frameNode, ScrollEnabled);
324 }
325 
ResetEnableScroll(ArkUINodeHandle node)326 void ResetEnableScroll(ArkUINodeHandle node)
327 {
328     auto* frameNode = reinterpret_cast<FrameNode*>(node);
329     CHECK_NULL_VOID(frameNode);
330     ArkUI_Bool scrollEnabled = true;
331     GridModelNG::SetScrollEnabled(frameNode, scrollEnabled);
332 }
333 
SetFriction(ArkUINodeHandle node,ArkUI_Float32 friction)334 void SetFriction(ArkUINodeHandle node, ArkUI_Float32 friction)
335 {
336     auto* frameNode = reinterpret_cast<FrameNode*>(node);
337     CHECK_NULL_VOID(frameNode);
338     GridModelNG::SetFriction(frameNode, friction);
339 }
340 
ResetFriction(ArkUINodeHandle node)341 void ResetFriction(ArkUINodeHandle node)
342 {
343     auto* frameNode = reinterpret_cast<FrameNode*>(node);
344     CHECK_NULL_VOID(frameNode);
345     ArkUI_Float32 friction = -1.0;
346     GridModelNG::SetFriction(frameNode, friction);
347 }
348 
SetFlingSpeedLimit(ArkUINodeHandle node,ArkUI_Float32 flingSpeedLimit)349 void SetFlingSpeedLimit(ArkUINodeHandle node, ArkUI_Float32 flingSpeedLimit)
350 {
351     auto* frameNode = reinterpret_cast<FrameNode*>(node);
352     CHECK_NULL_VOID(frameNode);
353     ScrollableModelNG::SetMaxFlingSpeed(frameNode, flingSpeedLimit);
354 }
355 
ResetFlingSpeedLimit(ArkUINodeHandle node)356 void ResetFlingSpeedLimit(ArkUINodeHandle node)
357 {
358     auto* frameNode = reinterpret_cast<FrameNode*>(node);
359     CHECK_NULL_VOID(frameNode);
360     ArkUI_Float32 flingSpeedLimit = -1.0;
361     ScrollableModelNG::SetMaxFlingSpeed(frameNode, flingSpeedLimit);
362 }
363 
SetGridAlignItems(ArkUINodeHandle node,int32_t alignItems)364 void SetGridAlignItems(ArkUINodeHandle node, int32_t alignItems)
365 {
366     auto* frameNode = reinterpret_cast<FrameNode*>(node);
367     CHECK_NULL_VOID(frameNode);
368     GridModelNG::SetAlignItems(frameNode, static_cast<GridItemAlignment>(alignItems));
369 }
370 
ResetGridAlignItems(ArkUINodeHandle node)371 void ResetGridAlignItems(ArkUINodeHandle node)
372 {
373     auto* frameNode = reinterpret_cast<FrameNode*>(node);
374     CHECK_NULL_VOID(frameNode);
375     GridModelNG::SetAlignItems(frameNode, GridItemAlignment::DEFAULT);
376 }
377 
GetColumnsTemplate(ArkUINodeHandle node)378 ArkUI_CharPtr GetColumnsTemplate(ArkUINodeHandle node)
379 {
380     auto* frameNode = reinterpret_cast<FrameNode*>(node);
381     CHECK_NULL_RETURN(frameNode, nullptr);
382     g_strValue = GridModelNG::GetColumnsTemplate(frameNode);
383     return g_strValue.c_str();
384 }
385 
GetRowsTemplate(ArkUINodeHandle node)386 ArkUI_CharPtr GetRowsTemplate(ArkUINodeHandle node)
387 {
388     auto* frameNode = reinterpret_cast<FrameNode*>(node);
389     CHECK_NULL_RETURN(frameNode, nullptr);
390     g_strValue = GridModelNG::GetRowsTemplate(frameNode);
391     return g_strValue.c_str();
392 }
393 
GetColumnsGap(ArkUINodeHandle node)394 ArkUI_Float32 GetColumnsGap(ArkUINodeHandle node)
395 {
396     auto* frameNode = reinterpret_cast<FrameNode*>(node);
397     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
398     return GridModelNG::GetColumnsGap(frameNode);
399 }
400 
GetRowsGap(ArkUINodeHandle node)401 ArkUI_Float32 GetRowsGap(ArkUINodeHandle node)
402 {
403     auto* frameNode = reinterpret_cast<FrameNode*>(node);
404     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
405     return GridModelNG::GetRowsGap(frameNode);
406 }
407 
SetNodeAdapter(ArkUINodeHandle node,ArkUINodeAdapterHandle handle)408 ArkUI_Int32 SetNodeAdapter(ArkUINodeHandle node, ArkUINodeAdapterHandle handle)
409 {
410     auto* frameNode = reinterpret_cast<FrameNode*>(node);
411     CHECK_NULL_RETURN(frameNode, ERROR_CODE_PARAM_INVALID);
412     auto totalChildCount = frameNode->TotalChildCount();
413     if (totalChildCount > 0) {
414         return ERROR_CODE_NATIVE_IMPL_NODE_ADAPTER_CHILD_NODE_EXIST;
415     }
416     NodeAdapter::GetNodeAdapterAPI()->attachHostNode(handle, node);
417     return ERROR_CODE_NO_ERROR;
418 }
419 
ResetNodeAdapter(ArkUINodeHandle node)420 void ResetNodeAdapter(ArkUINodeHandle node)
421 {
422     NodeAdapter::GetNodeAdapterAPI()->detachHostNode(node);
423 }
424 
GetNodeAdapter(ArkUINodeHandle node)425 ArkUINodeAdapterHandle GetNodeAdapter(ArkUINodeHandle node)
426 {
427     return NodeAdapter::GetNodeAdapterAPI()->getNodeAdapter(node);
428 }
429 
SetCachedCount(ArkUINodeHandle node,ArkUI_Int32 cachedCount)430 void SetCachedCount(ArkUINodeHandle node, ArkUI_Int32 cachedCount)
431 {
432     auto* frameNode = reinterpret_cast<FrameNode*>(node);
433     CHECK_NULL_VOID(frameNode);
434     GridModelNG::SetCachedCount(frameNode, cachedCount);
435 }
436 
ResetCachedCount(ArkUINodeHandle node)437 void ResetCachedCount(ArkUINodeHandle node)
438 {
439     auto* frameNode = reinterpret_cast<FrameNode*>(node);
440     CHECK_NULL_VOID(frameNode);
441     GridModelNG::SetCachedCount(frameNode, 1);
442 }
443 
GetCachedCount(ArkUINodeHandle node)444 ArkUI_Int32 GetCachedCount(ArkUINodeHandle node)
445 {
446     auto* frameNode = reinterpret_cast<FrameNode*>(node);
447     CHECK_NULL_RETURN(frameNode, 1);
448     return GridModelNG::GetCachedCount(frameNode);
449 }
450 
SetGridFadingEdge(ArkUINodeHandle node,ArkUI_Bool fadingEdge,ArkUI_Float32 fadingEdgeLengthValue,ArkUI_Int32 fadingEdgeLengthUnit)451 void SetGridFadingEdge(
452     ArkUINodeHandle node, ArkUI_Bool fadingEdge, ArkUI_Float32 fadingEdgeLengthValue, ArkUI_Int32 fadingEdgeLengthUnit)
453 {
454     auto* frameNode = reinterpret_cast<FrameNode*>(node);
455     CHECK_NULL_VOID(frameNode);
456     Dimension fadingEdgeLengthDimension =
457         Dimension(fadingEdgeLengthValue, static_cast<OHOS::Ace::DimensionUnit>(fadingEdgeLengthUnit));
458     NG::ScrollableModelNG::SetFadingEdge(frameNode, fadingEdge, fadingEdgeLengthDimension);
459 }
460 
ResetGridFadingEdge(ArkUINodeHandle node)461 void ResetGridFadingEdge(ArkUINodeHandle node)
462 {
463     auto* frameNode = reinterpret_cast<FrameNode*>(node);
464     CHECK_NULL_VOID(frameNode);
465     NG::ScrollableModelNG::SetFadingEdge(frameNode, false, DEFAULT_FADING_EDGE_LENGTH);
466 }
467 
SetShowCached(ArkUINodeHandle node,ArkUI_Bool show)468 void SetShowCached(ArkUINodeHandle node, ArkUI_Bool show)
469 {
470     auto* frameNode = reinterpret_cast<FrameNode*>(node);
471     CHECK_NULL_VOID(frameNode);
472     GridModelNG::SetShowCached(frameNode, show);
473 }
474 
ResetShowCached(ArkUINodeHandle node)475 void ResetShowCached(ArkUINodeHandle node)
476 {
477     auto* frameNode = reinterpret_cast<FrameNode*>(node);
478     CHECK_NULL_VOID(frameNode);
479     GridModelNG::SetShowCached(frameNode, false);
480 }
481 
GetShowCached(ArkUINodeHandle node)482 ArkUI_Bool GetShowCached(ArkUINodeHandle node)
483 {
484     auto* frameNode = reinterpret_cast<FrameNode*>(node);
485     CHECK_NULL_RETURN(frameNode, false);
486     return GridModelNG::GetShowCached(frameNode);
487 }
488 
489 namespace NodeModifier {
GetGridModifier()490 const ArkUIGridModifier* GetGridModifier()
491 {
492     static const ArkUIGridModifier modifier = { SetGridColumnsTemplate, ResetGridColumnsTemplate, SetGridRowsTemplate,
493         ResetGridRowsTemplate, SetGridColumnsGap, ResetGridColumnsGap, SetGridRowsGap, ResetGridRowsGap,
494         SetGridScrollBar, ResetGridScrollBar, SetGridScrollBarWidth, ResetGridScrollBarWidth, SetGridScrollBarColor,
495         ResetGridScrollBarColor, SetGridCachedCount, ResetGridCachedCount, SetShowCached, ResetShowCached,
496         GetShowCached, SetGridEditMode, ResetGridEditMode, SetGridMultiSelectable, ResetGridMultiSelectable,
497         SetGridMaxCount, ResetGridMaxCount, SetGridMinCount, ResetGridMinCount, SetGridCellLength, ResetGridCellLength,
498         SetGridLayoutDirection, ResetGridLayoutDirection, SetGridSupportAnimation, ResetGridSupportAnimation,
499         SetEdgeEffect, ResetEdgeEffect, SetNestedScroll, ResetNestedScroll, SetEnableScroll, ResetEnableScroll,
500         SetFriction, ResetFriction, GetColumnsTemplate, GetRowsTemplate, GetColumnsGap, GetRowsGap, SetNodeAdapter,
501         ResetNodeAdapter, GetNodeAdapter, SetCachedCount, ResetCachedCount, GetCachedCount, SetFlingSpeedLimit,
502         ResetFlingSpeedLimit, SetGridAlignItems, ResetGridAlignItems, SetGridFadingEdge, ResetGridFadingEdge };
503     return &modifier;
504 }
505 
GetCJUIGridModifier()506 const CJUIGridModifier* GetCJUIGridModifier()
507 {
508     static const CJUIGridModifier modifier = {
509         SetGridColumnsTemplate, ResetGridColumnsTemplate, SetGridRowsTemplate, ResetGridRowsTemplate,
510         SetGridColumnsGap, ResetGridColumnsGap, SetGridRowsGap, ResetGridRowsGap,
511         SetGridScrollBar, ResetGridScrollBar, SetGridScrollBarWidth, ResetGridScrollBarWidth, SetGridScrollBarColor,
512         ResetGridScrollBarColor, SetGridCachedCount, ResetGridCachedCount, SetGridEditMode, ResetGridEditMode,
513         SetGridMultiSelectable, ResetGridMultiSelectable, SetGridMaxCount, ResetGridMaxCount, SetGridMinCount,
514         ResetGridMinCount, SetGridCellLength, ResetGridCellLength, SetGridLayoutDirection, ResetGridLayoutDirection,
515         SetGridSupportAnimation, ResetGridSupportAnimation, SetEdgeEffect, ResetEdgeEffect, SetNestedScroll,
516         ResetNestedScroll, SetEnableScroll, ResetEnableScroll, SetFriction, ResetFriction, GetColumnsTemplate,
517         GetRowsTemplate, GetColumnsGap, GetRowsGap, SetNodeAdapter, ResetNodeAdapter, GetNodeAdapter, SetCachedCount,
518         ResetCachedCount, GetCachedCount, SetFlingSpeedLimit, ResetFlingSpeedLimit };
519     return &modifier;
520 }
521 
SetOnGridScrollIndex(ArkUINodeHandle node,void * extraParam)522 void SetOnGridScrollIndex(ArkUINodeHandle node, void* extraParam)
523 {
524     auto* frameNode = reinterpret_cast<FrameNode*>(node);
525     CHECK_NULL_VOID(frameNode);
526     auto onEvent = [node, extraParam](int32_t first, int32_t last) {
527         ArkUINodeEvent event;
528         event.kind = COMPONENT_ASYNC_EVENT;
529         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
530         event.componentAsyncEvent.subKind = ON_GRID_SCROLL_TO_INDEX;
531         event.componentAsyncEvent.data[0].i32 = first;
532         event.componentAsyncEvent.data[1].i32 = last;
533         SendArkUIAsyncEvent(&event);
534     };
535     GridModelNG::SetOnScrollIndex(frameNode, std::move(onEvent));
536 }
537 
ResetOnGridScrollIndex(ArkUINodeHandle node)538 void ResetOnGridScrollIndex(ArkUINodeHandle node)
539 {
540     auto* frameNode = reinterpret_cast<FrameNode*>(node);
541     CHECK_NULL_VOID(frameNode);
542     GridModelNG::SetOnScrollIndex(frameNode, nullptr);
543 }
544 } // namespace NodeModifier
545 } // namespace OHOS::Ace::NG