• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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