1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_list_bridge.h"
16
17 #include "core/interfaces/native/node/node_api.h"
18 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "frameworks/bridge/declarative_frontend/jsview/js_list.h"
20 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
21 #include "frameworks/core/components/list/list_theme.h"
22 #include "frameworks/core/components_ng/pattern/list/list_model.h"
23 #include "frameworks/core/components_ng/pattern/list/list_model_ng.h"
24 #include "frameworks/core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h"
25 #include "frameworks/core/components_ng/base/view_stack_model.h"
26 using namespace OHOS::Ace::Framework;
27
28 namespace OHOS::Ace::NG {
29 constexpr int32_t LIST_ARG_INDEX_0 = 0;
30 constexpr int32_t LIST_ARG_INDEX_1 = 1;
31 constexpr int32_t LIST_ARG_INDEX_2 = 2;
32 constexpr int32_t LIST_ARG_INDEX_3 = 3;
33 constexpr int32_t LIST_ARG_INDEX_4 = 4;
34 constexpr int32_t LIST_ARG_INDEX_5 = 5;
35 constexpr int32_t LIST_ARG_INDEX_6 = 6;
36 constexpr int32_t LIST_ARG_INDEX_7 = 7;
37 constexpr int32_t DEFAULT_CACHED_COUNT = 1;
38
39 constexpr int32_t ARG_LENGTH = 3;
40
SetListLanes(ArkUIRuntimeCallInfo * runtimeCallInfo)41 ArkUINativeModuleValue ListBridge::SetListLanes(ArkUIRuntimeCallInfo* runtimeCallInfo)
42 {
43 EcmaVM* vm = runtimeCallInfo->GetVM();
44 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
45 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0); // 0: index of parameter frameNode
46 Local<JSValueRef> laneNumArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of parameter laneNum
47 Local<JSValueRef> minLengthArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of parameter minLength
48 Local<JSValueRef> maxLengthArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of parameter maxLength
49 Local<JSValueRef> gutterArg = runtimeCallInfo->GetCallArgRef(4); // 4: index of parameter gutter
50 auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
51 ArkUIDimensionType gutterType;
52 ArkUIDimensionType minLengthType;
53 ArkUIDimensionType maxLengthType;
54
55 CalcDimension gutter = Dimension(0.0);
56 int32_t laneNum = 1;
57 CalcDimension minLength = -1.0_vp;
58 CalcDimension maxLength = -1.0_vp;
59 if (!gutterArg->IsUndefined() && ArkTSUtils::ParseJsDimensionVp(vm, gutterArg, gutter)) {
60 if (gutter.IsNegative()) {
61 gutter.Reset();
62 }
63 gutterType.value = gutter.Value();
64 gutterType.units = static_cast<int32_t>(gutter.Unit());
65 }
66 if (!laneNumArg->IsUndefined() && ArkTSUtils::ParseJsInteger(vm, laneNumArg, laneNum)) {
67 minLengthType.value = minLength.Value();
68 minLengthType.units = static_cast<int32_t>(minLength.Unit());
69 maxLengthType.value = maxLength.Value();
70 maxLengthType.units = static_cast<int32_t>(maxLength.Unit());
71 }
72 if (!minLengthArg->IsUndefined() && !maxLengthArg->IsUndefined() &&
73 ArkTSUtils::ParseJsDimensionVp(vm, minLengthArg, minLength) &&
74 ArkTSUtils::ParseJsDimensionVp(vm, maxLengthArg, maxLength)) {
75 laneNum = -1;
76 minLengthType.value = minLength.Value();
77 minLengthType.units = static_cast<int32_t>(minLength.Unit());
78 maxLengthType.value = maxLength.Value();
79 maxLengthType.units = static_cast<int32_t>(maxLength.Unit());
80 }
81 GetArkUINodeModifiers()->getListModifier()->setListLanes(
82 nativeNode, laneNum, &minLengthType, &maxLengthType, &gutterType);
83 return panda::JSValueRef::Undefined(vm);
84 }
85
ResetListLanes(ArkUIRuntimeCallInfo * runtimeCallInfo)86 ArkUINativeModuleValue ListBridge::ResetListLanes(ArkUIRuntimeCallInfo* runtimeCallInfo)
87 {
88 EcmaVM* vm = runtimeCallInfo->GetVM();
89 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
90 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
91 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
92 GetArkUINodeModifiers()->getListModifier()->resetListLanes(nativeNode);
93
94 return panda::JSValueRef::Undefined(vm);
95 }
SetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)96 ArkUINativeModuleValue ListBridge::SetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
97 {
98 EcmaVM* vm = runtimeCallInfo->GetVM();
99 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
100 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
101 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
102 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
103 if (secondArg->IsUndefined()) {
104 GetArkUINodeModifiers()->getListModifier()->resetEditMode(nativeNode);
105 } else {
106 bool editMode = secondArg->ToBoolean(vm)->Value();
107 GetArkUINodeModifiers()->getListModifier()->setEditMode(nativeNode, editMode);
108 }
109
110 return panda::JSValueRef::Undefined(vm);
111 }
112
ResetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)113 ArkUINativeModuleValue ListBridge::ResetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
114 {
115 EcmaVM* vm = runtimeCallInfo->GetVM();
116 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
117 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
118 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
119 GetArkUINodeModifiers()->getListModifier()->resetEditMode(nativeNode);
120
121 return panda::JSValueRef::Undefined(vm);
122 }
123
SetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)124 ArkUINativeModuleValue ListBridge::SetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
125 {
126 EcmaVM* vm = runtimeCallInfo->GetVM();
127 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
128 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
129 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
130 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
131 if (secondArg->IsUndefined()) {
132 GetArkUINodeModifiers()->getListModifier()->resetMultiSelectable(nativeNode);
133 } else {
134 bool selectable = secondArg->ToBoolean(vm)->Value();
135 GetArkUINodeModifiers()->getListModifier()->setMultiSelectable(nativeNode, selectable);
136 }
137
138 return panda::JSValueRef::Undefined(vm);
139 }
140
ResetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)141 ArkUINativeModuleValue ListBridge::ResetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
142 {
143 EcmaVM* vm = runtimeCallInfo->GetVM();
144 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
145 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
146 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
147 GetArkUINodeModifiers()->getListModifier()->resetMultiSelectable(nativeNode);
148
149 return panda::JSValueRef::Undefined(vm);
150 }
151
SetChainAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)152 ArkUINativeModuleValue ListBridge::SetChainAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
153 {
154 EcmaVM* vm = runtimeCallInfo->GetVM();
155 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
156 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
157 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
158 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
159 bool chainAnimation = secondArg->ToBoolean(vm)->Value();
160 GetArkUINodeModifiers()->getListModifier()->setChainAnimation(nativeNode, chainAnimation);
161
162 return panda::JSValueRef::Undefined(vm);
163 }
164
ResetChainAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)165 ArkUINativeModuleValue ListBridge::ResetChainAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
166 {
167 EcmaVM* vm = runtimeCallInfo->GetVM();
168 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
169 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
170 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
171 GetArkUINodeModifiers()->getListModifier()->resetChainAnimation(nativeNode);
172
173 return panda::JSValueRef::Undefined(vm);
174 }
175
SetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)176 ArkUINativeModuleValue ListBridge::SetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
177 {
178 EcmaVM* vm = runtimeCallInfo->GetVM();
179 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
180 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
181 Local<JSValueRef> cacheCountArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
182 Local<JSValueRef> cacheShowArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
183
184 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
185
186 auto cacheCount = DEFAULT_CACHED_COUNT;
187 if (!cacheCountArg->IsUndefined()) {
188 ArkTSUtils::ParseJsInteger(vm, cacheCountArg, cacheCount);
189 if (cacheCount < 0) {
190 cacheCount = DEFAULT_CACHED_COUNT;
191 }
192 }
193 GetArkUINodeModifiers()->getListModifier()->setCachedCount(nativeNode, cacheCount);
194
195 bool show = !cacheShowArg.IsNull() && cacheShowArg->IsTrue();
196 GetArkUINodeModifiers()->getListModifier()->setShowCached(nativeNode, show);
197
198 return panda::JSValueRef::Undefined(vm);
199 }
200
ResetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)201 ArkUINativeModuleValue ListBridge::ResetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
202 {
203 EcmaVM* vm = runtimeCallInfo->GetVM();
204 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
205 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
206 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
207 GetArkUINodeModifiers()->getListModifier()->resetCachedCount(nativeNode);
208 GetArkUINodeModifiers()->getListModifier()->resetShowCached(nativeNode);
209
210 return panda::JSValueRef::Undefined(vm);
211 }
212
SetEnableScrollInteraction(ArkUIRuntimeCallInfo * runtimeCallInfo)213 ArkUINativeModuleValue ListBridge::SetEnableScrollInteraction(ArkUIRuntimeCallInfo* runtimeCallInfo)
214 {
215 EcmaVM* vm = runtimeCallInfo->GetVM();
216 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
217 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
218 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
219 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
220 if (secondArg->IsBoolean()) {
221 bool enableScrollInteraction = secondArg->ToBoolean(vm)->Value();
222 GetArkUINodeModifiers()->getListModifier()->setEnableScrollInteraction(nativeNode, enableScrollInteraction);
223 } else {
224 GetArkUINodeModifiers()->getListModifier()->resetEnableScrollInteraction(nativeNode);
225 }
226
227 return panda::JSValueRef::Undefined(vm);
228 }
229
ResetEnableScrollInteraction(ArkUIRuntimeCallInfo * runtimeCallInfo)230 ArkUINativeModuleValue ListBridge::ResetEnableScrollInteraction(ArkUIRuntimeCallInfo* runtimeCallInfo)
231 {
232 EcmaVM* vm = runtimeCallInfo->GetVM();
233 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
234 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
235 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
236 GetArkUINodeModifiers()->getListModifier()->resetEnableScrollInteraction(nativeNode);
237
238 return panda::JSValueRef::Undefined(vm);
239 }
240
SetSticky(ArkUIRuntimeCallInfo * runtimeCallInfo)241 ArkUINativeModuleValue ListBridge::SetSticky(ArkUIRuntimeCallInfo* runtimeCallInfo)
242 {
243 EcmaVM* vm = runtimeCallInfo->GetVM();
244 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
245 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
246 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
247 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
248 if (secondArg->IsUndefined()) {
249 GetArkUINodeModifiers()->getListModifier()->resetSticky(nativeNode);
250 } else {
251 int32_t stickyStyle = secondArg->ToNumber(vm)->Value();
252 GetArkUINodeModifiers()->getListModifier()->setSticky(nativeNode, stickyStyle);
253 }
254
255 return panda::JSValueRef::Undefined(vm);
256 }
257
ResetSticky(ArkUIRuntimeCallInfo * runtimeCallInfo)258 ArkUINativeModuleValue ListBridge::ResetSticky(ArkUIRuntimeCallInfo* runtimeCallInfo)
259 {
260 EcmaVM* vm = runtimeCallInfo->GetVM();
261 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
262 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
263 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
264 GetArkUINodeModifiers()->getListModifier()->resetSticky(nativeNode);
265
266 return panda::JSValueRef::Undefined(vm);
267 }
268
SetListEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)269 ArkUINativeModuleValue ListBridge::SetListEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
270 {
271 EcmaVM* vm = runtimeCallInfo->GetVM();
272 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
273 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
274 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
275 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
276
277 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
278 int32_t effect = static_cast<int32_t>(EdgeEffect::SPRING);
279
280 if (secondArg->IsUndefined() || secondArg->IsNull()) {
281 effect = static_cast<int32_t>(EdgeEffect::SPRING);
282 } else {
283 effect = secondArg->Int32Value(vm);
284 }
285 if (effect < static_cast<int32_t>(EdgeEffect::SPRING) || effect > static_cast<int32_t>(EdgeEffect::NONE)) {
286 effect = static_cast<int32_t>(EdgeEffect::SPRING);
287 }
288 if (thirdArg->IsUndefined() || thirdArg->IsNull()) {
289 GetArkUINodeModifiers()->getListModifier()->setListEdgeEffect(nativeNode, effect, false);
290 } else {
291 GetArkUINodeModifiers()->getListModifier()->setListEdgeEffect(
292 nativeNode, effect, thirdArg->ToBoolean(vm)->Value());
293 }
294 return panda::JSValueRef::Undefined(vm);
295 }
296
ResetListEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)297 ArkUINativeModuleValue ListBridge::ResetListEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
298 {
299 EcmaVM* vm = runtimeCallInfo->GetVM();
300 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
301 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
302 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
303 GetArkUINodeModifiers()->getListModifier()->resetListEdgeEffect(nativeNode);
304 return panda::JSValueRef::Undefined(vm);
305 }
306
SetFadingEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)307 ArkUINativeModuleValue ListBridge::SetFadingEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
308 {
309 EcmaVM* vm = runtimeCallInfo->GetVM();
310 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
311 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
312 Local<JSValueRef> fadingEdgeArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
313 Local<JSValueRef> fadingEdgeLengthArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
314
315 auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
316 CalcDimension fadingEdgeLength = Dimension(32.0f, DimensionUnit::VP); // default value
317
318 if (fadingEdgeArg->IsUndefined() || fadingEdgeArg->IsNull()) {
319 GetArkUINodeModifiers()->getListModifier()->resetListFadingEdge(nativeNode);
320 } else {
321 bool fadingEdge = fadingEdgeArg->ToBoolean(vm)->Value();
322 if (!fadingEdgeLengthArg->IsUndefined() && !fadingEdgeLengthArg->IsNull() &&
323 fadingEdgeLengthArg->IsObject(vm)) {
324 ArkTSUtils::ParseJsLengthMetrics(vm, fadingEdgeLengthArg, fadingEdgeLength);
325 }
326 GetArkUINodeModifiers()->getListModifier()->setListFadingEdge(
327 nativeNode, fadingEdge, fadingEdgeLength.Value(), static_cast<int32_t>(fadingEdgeLength.Unit()));
328 }
329 return panda::JSValueRef::Undefined(vm);
330 }
331
ResetFadingEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)332 ArkUINativeModuleValue ListBridge::ResetFadingEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
333 {
334 EcmaVM* vm = runtimeCallInfo->GetVM();
335 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
336 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
337 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
338 GetArkUINodeModifiers()->getListModifier()->resetListFadingEdge(nativeNode);
339
340 return panda::JSValueRef::Undefined(vm);
341 }
342
SetListDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)343 ArkUINativeModuleValue ListBridge::SetListDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
344 {
345 EcmaVM* vm = runtimeCallInfo->GetVM();
346 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
347 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
348 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
349 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
350 if (secondArg->IsUndefined()) {
351 GetArkUINodeModifiers()->getListModifier()->resetListDirection(nativeNode);
352 } else {
353 int32_t direction = secondArg->ToNumber(vm)->Value();
354 GetArkUINodeModifiers()->getListModifier()->setListDirection(nativeNode, direction);
355 }
356
357 return panda::JSValueRef::Undefined(vm);
358 }
ResetListDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)359 ArkUINativeModuleValue ListBridge::ResetListDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
360 {
361 EcmaVM* vm = runtimeCallInfo->GetVM();
362 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
363 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
364 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
365 GetArkUINodeModifiers()->getListModifier()->resetListDirection(nativeNode);
366
367 return panda::JSValueRef::Undefined(vm);
368 }
369
SetListFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)370 ArkUINativeModuleValue ListBridge::SetListFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
371 {
372 EcmaVM* vm = runtimeCallInfo->GetVM();
373 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
374 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
375 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
376
377 double friction = -1.0;
378 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
379 if (secondArg->IsUndefined() || secondArg->IsNull() || !ArkTSUtils::ParseJsDouble(vm, secondArg, friction)) {
380 friction = -1.0;
381 }
382 GetArkUINodeModifiers()->getListModifier()->setListFriction(nativeNode, friction);
383 return panda::JSValueRef::Undefined(vm);
384 }
385
ResetListFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)386 ArkUINativeModuleValue ListBridge::ResetListFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
387 {
388 EcmaVM* vm = runtimeCallInfo->GetVM();
389 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
390 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
391 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
392 GetArkUINodeModifiers()->getListModifier()->resetListFriction(nativeNode);
393 return panda::JSValueRef::Undefined(vm);
394 }
395
SetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)396 ArkUINativeModuleValue ListBridge::SetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
397 {
398 EcmaVM* vm = runtimeCallInfo->GetVM();
399 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
400 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
401 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
402 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
403
404 if (secondArg->IsBoolean()) {
405 bool enabled = secondArg->ToBoolean(vm)->Value();
406 GetArkUINodeModifiers()->getListModifier()->setListMaintainVisibleContentPosition(nativeNode, enabled);
407 } else {
408 GetArkUINodeModifiers()->getListModifier()->resetListMaintainVisibleContentPosition(nativeNode);
409 }
410
411 return panda::JSValueRef::Undefined(vm);
412 }
413
ResetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)414 ArkUINativeModuleValue ListBridge::ResetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
415 {
416 EcmaVM* vm = runtimeCallInfo->GetVM();
417 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
418 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
419 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
420 GetArkUINodeModifiers()->getListModifier()->resetListMaintainVisibleContentPosition(nativeNode);
421 return panda::JSValueRef::Undefined(vm);
422 }
423
SetListNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)424 ArkUINativeModuleValue ListBridge::SetListNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
425 {
426 EcmaVM* vm = runtimeCallInfo->GetVM();
427 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
428 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
429 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
430 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
431
432 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
433 int32_t forward = 0;
434 int32_t backward = 0;
435 if (!secondArg->IsUndefined()) {
436 forward = secondArg->Int32Value(vm);
437 }
438 if (!thirdArg->IsUndefined()) {
439 backward = thirdArg->Int32Value(vm);
440 }
441
442 if (forward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
443 forward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
444 forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
445 }
446
447 if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
448 backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
449 backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
450 }
451
452 GetArkUINodeModifiers()->getListModifier()->setListNestedScroll(nativeNode, forward, backward);
453
454 return panda::JSValueRef::Undefined(vm);
455 }
456
ResetListNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)457 ArkUINativeModuleValue ListBridge::ResetListNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
458 {
459 EcmaVM* vm = runtimeCallInfo->GetVM();
460 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
461 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
462 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
463 GetArkUINodeModifiers()->getListModifier()->resetListNestedScroll(nativeNode);
464 return panda::JSValueRef::Undefined(vm);
465 }
466
SetListScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)467 ArkUINativeModuleValue ListBridge::SetListScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
468 {
469 EcmaVM* vm = runtimeCallInfo->GetVM();
470 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
471 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
472 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
473 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
474 if (secondArg->IsUndefined()) {
475 GetArkUINodeModifiers()->getListModifier()->resetListScrollBar(nativeNode);
476 } else {
477 int32_t barState = secondArg->ToNumber(vm)->Value();
478 GetArkUINodeModifiers()->getListModifier()->setListScrollBar(nativeNode, barState);
479 }
480
481 return panda::JSValueRef::Undefined(vm);
482 }
483
ResetListScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)484 ArkUINativeModuleValue ListBridge::ResetListScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
485 {
486 EcmaVM* vm = runtimeCallInfo->GetVM();
487 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
488 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
489 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
490 GetArkUINodeModifiers()->getListModifier()->resetListScrollBar(nativeNode);
491
492 return panda::JSValueRef::Undefined(vm);
493 }
494
SetListScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)495 ArkUINativeModuleValue ListBridge::SetListScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
496 {
497 EcmaVM* vm = runtimeCallInfo->GetVM();
498 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
499 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
500 Local<JSValueRef> scrollBarArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
501 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
502
503 CalcDimension scrollBarWidth;
504 if (!ArkTSUtils::ParseJsDimension(vm, scrollBarArg, scrollBarWidth, DimensionUnit::VP) || scrollBarArg->IsNull() ||
505 scrollBarArg->IsUndefined() || (scrollBarArg->IsString(vm) && scrollBarWidth.ToString().empty()) ||
506 LessNotEqual(scrollBarWidth.Value(), 0.0) || scrollBarWidth.Unit() == DimensionUnit::PERCENT) {
507 GetArkUINodeModifiers()->getListModifier()->resetListScrollBarWidth(nativeNode);
508 } else {
509 GetArkUINodeModifiers()->getListModifier()->setListScrollBarWidth(
510 nativeNode, scrollBarWidth.ToString().c_str());
511 }
512 return panda::JSValueRef::Undefined(vm);
513 }
514
ResetListScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)515 ArkUINativeModuleValue ListBridge::ResetListScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
516 {
517 EcmaVM* vm = runtimeCallInfo->GetVM();
518 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
519 Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
520 auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
521 GetArkUINodeModifiers()->getListModifier()->resetListScrollBarWidth(nativeNode);
522 return panda::JSValueRef::Undefined(vm);
523 }
524
SetListScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)525 ArkUINativeModuleValue ListBridge::SetListScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
526 {
527 EcmaVM* vm = runtimeCallInfo->GetVM();
528 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
529 Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
530 Local<JSValueRef> argColor = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
531 auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
532 std::string color = "";
533 if (!ArkTSUtils::ParseJsString(vm, argColor, color) || argColor->IsUndefined() || color.empty()) {
534 GetArkUINodeModifiers()->getListModifier()->resetListScrollBarColor(nativeNode);
535 } else {
536 GetArkUINodeModifiers()->getListModifier()->setListScrollBarColor(nativeNode, color.c_str());
537 }
538 return panda::JSValueRef::Undefined(vm);
539 }
540
ResetListScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)541 ArkUINativeModuleValue ListBridge::ResetListScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
542 {
543 EcmaVM* vm = runtimeCallInfo->GetVM();
544 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
545 Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
546 auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
547 GetArkUINodeModifiers()->getListModifier()->resetListScrollBarColor(nativeNode);
548 return panda::JSValueRef::Undefined(vm);
549 }
550
SetFlingSpeedLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)551 ArkUINativeModuleValue ListBridge::SetFlingSpeedLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
552 {
553 EcmaVM* vm = runtimeCallInfo->GetVM();
554 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
555 Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
556 Local<JSValueRef> argSpeed = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
557 auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
558 double limitSpeed = -1.0;
559 if (!ArkTSUtils::ParseJsDouble(vm, argSpeed, limitSpeed)) {
560 GetArkUINodeModifiers()->getListModifier()->resetListFlingSpeedLimit(nativeNode);
561 } else {
562 GetArkUINodeModifiers()->getListModifier()->setListFlingSpeedLimit(
563 nativeNode, static_cast<ArkUI_Float32>(limitSpeed));
564 }
565 return panda::JSValueRef::Undefined(vm);
566 }
567
ResetFlingSpeedLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)568 ArkUINativeModuleValue ListBridge::ResetFlingSpeedLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
569 {
570 EcmaVM* vm = runtimeCallInfo->GetVM();
571 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
572 Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
573 auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
574 GetArkUINodeModifiers()->getListModifier()->resetListFlingSpeedLimit(nativeNode);
575 return panda::JSValueRef::Undefined(vm);
576 }
577
SetAlignListItem(ArkUIRuntimeCallInfo * runtimeCallInfo)578 ArkUINativeModuleValue ListBridge::SetAlignListItem(ArkUIRuntimeCallInfo* runtimeCallInfo)
579 {
580 EcmaVM* vm = runtimeCallInfo->GetVM();
581 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
582 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
583 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
584 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
585 int32_t listItemAlign = secondArg->Int32Value(vm);
586 GetArkUINodeModifiers()->getListModifier()->setAlignListItem(nativeNode, listItemAlign);
587
588 return panda::JSValueRef::Undefined(vm);
589 }
590
ResetAlignListItem(ArkUIRuntimeCallInfo * runtimeCallInfo)591 ArkUINativeModuleValue ListBridge::ResetAlignListItem(ArkUIRuntimeCallInfo* runtimeCallInfo)
592 {
593 EcmaVM* vm = runtimeCallInfo->GetVM();
594 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
595 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
596 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
597 GetArkUINodeModifiers()->getListModifier()->resetAlignListItem(nativeNode);
598 return panda::JSValueRef::Undefined(vm);
599 }
600
SetScrollSnapAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)601 ArkUINativeModuleValue ListBridge::SetScrollSnapAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
602 {
603 EcmaVM* vm = runtimeCallInfo->GetVM();
604 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
605 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
606 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
607 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
608 if (secondArg->IsUndefined()) {
609 GetArkUINodeModifiers()->getListModifier()->resetScrollSnapAlign(nativeNode);
610 } else {
611 int32_t scrollSnapAlign = secondArg->Int32Value(vm);
612 GetArkUINodeModifiers()->getListModifier()->setScrollSnapAlign(nativeNode, scrollSnapAlign);
613 }
614
615 return panda::JSValueRef::Undefined(vm);
616 }
617
ResetScrollSnapAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)618 ArkUINativeModuleValue ListBridge::ResetScrollSnapAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
619 {
620 EcmaVM* vm = runtimeCallInfo->GetVM();
621 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
622 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
623 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
624 GetArkUINodeModifiers()->getListModifier()->resetScrollSnapAlign(nativeNode);
625 return panda::JSValueRef::Undefined(vm);
626 }
627
SetContentStartOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)628 ArkUINativeModuleValue ListBridge::SetContentStartOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
629 {
630 EcmaVM* vm = runtimeCallInfo->GetVM();
631 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
632 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
633 Local<JSValueRef> startOffsetArg = runtimeCallInfo->GetCallArgRef(1);
634 auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
635 double startOffset = 0.0;
636 ArkTSUtils::ParseJsDouble(vm, startOffsetArg, startOffset);
637
638 GetArkUINodeModifiers()->getListModifier()->setContentStartOffset(nativeNode, startOffset);
639
640 return panda::JSValueRef::Undefined(vm);
641 }
642
ResetContentStartOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)643 ArkUINativeModuleValue ListBridge::ResetContentStartOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
644 {
645 EcmaVM* vm = runtimeCallInfo->GetVM();
646 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
647 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
648 auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
649 GetArkUINodeModifiers()->getListModifier()->resetContentStartOffset(nativeNode);
650
651 return panda::JSValueRef::Undefined(vm);
652 }
653
SetContentEndOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)654 ArkUINativeModuleValue ListBridge::SetContentEndOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
655 {
656 EcmaVM* vm = runtimeCallInfo->GetVM();
657 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
658 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
659 Local<JSValueRef> endOffsetArg = runtimeCallInfo->GetCallArgRef(1);
660 auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
661 double endOffset = 0.0;
662 ArkTSUtils::ParseJsDouble(vm, endOffsetArg, endOffset);
663
664 GetArkUINodeModifiers()->getListModifier()->setContentEndOffset(nativeNode, endOffset);
665
666 return panda::JSValueRef::Undefined(vm);
667 }
668
ResetContentEndOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)669 ArkUINativeModuleValue ListBridge::ResetContentEndOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
670 {
671 EcmaVM* vm = runtimeCallInfo->GetVM();
672 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
673 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
674 auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
675 GetArkUINodeModifiers()->getListModifier()->resetContentEndOffset(nativeNode);
676
677 return panda::JSValueRef::Undefined(vm);
678 }
679
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)680 ArkUINativeModuleValue ListBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
681 {
682 EcmaVM* vm = runtimeCallInfo->GetVM();
683 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
684 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
685 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
686 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
687 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
688 Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_3);
689 Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_4);
690 if (dividerStrokeWidthArgs->IsUndefined() && dividerStartMarginArgs->IsUndefined() &&
691 dividerEndMarginArgs->IsUndefined() && colorArg->IsUndefined()) {
692 GetArkUINodeModifiers()->getListModifier()->listResetDivider(nativeNode);
693 return panda::JSValueRef::Undefined(vm);
694 }
695
696 CalcDimension dividerStrokeWidth;
697 CalcDimension dividerStartMargin;
698 CalcDimension dividerEndMargin;
699 uint32_t color;
700 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
701 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
702 auto context = frameNode->GetContext();
703 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
704 auto themeManager = context->GetThemeManager();
705 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
706 auto listTheme = themeManager->GetTheme<ListTheme>();
707 CHECK_NULL_RETURN(listTheme, panda::NativePointerRef::New(vm, nullptr));
708
709 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, dividerStrokeWidthArgs, dividerStrokeWidth) ||
710 LessNotEqual(dividerStrokeWidth.Value(), 0.0f) || dividerStrokeWidth.Unit() == DimensionUnit::PERCENT) {
711 dividerStrokeWidth.Reset();
712 }
713 Color colorObj;
714 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
715 color = listTheme->GetDividerColor().GetValue();
716 } else {
717 color = colorObj.GetValue();
718 }
719 if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerStartMarginArgs, dividerStartMargin) ||
720 LessNotEqual(dividerStartMargin.Value(), 0.0f) || dividerStartMargin.Unit() == DimensionUnit::PERCENT) {
721 dividerStartMargin.Reset();
722 }
723 if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerEndMarginArgs, dividerEndMargin) ||
724 LessNotEqual(dividerEndMargin.Value(), 0.0f) || dividerEndMargin.Unit() == DimensionUnit::PERCENT) {
725 dividerEndMargin.Reset();
726 }
727 uint32_t size = ARG_LENGTH;
728 ArkUI_Float32 values[size];
729 int32_t units[size];
730 values[LIST_ARG_INDEX_0] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
731 values[LIST_ARG_INDEX_1] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
732 values[LIST_ARG_INDEX_2] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
733 units[LIST_ARG_INDEX_0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
734 units[LIST_ARG_INDEX_1] = static_cast<int32_t>(dividerStartMargin.Unit());
735 units[LIST_ARG_INDEX_2] = static_cast<int32_t>(dividerEndMargin.Unit());
736 GetArkUINodeModifiers()->getListModifier()->listSetDivider(nativeNode, color, values, units, size);
737
738 return panda::JSValueRef::Undefined(vm);
739 }
740
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)741 ArkUINativeModuleValue ListBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
742 {
743 EcmaVM* vm = runtimeCallInfo->GetVM();
744 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
745 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
746 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
747 GetArkUINodeModifiers()->getListModifier()->listResetDivider(nativeNode);
748 return panda::JSValueRef::Undefined(vm);
749 }
750
SetChainAnimationOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)751 ArkUINativeModuleValue ListBridge::SetChainAnimationOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
752 {
753 EcmaVM* vm = runtimeCallInfo->GetVM();
754 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
755 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
756 Local<JSValueRef> minSpaceArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
757 Local<JSValueRef> maxSpaceArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
758 Local<JSValueRef> conductivityArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_3);
759 Local<JSValueRef> intensityArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_4);
760 Local<JSValueRef> edgeEffectArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_5);
761 Local<JSValueRef> stiffnessArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_6);
762 Local<JSValueRef> dampingArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_7);
763
764 CalcDimension minSpace;
765 CalcDimension maxSpace;
766
767 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
768 if (minSpaceArgs->IsUndefined() && maxSpaceArgs->IsUndefined() && conductivityArgs->IsUndefined() &&
769 intensityArgs->IsUndefined() && edgeEffectArgs->IsUndefined() && stiffnessArgs->IsUndefined() &&
770 dampingArgs->IsUndefined()) {
771 GetArkUINodeModifiers()->getListModifier()->resetChainAnimationOptions(nativeNode);
772 return panda::JSValueRef::Undefined(vm);
773 } else {
774 RefPtr<ListTheme> listTheme = ArkTSUtils::GetTheme<ListTheme>();
775 CHECK_NULL_RETURN(listTheme, panda::NativePointerRef::New(vm, nullptr));
776
777 minSpace = listTheme->GetChainMinSpace();
778 maxSpace = listTheme->GetChainMaxSpace();
779 ArkUIChainAnimationOptionsType chainAnimationOptions;
780
781 double conductivity;
782 double intensity;
783
784 chainAnimationOptions.conductivity = listTheme->GetChainConductivity();
785 chainAnimationOptions.intensity = listTheme->GetChainIntensity();
786 chainAnimationOptions.edgeEffect = 0;
787 chainAnimationOptions.stiffness = listTheme->GetChainStiffness();
788 chainAnimationOptions.damping = listTheme->GetChainDamping();
789
790 ArkTSUtils::ParseJsDimension(vm, minSpaceArgs, minSpace, DimensionUnit::VP);
791 ArkTSUtils::ParseJsDimension(vm, maxSpaceArgs, maxSpace, DimensionUnit::VP);
792 ArkTSUtils::ParseJsDouble(vm, conductivityArgs, conductivity);
793 chainAnimationOptions.conductivity = static_cast<ArkUI_Float32>(conductivity);
794
795 ArkTSUtils::ParseJsDouble(vm, intensityArgs, intensity);
796 chainAnimationOptions.intensity = static_cast<ArkUI_Float32>(intensity);
797
798 if (edgeEffectArgs->IsNumber()) {
799 chainAnimationOptions.edgeEffect = edgeEffectArgs->ToNumber(vm)->Value();
800 }
801
802 double stiffness;
803 double damping;
804
805 ArkTSUtils::ParseJsDouble(vm, stiffnessArgs, stiffness);
806 chainAnimationOptions.stiffness = static_cast<ArkUI_Float32>(stiffness);
807
808 ArkTSUtils::ParseJsDouble(vm, dampingArgs, damping);
809 chainAnimationOptions.damping = static_cast<ArkUI_Float32>(damping);
810
811 chainAnimationOptions.minSpace = minSpace.Value();
812 chainAnimationOptions.minSpaceUnits = static_cast<int32_t>(minSpace.Unit());
813 chainAnimationOptions.maxSpace = maxSpace.Value();
814 chainAnimationOptions.maxSpaceUnits = static_cast<int32_t>(maxSpace.Unit());
815
816 GetArkUINodeModifiers()->getListModifier()->setChainAnimationOptions(nativeNode, &chainAnimationOptions);
817 }
818
819 return panda::JSValueRef::Undefined(vm);
820 }
821
ResetChainAnimationOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)822 ArkUINativeModuleValue ListBridge::ResetChainAnimationOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
823 {
824 EcmaVM* vm = runtimeCallInfo->GetVM();
825 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
826 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
827 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
828 GetArkUINodeModifiers()->getListModifier()->resetChainAnimationOptions(nativeNode);
829 return panda::JSValueRef::Undefined(vm);
830 }
831
SetListChildrenMainSize(ArkUIRuntimeCallInfo * runtimeCallInfo)832 ArkUINativeModuleValue ListBridge::SetListChildrenMainSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
833 {
834 EcmaVM* vm = runtimeCallInfo->GetVM();
835 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
836 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
837 // 2: argument count.
838 if (info.Length() != 2 || !(info[1]->IsObject())) {
839 return panda::JSValueRef::Undefined(vm);
840 }
841 JSList::SetChildrenMainSize(Framework::JSRef<Framework::JSObject>::Cast(info[1]));
842
843 return panda::JSValueRef::Undefined(vm);
844 }
845
ResetListChildrenMainSize(ArkUIRuntimeCallInfo * runtimeCallInfo)846 ArkUINativeModuleValue ListBridge::ResetListChildrenMainSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
847 {
848 EcmaVM* vm = runtimeCallInfo->GetVM();
849 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
850 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
851 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
852 GetArkUINodeModifiers()->getListModifier()->resetListChildrenMainSize(nativeNode);
853
854 return panda::JSValueRef::Undefined(vm);
855 }
856
SetInitialIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)857 ArkUINativeModuleValue ListBridge::SetInitialIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
858 {
859 EcmaVM* vm = runtimeCallInfo->GetVM();
860 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
861 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
862 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
863 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
864 int32_t index = secondArg->ToNumber(vm)->Value();
865 GetArkUINodeModifiers()->getListModifier()->setInitialIndex(nativeNode, index);
866 return panda::JSValueRef::Undefined(vm);
867 }
868
ResetInitialIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)869 ArkUINativeModuleValue ListBridge::ResetInitialIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
870 {
871 EcmaVM* vm = runtimeCallInfo->GetVM();
872 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
873 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
874 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
875 GetArkUINodeModifiers()->getListModifier()->resetInitialIndex(nativeNode);
876 return panda::JSValueRef::Undefined(vm);
877 }
878
SetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)879 ArkUINativeModuleValue ListBridge::SetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
880 {
881 EcmaVM* vm = runtimeCallInfo->GetVM();
882 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
883 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
884 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
885 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
886 float space = secondArg->ToNumber(vm)->Value();
887 GetArkUINodeModifiers()->getListModifier()->setListSpace(nativeNode, space);
888 return panda::JSValueRef::Undefined(vm);
889 }
890
ResetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)891 ArkUINativeModuleValue ListBridge::ResetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
892 {
893 EcmaVM* vm = runtimeCallInfo->GetVM();
894 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
895 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
896 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
897 GetArkUINodeModifiers()->getListModifier()->resetListSpace(nativeNode);
898 return panda::JSValueRef::Undefined(vm);
899 }
900
SetInitialScroller(ArkUIRuntimeCallInfo * runtimeCallInfo)901 ArkUINativeModuleValue ListBridge::SetInitialScroller(ArkUIRuntimeCallInfo* runtimeCallInfo)
902 {
903 EcmaVM* vm = runtimeCallInfo->GetVM();
904 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
905 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
906 Framework::JSRef<Framework::JSVal> args = info[1];
907 if (args->IsObject()) {
908 Framework::JSScroller* scroller =
909 Framework::JSRef<Framework::JSObject>::Cast(args)->Unwrap<Framework::JSScroller>();
910 RefPtr<Framework::JSScroller> jsScroller = Referenced::Claim(scroller);
911 jsScroller->SetInstanceId(Container::CurrentId());
912 SetScroller(runtimeCallInfo, jsScroller);
913 }
914 return panda::JSValueRef::Undefined(vm);
915 }
916
ResetInitialScroller(ArkUIRuntimeCallInfo * runtimeCallInfo)917 ArkUINativeModuleValue ListBridge::ResetInitialScroller(ArkUIRuntimeCallInfo* runtimeCallInfo)
918 {
919 EcmaVM* vm = runtimeCallInfo->GetVM();
920 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
921 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
922 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
923 GetArkUINodeModifiers()->getListModifier()->resetInitialScroller(nativeNode);
924 return panda::JSValueRef::Undefined(vm);
925 }
926
SetScroller(ArkUIRuntimeCallInfo * runtimeCallInfo,RefPtr<Framework::JSScroller> jsScroller)927 void ListBridge::SetScroller(ArkUIRuntimeCallInfo* runtimeCallInfo, RefPtr<Framework::JSScroller> jsScroller)
928 {
929 if (jsScroller) {
930 EcmaVM* vm = runtimeCallInfo->GetVM();
931 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
932 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
933 RefPtr<ScrollControllerBase> listController = ListModel::GetInstance()->CreateScrollController();
934 jsScroller->SetController(listController);
935 auto proxy = jsScroller->GetScrollBarProxy();
936 if (!proxy) {
937 proxy = AceType::MakeRefPtr<NG::ScrollBarProxy>();
938 jsScroller->SetScrollBarProxy(proxy);
939 }
940 auto controller = reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(listController));
941 auto proxyPtr = reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(proxy));
942 GetArkUINodeModifiers()->getListModifier()->setInitialScroller(nativeNode, controller, proxyPtr);
943 }
944 }
945
SetOnScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)946 ArkUINativeModuleValue ListBridge::SetOnScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
947 {
948 EcmaVM *vm = runtimeCallInfo->GetVM();
949 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
950 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
951 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
952 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
953 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
954 GetArkUINodeModifiers()->getListModifier()->resetOnListScrollIndex(nativeNode);
955 return panda::JSValueRef::Undefined(vm);
956 }
957 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
958 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
959 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
960
961 std::function<void(int32_t, int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
962 const int32_t start, const int32_t end,
963 const int32_t center) {
964 panda::LocalScope pandaScope(vm);
965 panda::TryCatch trycatch(vm);
966 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
967
968 panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, start);
969 panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, end);
970 panda::Local<panda::NumberRef> centerParam = panda::NumberRef::New(vm, center);
971 // 3: Array length
972 panda::Local<panda::JSValueRef> params[3] = { startParam, endParam, centerParam };
973 func->Call(vm, func.ToLocal(), params, 3); // 3: Array length
974 };
975 GetArkUINodeModifiers()->getListModifier()->setOnListScrollIndexCallBack(
976 nativeNode, reinterpret_cast<void*>(&callback));
977 return panda::JSValueRef::Undefined(vm);
978 }
979
SetListItemIndex(const EcmaVM * vm,const ListItemIndex indexInfo)980 Local<panda::ObjectRef> SetListItemIndex(const EcmaVM* vm, const ListItemIndex indexInfo)
981 {
982 const char* keys[] = { "index", "itemIndexInGroup", "itemGroupArea" };
983 auto indexInGroup = panda::NumberRef::Undefined(vm);
984 if (indexInfo.indexInGroup != -1) {
985 indexInGroup = panda::NumberRef::New(vm, static_cast<int32_t>(indexInfo.indexInGroup));
986 }
987 auto area = panda::NumberRef::Undefined(vm);
988 if (indexInfo.area != -1) {
989 area = panda::NumberRef::New(vm, static_cast<int32_t>(indexInfo.area));
990 }
991 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(indexInfo.index)), indexInGroup,
992 area };
993 return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
994 }
995
SetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo * runtimeCallInfo)996 ArkUINativeModuleValue ListBridge::SetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
997 {
998 EcmaVM *vm = runtimeCallInfo->GetVM();
999 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1000 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1001 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1002 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1003 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1004 GetArkUINodeModifiers()->getListModifier()->resetOnScrollVisibleContentChange(nativeNode);
1005 return panda::JSValueRef::Undefined(vm);
1006 }
1007 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1008 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1009 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1010
1011 std::function<void(ListItemIndex, ListItemIndex)> callback =
1012 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1013 const ListItemIndex start, const ListItemIndex end) {
1014 panda::LocalScope pandaScope(vm);
1015 panda::TryCatch trycatch(vm);
1016 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1017
1018 auto startParam = SetListItemIndex(vm, start);
1019 auto endParam = SetListItemIndex(vm, end);
1020 startParam->SetNativePointerFieldCount(vm, 1);
1021 startParam->SetNativePointerField(vm, 0, static_cast<void*>(&startParam));
1022 endParam->SetNativePointerFieldCount(vm, 1);
1023 endParam->SetNativePointerField(vm, 0, static_cast<void*>(&endParam));
1024 // 2: Array length
1025 panda::Local<panda::JSValueRef> params[2] = { startParam, endParam };
1026 func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1027 };
1028 GetArkUINodeModifiers()->getListModifier()->setOnScrollVisibleContentChange(
1029 nativeNode, reinterpret_cast<void*>(&callback));
1030 return panda::JSValueRef::Undefined(vm);
1031 }
1032
SetOnItemMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1033 ArkUINativeModuleValue ListBridge::SetOnItemMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1034 {
1035 EcmaVM *vm = runtimeCallInfo->GetVM();
1036 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1037 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1038 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1039 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1040 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1041 GetArkUINodeModifiers()->getListModifier()->resetOnItemMove(nativeNode);
1042 return panda::JSValueRef::Undefined(vm);
1043 }
1044 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1045 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1046 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1047
1048 std::function<bool(int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1049 int32_t start, int32_t end) -> bool {
1050 panda::LocalScope pandaScope(vm);
1051 panda::TryCatch trycatch(vm);
1052 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1053
1054 panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, start);
1055 panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, end);
1056 // 2: Array length
1057 panda::Local<panda::JSValueRef> params[2] = { startParam, endParam};
1058 auto result = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1059 if (result->IsBoolean()) {
1060 return result->ToBoolean(vm)->Value();
1061 }
1062 return false;
1063 };
1064 GetArkUINodeModifiers()->getListModifier()->setOnItemMove(
1065 nativeNode, reinterpret_cast<void*>(&callback));
1066 return panda::JSValueRef::Undefined(vm);
1067 }
1068
SetOnItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1069 ArkUINativeModuleValue ListBridge::SetOnItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1070 {
1071 EcmaVM *vm = runtimeCallInfo->GetVM();
1072 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1073 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1074 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1075 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1076 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1077
1078 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1079 if (!info[1]->IsFunction()) {
1080 return panda::JSValueRef::Undefined(vm);
1081 }
1082
1083 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1084 std::function<RefPtr<AceType>(const ItemDragInfo&, int32_t)> callback =
1085 [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1086 const ItemDragInfo& dragInfo, int32_t itemIndex) -> RefPtr<AceType> {
1087 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx, nullptr);
1088 panda::LocalScope pandaScope(vm);
1089 panda::TryCatch trycatch(vm);
1090
1091 auto ret = func->ItemDragStartExecute(dragInfo, itemIndex);
1092 if (!ret->IsFunction()) {
1093 return nullptr;
1094 }
1095
1096 auto builderFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSFunc>::Cast(ret));
1097 if (!builderFunc) {
1098 return nullptr;
1099 }
1100 // use another VSP instance while executing the builder function
1101 ViewStackModel::GetInstance()->NewScope();
1102 {
1103 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1104 builderFunc->Execute();
1105 }
1106 return ViewStackModel::GetInstance()->Finish();
1107 };
1108 GetArkUINodeModifiers()->getListModifier()->setOnItemDragStart(nativeNode, reinterpret_cast<void*>(&callback));
1109 return panda::JSValueRef::Undefined(vm);
1110 }
1111
SetOnItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)1112 ArkUINativeModuleValue ListBridge::SetOnItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1113 {
1114 EcmaVM *vm = runtimeCallInfo->GetVM();
1115 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1116 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1117 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1118 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1119 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1120
1121 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1122 if (!info[1]->IsFunction()) {
1123 return panda::JSValueRef::Undefined(vm);
1124 }
1125 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1126
1127 std::function<void(const ItemDragInfo&)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
1128 execCtx = info.GetExecutionContext()](
1129 const ItemDragInfo& dragInfo) {
1130 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1131 panda::LocalScope pandaScope(vm);
1132 panda::TryCatch trycatch(vm);
1133
1134 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1135 func->ItemDragEnterExecute(dragInfo);
1136 };
1137 GetArkUINodeModifiers()->getListModifier()->setOnItemDragEnter(nativeNode, reinterpret_cast<void*>(&callback));
1138 return panda::JSValueRef::Undefined(vm);
1139 }
1140
SetOnItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1141 ArkUINativeModuleValue ListBridge::SetOnItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1142 {
1143 EcmaVM *vm = runtimeCallInfo->GetVM();
1144 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1145 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1146 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1147 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1148 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1149
1150 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1151 if (!info[1]->IsFunction()) {
1152 return panda::JSValueRef::Undefined(vm);
1153 }
1154 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1155
1156 std::function<void(const ItemDragInfo&, int32_t, int32_t)> callback =
1157 [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1158 const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) {
1159 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1160 panda::LocalScope pandaScope(vm);
1161 panda::TryCatch trycatch(vm);
1162
1163 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1164 func->ItemDragMoveExecute(dragInfo, itemIndex, insertIndex);
1165 };
1166 GetArkUINodeModifiers()->getListModifier()->setOnItemDragMove(
1167 nativeNode, reinterpret_cast<void*>(&callback));
1168 return panda::JSValueRef::Undefined(vm);
1169 }
1170
SetOnItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1171 ArkUINativeModuleValue ListBridge::SetOnItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1172 {
1173 EcmaVM *vm = runtimeCallInfo->GetVM();
1174 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1175 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1176 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1177 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1178 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1179
1180 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1181 if (!info[1]->IsFunction()) {
1182 return panda::JSValueRef::Undefined(vm);
1183 }
1184 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1185
1186 std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc)](
1187 const ItemDragInfo& dragInfo, int32_t itemIndex) {
1188 panda::LocalScope pandaScope(vm);
1189 panda::TryCatch trycatch(vm);
1190
1191 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1192 func->ItemDragLeaveExecute(dragInfo, itemIndex);
1193 };
1194 GetArkUINodeModifiers()->getListModifier()->setOnItemDragLeave(nativeNode, reinterpret_cast<void*>(&callback));
1195 return panda::JSValueRef::Undefined(vm);
1196 }
1197
SetOnItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1198 ArkUINativeModuleValue ListBridge::SetOnItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1199 {
1200 EcmaVM *vm = runtimeCallInfo->GetVM();
1201 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1202 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1203 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1204 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1205 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1206
1207 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1208 if (!info[1]->IsFunction()) {
1209 return panda::JSValueRef::Undefined(vm);
1210 }
1211 RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1212
1213 std::function<void(const ItemDragInfo&, int32_t, int32_t, bool)> callback =
1214 [vm, frameNode, func = std::move(jsOnDragFunc)](
1215 const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess) {
1216 panda::LocalScope pandaScope(vm);
1217 panda::TryCatch trycatch(vm);
1218
1219 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1220 func->ItemDropExecute(dragInfo, itemIndex, insertIndex, isSuccess);
1221 };
1222 GetArkUINodeModifiers()->getListModifier()->setOnItemDrop(nativeNode, reinterpret_cast<void*>(&callback));
1223 return panda::JSValueRef::Undefined(vm);
1224 }
1225
SetOnListScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1226 ArkUINativeModuleValue ListBridge::SetOnListScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1227 {
1228 EcmaVM *vm = runtimeCallInfo->GetVM();
1229 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1230 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1231 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1232 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1233 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1234 GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStart(nativeNode);
1235 return panda::JSValueRef::Undefined(vm);
1236 }
1237 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1238 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1239 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1240
1241 std::function<void()> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1242 panda::LocalScope pandaScope(vm);
1243 panda::TryCatch trycatch(vm);
1244 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1245 func->Call(vm, func.ToLocal(), nullptr, 0);
1246 };
1247 GetArkUINodeModifiers()->getListModifier()->setOnListScrollStartCallBack(
1248 nativeNode, reinterpret_cast<void*>(&callback));
1249 return panda::JSValueRef::Undefined(vm);
1250 }
1251
SetOnListScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)1252 ArkUINativeModuleValue ListBridge::SetOnListScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1253 {
1254 EcmaVM *vm = runtimeCallInfo->GetVM();
1255 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1256 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1257 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1258 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1259 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1260 GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStop(nativeNode);
1261 return panda::JSValueRef::Undefined(vm);
1262 }
1263 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1264 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1265 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1266 std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1267 panda::LocalScope pandaScope(vm);
1268 panda::TryCatch trycatch(vm);
1269 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1270 func->Call(vm, func.ToLocal(), nullptr, 0);
1271 };
1272 GetArkUINodeModifiers()->getListModifier()->setOnListScrollStopCallBack(
1273 nativeNode, reinterpret_cast<void*>(&callback));
1274 return panda::JSValueRef::Undefined(vm);
1275 }
1276
SetOnListScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)1277 ArkUINativeModuleValue ListBridge::SetOnListScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
1278 {
1279 EcmaVM* vm = runtimeCallInfo->GetVM();
1280 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1281 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1282 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1283 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1284 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1285 GetArkUINodeModifiers()->getListModifier()->resetOnListScrollFrameBegin(nativeNode);
1286 return panda::JSValueRef::Undefined(vm);
1287 }
1288 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1289 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1290 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1291 std::function<ScrollFrameResult(Dimension, ScrollState)> callback = [vm, frameNode,
1292 func = panda::CopyableGlobal(vm, func)](Dimension offset, ScrollState state) -> ScrollFrameResult {
1293 panda::LocalScope pandaScope(vm);
1294 panda::TryCatch trycatch(vm);
1295 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1296
1297 panda::Local<panda::NumberRef> offsetParam = panda::NumberRef::New(
1298 vm, static_cast<double>(offset.ConvertToVp()));
1299 panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
1300 // 2: Array length
1301 panda::Local<panda::JSValueRef> params[2] = { offsetParam, stateParam };
1302 auto value = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1303
1304 OHOS::Ace::ScrollFrameResult scrollRes { .offset = offset };
1305 if (value->IsNumber()) {
1306 scrollRes.offset = Dimension(value->ToNumber(vm)->Value(), DimensionUnit::VP);
1307 }
1308 if (value->IsObject(vm)) {
1309 auto resultObj = value->ToObject(vm);
1310 panda::Local<panda::JSValueRef> remain = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm,
1311 "offsetRemain"));
1312 if (remain->IsNumber()) {
1313 scrollRes.offset = Dimension(remain->ToNumber(vm)->Value(), DimensionUnit::VP);
1314 }
1315 }
1316 return scrollRes;
1317 };
1318 GetArkUINodeModifiers()->getListModifier()->setOnListScrollFrameBeginCallBack(
1319 nativeNode, reinterpret_cast<void*>(&callback));
1320 return panda::JSValueRef::Undefined(vm);
1321 }
1322
SetOnListWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1323 ArkUINativeModuleValue ListBridge::SetOnListWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1324 {
1325 EcmaVM* vm = runtimeCallInfo->GetVM();
1326 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1327 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1328 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1329 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1330 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1331 GetArkUINodeModifiers()->getListModifier()->resetOnListWillScroll(nativeNode);
1332 return panda::JSValueRef::Undefined(vm);
1333 }
1334 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1335 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1336 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1337 std::function<ScrollFrameResult(CalcDimension, ScrollState, ScrollSource)> callback =
1338 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const CalcDimension& scrollOffset,
1339 const ScrollState& scrollState, ScrollSource scrollSource) {
1340 panda::LocalScope pandaScope(vm);
1341 panda::TryCatch trycatch(vm);
1342 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1343
1344 panda::Local<panda::NumberRef> offsetParam = panda::NumberRef::New(
1345 vm, static_cast<double>(scrollOffset.ConvertToVp()));
1346 panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<int32_t>(scrollState));
1347 panda::Local<panda::NumberRef> sourceParam = panda::NumberRef::New(vm, static_cast<int32_t>(scrollSource));
1348 // 3: Array length
1349 panda::Local<panda::JSValueRef> params[3] = { offsetParam, stateParam, sourceParam };
1350 auto result = func->Call(vm, func.ToLocal(), params, 3); // 4: Array length
1351 ScrollFrameResult scrollRes { .offset = scrollOffset };
1352
1353 if (result->IsObject(vm)) {
1354 auto resultObj = result->ToObject(vm);
1355 panda::Local<panda::JSValueRef> dxRemainValue =
1356 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "offsetRemain"));
1357 if (dxRemainValue->IsNumber()) {
1358 scrollRes.offset = Dimension(dxRemainValue->ToNumber(vm)->Value(), DimensionUnit::VP);
1359 }
1360 }
1361 return scrollRes;
1362 };
1363 GetArkUINodeModifiers()->getListModifier()->setOnListWillScrollCallBack(
1364 nativeNode, reinterpret_cast<void*>(&callback));
1365 return panda::JSValueRef::Undefined(vm);
1366 }
1367
SetOnListDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1368 ArkUINativeModuleValue ListBridge::SetOnListDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1369 {
1370 EcmaVM* vm = runtimeCallInfo->GetVM();
1371 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1372 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1373 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1374 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1375 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1376 GetArkUINodeModifiers()->getListModifier()->resetOnListDidScroll(nativeNode);
1377 return panda::JSValueRef::Undefined(vm);
1378 }
1379 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1380 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1381 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1382 std::function<void(Dimension, ScrollState)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1383 const CalcDimension& scrollOffset, const ScrollState& scrollState) {
1384 panda::LocalScope pandaScope(vm);
1385 panda::TryCatch trycatch(vm);
1386 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1387
1388 panda::Local<panda::NumberRef> offsetParam =
1389 panda::NumberRef::New(vm, static_cast<double>(scrollOffset.ConvertToVp()));
1390 panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<int32_t>(scrollState));
1391 // 2: Array length
1392 panda::Local<panda::JSValueRef> params[2] = { offsetParam, stateParam };
1393 func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1394 };
1395 GetArkUINodeModifiers()->getListModifier()->setOnListDidScrollCallBack(
1396 nativeNode, reinterpret_cast<void*>(&callback));
1397 return panda::JSValueRef::Undefined(vm);
1398 }
1399
SetOnListReachStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1400 ArkUINativeModuleValue ListBridge::SetOnListReachStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1401 {
1402 EcmaVM* vm = runtimeCallInfo->GetVM();
1403 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1404 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1405 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1406 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1407 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1408 GetArkUINodeModifiers()->getListModifier()->resetOnListReachStart(nativeNode);
1409 return panda::JSValueRef::Undefined(vm);
1410 }
1411 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1412 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1413 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1414 std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1415 panda::LocalScope pandaScope(vm);
1416 panda::TryCatch trycatch(vm);
1417 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1418 func->Call(vm, func.ToLocal(), nullptr, 0);
1419 };
1420
1421 GetArkUINodeModifiers()->getListModifier()->setOnListReachStartCallBack(
1422 nativeNode, reinterpret_cast<void*>(&callback));
1423 return panda::JSValueRef::Undefined(vm);
1424 }
1425
SetOnListReachEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1426 ArkUINativeModuleValue ListBridge::SetOnListReachEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1427 {
1428 EcmaVM* vm = runtimeCallInfo->GetVM();
1429 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1430 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1431 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1432 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1433 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1434 GetArkUINodeModifiers()->getListModifier()->resetOnListReachEnd(nativeNode);
1435 return panda::JSValueRef::Undefined(vm);
1436 }
1437 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1438 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1439 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1440 std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1441 panda::LocalScope pandaScope(vm);
1442 panda::TryCatch trycatch(vm);
1443 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1444 func->Call(vm, func.ToLocal(), nullptr, 0);
1445 };
1446
1447 GetArkUINodeModifiers()->getListModifier()->setOnListReachEndCallBack(
1448 nativeNode, reinterpret_cast<void*>(&callback));
1449 return panda::JSValueRef::Undefined(vm);
1450 }
1451
ResetOnScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)1452 ArkUINativeModuleValue ListBridge::ResetOnScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
1453 {
1454 EcmaVM* vm = runtimeCallInfo->GetVM();
1455 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1456 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1457 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1458 GetArkUINodeModifiers()->getListModifier()->resetOnListScrollIndex(nativeNode);
1459 return panda::JSValueRef::Undefined(vm);
1460 }
1461
ResetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1462 ArkUINativeModuleValue ListBridge::ResetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1463 {
1464 EcmaVM* vm = runtimeCallInfo->GetVM();
1465 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1466 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1467 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1468 GetArkUINodeModifiers()->getListModifier()->resetOnScrollVisibleContentChange(nativeNode);
1469 return panda::JSValueRef::Undefined(vm);
1470 }
1471
ResetOnItemMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1472 ArkUINativeModuleValue ListBridge::ResetOnItemMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1473 {
1474 EcmaVM* vm = runtimeCallInfo->GetVM();
1475 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1476 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1477 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1478 GetArkUINodeModifiers()->getListModifier()->resetOnItemMove(nativeNode);
1479 return panda::JSValueRef::Undefined(vm);
1480 }
1481
ResetOnItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1482 ArkUINativeModuleValue ListBridge::ResetOnItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1483 {
1484 EcmaVM* vm = runtimeCallInfo->GetVM();
1485 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1486 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1487 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1488 GetArkUINodeModifiers()->getListModifier()->resetOnItemDragStart(nativeNode);
1489 return panda::JSValueRef::Undefined(vm);
1490 }
1491
ResetOnItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)1492 ArkUINativeModuleValue ListBridge::ResetOnItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1493 {
1494 EcmaVM* vm = runtimeCallInfo->GetVM();
1495 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1496 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1497 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1498 GetArkUINodeModifiers()->getListModifier()->resetOnItemDragEnter(nativeNode);
1499 return panda::JSValueRef::Undefined(vm);
1500 }
1501
ResetOnItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1502 ArkUINativeModuleValue ListBridge::ResetOnItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1503 {
1504 EcmaVM* vm = runtimeCallInfo->GetVM();
1505 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1506 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1507 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1508 GetArkUINodeModifiers()->getListModifier()->resetOnItemDragMove(nativeNode);
1509 return panda::JSValueRef::Undefined(vm);
1510 }
1511
ResetOnItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1512 ArkUINativeModuleValue ListBridge::ResetOnItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1513 {
1514 EcmaVM* vm = runtimeCallInfo->GetVM();
1515 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1516 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1517 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1518 GetArkUINodeModifiers()->getListModifier()->resetOnItemDragLeave(nativeNode);
1519 return panda::JSValueRef::Undefined(vm);
1520 }
1521
ResetOnItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1522 ArkUINativeModuleValue ListBridge::ResetOnItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1523 {
1524 EcmaVM* vm = runtimeCallInfo->GetVM();
1525 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1526 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1527 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1528 GetArkUINodeModifiers()->getListModifier()->resetOnItemDrop(nativeNode);
1529 return panda::JSValueRef::Undefined(vm);
1530 }
1531
ResetOnListScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1532 ArkUINativeModuleValue ListBridge::ResetOnListScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1533 {
1534 EcmaVM* vm = runtimeCallInfo->GetVM();
1535 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1536 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1537 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1538 GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStart(nativeNode);
1539 return panda::JSValueRef::Undefined(vm);
1540 }
1541
ResetOnListScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)1542 ArkUINativeModuleValue ListBridge::ResetOnListScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1543 {
1544 EcmaVM* vm = runtimeCallInfo->GetVM();
1545 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1546 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1547 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1548 GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStop(nativeNode);
1549 return panda::JSValueRef::Undefined(vm);
1550 }
1551
ResetOnListScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)1552 ArkUINativeModuleValue ListBridge::ResetOnListScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
1553 {
1554 EcmaVM* vm = runtimeCallInfo->GetVM();
1555 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1556 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1557 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1558 GetArkUINodeModifiers()->getListModifier()->resetOnListScrollFrameBegin(nativeNode);
1559 return panda::JSValueRef::Undefined(vm);
1560 }
1561
ResetOnListWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1562 ArkUINativeModuleValue ListBridge::ResetOnListWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1563 {
1564 EcmaVM* vm = runtimeCallInfo->GetVM();
1565 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1566 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1567 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1568 GetArkUINodeModifiers()->getListModifier()->resetOnListWillScroll(nativeNode);
1569 return panda::JSValueRef::Undefined(vm);
1570 }
1571
ResetOnListDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1572 ArkUINativeModuleValue ListBridge::ResetOnListDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1573 {
1574 EcmaVM* vm = runtimeCallInfo->GetVM();
1575 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1576 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1577 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1578 GetArkUINodeModifiers()->getListModifier()->resetOnListDidScroll(nativeNode);
1579 return panda::JSValueRef::Undefined(vm);
1580 }
1581
ResetOnListReachStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1582 ArkUINativeModuleValue ListBridge::ResetOnListReachStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1583 {
1584 EcmaVM* vm = runtimeCallInfo->GetVM();
1585 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1586 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1587 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1588 GetArkUINodeModifiers()->getListModifier()->resetOnListReachStart(nativeNode);
1589 return panda::JSValueRef::Undefined(vm);
1590 }
1591
ResetOnListReachEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1592 ArkUINativeModuleValue ListBridge::ResetOnListReachEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1593 {
1594 EcmaVM* vm = runtimeCallInfo->GetVM();
1595 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1596 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1597 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1598 GetArkUINodeModifiers()->getListModifier()->resetOnListReachEnd(nativeNode);
1599 return panda::JSValueRef::Undefined(vm);
1600 }
1601 } // namespace OHOS::Ace::NG