1 /*
2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_grid_bridge.h"
16 #include "base/utils/string_utils.h"
17 #include "base/utils/utils.h"
18 #include "bridge/declarative_frontend/engine/functions/js_function.h"
19 #include "bridge/declarative_frontend/jsview/js_grid.h"
20 #include "bridge/declarative_frontend/jsview/js_scroller.h"
21 #include "core/components_ng/pattern/grid/grid_model_ng.h"
22 #include "core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h"
23 #include "core/components_ng/pattern/scrollable/scrollable_controller.h"
24 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
25 using namespace OHOS::Ace::Framework;
26
27 namespace OHOS::Ace::NG {
28 constexpr int32_t CALL_ARG_0 = 0;
29 constexpr int32_t CALL_ARG_1 = 1;
30 constexpr int32_t CALL_ARG_2 = 2;
31 constexpr int32_t DEFAULT_CACHED_COUNT = 1;
32 constexpr size_t GRID_ITEM_SIZE_RESULT_LENGTH = 2;
33 constexpr size_t GRID_ITEM_RECT_RESULT_LENGTH = 4;
34 namespace {
ParseGridItemSize(const Framework::JSRef<Framework::JSVal> & value,GridItemSize & gridItemSize)35 void ParseGridItemSize(const Framework::JSRef<Framework::JSVal>& value, GridItemSize& gridItemSize)
36 {
37 if (value->IsArray()) {
38 auto array = Framework::JSRef<Framework::JSArray>::Cast(value);
39 auto length = array->Length();
40 if (length != GRID_ITEM_SIZE_RESULT_LENGTH) {
41 return;
42 }
43 Framework::JSRef<Framework::JSVal> rows = array->GetValueAt(0);
44 if (rows->IsNumber()) {
45 gridItemSize.rows = rows->ToNumber<int32_t>();
46 }
47 Framework::JSRef<Framework::JSVal> columns = array->GetValueAt(1);
48 if (columns->IsNumber()) {
49 gridItemSize.columns = columns->ToNumber<int32_t>();
50 }
51 }
52 }
53
ParseGridItemRect(const Framework::JSRef<Framework::JSVal> & value,GridItemRect & gridItemRect)54 void ParseGridItemRect(const Framework::JSRef<Framework::JSVal>& value, GridItemRect& gridItemRect)
55 {
56 if (value->IsArray()) {
57 Framework::JSRef<Framework::JSArray> array = Framework::JSRef<Framework::JSArray>::Cast(value);
58 auto length = array->Length();
59 if (length != GRID_ITEM_RECT_RESULT_LENGTH) {
60 return;
61 }
62 auto rowStart = array->GetValueAt(GridItemRect::ROW_START);
63 if (rowStart->IsNumber()) {
64 gridItemRect.rowStart = rowStart->ToNumber<int32_t>();
65 }
66 auto rowSpan = array->GetValueAt(GridItemRect::ROW_SPAN);
67 if (rowSpan->IsNumber()) {
68 gridItemRect.rowSpan = rowSpan->ToNumber<int32_t>();
69 }
70 auto columnStart = array->GetValueAt(GridItemRect::COLUMN_START);
71 if (columnStart->IsNumber()) {
72 gridItemRect.columnStart = columnStart->ToNumber<int32_t>();
73 }
74 auto columnSpan = array->GetValueAt(GridItemRect::COLUMN_SPAN);
75 if (columnSpan->IsNumber()) {
76 gridItemRect.columnSpan = columnSpan->ToNumber<int32_t>();
77 }
78 }
79 }
80
ParseGetGridItemSize(const EcmaVM * vm,const Local<JSValueRef> & getSizeByIndex,GridLayoutOptions & option)81 void ParseGetGridItemSize(const EcmaVM* vm, const Local<JSValueRef>& getSizeByIndex, GridLayoutOptions& option)
82 {
83 if (getSizeByIndex->IsFunction(vm)) {
84 Local<panda::FunctionRef> functionRef = getSizeByIndex->ToObject(vm);
85 auto onGetIrregularSizeByIndex =
86 [func = AceType::MakeRefPtr<Framework::JsFunction>(Framework::JSRef<Framework::JSObject>(),
87 Framework::JSRef<Framework::JSFunc>(Framework::JSFunc(functionRef)))](int32_t index) {
88 GridItemSize gridItemSize;
89 auto itemIndex = Framework::JSRef<Framework::JSVal>::Make(Framework::ToJSValue(index));
90 auto result = func->ExecuteJS(1, &itemIndex);
91 if (!result->IsArray()) {
92 return gridItemSize;
93 }
94 ParseGridItemSize(result, gridItemSize);
95 return gridItemSize;
96 };
97 option.getSizeByIndex = std::move(onGetIrregularSizeByIndex);
98 }
99 }
100
ParseGetGridItemRect(const EcmaVM * vm,const Local<JSValueRef> & getRectByIndex,GridLayoutOptions & option)101 void ParseGetGridItemRect(const EcmaVM* vm, const Local<JSValueRef>& getRectByIndex, GridLayoutOptions& option)
102 {
103 if (getRectByIndex->IsFunction(vm)) {
104 Local<panda::FunctionRef> functionRef = getRectByIndex->ToObject(vm);
105 auto onGetRectByIndex =
106 [func = AceType::MakeRefPtr<Framework::JsFunction>(Framework::JSRef<Framework::JSObject>(),
107 Framework::JSRef<Framework::JSFunc>(Framework::JSFunc(functionRef)))](int32_t index) {
108 GridItemRect gridItemRect;
109 auto itemIndex = Framework::JSRef<Framework::JSVal>::Make(Framework::ToJSValue(index));
110 auto result = func->ExecuteJS(1, &itemIndex);
111 if (!result->IsArray()) {
112 return gridItemRect;
113 }
114 ParseGridItemRect(result, gridItemRect);
115 return gridItemRect;
116 };
117 option.getRectByIndex = std::move(onGetRectByIndex);
118 }
119 }
120 } // namespace
121
SetColumnsTemplate(ArkUIRuntimeCallInfo * runtimeCallInfo)122 ArkUINativeModuleValue GridBridge::SetColumnsTemplate(ArkUIRuntimeCallInfo* runtimeCallInfo)
123 {
124 EcmaVM* vm = runtimeCallInfo->GetVM();
125 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
126 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
127 Local<JSValueRef> arg_columnsTemplate = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
128 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
129 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
130 if (arg_columnsTemplate->IsUndefined() || !arg_columnsTemplate->IsString(vm)) {
131 GetArkUINodeModifiers()->getGridModifier()->resetGridColumnsTemplate(nativeNode);
132 } else {
133 std::string columnsTemplate = arg_columnsTemplate->ToString(vm)->ToString(vm);
134 GetArkUINodeModifiers()->getGridModifier()->setGridColumnsTemplate(nativeNode, columnsTemplate.c_str());
135 }
136 return panda::JSValueRef::Undefined(vm);
137 }
138
ResetColumnsTemplate(ArkUIRuntimeCallInfo * runtimeCallInfo)139 ArkUINativeModuleValue GridBridge::ResetColumnsTemplate(ArkUIRuntimeCallInfo* runtimeCallInfo)
140 {
141 EcmaVM* vm = runtimeCallInfo->GetVM();
142 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
143 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
144 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
145 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
146 GetArkUINodeModifiers()->getGridModifier()->resetGridColumnsTemplate(nativeNode);
147 return panda::JSValueRef::Undefined(vm);
148 }
149
SetRowsTemplate(ArkUIRuntimeCallInfo * runtimeCallInfo)150 ArkUINativeModuleValue GridBridge::SetRowsTemplate(ArkUIRuntimeCallInfo* runtimeCallInfo)
151 {
152 EcmaVM* vm = runtimeCallInfo->GetVM();
153 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
154 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
155 Local<JSValueRef> arg_rowsTemplate = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
156 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
157 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
158 if (arg_rowsTemplate->IsUndefined() || !arg_rowsTemplate->IsString(vm)) {
159 GetArkUINodeModifiers()->getGridModifier()->resetGridRowsTemplate(nativeNode);
160 } else {
161 std::string rowsTemplate = arg_rowsTemplate->ToString(vm)->ToString(vm);
162 GetArkUINodeModifiers()->getGridModifier()->setGridRowsTemplate(nativeNode, rowsTemplate.c_str());
163 }
164 return panda::JSValueRef::Undefined(vm);
165 }
166
ResetRowsTemplate(ArkUIRuntimeCallInfo * runtimeCallInfo)167 ArkUINativeModuleValue GridBridge::ResetRowsTemplate(ArkUIRuntimeCallInfo* runtimeCallInfo)
168 {
169 EcmaVM* vm = runtimeCallInfo->GetVM();
170 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
171 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
172 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
173 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
174 GetArkUINodeModifiers()->getGridModifier()->resetGridRowsTemplate(nativeNode);
175 return panda::JSValueRef::Undefined(vm);
176 }
177
SetColumnsGap(ArkUIRuntimeCallInfo * runtimeCallInfo)178 ArkUINativeModuleValue GridBridge::SetColumnsGap(ArkUIRuntimeCallInfo* runtimeCallInfo)
179 {
180 EcmaVM* vm = runtimeCallInfo->GetVM();
181 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
182 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
183 Local<JSValueRef> arg_size = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
184 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
185 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
186
187 CalcDimension size;
188 std::string calcStr;
189 struct ArkUIResourceLength columnGap = { 0.0, 0, nullptr };
190 if (arg_size->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, arg_size, size, true)) {
191 GetArkUINodeModifiers()->getGridModifier()->resetGridColumnsGap(nativeNode);
192 } else {
193 if (size.Unit() == DimensionUnit::CALC) {
194 columnGap.unit = static_cast<int32_t>(DimensionUnit::CALC);
195 calcStr = size.CalcValue();
196 columnGap.string = calcStr.c_str();
197 GetArkUINodeModifiers()->getGridModifier()->setGridColumnsGap(nativeNode, &columnGap);
198 } else {
199 columnGap.value = size.Value();
200 columnGap.unit = static_cast<int32_t>(size.Unit());
201 columnGap.string = calcStr.c_str();
202 GetArkUINodeModifiers()->getGridModifier()->setGridColumnsGap(nativeNode, &columnGap);
203 }
204 }
205 return panda::JSValueRef::Undefined(vm);
206 }
207
ResetColumnsGap(ArkUIRuntimeCallInfo * runtimeCallInfo)208 ArkUINativeModuleValue GridBridge::ResetColumnsGap(ArkUIRuntimeCallInfo* runtimeCallInfo)
209 {
210 EcmaVM* vm = runtimeCallInfo->GetVM();
211 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
212 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
213 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
214 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
215 GetArkUINodeModifiers()->getGridModifier()->resetGridColumnsGap(nativeNode);
216 return panda::JSValueRef::Undefined(vm);
217 }
218
SetRowsGap(ArkUIRuntimeCallInfo * runtimeCallInfo)219 ArkUINativeModuleValue GridBridge::SetRowsGap(ArkUIRuntimeCallInfo* runtimeCallInfo)
220 {
221 EcmaVM* vm = runtimeCallInfo->GetVM();
222 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
223 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
224 Local<JSValueRef> arg_size = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
225 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
226 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
227
228 CalcDimension size;
229 std::string calcStr;
230 struct ArkUIResourceLength rowsGap = { 0.0, 0, nullptr };
231 if (arg_size->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, arg_size, size, true)) {
232 GetArkUINodeModifiers()->getGridModifier()->resetGridRowsGap(nativeNode);
233 } else {
234 if (size.Unit() == DimensionUnit::CALC) {
235 rowsGap.unit = static_cast<int32_t>(DimensionUnit::CALC);
236 calcStr = size.CalcValue();
237 rowsGap.string = calcStr.c_str();
238 GetArkUINodeModifiers()->getGridModifier()->setGridRowsGap(nativeNode, &rowsGap);
239 } else {
240 rowsGap.value = size.Value();
241 rowsGap.unit = static_cast<int32_t>(size.Unit());
242 rowsGap.string = calcStr.c_str();
243 GetArkUINodeModifiers()->getGridModifier()->setGridRowsGap(nativeNode, &rowsGap);
244 }
245 }
246 return panda::JSValueRef::Undefined(vm);
247 }
248
ResetRowsGap(ArkUIRuntimeCallInfo * runtimeCallInfo)249 ArkUINativeModuleValue GridBridge::ResetRowsGap(ArkUIRuntimeCallInfo* runtimeCallInfo)
250 {
251 EcmaVM* vm = runtimeCallInfo->GetVM();
252 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
253 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
254 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
255 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
256 GetArkUINodeModifiers()->getGridModifier()->resetGridRowsGap(nativeNode);
257 return panda::JSValueRef::Undefined(vm);
258 }
259
SetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)260 ArkUINativeModuleValue GridBridge::SetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
261 {
262 EcmaVM* vm = runtimeCallInfo->GetVM();
263 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
264 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
265 Local<JSValueRef> arg_scrollBar = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
266 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
267 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
268 if (!arg_scrollBar->IsNull() && arg_scrollBar->IsNumber()) {
269 int32_t scrollBar = arg_scrollBar->Int32Value(vm);
270 if (scrollBar < 0) {
271 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBar(nativeNode);
272 } else {
273 GetArkUINodeModifiers()->getGridModifier()->setGridScrollBar(nativeNode, scrollBar);
274 }
275 } else {
276 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBar(nativeNode);
277 }
278 return panda::JSValueRef::Undefined(vm);
279 }
280
ResetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)281 ArkUINativeModuleValue GridBridge::ResetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
282 {
283 EcmaVM* vm = runtimeCallInfo->GetVM();
284 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
285 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
286 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
287 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
288 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBar(nativeNode);
289 return panda::JSValueRef::Undefined(vm);
290 }
291
SetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)292 ArkUINativeModuleValue GridBridge::SetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
293 {
294 EcmaVM* vm = runtimeCallInfo->GetVM();
295 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
296 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
297 Local<JSValueRef> scrollBarArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
298 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
299 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
300
301 CalcDimension scrollBarWidth;
302 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, scrollBarArg, scrollBarWidth, false)) {
303 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarWidth(nativeNode);
304 } else {
305 if (LessNotEqual(scrollBarWidth.Value(), 0.0f)) {
306 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarWidth(nativeNode);
307 } else {
308 GetArkUINodeModifiers()->getGridModifier()->setGridScrollBarWidth(
309 nativeNode, scrollBarWidth.Value(), static_cast<int32_t>(scrollBarWidth.Unit()));
310 }
311 }
312 return panda::JSValueRef::Undefined(vm);
313 }
314
ResetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)315 ArkUINativeModuleValue GridBridge::ResetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
316 {
317 EcmaVM* vm = runtimeCallInfo->GetVM();
318 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
319 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
320 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
321 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
322 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarWidth(nativeNode);
323 return panda::JSValueRef::Undefined(vm);
324 }
325
SetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)326 ArkUINativeModuleValue GridBridge::SetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
327 {
328 EcmaVM* vm = runtimeCallInfo->GetVM();
329 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
330 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
331 Local<JSValueRef> arg_color = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
332 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
333 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
334 if (arg_color->IsNull() || arg_color->IsUndefined()) {
335 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
336 return panda::JSValueRef::Undefined(vm);
337 }
338 if (arg_color->IsNumber()) {
339 auto colorNum = arg_color->ToNumber(vm)->Value();
340 if (colorNum <= 0) {
341 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
342 return panda::JSValueRef::Undefined(vm);
343 }
344 }
345 Color color;
346 if (ArkTSUtils::ParseJsColorAlpha(vm, arg_color, color)) {
347 GetArkUINodeModifiers()->getGridModifier()->setGridScrollBarColor(
348 nativeNode, color.GetValue());
349 } else {
350 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
351 }
352 return panda::JSValueRef::Undefined(vm);
353 }
354
ResetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)355 ArkUINativeModuleValue GridBridge::ResetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
356 {
357 EcmaVM* vm = runtimeCallInfo->GetVM();
358 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
359 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
360 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
361 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
362 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
363 return panda::JSValueRef::Undefined(vm);
364 }
365
SetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)366 ArkUINativeModuleValue GridBridge::SetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
367 {
368 EcmaVM* vm = runtimeCallInfo->GetVM();
369 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
370 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
371 Local<JSValueRef> argCachedCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
372 Local<JSValueRef> argShow = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
373 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
374 auto* nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
375 auto value = DEFAULT_CACHED_COUNT;
376 if (!argCachedCount->IsUndefined()) {
377 ArkTSUtils::ParseJsInteger(vm, argCachedCount, value);
378 if (value < 0) {
379 value = DEFAULT_CACHED_COUNT;
380 }
381 }
382 GetArkUINodeModifiers()->getGridModifier()->setGridCachedCount(nativeNode, value);
383
384 bool show = !argShow.IsNull() && argShow->IsTrue();
385 GetArkUINodeModifiers()->getGridModifier()->setShowCached(nativeNode, show);
386 return panda::JSValueRef::Undefined(vm);
387 }
388
ResetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)389 ArkUINativeModuleValue GridBridge::ResetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
390 {
391 EcmaVM* vm = runtimeCallInfo->GetVM();
392 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
393 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
394 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
395 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
396 GetArkUINodeModifiers()->getGridModifier()->resetGridCachedCount(nativeNode);
397 GetArkUINodeModifiers()->getGridModifier()->resetShowCached(nativeNode);
398 return panda::JSValueRef::Undefined(vm);
399 }
400
SetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)401 ArkUINativeModuleValue GridBridge::SetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
402 {
403 EcmaVM* vm = runtimeCallInfo->GetVM();
404 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
405 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
406 Local<JSValueRef> arg_editMode = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
407 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
408 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
409 bool editMode = arg_editMode->ToBoolean(vm)->Value();
410 GetArkUINodeModifiers()->getGridModifier()->setGridEditMode(nativeNode, editMode);
411 return panda::JSValueRef::Undefined(vm);
412 }
413
ResetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)414 ArkUINativeModuleValue GridBridge::ResetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
415 {
416 EcmaVM* vm = runtimeCallInfo->GetVM();
417 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
418 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
419 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
420 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
421 GetArkUINodeModifiers()->getGridModifier()->resetGridEditMode(nativeNode);
422 return panda::JSValueRef::Undefined(vm);
423 }
424
SetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)425 ArkUINativeModuleValue GridBridge::SetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
426 {
427 EcmaVM* vm = runtimeCallInfo->GetVM();
428 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
429 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
430 Local<JSValueRef> arg_multiSelectable = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
431 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
432 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
433 bool multiSelectable = arg_multiSelectable->ToBoolean(vm)->Value();
434 GetArkUINodeModifiers()->getGridModifier()->setGridMultiSelectable(nativeNode, multiSelectable);
435 return panda::JSValueRef::Undefined(vm);
436 }
437
ResetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)438 ArkUINativeModuleValue GridBridge::ResetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
439 {
440 EcmaVM* vm = runtimeCallInfo->GetVM();
441 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
442 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
443 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
444 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
445 GetArkUINodeModifiers()->getGridModifier()->resetGridMultiSelectable(nativeNode);
446 return panda::JSValueRef::Undefined(vm);
447 }
448
SetMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)449 ArkUINativeModuleValue GridBridge::SetMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
450 {
451 EcmaVM* vm = runtimeCallInfo->GetVM();
452 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
453 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
454 Local<JSValueRef> arg_maxCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
455 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
456 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
457 if (!arg_maxCount->IsNull() && arg_maxCount->IsNumber()) {
458 int32_t maxCount = arg_maxCount->Int32Value(vm);
459 if (maxCount < 1) {
460 GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
461 } else {
462 GetArkUINodeModifiers()->getGridModifier()->setGridMaxCount(nativeNode, maxCount);
463 }
464 } else {
465 GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
466 }
467 return panda::JSValueRef::Undefined(vm);
468 }
469
ResetMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)470 ArkUINativeModuleValue GridBridge::ResetMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
471 {
472 EcmaVM* vm = runtimeCallInfo->GetVM();
473 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
474 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
475 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
476 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
477 GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
478 return panda::JSValueRef::Undefined(vm);
479 }
480
SetMinCount(ArkUIRuntimeCallInfo * runtimeCallInfo)481 ArkUINativeModuleValue GridBridge::SetMinCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
482 {
483 EcmaVM* vm = runtimeCallInfo->GetVM();
484 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
485 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
486 Local<JSValueRef> arg_minCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
487 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
488 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
489 if (!arg_minCount->IsNull() && arg_minCount->IsNumber()) {
490 int32_t minCount = arg_minCount->Int32Value(vm);
491 if (minCount < 1) {
492 GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
493 } else {
494 GetArkUINodeModifiers()->getGridModifier()->setGridMinCount(nativeNode, minCount);
495 }
496 } else {
497 GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
498 }
499 return panda::JSValueRef::Undefined(vm);
500 }
501
ResetMinCount(ArkUIRuntimeCallInfo * runtimeCallInfo)502 ArkUINativeModuleValue GridBridge::ResetMinCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
503 {
504 EcmaVM* vm = runtimeCallInfo->GetVM();
505 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
506 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
507 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
508 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
509 GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
510 return panda::JSValueRef::Undefined(vm);
511 }
512
SetCellLength(ArkUIRuntimeCallInfo * runtimeCallInfo)513 ArkUINativeModuleValue GridBridge::SetCellLength(ArkUIRuntimeCallInfo* runtimeCallInfo)
514 {
515 EcmaVM* vm = runtimeCallInfo->GetVM();
516 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
517 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
518 Local<JSValueRef> arg_cellLength = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
519 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
520 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
521 if (!arg_cellLength->IsNull() && arg_cellLength->IsNumber()) {
522 int32_t cellLength = arg_cellLength->Int32Value(vm);
523 GetArkUINodeModifiers()->getGridModifier()->setGridCellLength(nativeNode, cellLength);
524 } else {
525 GetArkUINodeModifiers()->getGridModifier()->resetGridCellLength(nativeNode);
526 }
527 return panda::JSValueRef::Undefined(vm);
528 }
529
ResetCellLength(ArkUIRuntimeCallInfo * runtimeCallInfo)530 ArkUINativeModuleValue GridBridge::ResetCellLength(ArkUIRuntimeCallInfo* runtimeCallInfo)
531 {
532 EcmaVM* vm = runtimeCallInfo->GetVM();
533 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
534 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
535 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
536 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
537 GetArkUINodeModifiers()->getGridModifier()->resetGridCellLength(nativeNode);
538 return panda::JSValueRef::Undefined(vm);
539 }
540
SetLayoutDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)541 ArkUINativeModuleValue GridBridge::SetLayoutDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
542 {
543 EcmaVM* vm = runtimeCallInfo->GetVM();
544 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
545 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
546 Local<JSValueRef> arg_layoutDirection = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
547 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
548 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
549 if (!arg_layoutDirection->IsNull() && arg_layoutDirection->IsNumber()) {
550 int32_t layoutDirection = arg_layoutDirection->Int32Value(vm);
551 GetArkUINodeModifiers()->getGridModifier()->setGridLayoutDirection(nativeNode, layoutDirection);
552 } else {
553 GetArkUINodeModifiers()->getGridModifier()->resetGridLayoutDirection(nativeNode);
554 }
555 return panda::JSValueRef::Undefined(vm);
556 }
557
ResetLayoutDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)558 ArkUINativeModuleValue GridBridge::ResetLayoutDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
559 {
560 EcmaVM* vm = runtimeCallInfo->GetVM();
561 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
562 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
563 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
564 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
565 GetArkUINodeModifiers()->getGridModifier()->resetGridLayoutDirection(nativeNode);
566 return panda::JSValueRef::Undefined(vm);
567 }
568
SetSupportAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)569 ArkUINativeModuleValue GridBridge::SetSupportAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
570 {
571 EcmaVM* vm = runtimeCallInfo->GetVM();
572 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
573 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
574 Local<JSValueRef> arg_supportAnimation = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
575 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
576 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
577 bool supportAnimation = arg_supportAnimation->ToBoolean(vm)->Value();
578 GetArkUINodeModifiers()->getGridModifier()->setGridSupportAnimation(nativeNode, supportAnimation);
579 return panda::JSValueRef::Undefined(vm);
580 }
581
ResetSupportAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)582 ArkUINativeModuleValue GridBridge::ResetSupportAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
583 {
584 EcmaVM* vm = runtimeCallInfo->GetVM();
585 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
586 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
587 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
588 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
589 GetArkUINodeModifiers()->getGridModifier()->resetGridSupportAnimation(nativeNode);
590 return panda::JSValueRef::Undefined(vm);
591 }
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)592 ArkUINativeModuleValue GridBridge::SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
593 {
594 EcmaVM* vm = runtimeCallInfo->GetVM();
595 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
596 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
597 Local<JSValueRef> arg_forward = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
598 Local<JSValueRef> arg_backward = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
599
600 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
601 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
602 int32_t forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
603 int32_t backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
604 if (!arg_forward->IsUndefined()) {
605 forward = arg_forward->Int32Value(vm);
606 }
607 if (!arg_backward->IsUndefined()) {
608 backward = arg_backward->Int32Value(vm);
609 }
610
611 if (forward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
612 forward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
613 forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
614 }
615
616 if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
617 backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
618 backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
619 }
620
621 GetArkUINodeModifiers()->getGridModifier()->setNestedScroll(nativeNode, forward, backward);
622
623 return panda::JSValueRef::Undefined(vm);
624 }
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)625 ArkUINativeModuleValue GridBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
626 {
627 EcmaVM* vm = runtimeCallInfo->GetVM();
628 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
629 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
630 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
631 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
632 GetArkUINodeModifiers()->getGridModifier()->resetNestedScroll(nativeNode);
633 return panda::JSValueRef::Undefined(vm);
634 }
SetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)635 ArkUINativeModuleValue GridBridge::SetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
636 {
637 EcmaVM* vm = runtimeCallInfo->GetVM();
638 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
639 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
640 Local<JSValueRef> arg_enableScroll = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
641
642 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
643 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
644
645 GetArkUINodeModifiers()->getGridModifier()->setEnableScroll(
646 nativeNode, arg_enableScroll->IsBoolean() ? arg_enableScroll->ToBoolean(vm)->Value() : true);
647
648 return panda::JSValueRef::Undefined(vm);
649 }
ResetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)650 ArkUINativeModuleValue GridBridge::ResetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
651 {
652 EcmaVM* vm = runtimeCallInfo->GetVM();
653 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
654 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
655 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
656 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
657 GetArkUINodeModifiers()->getGridModifier()->resetEnableScroll(nativeNode);
658 return panda::JSValueRef::Undefined(vm);
659 }
SetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)660 ArkUINativeModuleValue GridBridge::SetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
661 {
662 EcmaVM* vm = runtimeCallInfo->GetVM();
663 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
664 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
665 Local<JSValueRef> arg_friction = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
666
667 double friction = -1.0;
668 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
669 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
670 if (!ArkTSUtils::ParseJsDouble(vm, arg_friction, friction)) {
671 friction = -1.0;
672 }
673 GetArkUINodeModifiers()->getGridModifier()->setFriction(nativeNode, static_cast<ArkUI_Float32>(friction));
674
675 return panda::JSValueRef::Undefined(vm);
676 }
ResetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)677 ArkUINativeModuleValue GridBridge::ResetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
678 {
679 EcmaVM* vm = runtimeCallInfo->GetVM();
680 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
681 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
682 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
683 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
684 GetArkUINodeModifiers()->getGridModifier()->resetFriction(nativeNode);
685 return panda::JSValueRef::Undefined(vm);
686 }
SetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)687 ArkUINativeModuleValue GridBridge::SetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
688 {
689 EcmaVM* vm = runtimeCallInfo->GetVM();
690 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
691 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
692 Local<JSValueRef> arg_alignItems = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
693
694 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
695 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
696 int32_t itemAlignment = static_cast<int32_t>(GridItemAlignment::DEFAULT);
697 if (!arg_alignItems->IsUndefined() && !arg_alignItems->IsNull()) {
698 itemAlignment = arg_alignItems->Int32Value(vm);
699 }
700
701 if (itemAlignment != static_cast<int32_t>(GridItemAlignment::DEFAULT) &&
702 itemAlignment != static_cast<int32_t>(GridItemAlignment::STRETCH)) {
703 itemAlignment = static_cast<int32_t>(GridItemAlignment::DEFAULT);
704 }
705
706 GetArkUINodeModifiers()->getGridModifier()->setGridAlignItems(nativeNode, itemAlignment);
707 return panda::JSValueRef::Undefined(vm);
708 }
ResetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)709 ArkUINativeModuleValue GridBridge::ResetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
710 {
711 EcmaVM* vm = runtimeCallInfo->GetVM();
712 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
713 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
714 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
715 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
716 GetArkUINodeModifiers()->getGridModifier()->resetGridAlignItems(nativeNode);
717 return panda::JSValueRef::Undefined(vm);
718 }
719
SetGridScroller(ArkUIRuntimeCallInfo * runtimeCallInfo)720 ArkUINativeModuleValue GridBridge::SetGridScroller(ArkUIRuntimeCallInfo* runtimeCallInfo)
721 {
722 EcmaVM* vm = runtimeCallInfo->GetVM();
723 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
724 Local<JSValueRef> nodeVal = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
725 Local<JSValueRef> scrollerVal = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
726 RefPtr<ScrollControllerBase> positionController;
727 RefPtr<ScrollProxy> scrollBarProxy;
728 CHECK_NULL_RETURN(nodeVal->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
729 auto nativeNode = nodePtr(nodeVal->ToNativePointer(vm)->Value());
730 if (scrollerVal->IsObject(vm)) {
731 auto* jsScroller = Framework::JSRef<Framework::JSObject>(Framework::JSObject(scrollerVal->ToObject(vm)))
732 ->Unwrap<Framework::JSScroller>();
733 if (jsScroller) {
734 jsScroller->SetInstanceId(Container::CurrentIdSafely());
735 positionController = AceType::MakeRefPtr<ScrollableController>();
736 jsScroller->SetController(positionController);
737 scrollBarProxy = jsScroller->GetScrollBarProxy();
738 if (!scrollBarProxy) {
739 scrollBarProxy = AceType::MakeRefPtr<NG::ScrollBarProxy>();
740 jsScroller->SetScrollBarProxy(scrollBarProxy);
741 }
742 }
743 }
744 GridModelNG::InitScroller(reinterpret_cast<FrameNode*>(nativeNode), positionController, scrollBarProxy);
745 return panda::JSValueRef::Undefined(vm);
746 }
747
SetGridLayoutOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)748 ArkUINativeModuleValue GridBridge::SetGridLayoutOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
749 {
750 EcmaVM* vm = runtimeCallInfo->GetVM();
751 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
752 Local<JSValueRef> nodeVal = runtimeCallInfo->GetCallArgRef(0);
753 Local<JSValueRef> irregularIndexesVal = runtimeCallInfo->GetCallArgRef(2); // 2: parameter index
754 Local<JSValueRef> indexesLengthVal = runtimeCallInfo->GetCallArgRef(3); // 3: parameter index
755 CHECK_NULL_RETURN(nodeVal->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
756 auto nativeNode = nodePtr(nodeVal->ToNativePointer(vm)->Value());
757 int32_t length = 0;
758 if (indexesLengthVal->IsNumber()) {
759 length = indexesLengthVal->Int32Value(vm);
760 }
761 auto irregularIndexes = std::make_unique<int32_t[]>(length);
762 bool irregularResult = ArkTSUtils::ParseArray<int32_t>(vm, irregularIndexesVal, irregularIndexes.get(), length,
763 [](const EcmaVM* vm, const Local<JSValueRef>& jsValue) {
764 bool isNumber = false;
765 return jsValue->GetValueInt32(isNumber);
766 });
767
768 GridLayoutOptions options;
769 // only support regularSize(1, 1)
770 options.regularSize.rows = 1;
771 options.regularSize.columns = 1;
772 if (irregularResult) {
773 for (int32_t i = 0; i < length; i++) {
774 options.irregularIndexes.emplace(irregularIndexes[i]);
775 }
776 }
777 irregularIndexes.reset();
778 ParseGetGridItemSize(vm, runtimeCallInfo->GetCallArgRef(4), options); // 4: parameter index
779 ParseGetGridItemRect(vm, runtimeCallInfo->GetCallArgRef(5), options); // 5: parameter index
780 GridModelNG::SetLayoutOptions(reinterpret_cast<FrameNode*>(nativeNode), options);
781 return panda::JSValueRef::Undefined(vm);
782 }
783
SetOnGridScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)784 ArkUINativeModuleValue GridBridge::SetOnGridScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
785 {
786 EcmaVM* vm = runtimeCallInfo->GetVM();
787 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
788 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
789 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
790 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
791 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
792 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
793 GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollIndex(nativeNode);
794 return panda::JSValueRef::Undefined(vm);
795 }
796 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
797 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
798 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
799
800 std::function<void(int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
801 const int32_t first, const int32_t last) {
802 panda::LocalScope pandaScope(vm);
803 panda::TryCatch trycatch(vm);
804 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
805
806 panda::Local<panda::NumberRef> firstParam = panda::NumberRef::New(vm, first);
807 panda::Local<panda::NumberRef> lastParam = panda::NumberRef::New(vm, last);
808 // 2: Array length
809 panda::Local<panda::JSValueRef> params[2] = { firstParam, lastParam };
810 func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
811 };
812 GetArkUINodeModifiers()->getGridModifier()->setOnGridScrollIndexCallBack(
813 nativeNode, reinterpret_cast<void*>(&callback));
814 return panda::JSValueRef::Undefined(vm);
815 }
816
ResetOnGridScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)817 ArkUINativeModuleValue GridBridge::ResetOnGridScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
818 {
819 EcmaVM* vm = runtimeCallInfo->GetVM();
820 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
821 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
822 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
823 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
824 GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollIndex(nativeNode);
825 return panda::JSValueRef::Undefined(vm);
826 }
827
SetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)828 ArkUINativeModuleValue GridBridge::SetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
829 {
830 EcmaVM* vm = runtimeCallInfo->GetVM();
831 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
832 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
833 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
834 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
835 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
836 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
837 GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollBarUpdate(nativeNode);
838 return panda::JSValueRef::Undefined(vm);
839 }
840 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
841 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
842 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
843
844 std::function<std::pair<float, float>(int32_t, Dimension&)> callback =
845 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const int32_t index, const Dimension& offset) {
846 panda::LocalScope pandaScope(vm);
847 panda::TryCatch trycatch(vm);
848 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
849
850 panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
851 panda::Local<panda::NumberRef> offsetParam =
852 panda::NumberRef::New(vm, static_cast<double>(offset.ConvertToVp()));
853
854 // 2: Array length
855 panda::Local<panda::JSValueRef> params[2] = { indexParam, offsetParam };
856 auto result = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
857 if (result->IsObject(vm)) {
858 auto resultObj = result->ToObject(vm);
859 panda::Local<panda::JSValueRef> offset =
860 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "totalOffset"));
861 panda::Local<panda::JSValueRef> length =
862 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "totalLength"));
863 CalcDimension totalOffset_;
864 CalcDimension totalLength_;
865 if (ArkTSUtils::ParseJsDimensionVp(vm, offset, totalOffset_) &&
866 ArkTSUtils::ParseJsDimensionVp(vm, length, totalLength_)) {
867 return std::pair<float, float>(totalOffset_.ConvertToPx(), totalLength_.ConvertToPx());
868 }
869 }
870 return std::pair<float, float>(0, 0);
871 };
872 GetArkUINodeModifiers()->getGridModifier()->setOnGridScrollBarUpdateCallBack(
873 nativeNode, reinterpret_cast<void*>(&callback));
874 return panda::JSValueRef::Undefined(vm);
875 }
876
ResetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)877 ArkUINativeModuleValue GridBridge::ResetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
878 {
879 EcmaVM* vm = runtimeCallInfo->GetVM();
880 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
881 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
882 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
883 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
884 GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollBarUpdate(nativeNode);
885 return panda::JSValueRef::Undefined(vm);
886 }
887
SetOnGridItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)888 ArkUINativeModuleValue GridBridge::SetOnGridItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
889 {
890 EcmaVM* vm = runtimeCallInfo->GetVM();
891 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
892 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
893 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
894 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
895 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
896 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
897
898 JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo);
899 if (!info[1]->IsFunction()) {
900 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragStart(nativeNode);
901 return panda::JSValueRef::Undefined(vm);
902 }
903
904 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
905 std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
906 execCtx = info.GetExecutionContext()](
907 const ItemDragInfo& dragInfo, int32_t itemIndex) {
908 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
909 panda::LocalScope pandaScope(vm);
910 panda::TryCatch trycatch(vm);
911
912 auto ret = func->ItemDragStartExecute(dragInfo, itemIndex);
913 if (!ret->IsFunction()) {
914 return;
915 }
916
917 auto builderFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSFunc>::Cast(ret));
918 if (!builderFunc) {
919 return;
920 }
921
922 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
923 builderFunc->Execute();
924 };
925 GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragStart(nativeNode, reinterpret_cast<void*>(&callback));
926 return panda::JSValueRef::Undefined(vm);
927 }
928
ResetOnGridItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)929 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
930 {
931 EcmaVM* vm = runtimeCallInfo->GetVM();
932 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
933 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
934 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
935 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
936 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragStart(nativeNode);
937 return panda::JSValueRef::Undefined(vm);
938 }
939
SetOnGridItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)940 ArkUINativeModuleValue GridBridge::SetOnGridItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
941 {
942 EcmaVM* vm = runtimeCallInfo->GetVM();
943 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
944 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
945 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
946 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
947 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
948 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
949
950 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
951 if (!info[1]->IsFunction()) {
952 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragEnter(nativeNode);
953 return panda::JSValueRef::Undefined(vm);
954 }
955 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
956
957 std::function<void(const ItemDragInfo&)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
958 execCtx = info.GetExecutionContext()](
959 const ItemDragInfo& dragInfo) {
960 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
961 panda::LocalScope pandaScope(vm);
962 panda::TryCatch trycatch(vm);
963
964 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
965 func->ItemDragEnterExecute(dragInfo);
966 };
967 GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragEnter(nativeNode, reinterpret_cast<void*>(&callback));
968 return panda::JSValueRef::Undefined(vm);
969 }
970
ResetOnGridItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)971 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
972 {
973 EcmaVM* vm = runtimeCallInfo->GetVM();
974 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
975 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
976 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
977 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
978 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragEnter(nativeNode);
979 return panda::JSValueRef::Undefined(vm);
980 }
981
SetOnGridItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)982 ArkUINativeModuleValue GridBridge::SetOnGridItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
983 {
984 EcmaVM* vm = runtimeCallInfo->GetVM();
985 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
986 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
987 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
988 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
989 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
990 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
991
992 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
993 if (!info[1]->IsFunction()) {
994 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragMove(nativeNode);
995 return panda::JSValueRef::Undefined(vm);
996 }
997 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
998
999 std::function<void(const ItemDragInfo&, int32_t, int32_t)> callback =
1000 [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1001 const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) {
1002 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1003 panda::LocalScope pandaScope(vm);
1004 panda::TryCatch trycatch(vm);
1005
1006 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1007 func->ItemDragMoveExecute(dragInfo, itemIndex, insertIndex);
1008 };
1009 GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragMove(nativeNode, reinterpret_cast<void*>(&callback));
1010 return panda::JSValueRef::Undefined(vm);
1011 }
1012
ResetOnGridItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1013 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1014 {
1015 EcmaVM* vm = runtimeCallInfo->GetVM();
1016 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1017 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1018 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1019 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1020 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragMove(nativeNode);
1021 return panda::JSValueRef::Undefined(vm);
1022 }
1023
SetOnGridItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1024 ArkUINativeModuleValue GridBridge::SetOnGridItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1025 {
1026 EcmaVM* vm = runtimeCallInfo->GetVM();
1027 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1028 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1029 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1030 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1031 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1032 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1033
1034 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1035 if (!info[1]->IsFunction()) {
1036 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragLeave(nativeNode);
1037 return panda::JSValueRef::Undefined(vm);
1038 }
1039 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1040
1041 std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
1042 execCtx = info.GetExecutionContext()](
1043 const ItemDragInfo& dragInfo, int32_t itemIndex) {
1044 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1045 panda::LocalScope pandaScope(vm);
1046 panda::TryCatch trycatch(vm);
1047
1048 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1049 func->ItemDragLeaveExecute(dragInfo, itemIndex);
1050 };
1051 GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragLeave(nativeNode, reinterpret_cast<void*>(&callback));
1052 return panda::JSValueRef::Undefined(vm);
1053 }
1054
ResetOnGridItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1055 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1056 {
1057 EcmaVM* vm = runtimeCallInfo->GetVM();
1058 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1059 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1060 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1061 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1062 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragLeave(nativeNode);
1063 return panda::JSValueRef::Undefined(vm);
1064 }
1065
SetOnGridItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1066 ArkUINativeModuleValue GridBridge::SetOnGridItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1067 {
1068 EcmaVM* vm = runtimeCallInfo->GetVM();
1069 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1070 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1071 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1072 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1073 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1074 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1075
1076 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1077 if (!info[1]->IsFunction()) {
1078 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDrop(nativeNode);
1079 return panda::JSValueRef::Undefined(vm);
1080 }
1081 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1082
1083 std::function<void(const ItemDragInfo&, int32_t, int32_t, bool)> callback =
1084 [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1085 const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess) {
1086 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1087 panda::LocalScope pandaScope(vm);
1088 panda::TryCatch trycatch(vm);
1089
1090 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1091 func->ItemDropExecute(dragInfo, itemIndex, insertIndex, isSuccess);
1092 };
1093 GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDrop(nativeNode, reinterpret_cast<void*>(&callback));
1094 return panda::JSValueRef::Undefined(vm);
1095 }
1096
ResetOnGridItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1097 ArkUINativeModuleValue GridBridge::ResetOnGridItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1098 {
1099 EcmaVM* vm = runtimeCallInfo->GetVM();
1100 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1101 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1102 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1103 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1104 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDrop(nativeNode);
1105 return panda::JSValueRef::Undefined(vm);
1106 }
1107 } // namespace OHOS::Ace::NG
1108