1 /*
2 * Copyright (c) 2023-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "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 RefPtr<ResourceObject> resObj;
347 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
348 if (ArkTSUtils::ParseJsColorAlpha(vm, arg_color, color, resObj, nodeInfo)) {
349 GetArkUINodeModifiers()->getGridModifier()->setGridScrollBarColor(
350 nativeNode, color.GetValue());
351 } else {
352 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
353 }
354 if (SystemProperties::ConfigChangePerform()) {
355 GetArkUINodeModifiers()->getGridModifier()->createWithResourceObjScrollBarColor(
356 nativeNode, reinterpret_cast<void*>(AceType::RawPtr(resObj)));
357 }
358 return panda::JSValueRef::Undefined(vm);
359 }
360
ResetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)361 ArkUINativeModuleValue GridBridge::ResetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
362 {
363 EcmaVM* vm = runtimeCallInfo->GetVM();
364 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
365 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
366 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
367 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
368 GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
369 if (SystemProperties::ConfigChangePerform()) {
370 GetArkUINodeModifiers()->getGridModifier()->createWithResourceObjScrollBarColor(nativeNode, nullptr);
371 }
372 return panda::JSValueRef::Undefined(vm);
373 }
374
SetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)375 ArkUINativeModuleValue GridBridge::SetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
376 {
377 EcmaVM* vm = runtimeCallInfo->GetVM();
378 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
379 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
380 Local<JSValueRef> argCachedCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
381 Local<JSValueRef> argShow = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
382 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
383 auto* nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
384 auto value = DEFAULT_CACHED_COUNT;
385 if (!argCachedCount->IsUndefined()) {
386 ArkTSUtils::ParseJsInteger(vm, argCachedCount, value);
387 if (value < 0) {
388 value = DEFAULT_CACHED_COUNT;
389 }
390 }
391 GetArkUINodeModifiers()->getGridModifier()->setGridCachedCount(nativeNode, value);
392
393 bool show = !argShow.IsNull() && argShow->IsTrue();
394 GetArkUINodeModifiers()->getGridModifier()->setShowCached(nativeNode, show);
395 return panda::JSValueRef::Undefined(vm);
396 }
397
ResetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)398 ArkUINativeModuleValue GridBridge::ResetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
399 {
400 EcmaVM* vm = runtimeCallInfo->GetVM();
401 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
402 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
403 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
404 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
405 GetArkUINodeModifiers()->getGridModifier()->resetGridCachedCount(nativeNode);
406 GetArkUINodeModifiers()->getGridModifier()->resetShowCached(nativeNode);
407 return panda::JSValueRef::Undefined(vm);
408 }
409
SetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)410 ArkUINativeModuleValue GridBridge::SetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
411 {
412 EcmaVM* vm = runtimeCallInfo->GetVM();
413 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
414 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
415 Local<JSValueRef> arg_editMode = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
416 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
417 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
418 bool editMode = arg_editMode->ToBoolean(vm)->Value();
419 GetArkUINodeModifiers()->getGridModifier()->setGridEditMode(nativeNode, editMode);
420 return panda::JSValueRef::Undefined(vm);
421 }
422
ResetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)423 ArkUINativeModuleValue GridBridge::ResetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
424 {
425 EcmaVM* vm = runtimeCallInfo->GetVM();
426 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
427 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
428 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
429 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
430 GetArkUINodeModifiers()->getGridModifier()->resetGridEditMode(nativeNode);
431 return panda::JSValueRef::Undefined(vm);
432 }
433
SetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)434 ArkUINativeModuleValue GridBridge::SetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
435 {
436 EcmaVM* vm = runtimeCallInfo->GetVM();
437 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
438 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
439 Local<JSValueRef> arg_multiSelectable = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
440 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
441 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
442 bool multiSelectable = arg_multiSelectable->ToBoolean(vm)->Value();
443 GetArkUINodeModifiers()->getGridModifier()->setGridMultiSelectable(nativeNode, multiSelectable);
444 return panda::JSValueRef::Undefined(vm);
445 }
446
ResetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)447 ArkUINativeModuleValue GridBridge::ResetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
448 {
449 EcmaVM* vm = runtimeCallInfo->GetVM();
450 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
451 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
452 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
453 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
454 GetArkUINodeModifiers()->getGridModifier()->resetGridMultiSelectable(nativeNode);
455 return panda::JSValueRef::Undefined(vm);
456 }
457
SetMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)458 ArkUINativeModuleValue GridBridge::SetMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
459 {
460 EcmaVM* vm = runtimeCallInfo->GetVM();
461 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
462 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
463 Local<JSValueRef> arg_maxCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
464 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
465 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
466 if (!arg_maxCount->IsNull() && arg_maxCount->IsNumber()) {
467 int32_t maxCount = arg_maxCount->Int32Value(vm);
468 if (maxCount < 1) {
469 GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
470 } else {
471 GetArkUINodeModifiers()->getGridModifier()->setGridMaxCount(nativeNode, maxCount);
472 }
473 } else {
474 GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
475 }
476 return panda::JSValueRef::Undefined(vm);
477 }
478
ResetMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)479 ArkUINativeModuleValue GridBridge::ResetMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
480 {
481 EcmaVM* vm = runtimeCallInfo->GetVM();
482 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
483 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
484 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
485 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
486 GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
487 return panda::JSValueRef::Undefined(vm);
488 }
489
SetMinCount(ArkUIRuntimeCallInfo * runtimeCallInfo)490 ArkUINativeModuleValue GridBridge::SetMinCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
491 {
492 EcmaVM* vm = runtimeCallInfo->GetVM();
493 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
494 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
495 Local<JSValueRef> arg_minCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
496 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
497 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
498 if (!arg_minCount->IsNull() && arg_minCount->IsNumber()) {
499 int32_t minCount = arg_minCount->Int32Value(vm);
500 if (minCount < 1) {
501 GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
502 } else {
503 GetArkUINodeModifiers()->getGridModifier()->setGridMinCount(nativeNode, minCount);
504 }
505 } else {
506 GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
507 }
508 return panda::JSValueRef::Undefined(vm);
509 }
510
ResetMinCount(ArkUIRuntimeCallInfo * runtimeCallInfo)511 ArkUINativeModuleValue GridBridge::ResetMinCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
512 {
513 EcmaVM* vm = runtimeCallInfo->GetVM();
514 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
515 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
516 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
517 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
518 GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
519 return panda::JSValueRef::Undefined(vm);
520 }
521
SetCellLength(ArkUIRuntimeCallInfo * runtimeCallInfo)522 ArkUINativeModuleValue GridBridge::SetCellLength(ArkUIRuntimeCallInfo* runtimeCallInfo)
523 {
524 EcmaVM* vm = runtimeCallInfo->GetVM();
525 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
526 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
527 Local<JSValueRef> arg_cellLength = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
528 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
529 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
530 if (!arg_cellLength->IsNull() && arg_cellLength->IsNumber()) {
531 int32_t cellLength = arg_cellLength->Int32Value(vm);
532 GetArkUINodeModifiers()->getGridModifier()->setGridCellLength(nativeNode, cellLength);
533 } else {
534 GetArkUINodeModifiers()->getGridModifier()->resetGridCellLength(nativeNode);
535 }
536 return panda::JSValueRef::Undefined(vm);
537 }
538
ResetCellLength(ArkUIRuntimeCallInfo * runtimeCallInfo)539 ArkUINativeModuleValue GridBridge::ResetCellLength(ArkUIRuntimeCallInfo* runtimeCallInfo)
540 {
541 EcmaVM* vm = runtimeCallInfo->GetVM();
542 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
543 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
544 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
545 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
546 GetArkUINodeModifiers()->getGridModifier()->resetGridCellLength(nativeNode);
547 return panda::JSValueRef::Undefined(vm);
548 }
549
SetLayoutDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)550 ArkUINativeModuleValue GridBridge::SetLayoutDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
551 {
552 EcmaVM* vm = runtimeCallInfo->GetVM();
553 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
554 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
555 Local<JSValueRef> arg_layoutDirection = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
556 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
557 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
558 if (!arg_layoutDirection->IsNull() && arg_layoutDirection->IsNumber()) {
559 int32_t layoutDirection = arg_layoutDirection->Int32Value(vm);
560 GetArkUINodeModifiers()->getGridModifier()->setGridLayoutDirection(nativeNode, layoutDirection);
561 } else {
562 GetArkUINodeModifiers()->getGridModifier()->resetGridLayoutDirection(nativeNode);
563 }
564 return panda::JSValueRef::Undefined(vm);
565 }
566
ResetLayoutDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)567 ArkUINativeModuleValue GridBridge::ResetLayoutDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
568 {
569 EcmaVM* vm = runtimeCallInfo->GetVM();
570 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
571 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
572 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
573 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
574 GetArkUINodeModifiers()->getGridModifier()->resetGridLayoutDirection(nativeNode);
575 return panda::JSValueRef::Undefined(vm);
576 }
577
SetSupportAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)578 ArkUINativeModuleValue GridBridge::SetSupportAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
579 {
580 EcmaVM* vm = runtimeCallInfo->GetVM();
581 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
582 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
583 Local<JSValueRef> arg_supportAnimation = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
584 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
585 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
586 bool supportAnimation = arg_supportAnimation->ToBoolean(vm)->Value();
587 GetArkUINodeModifiers()->getGridModifier()->setGridSupportAnimation(nativeNode, supportAnimation);
588 return panda::JSValueRef::Undefined(vm);
589 }
590
ResetSupportAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)591 ArkUINativeModuleValue GridBridge::ResetSupportAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
592 {
593 EcmaVM* vm = runtimeCallInfo->GetVM();
594 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
595 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
596 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
597 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
598 GetArkUINodeModifiers()->getGridModifier()->resetGridSupportAnimation(nativeNode);
599 return panda::JSValueRef::Undefined(vm);
600 }
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)601 ArkUINativeModuleValue GridBridge::SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
602 {
603 EcmaVM* vm = runtimeCallInfo->GetVM();
604 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
605 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
606 Local<JSValueRef> arg_forward = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
607 Local<JSValueRef> arg_backward = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
608
609 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
610 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
611 int32_t forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
612 int32_t backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
613 if (!arg_forward->IsUndefined()) {
614 forward = arg_forward->Int32Value(vm);
615 }
616 if (!arg_backward->IsUndefined()) {
617 backward = arg_backward->Int32Value(vm);
618 }
619
620 if (forward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
621 forward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
622 forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
623 }
624
625 if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
626 backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
627 backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
628 }
629
630 GetArkUINodeModifiers()->getGridModifier()->setNestedScroll(nativeNode, forward, backward);
631
632 return panda::JSValueRef::Undefined(vm);
633 }
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)634 ArkUINativeModuleValue GridBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
635 {
636 EcmaVM* vm = runtimeCallInfo->GetVM();
637 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
638 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
639 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
640 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
641 GetArkUINodeModifiers()->getGridModifier()->resetNestedScroll(nativeNode);
642 return panda::JSValueRef::Undefined(vm);
643 }
SetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)644 ArkUINativeModuleValue GridBridge::SetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
645 {
646 EcmaVM* vm = runtimeCallInfo->GetVM();
647 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
648 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
649 Local<JSValueRef> arg_enableScroll = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
650
651 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
652 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
653
654 GetArkUINodeModifiers()->getGridModifier()->setEnableScroll(
655 nativeNode, arg_enableScroll->IsBoolean() ? arg_enableScroll->ToBoolean(vm)->Value() : true);
656
657 return panda::JSValueRef::Undefined(vm);
658 }
ResetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)659 ArkUINativeModuleValue GridBridge::ResetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
660 {
661 EcmaVM* vm = runtimeCallInfo->GetVM();
662 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
663 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
664 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
665 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
666 GetArkUINodeModifiers()->getGridModifier()->resetEnableScroll(nativeNode);
667 return panda::JSValueRef::Undefined(vm);
668 }
SetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)669 ArkUINativeModuleValue GridBridge::SetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
670 {
671 EcmaVM* vm = runtimeCallInfo->GetVM();
672 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
673 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
674 Local<JSValueRef> arg_friction = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
675
676 double friction = -1.0;
677 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
678 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
679 RefPtr<ResourceObject> resObj;
680 if (!ArkTSUtils::ParseJsDouble(vm, arg_friction, friction, resObj)) {
681 friction = -1.0;
682 }
683 if (SystemProperties::ConfigChangePerform()) {
684 GetArkUINodeModifiers()->getGridModifier()->createWithResourceObjFriction(
685 nativeNode, reinterpret_cast<void*>(AceType::RawPtr(resObj)));
686 }
687 GetArkUINodeModifiers()->getGridModifier()->setFriction(nativeNode, static_cast<ArkUI_Float32>(friction));
688
689 return panda::JSValueRef::Undefined(vm);
690 }
ResetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)691 ArkUINativeModuleValue GridBridge::ResetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
692 {
693 EcmaVM* vm = runtimeCallInfo->GetVM();
694 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
695 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
696 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
697 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
698 GetArkUINodeModifiers()->getGridModifier()->resetFriction(nativeNode);
699 if (SystemProperties::ConfigChangePerform()) {
700 GetArkUINodeModifiers()->getGridModifier()->createWithResourceObjFriction(nativeNode, nullptr);
701 }
702 return panda::JSValueRef::Undefined(vm);
703 }
SetFocusWrapMode(ArkUIRuntimeCallInfo * runtimeCallInfo)704 ArkUINativeModuleValue GridBridge::SetFocusWrapMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
705 {
706 EcmaVM* vm = runtimeCallInfo->GetVM();
707 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
708 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
709 Local<JSValueRef> arg_focusWrapMode = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
710 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
711 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
712 if (!arg_focusWrapMode->IsNull() && arg_focusWrapMode->IsNumber()) {
713 int32_t focusWrapMode = arg_focusWrapMode->Int32Value(vm);
714 if (focusWrapMode < 0 || focusWrapMode > 1) {
715 GetArkUINodeModifiers()->getGridModifier()->resetGridFocusWrapMode(nativeNode);
716 } else {
717 GetArkUINodeModifiers()->getGridModifier()->setGridFocusWrapMode(nativeNode, focusWrapMode);
718 }
719 } else {
720 GetArkUINodeModifiers()->getGridModifier()->resetGridFocusWrapMode(nativeNode);
721 }
722 return panda::JSValueRef::Undefined(vm);
723 }
ResetFocusWrapMode(ArkUIRuntimeCallInfo * runtimeCallInfo)724 ArkUINativeModuleValue GridBridge::ResetFocusWrapMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
725 {
726 EcmaVM* vm = runtimeCallInfo->GetVM();
727 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
728 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
729 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
730 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
731 GetArkUINodeModifiers()->getGridModifier()->resetGridFocusWrapMode(nativeNode);
732 return panda::JSValueRef::Undefined(vm);
733 }
SetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)734 ArkUINativeModuleValue GridBridge::SetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
735 {
736 EcmaVM* vm = runtimeCallInfo->GetVM();
737 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
738 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
739 Local<JSValueRef> arg_alignItems = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
740
741 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
742 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
743 int32_t itemAlignment = static_cast<int32_t>(GridItemAlignment::DEFAULT);
744 if (!arg_alignItems->IsUndefined() && !arg_alignItems->IsNull()) {
745 itemAlignment = arg_alignItems->Int32Value(vm);
746 }
747
748 if (itemAlignment != static_cast<int32_t>(GridItemAlignment::DEFAULT) &&
749 itemAlignment != static_cast<int32_t>(GridItemAlignment::STRETCH)) {
750 itemAlignment = static_cast<int32_t>(GridItemAlignment::DEFAULT);
751 }
752
753 GetArkUINodeModifiers()->getGridModifier()->setGridAlignItems(nativeNode, itemAlignment);
754 return panda::JSValueRef::Undefined(vm);
755 }
ResetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)756 ArkUINativeModuleValue GridBridge::ResetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
757 {
758 EcmaVM* vm = runtimeCallInfo->GetVM();
759 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
760 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
761 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
762 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
763 GetArkUINodeModifiers()->getGridModifier()->resetGridAlignItems(nativeNode);
764 return panda::JSValueRef::Undefined(vm);
765 }
766
SetSyncLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)767 ArkUINativeModuleValue GridBridge::SetSyncLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
768 {
769 EcmaVM* vm = runtimeCallInfo->GetVM();
770 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
771 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
772 Local<JSValueRef> argSyncLoad = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
773
774 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
775 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
776 bool syncLoad = true;
777 if (!argSyncLoad->IsUndefined() && !argSyncLoad->IsNull()) {
778 syncLoad = argSyncLoad->BooleaValue(vm);
779 }
780
781 GetArkUINodeModifiers()->getGridModifier()->setSyncLoad(nativeNode, syncLoad);
782 return panda::JSValueRef::Undefined(vm);
783 }
784
ResetSyncLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)785 ArkUINativeModuleValue GridBridge::ResetSyncLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
786 {
787 EcmaVM* vm = runtimeCallInfo->GetVM();
788 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
789 Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
790 CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
791 auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
792 GetArkUINodeModifiers()->getGridModifier()->resetSyncLoad(nativeNode);
793 return panda::JSValueRef::Undefined(vm);
794 }
795
SetGridScroller(ArkUIRuntimeCallInfo * runtimeCallInfo)796 ArkUINativeModuleValue GridBridge::SetGridScroller(ArkUIRuntimeCallInfo* runtimeCallInfo)
797 {
798 EcmaVM* vm = runtimeCallInfo->GetVM();
799 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
800 Local<JSValueRef> nodeVal = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
801 Local<JSValueRef> scrollerVal = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
802 RefPtr<ScrollControllerBase> positionController;
803 RefPtr<ScrollProxy> scrollBarProxy;
804 CHECK_NULL_RETURN(nodeVal->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
805 auto nativeNode = nodePtr(nodeVal->ToNativePointer(vm)->Value());
806 if (scrollerVal->IsObject(vm)) {
807 auto* jsScroller = Framework::JSRef<Framework::JSObject>(Framework::JSObject(scrollerVal->ToObject(vm)))
808 ->Unwrap<Framework::JSScroller>();
809 if (jsScroller) {
810 jsScroller->SetInstanceId(Container::CurrentIdSafely());
811 positionController = AceType::MakeRefPtr<ScrollableController>();
812 jsScroller->SetController(positionController);
813 scrollBarProxy = jsScroller->GetScrollBarProxy();
814 if (!scrollBarProxy) {
815 scrollBarProxy = AceType::MakeRefPtr<NG::ScrollBarProxy>();
816 jsScroller->SetScrollBarProxy(scrollBarProxy);
817 }
818 }
819 }
820 GridModelNG::InitScroller(reinterpret_cast<FrameNode*>(nativeNode), positionController, scrollBarProxy);
821 return panda::JSValueRef::Undefined(vm);
822 }
823
SetGridLayoutOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)824 ArkUINativeModuleValue GridBridge::SetGridLayoutOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
825 {
826 EcmaVM* vm = runtimeCallInfo->GetVM();
827 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
828 Local<JSValueRef> nodeVal = runtimeCallInfo->GetCallArgRef(0);
829 Local<JSValueRef> irregularIndexesVal = runtimeCallInfo->GetCallArgRef(2); // 2: parameter index
830 Local<JSValueRef> indexesLengthVal = runtimeCallInfo->GetCallArgRef(3); // 3: parameter index
831 CHECK_NULL_RETURN(nodeVal->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
832 auto nativeNode = nodePtr(nodeVal->ToNativePointer(vm)->Value());
833 int32_t length = 0;
834 if (indexesLengthVal->IsNumber()) {
835 length = indexesLengthVal->Int32Value(vm);
836 }
837 auto irregularIndexes = std::make_unique<int32_t[]>(length);
838 bool irregularResult = ArkTSUtils::ParseArray<int32_t>(vm, irregularIndexesVal, irregularIndexes.get(), length,
839 [](const EcmaVM* vm, const Local<JSValueRef>& jsValue) {
840 bool isNumber = false;
841 return jsValue->GetValueInt32(isNumber);
842 });
843
844 GridLayoutOptions options;
845 // only support regularSize(1, 1)
846 options.regularSize.rows = 1;
847 options.regularSize.columns = 1;
848 if (irregularResult) {
849 for (int32_t i = 0; i < length; i++) {
850 options.irregularIndexes.emplace(irregularIndexes[i]);
851 }
852 }
853 irregularIndexes.reset();
854 ParseGetGridItemSize(vm, runtimeCallInfo->GetCallArgRef(4), options); // 4: parameter index
855 ParseGetGridItemRect(vm, runtimeCallInfo->GetCallArgRef(5), options); // 5: parameter index
856 GridModelNG::SetLayoutOptions(reinterpret_cast<FrameNode*>(nativeNode), options);
857 return panda::JSValueRef::Undefined(vm);
858 }
859
SetOnGridScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)860 ArkUINativeModuleValue GridBridge::SetOnGridScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
861 {
862 EcmaVM* vm = runtimeCallInfo->GetVM();
863 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
864 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
865 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
866 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
867 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
868 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
869 GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollIndex(nativeNode);
870 return panda::JSValueRef::Undefined(vm);
871 }
872 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
873 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
874 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
875
876 std::function<void(int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
877 const int32_t first, const int32_t last) {
878 panda::LocalScope pandaScope(vm);
879 panda::TryCatch trycatch(vm);
880 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
881
882 panda::Local<panda::NumberRef> firstParam = panda::NumberRef::New(vm, first);
883 panda::Local<panda::NumberRef> lastParam = panda::NumberRef::New(vm, last);
884 // 2: Array length
885 panda::Local<panda::JSValueRef> params[2] = { firstParam, lastParam };
886 func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
887 };
888 GetArkUINodeModifiers()->getGridModifier()->setOnGridScrollIndexCallBack(
889 nativeNode, reinterpret_cast<void*>(&callback));
890 return panda::JSValueRef::Undefined(vm);
891 }
892
ResetOnGridScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)893 ArkUINativeModuleValue GridBridge::ResetOnGridScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
894 {
895 EcmaVM* vm = runtimeCallInfo->GetVM();
896 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
897 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
898 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
899 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
900 GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollIndex(nativeNode);
901 return panda::JSValueRef::Undefined(vm);
902 }
903
SetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)904 ArkUINativeModuleValue GridBridge::SetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
905 {
906 EcmaVM* vm = runtimeCallInfo->GetVM();
907 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
908 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
909 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
910 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
911 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
912 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
913 GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollBarUpdate(nativeNode);
914 return panda::JSValueRef::Undefined(vm);
915 }
916 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
917 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
918 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
919
920 std::function<std::pair<std::optional<float>, std::optional<float>>(int32_t, Dimension)> callback =
921 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const int32_t index, const Dimension& offset) {
922 panda::LocalScope pandaScope(vm);
923 panda::TryCatch trycatch(vm);
924 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
925
926 panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
927 panda::Local<panda::NumberRef> offsetParam =
928 panda::NumberRef::New(vm, static_cast<double>(offset.ConvertToVp()));
929
930 // 2: Array length
931 panda::Local<panda::JSValueRef> params[2] = { indexParam, offsetParam };
932 auto result = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
933 if (result->IsObject(vm)) {
934 auto resultObj = result->ToObject(vm);
935 panda::Local<panda::JSValueRef> offset =
936 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "totalOffset"));
937 panda::Local<panda::JSValueRef> length =
938 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "totalLength"));
939 CalcDimension totalOffset_;
940 CalcDimension totalLength_;
941 if (ArkTSUtils::ParseJsDimensionVp(vm, offset, totalOffset_) &&
942 ArkTSUtils::ParseJsDimensionVp(vm, length, totalLength_)) {
943 return std::pair<float, float>(totalOffset_.ConvertToPx(), totalLength_.ConvertToPx());
944 }
945 }
946 return std::pair<float, float>(0, 0);
947 };
948 GetArkUINodeModifiers()->getGridModifier()->setOnGridScrollBarUpdateCallBack(
949 nativeNode, reinterpret_cast<void*>(&callback));
950 return panda::JSValueRef::Undefined(vm);
951 }
952
ResetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)953 ArkUINativeModuleValue GridBridge::ResetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
954 {
955 EcmaVM* vm = runtimeCallInfo->GetVM();
956 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
957 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
958 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
959 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
960 GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollBarUpdate(nativeNode);
961 return panda::JSValueRef::Undefined(vm);
962 }
963
SetOnGridItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)964 ArkUINativeModuleValue GridBridge::SetOnGridItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
965 {
966 EcmaVM* vm = runtimeCallInfo->GetVM();
967 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
968 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
969 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
970 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
971 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
972 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
973
974 JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo);
975 if (!info[1]->IsFunction()) {
976 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragStart(nativeNode);
977 return panda::JSValueRef::Undefined(vm);
978 }
979
980 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
981 std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
982 execCtx = info.GetExecutionContext()](
983 const ItemDragInfo& dragInfo, int32_t itemIndex) {
984 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
985 panda::LocalScope pandaScope(vm);
986 panda::TryCatch trycatch(vm);
987
988 auto ret = func->ItemDragStartExecute(dragInfo, itemIndex);
989 if (!ret->IsFunction()) {
990 return;
991 }
992
993 auto builderFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSFunc>::Cast(ret));
994 if (!builderFunc) {
995 return;
996 }
997
998 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
999 builderFunc->Execute();
1000 };
1001 GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragStart(nativeNode, reinterpret_cast<void*>(&callback));
1002 return panda::JSValueRef::Undefined(vm);
1003 }
1004
ResetOnGridItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1005 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1006 {
1007 EcmaVM* vm = runtimeCallInfo->GetVM();
1008 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1009 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1010 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1011 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1012 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragStart(nativeNode);
1013 return panda::JSValueRef::Undefined(vm);
1014 }
1015
SetOnGridItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)1016 ArkUINativeModuleValue GridBridge::SetOnGridItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1017 {
1018 EcmaVM* vm = runtimeCallInfo->GetVM();
1019 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1020 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1021 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1022 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1023 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1024 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1025
1026 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1027 if (!info[1]->IsFunction()) {
1028 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragEnter(nativeNode);
1029 return panda::JSValueRef::Undefined(vm);
1030 }
1031 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1032
1033 std::function<void(const ItemDragInfo&)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
1034 execCtx = info.GetExecutionContext()](
1035 const ItemDragInfo& dragInfo) {
1036 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1037 panda::LocalScope pandaScope(vm);
1038 panda::TryCatch trycatch(vm);
1039
1040 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1041 func->ItemDragEnterExecute(dragInfo);
1042 };
1043 GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragEnter(nativeNode, reinterpret_cast<void*>(&callback));
1044 return panda::JSValueRef::Undefined(vm);
1045 }
1046
ResetOnGridItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)1047 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1048 {
1049 EcmaVM* vm = runtimeCallInfo->GetVM();
1050 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1051 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1052 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1053 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1054 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragEnter(nativeNode);
1055 return panda::JSValueRef::Undefined(vm);
1056 }
1057
SetOnGridItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1058 ArkUINativeModuleValue GridBridge::SetOnGridItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1059 {
1060 EcmaVM* vm = runtimeCallInfo->GetVM();
1061 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1062 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1063 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1064 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1065 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1066 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1067
1068 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1069 if (!info[1]->IsFunction()) {
1070 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragMove(nativeNode);
1071 return panda::JSValueRef::Undefined(vm);
1072 }
1073 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1074
1075 std::function<void(const ItemDragInfo&, int32_t, int32_t)> callback =
1076 [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1077 const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) {
1078 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1079 panda::LocalScope pandaScope(vm);
1080 panda::TryCatch trycatch(vm);
1081
1082 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1083 func->ItemDragMoveExecute(dragInfo, itemIndex, insertIndex);
1084 };
1085 GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragMove(nativeNode, reinterpret_cast<void*>(&callback));
1086 return panda::JSValueRef::Undefined(vm);
1087 }
1088
ResetOnGridItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1089 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1090 {
1091 EcmaVM* vm = runtimeCallInfo->GetVM();
1092 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1093 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1094 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1095 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1096 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragMove(nativeNode);
1097 return panda::JSValueRef::Undefined(vm);
1098 }
1099
SetOnGridItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1100 ArkUINativeModuleValue GridBridge::SetOnGridItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1101 {
1102 EcmaVM* vm = runtimeCallInfo->GetVM();
1103 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1104 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1105 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1106 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1107 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1108 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1109
1110 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1111 if (!info[1]->IsFunction()) {
1112 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragLeave(nativeNode);
1113 return panda::JSValueRef::Undefined(vm);
1114 }
1115 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1116
1117 std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
1118 execCtx = info.GetExecutionContext()](
1119 const ItemDragInfo& dragInfo, int32_t itemIndex) {
1120 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1121 panda::LocalScope pandaScope(vm);
1122 panda::TryCatch trycatch(vm);
1123
1124 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1125 func->ItemDragLeaveExecute(dragInfo, itemIndex);
1126 };
1127 GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragLeave(nativeNode, reinterpret_cast<void*>(&callback));
1128 return panda::JSValueRef::Undefined(vm);
1129 }
1130
ResetOnGridItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1131 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1132 {
1133 EcmaVM* vm = runtimeCallInfo->GetVM();
1134 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1135 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1136 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1137 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1138 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragLeave(nativeNode);
1139 return panda::JSValueRef::Undefined(vm);
1140 }
1141
SetOnGridItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1142 ArkUINativeModuleValue GridBridge::SetOnGridItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1143 {
1144 EcmaVM* vm = runtimeCallInfo->GetVM();
1145 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1146 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1147 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1148 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1149 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1150 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1151
1152 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1153 if (!info[1]->IsFunction()) {
1154 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDrop(nativeNode);
1155 return panda::JSValueRef::Undefined(vm);
1156 }
1157 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1158
1159 std::function<void(const ItemDragInfo&, int32_t, int32_t, bool)> callback =
1160 [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1161 const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess) {
1162 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1163 panda::LocalScope pandaScope(vm);
1164 panda::TryCatch trycatch(vm);
1165
1166 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1167 func->ItemDropExecute(dragInfo, itemIndex, insertIndex, isSuccess);
1168 };
1169 GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDrop(nativeNode, reinterpret_cast<void*>(&callback));
1170 return panda::JSValueRef::Undefined(vm);
1171 }
1172
ResetOnGridItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1173 ArkUINativeModuleValue GridBridge::ResetOnGridItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1174 {
1175 EcmaVM* vm = runtimeCallInfo->GetVM();
1176 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1177 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1178 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1179 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1180 GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDrop(nativeNode);
1181 return panda::JSValueRef::Undefined(vm);
1182 }
1183 } // namespace OHOS::Ace::NG
1184