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/api.h"
18 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
20 #include "frameworks/core/components/list/list_theme.h"
21
22 namespace OHOS::Ace::NG {
23 constexpr int32_t LIST_ARG_INDEX_0 = 0;
24 constexpr int32_t LIST_ARG_INDEX_1 = 1;
25 constexpr int32_t LIST_ARG_INDEX_2 = 2;
26 constexpr int32_t LIST_ARG_INDEX_3 = 3;
27 constexpr int32_t LIST_ARG_INDEX_4 = 4;
28 constexpr int32_t LIST_ARG_INDEX_5 = 5;
29 constexpr int32_t LIST_ARG_INDEX_6 = 6;
30 constexpr int32_t LIST_ARG_INDEX_7 = 7;
31
32 constexpr int32_t ARG_LENGTH = 3;
33
SetListLanes(ArkUIRuntimeCallInfo * runtimeCallInfo)34 ArkUINativeModuleValue ListBridge::SetListLanes(ArkUIRuntimeCallInfo* runtimeCallInfo)
35 {
36 EcmaVM* vm = runtimeCallInfo->GetVM();
37 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
38 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0); // 0: index of parameter frameNode
39 Local<JSValueRef> laneNumArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of parameter laneNum
40 Local<JSValueRef> minLengthArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of parameter minLength
41 Local<JSValueRef> maxLengthArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of parameter maxLength
42 Local<JSValueRef> gutterArg = runtimeCallInfo->GetCallArgRef(4); // 4: index of parameter gutter
43 void* nativeNode = frameNodeArg->ToNativePointer(vm)->Value();
44 ArkUIDimensionType gutterType;
45 ArkUIDimensionType minLengthType;
46 ArkUIDimensionType maxLengthType;
47
48 CalcDimension gutter = Dimension(0.0);
49 int32_t laneNum = 1;
50 CalcDimension minLength = -1.0_vp;
51 CalcDimension maxLength = -1.0_vp;
52 if (!gutterArg->IsUndefined() && ArkTSUtils::ParseJsDimensionVp(vm, gutterArg, gutter)) {
53 if (gutter.IsNegative()) {
54 gutter.Reset();
55 }
56 gutterType.value = gutter.Value();
57 gutterType.units = static_cast<int32_t>(gutter.Unit());
58 }
59 if (!laneNumArg->IsUndefined() && ArkTSUtils::ParseJsInteger(vm, laneNumArg, laneNum)) {
60 minLengthType.value = minLength.Value();
61 minLengthType.units = static_cast<int32_t>(minLength.Unit());
62 maxLengthType.value = maxLength.Value();
63 maxLengthType.units = static_cast<int32_t>(maxLength.Unit());
64 }
65 if (!minLengthArg->IsUndefined() && !maxLengthArg->IsUndefined() &&
66 ArkTSUtils::ParseJsDimensionVp(vm, minLengthArg, minLength) &&
67 ArkTSUtils::ParseJsDimensionVp(vm, maxLengthArg, maxLength)) {
68 laneNum = -1;
69 minLengthType.value = minLength.Value();
70 minLengthType.units = static_cast<int32_t>(minLength.Unit());
71 maxLengthType.value = maxLength.Value();
72 maxLengthType.units = static_cast<int32_t>(maxLength.Unit());
73 }
74 GetArkUIInternalNodeAPI()->GetListModifier().SetListLanes(
75 nativeNode, laneNum, &minLengthType, &maxLengthType, &gutterType);
76 return panda::JSValueRef::Undefined(vm);
77 }
78
ResetListLanes(ArkUIRuntimeCallInfo * runtimeCallInfo)79 ArkUINativeModuleValue ListBridge::ResetListLanes(ArkUIRuntimeCallInfo* runtimeCallInfo)
80 {
81 EcmaVM* vm = runtimeCallInfo->GetVM();
82 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
83 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
84 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
85 GetArkUIInternalNodeAPI()->GetListModifier().ResetListLanes(nativeNode);
86
87 return panda::JSValueRef::Undefined(vm);
88 }
SetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)89 ArkUINativeModuleValue ListBridge::SetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
90 {
91 EcmaVM* vm = runtimeCallInfo->GetVM();
92 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
93 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
94 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
95 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
96 if (secondArg->IsUndefined()) {
97 GetArkUIInternalNodeAPI()->GetListModifier().ResetEditMode(nativeNode);
98 } else {
99 bool editMode = secondArg->ToBoolean(vm)->Value();
100 GetArkUIInternalNodeAPI()->GetListModifier().SetEditMode(nativeNode, editMode);
101 }
102
103 return panda::JSValueRef::Undefined(vm);
104 }
105
ResetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)106 ArkUINativeModuleValue ListBridge::ResetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
107 {
108 EcmaVM* vm = runtimeCallInfo->GetVM();
109 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
110 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
111 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
112 GetArkUIInternalNodeAPI()->GetListModifier().ResetEditMode(nativeNode);
113
114 return panda::JSValueRef::Undefined(vm);
115 }
116
SetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)117 ArkUINativeModuleValue ListBridge::SetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
118 {
119 EcmaVM* vm = runtimeCallInfo->GetVM();
120 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
121 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
122 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
123 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
124 if (secondArg->IsUndefined()) {
125 GetArkUIInternalNodeAPI()->GetListModifier().ResetMultiSelectable(nativeNode);
126 } else {
127 bool selectable = secondArg->ToBoolean(vm)->Value();
128 GetArkUIInternalNodeAPI()->GetListModifier().SetMultiSelectable(nativeNode, selectable);
129 }
130
131 return panda::JSValueRef::Undefined(vm);
132 }
133
ResetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)134 ArkUINativeModuleValue ListBridge::ResetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
135 {
136 EcmaVM* vm = runtimeCallInfo->GetVM();
137 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
138 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
139 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
140 GetArkUIInternalNodeAPI()->GetListModifier().ResetMultiSelectable(nativeNode);
141
142 return panda::JSValueRef::Undefined(vm);
143 }
144
SetChainAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)145 ArkUINativeModuleValue ListBridge::SetChainAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
146 {
147 EcmaVM* vm = runtimeCallInfo->GetVM();
148 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
149 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
150 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
151 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
152 bool chainAnimation = secondArg->ToBoolean(vm)->Value();
153 GetArkUIInternalNodeAPI()->GetListModifier().SetChainAnimation(nativeNode, chainAnimation);
154
155 return panda::JSValueRef::Undefined(vm);
156 }
157
ResetChainAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)158 ArkUINativeModuleValue ListBridge::ResetChainAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
159 {
160 EcmaVM* vm = runtimeCallInfo->GetVM();
161 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
162 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
163 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
164 GetArkUIInternalNodeAPI()->GetListModifier().ResetChainAnimation(nativeNode);
165
166 return panda::JSValueRef::Undefined(vm);
167 }
168
SetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)169 ArkUINativeModuleValue ListBridge::SetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
170 {
171 EcmaVM* vm = runtimeCallInfo->GetVM();
172 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
173 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
174 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
175 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
176 int32_t cachedCount = secondArg->Int32Value(vm);
177
178 GetArkUIInternalNodeAPI()->GetListModifier().SetCachedCount(nativeNode, cachedCount);
179
180 return panda::JSValueRef::Undefined(vm);
181 }
182
ResetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)183 ArkUINativeModuleValue ListBridge::ResetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
184 {
185 EcmaVM* vm = runtimeCallInfo->GetVM();
186 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
187 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
188 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
189 GetArkUIInternalNodeAPI()->GetListModifier().ResetCachedCount(nativeNode);
190
191 return panda::JSValueRef::Undefined(vm);
192 }
193
SetEnableScrollInteraction(ArkUIRuntimeCallInfo * runtimeCallInfo)194 ArkUINativeModuleValue ListBridge::SetEnableScrollInteraction(ArkUIRuntimeCallInfo* runtimeCallInfo)
195 {
196 EcmaVM* vm = runtimeCallInfo->GetVM();
197 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
198 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
199 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
200 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
201 if (secondArg->IsBoolean()) {
202 bool enableScrollInteraction = secondArg->ToBoolean(vm)->Value();
203 GetArkUIInternalNodeAPI()->GetListModifier().SetEnableScrollInteraction(nativeNode, enableScrollInteraction);
204 } else {
205 GetArkUIInternalNodeAPI()->GetListModifier().ResetEnableScrollInteraction(nativeNode);
206 }
207
208 return panda::JSValueRef::Undefined(vm);
209 }
210
ResetEnableScrollInteraction(ArkUIRuntimeCallInfo * runtimeCallInfo)211 ArkUINativeModuleValue ListBridge::ResetEnableScrollInteraction(ArkUIRuntimeCallInfo* runtimeCallInfo)
212 {
213 EcmaVM* vm = runtimeCallInfo->GetVM();
214 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
215 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
216 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
217 GetArkUIInternalNodeAPI()->GetListModifier().ResetEnableScrollInteraction(nativeNode);
218
219 return panda::JSValueRef::Undefined(vm);
220 }
221
SetSticky(ArkUIRuntimeCallInfo * runtimeCallInfo)222 ArkUINativeModuleValue ListBridge::SetSticky(ArkUIRuntimeCallInfo* runtimeCallInfo)
223 {
224 EcmaVM* vm = runtimeCallInfo->GetVM();
225 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
226 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
227 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
228 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
229 if (secondArg->IsUndefined()) {
230 GetArkUIInternalNodeAPI()->GetListModifier().ResetSticky(nativeNode);
231 } else {
232 int32_t stickyStyle = secondArg->ToNumber(vm)->Value();
233 GetArkUIInternalNodeAPI()->GetListModifier().SetSticky(nativeNode, stickyStyle);
234 }
235
236 return panda::JSValueRef::Undefined(vm);
237 }
238
ResetSticky(ArkUIRuntimeCallInfo * runtimeCallInfo)239 ArkUINativeModuleValue ListBridge::ResetSticky(ArkUIRuntimeCallInfo* runtimeCallInfo)
240 {
241 EcmaVM* vm = runtimeCallInfo->GetVM();
242 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
243 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
244 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
245 GetArkUIInternalNodeAPI()->GetListModifier().ResetSticky(nativeNode);
246
247 return panda::JSValueRef::Undefined(vm);
248 }
249
SetListEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)250 ArkUINativeModuleValue ListBridge::SetListEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
251 {
252 EcmaVM* vm = runtimeCallInfo->GetVM();
253 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
254 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
255 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
256 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
257
258 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
259 int32_t effect = static_cast<int32_t>(EdgeEffect::SPRING);
260
261 if (secondArg->IsUndefined() || secondArg->IsNull()) {
262 effect = static_cast<int32_t>(EdgeEffect::SPRING);
263 } else {
264 effect = secondArg->Int32Value(vm);
265 }
266 if (effect < static_cast<int32_t>(EdgeEffect::SPRING) || effect > static_cast<int32_t>(EdgeEffect::NONE)) {
267 effect = static_cast<int32_t>(EdgeEffect::SPRING);
268 }
269 if (thirdArg->IsUndefined() || thirdArg->IsNull()) {
270 GetArkUIInternalNodeAPI()->GetListModifier().SetListEdgeEffect(nativeNode, effect, false);
271 } else {
272 GetArkUIInternalNodeAPI()->GetListModifier().SetListEdgeEffect(
273 nativeNode, effect, thirdArg->ToBoolean(vm)->Value());
274 }
275 return panda::JSValueRef::Undefined(vm);
276 }
277
ResetListEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)278 ArkUINativeModuleValue ListBridge::ResetListEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
279 {
280 EcmaVM* vm = runtimeCallInfo->GetVM();
281 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
282 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
283 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
284 GetArkUIInternalNodeAPI()->GetListModifier().ResetListEdgeEffect(nativeNode);
285 return panda::JSValueRef::Undefined(vm);
286 }
287
SetListDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)288 ArkUINativeModuleValue ListBridge::SetListDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
289 {
290 EcmaVM* vm = runtimeCallInfo->GetVM();
291 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
292 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
293 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
294 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
295 if (secondArg->IsUndefined()) {
296 GetArkUIInternalNodeAPI()->GetListModifier().ResetListDirection(nativeNode);
297 } else {
298 int32_t direction = secondArg->ToNumber(vm)->Value();
299 GetArkUIInternalNodeAPI()->GetListModifier().SetListDirection(nativeNode, direction);
300 }
301
302 return panda::JSValueRef::Undefined(vm);
303 }
ResetListDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)304 ArkUINativeModuleValue ListBridge::ResetListDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
305 {
306 EcmaVM* vm = runtimeCallInfo->GetVM();
307 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
308 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
309 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
310 GetArkUIInternalNodeAPI()->GetListModifier().ResetListDirection(nativeNode);
311
312 return panda::JSValueRef::Undefined(vm);
313 }
314
SetListFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)315 ArkUINativeModuleValue ListBridge::SetListFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
316 {
317 EcmaVM* vm = runtimeCallInfo->GetVM();
318 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
319 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
320 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
321
322 double friction = -1.0;
323 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
324 if (secondArg->IsUndefined() || secondArg->IsNull() || !ArkTSUtils::ParseJsDouble(vm, secondArg, friction)) {
325 friction = -1.0;
326 }
327 GetArkUIInternalNodeAPI()->GetListModifier().SetListFriction(nativeNode, friction);
328 return panda::JSValueRef::Undefined(vm);
329 }
330
ResetListFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)331 ArkUINativeModuleValue ListBridge::ResetListFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
332 {
333 EcmaVM* vm = runtimeCallInfo->GetVM();
334 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
335 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
336 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
337 GetArkUIInternalNodeAPI()->GetListModifier().ResetListFriction(nativeNode);
338 return panda::JSValueRef::Undefined(vm);
339 }
340
SetListNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)341 ArkUINativeModuleValue ListBridge::SetListNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
342 {
343 EcmaVM* vm = runtimeCallInfo->GetVM();
344 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
345 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
346 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
347 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
348
349 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
350 int32_t forward = 0;
351 int32_t backward = 0;
352 if (!secondArg->IsUndefined()) {
353 forward = secondArg->Int32Value(vm);
354 }
355 if (!thirdArg->IsUndefined()) {
356 backward = thirdArg->Int32Value(vm);
357 }
358
359 if (forward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
360 forward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
361 forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
362 }
363
364 if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
365 backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
366 backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
367 }
368
369 GetArkUIInternalNodeAPI()->GetListModifier().SetListNestedScroll(nativeNode, forward, backward);
370
371 return panda::JSValueRef::Undefined(vm);
372 }
373
ResetListNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)374 ArkUINativeModuleValue ListBridge::ResetListNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
375 {
376 EcmaVM* vm = runtimeCallInfo->GetVM();
377 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
378 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
379 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
380 GetArkUIInternalNodeAPI()->GetListModifier().ResetListNestedScroll(nativeNode);
381 return panda::JSValueRef::Undefined(vm);
382 }
383
SetListScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)384 ArkUINativeModuleValue ListBridge::SetListScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
385 {
386 EcmaVM* vm = runtimeCallInfo->GetVM();
387 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
388 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
389 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
390 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
391 if (secondArg->IsUndefined()) {
392 GetArkUIInternalNodeAPI()->GetListModifier().ResetListScrollBar(nativeNode);
393 } else {
394 int32_t barState = secondArg->ToNumber(vm)->Value();
395 GetArkUIInternalNodeAPI()->GetListModifier().SetListScrollBar(nativeNode, barState);
396 }
397
398 return panda::JSValueRef::Undefined(vm);
399 }
400
ResetListScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)401 ArkUINativeModuleValue ListBridge::ResetListScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
402 {
403 EcmaVM* vm = runtimeCallInfo->GetVM();
404 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
405 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
406 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
407 GetArkUIInternalNodeAPI()->GetListModifier().ResetListScrollBar(nativeNode);
408
409 return panda::JSValueRef::Undefined(vm);
410 }
411
SetAlignListItem(ArkUIRuntimeCallInfo * runtimeCallInfo)412 ArkUINativeModuleValue ListBridge::SetAlignListItem(ArkUIRuntimeCallInfo* runtimeCallInfo)
413 {
414 EcmaVM* vm = runtimeCallInfo->GetVM();
415 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
416 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
417 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
418 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
419 int32_t listItemAlign = secondArg->Int32Value(vm);
420 GetArkUIInternalNodeAPI()->GetListModifier().SetAlignListItem(nativeNode, listItemAlign);
421
422 return panda::JSValueRef::Undefined(vm);
423 }
424
ResetAlignListItem(ArkUIRuntimeCallInfo * runtimeCallInfo)425 ArkUINativeModuleValue ListBridge::ResetAlignListItem(ArkUIRuntimeCallInfo* runtimeCallInfo)
426 {
427 EcmaVM* vm = runtimeCallInfo->GetVM();
428 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
429 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
430 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
431 GetArkUIInternalNodeAPI()->GetListModifier().ResetAlignListItem(nativeNode);
432 return panda::JSValueRef::Undefined(vm);
433 }
434
SetScrollSnapAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)435 ArkUINativeModuleValue ListBridge::SetScrollSnapAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
436 {
437 EcmaVM* vm = runtimeCallInfo->GetVM();
438 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
439 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
440 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
441 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
442 if (secondArg->IsUndefined()) {
443 GetArkUIInternalNodeAPI()->GetListModifier().ResetScrollSnapAlign(nativeNode);
444 } else {
445 int32_t scrollSnapAlign = secondArg->Int32Value(vm);
446 GetArkUIInternalNodeAPI()->GetListModifier().SetScrollSnapAlign(nativeNode, scrollSnapAlign);
447 }
448
449 return panda::JSValueRef::Undefined(vm);
450 }
451
ResetScrollSnapAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)452 ArkUINativeModuleValue ListBridge::ResetScrollSnapAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
453 {
454 EcmaVM* vm = runtimeCallInfo->GetVM();
455 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
456 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
457 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
458 GetArkUIInternalNodeAPI()->GetListModifier().ResetAlignListItem(nativeNode);
459 return panda::JSValueRef::Undefined(vm);
460 }
461
SetContentStartOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)462 ArkUINativeModuleValue ListBridge::SetContentStartOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
463 {
464 EcmaVM* vm = runtimeCallInfo->GetVM();
465 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
466 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
467 Local<JSValueRef> startOffsetArg = runtimeCallInfo->GetCallArgRef(1);
468 void* nativeNode = frameNodeArg->ToNativePointer(vm)->Value();
469 double startOffset = 0.0;
470 ArkTSUtils::ParseJsDouble(vm, startOffsetArg, startOffset);
471
472 GetArkUIInternalNodeAPI()->GetListModifier().SetContentStartOffset(nativeNode, startOffset);
473
474 return panda::JSValueRef::Undefined(vm);
475 }
476
ResetContentStartOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)477 ArkUINativeModuleValue ListBridge::ResetContentStartOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
478 {
479 EcmaVM* vm = runtimeCallInfo->GetVM();
480 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
481 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
482 void* nativeNode = frameNodeArg->ToNativePointer(vm)->Value();
483 GetArkUIInternalNodeAPI()->GetListModifier().ResetContentStartOffset(nativeNode);
484
485 return panda::JSValueRef::Undefined(vm);
486 }
487
SetContentEndOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)488 ArkUINativeModuleValue ListBridge::SetContentEndOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
489 {
490 EcmaVM* vm = runtimeCallInfo->GetVM();
491 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
492 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
493 Local<JSValueRef> endOffsetArg = runtimeCallInfo->GetCallArgRef(1);
494 void* nativeNode = frameNodeArg->ToNativePointer(vm)->Value();
495 double endOffset = 0.0;
496 ArkTSUtils::ParseJsDouble(vm, endOffsetArg, endOffset);
497
498 GetArkUIInternalNodeAPI()->GetListModifier().SetContentEndOffset(nativeNode, endOffset);
499
500 return panda::JSValueRef::Undefined(vm);
501 }
502
ResetContentEndOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)503 ArkUINativeModuleValue ListBridge::ResetContentEndOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
504 {
505 EcmaVM* vm = runtimeCallInfo->GetVM();
506 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
507 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
508 void* nativeNode = frameNodeArg->ToNativePointer(vm)->Value();
509 GetArkUIInternalNodeAPI()->GetListModifier().ResetContentEndOffset(nativeNode);
510
511 return panda::JSValueRef::Undefined(vm);
512 }
513
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)514 ArkUINativeModuleValue ListBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
515 {
516 EcmaVM* vm = runtimeCallInfo->GetVM();
517 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
518 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
519 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
520 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
521 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
522 Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_3);
523 Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_4);
524 if (dividerStrokeWidthArgs->IsUndefined() && dividerStartMarginArgs->IsUndefined() &&
525 dividerEndMarginArgs->IsUndefined() && colorArg->IsUndefined()) {
526 GetArkUIInternalNodeAPI()->GetListModifier().ListResetDivider(nativeNode);
527 return panda::JSValueRef::Undefined(vm);
528 }
529
530 CalcDimension dividerStrokeWidth;
531 CalcDimension dividerStartMargin;
532 CalcDimension dividerEndMargin;
533 uint32_t color;
534 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
535 auto context = frameNode->GetContext();
536 auto themeManager = context->GetThemeManager();
537 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
538 auto listTheme = themeManager->GetTheme<ListTheme>();
539 CHECK_NULL_RETURN(listTheme, panda::NativePointerRef::New(vm, nullptr));
540
541 if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerStrokeWidthArgs, dividerStrokeWidth) ||
542 LessNotEqual(dividerStrokeWidth.Value(), 0.0f) || dividerStrokeWidth.Unit() == DimensionUnit::PERCENT) {
543 dividerStrokeWidth.Reset();
544 }
545 Color colorObj;
546 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
547 color = listTheme->GetDividerColor().GetValue();
548 } else {
549 color = colorObj.GetValue();
550 }
551 if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerStartMarginArgs, dividerStartMargin) ||
552 LessNotEqual(dividerStartMargin.Value(), 0.0f) || dividerStartMargin.Unit() == DimensionUnit::PERCENT) {
553 dividerStartMargin.Reset();
554 }
555 if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerEndMarginArgs, dividerEndMargin) ||
556 LessNotEqual(dividerEndMargin.Value(), 0.0f) || dividerEndMargin.Unit() == DimensionUnit::PERCENT) {
557 dividerEndMargin.Reset();
558 }
559 uint32_t size = ARG_LENGTH;
560 double values[size];
561 int32_t units[size];
562 values[LIST_ARG_INDEX_0] = dividerStrokeWidth.Value();
563 values[LIST_ARG_INDEX_1] = dividerStartMargin.Value();
564 values[LIST_ARG_INDEX_2] = dividerEndMargin.Value();
565 units[LIST_ARG_INDEX_0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
566 units[LIST_ARG_INDEX_1] = static_cast<int32_t>(dividerStartMargin.Unit());
567 units[LIST_ARG_INDEX_2] = static_cast<int32_t>(dividerEndMargin.Unit());
568 GetArkUIInternalNodeAPI()->GetListModifier().ListSetDivider(nativeNode, color, values, units, size);
569
570 return panda::JSValueRef::Undefined(vm);
571 }
572
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)573 ArkUINativeModuleValue ListBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
574 {
575 EcmaVM* vm = runtimeCallInfo->GetVM();
576 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
577 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
578 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
579 GetArkUIInternalNodeAPI()->GetListModifier().ListResetDivider(nativeNode);
580 return panda::JSValueRef::Undefined(vm);
581 }
582
SetChainAnimationOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)583 ArkUINativeModuleValue ListBridge::SetChainAnimationOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
584 {
585 EcmaVM* vm = runtimeCallInfo->GetVM();
586 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
587 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
588 Local<JSValueRef> minSpaceArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
589 Local<JSValueRef> maxSpaceArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
590 Local<JSValueRef> conductivityArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_3);
591 Local<JSValueRef> intensityArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_4);
592 Local<JSValueRef> edgeEffectArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_5);
593 Local<JSValueRef> stiffnessArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_6);
594 Local<JSValueRef> dampingArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_7);
595
596 CalcDimension minSpace;
597 CalcDimension maxSpace;
598
599 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
600 if (minSpaceArgs->IsUndefined() && maxSpaceArgs->IsUndefined() && conductivityArgs->IsUndefined() &&
601 intensityArgs->IsUndefined() && edgeEffectArgs->IsUndefined() && stiffnessArgs->IsUndefined() &&
602 dampingArgs->IsUndefined()) {
603 GetArkUIInternalNodeAPI()->GetListModifier().ResetChainAnimationOptions(nativeNode);
604 return panda::JSValueRef::Undefined(vm);
605 } else {
606 RefPtr<ListTheme> listTheme = ArkTSUtils::GetTheme<ListTheme>();
607 CHECK_NULL_RETURN(listTheme, panda::NativePointerRef::New(vm, nullptr));
608
609 minSpace = listTheme->GetChainMinSpace();
610 maxSpace = listTheme->GetChainMaxSpace();
611 ArkUIChainAnimationOptionsType chainAnimationOptions;
612 chainAnimationOptions.conductivity = listTheme->GetChainConductivity();
613 chainAnimationOptions.intensity = listTheme->GetChainIntensity();
614 chainAnimationOptions.edgeEffect = 0;
615 chainAnimationOptions.stiffness = listTheme->GetChainStiffness();
616 chainAnimationOptions.damping = listTheme->GetChainDamping();
617
618 ArkTSUtils::ParseJsDimension(vm, minSpaceArgs, minSpace, DimensionUnit::VP);
619 ArkTSUtils::ParseJsDimension(vm, maxSpaceArgs, maxSpace, DimensionUnit::VP);
620 ArkTSUtils::ParseJsDouble(vm, conductivityArgs, chainAnimationOptions.conductivity);
621 ArkTSUtils::ParseJsDouble(vm, intensityArgs, chainAnimationOptions.intensity);
622 if (edgeEffectArgs->IsNumber()) {
623 chainAnimationOptions.edgeEffect = edgeEffectArgs->ToNumber(vm)->Value();
624 }
625 ArkTSUtils::ParseJsDouble(vm, stiffnessArgs, chainAnimationOptions.stiffness);
626 ArkTSUtils::ParseJsDouble(vm, dampingArgs, chainAnimationOptions.damping);
627 chainAnimationOptions.minSpace = minSpace.Value();
628 chainAnimationOptions.minSpaceUnits = static_cast<int32_t>(minSpace.Unit());
629 chainAnimationOptions.maxSpace = maxSpace.Value();
630 chainAnimationOptions.maxSpaceUnits = static_cast<int32_t>(maxSpace.Unit());
631
632 GetArkUIInternalNodeAPI()->GetListModifier().SetChainAnimationOptions(nativeNode, &chainAnimationOptions);
633 }
634
635 return panda::JSValueRef::Undefined(vm);
636 }
637
ResetChainAnimationOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)638 ArkUINativeModuleValue ListBridge::ResetChainAnimationOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
639 {
640 EcmaVM* vm = runtimeCallInfo->GetVM();
641 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
642 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
643 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
644 GetArkUIInternalNodeAPI()->GetListModifier().ResetChainAnimationOptions(nativeNode);
645 return panda::JSValueRef::Undefined(vm);
646 }
647
648 } // namespace OHOS::Ace::NG