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