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
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_scroll_bridge.h"
17
18 #include "base/log/log.h"
19 #include "base/utils/string_utils.h"
20 #include "base/utils/utils.h"
21 #include "bridge/declarative_frontend/jsview/js_scroller.h"
22 #include "core/components_ng/pattern/scroll/scroll_model.h"
23 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
24 #include "frameworks/core/components/scroll_bar/scroll_proxy.h"
25
26 namespace OHOS::Ace::NG {
27 constexpr int NUM_0 = 0;
28 constexpr int NUM_1 = 1;
29 constexpr int NUM_2 = 2;
30 constexpr double FRICTION_DEFAULT = 0.6;
31 constexpr int32_t FROWARD_INITIAL_VALUE = 0;
32 constexpr int32_t BACKWARD_INITIAL_VALUE = 0;
33
ParsePagination(const EcmaVM * vm,const Local<JSValueRef> & paginationValue,std::vector<ArkUI_Float32> & vPaginationValue,std::vector<int32_t> & vPaginationUnit)34 bool ParsePagination(const EcmaVM* vm, const Local<JSValueRef>& paginationValue,
35 std::vector<ArkUI_Float32>& vPaginationValue,
36 std::vector<int32_t>& vPaginationUnit)
37 {
38 uint32_t pLength = 0;
39 if (paginationValue->IsArray(vm)) {
40 auto paginationArray = panda::Local<panda::ArrayRef>(paginationValue);
41 pLength = paginationArray->Length(vm);
42 if (pLength <= 0) {
43 return false;
44 }
45 for (uint32_t i = 0; i < pLength; i++) {
46 CalcDimension dims;
47 Local<JSValueRef> xValue = panda::ArrayRef::GetValueAt(vm, paginationArray, i);
48 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, xValue, dims, true)) {
49 return false;
50 }
51 vPaginationValue.push_back(static_cast<ArkUI_Float32>(dims.Value()));
52 vPaginationUnit.push_back(static_cast<int32_t>(dims.Unit()));
53 }
54 } else {
55 CalcDimension intervalSize;
56 if (!ArkTSUtils::ParseJsDimensionVp(vm, paginationValue, intervalSize) || intervalSize.IsNegative()) {
57 intervalSize = CalcDimension(0.0);
58 }
59 vPaginationValue.push_back(static_cast<ArkUI_Float32>(intervalSize.Value()));
60 vPaginationUnit.push_back(static_cast<int32_t>(intervalSize.Unit()));
61 }
62
63 return true;
64 }
65
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)66 ArkUINativeModuleValue ScrollBridge::SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
67 {
68 EcmaVM* vm = runtimeCallInfo->GetVM();
69 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
70 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
71 Local<JSValueRef> scrollForwardValue = runtimeCallInfo->GetCallArgRef(1); // 1: index of scroll forward value
72 Local<JSValueRef> scrollBackwardValue = runtimeCallInfo->GetCallArgRef(2); // 2: index of scroll backward value
73 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
74 auto froward = 0;
75 auto backward = 0;
76 ArkTSUtils::ParseJsInteger(vm, scrollForwardValue, froward);
77 if (froward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
78 froward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
79 froward = FROWARD_INITIAL_VALUE;
80 }
81 ArkTSUtils::ParseJsInteger(vm, scrollBackwardValue, backward);
82 if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
83 backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
84 backward = BACKWARD_INITIAL_VALUE;
85 }
86 GetArkUINodeModifiers()->getScrollModifier()->setScrollNestedScroll(nativeNode, froward, backward);
87 return panda::JSValueRef::Undefined(vm);
88 }
89
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)90 ArkUINativeModuleValue ScrollBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
91 {
92 EcmaVM* vm = runtimeCallInfo->GetVM();
93 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
94 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
95 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
96 GetArkUINodeModifiers()->getScrollModifier()->resetScrollNestedScroll(nativeNode);
97 return panda::JSValueRef::Undefined(vm);
98 }
99
SetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)100 ArkUINativeModuleValue ScrollBridge::SetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
101 {
102 EcmaVM* vm = runtimeCallInfo->GetVM();
103 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
104 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
105 Local<JSValueRef> isEnabledArg = runtimeCallInfo->GetCallArgRef(1);
106 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
107 bool isEnabled = isEnabledArg->IsBoolean() ? isEnabledArg->ToBoolean(vm)->Value() : true;
108 GetArkUINodeModifiers()->getScrollModifier()->setScrollEnableScroll(nativeNode, isEnabled);
109 return panda::JSValueRef::Undefined(vm);
110 }
111
ResetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)112 ArkUINativeModuleValue ScrollBridge::ResetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
113 {
114 EcmaVM* vm = runtimeCallInfo->GetVM();
115 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
116 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
117 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
118 GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnableScroll(nativeNode);
119 return panda::JSValueRef::Undefined(vm);
120 }
121
SetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)122 ArkUINativeModuleValue ScrollBridge::SetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
123 {
124 EcmaVM* vm = runtimeCallInfo->GetVM();
125 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
126 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
127 Local<JSValueRef> scrollFrictionArg = runtimeCallInfo->GetCallArgRef(1);
128 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
129 double friction = FRICTION_DEFAULT;
130 if (!ArkTSUtils::ParseJsDouble(vm, scrollFrictionArg, friction)) {
131 GetArkUINodeModifiers()->getScrollModifier()->resetScrollFriction(nativeNode);
132 } else {
133 GetArkUINodeModifiers()->getScrollModifier()->setScrollFriction(nativeNode,
134 static_cast<ArkUI_Float32>(friction));
135 }
136 return panda::JSValueRef::Undefined(vm);
137 }
138
ResetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)139 ArkUINativeModuleValue ScrollBridge::ResetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
140 {
141 EcmaVM* vm = runtimeCallInfo->GetVM();
142 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
143 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
144 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
145 GetArkUINodeModifiers()->getScrollModifier()->resetScrollFriction(nativeNode);
146 return panda::JSValueRef::Undefined(vm);
147 }
148
SetScrollSnap(ArkUIRuntimeCallInfo * runtimeCallInfo)149 ArkUINativeModuleValue ScrollBridge::SetScrollSnap(ArkUIRuntimeCallInfo* runtimeCallInfo)
150 {
151 EcmaVM* vm = runtimeCallInfo->GetVM();
152 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
153 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
154 Local<JSValueRef> snapAlignValue = runtimeCallInfo->GetCallArgRef(1); // 1: index of snap align value
155 Local<JSValueRef> paginationValue = runtimeCallInfo->GetCallArgRef(2); // 2: index of pagination value
156 Local<JSValueRef> enableSnapToStartValue = runtimeCallInfo->GetCallArgRef(3); // 3: index of enableSnapToStart value
157 Local<JSValueRef> enableSnapToEndValue = runtimeCallInfo->GetCallArgRef(4); // 4: index of enableSnapToEnd value
158 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
159 auto snapAlign = static_cast<int32_t>(ScrollSnapAlign::NONE);
160 if (snapAlignValue->IsNull() || snapAlignValue->IsUndefined() ||
161 !ArkTSUtils::ParseJsInteger(vm, snapAlignValue, snapAlign) ||
162 snapAlign < static_cast<int32_t>(ScrollSnapAlign::NONE) ||
163 snapAlign > static_cast<int32_t>(ScrollSnapAlign::END)) {
164 snapAlign = static_cast<int32_t>(ScrollSnapAlign::NONE);
165 }
166 std::vector<ArkUI_Float32> vPaginationValue;
167 std::vector<int32_t> vPaginationUnit;
168 if (!ParsePagination(vm, paginationValue, vPaginationValue, vPaginationUnit)) {
169 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollSnap(nativeNode);
170 return panda::JSValueRef::Undefined(vm);
171 }
172 bool isArray = true;
173 if (!paginationValue->IsArray(vm)) {
174 isArray = false;
175 }
176 auto pLength = vPaginationValue.size();
177 vPaginationUnit.push_back(snapAlign);
178 vPaginationUnit.push_back(static_cast<int32_t>(enableSnapToStartValue->ToBoolean(vm)->Value()));
179 vPaginationUnit.push_back(static_cast<int32_t>(enableSnapToEndValue->ToBoolean(vm)->Value()));
180 vPaginationUnit.push_back(static_cast<int32_t>(isArray));
181 auto uLength = pLength + 4;
182 GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollSnap(
183 nativeNode, vPaginationValue.data(), pLength, vPaginationUnit.data(), uLength);
184 return panda::JSValueRef::Undefined(vm);
185 }
186
ResetScrollSnap(ArkUIRuntimeCallInfo * runtimeCallInfo)187 ArkUINativeModuleValue ScrollBridge::ResetScrollSnap(ArkUIRuntimeCallInfo* runtimeCallInfo)
188 {
189 EcmaVM* vm = runtimeCallInfo->GetVM();
190 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
191 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
192 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
193 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollSnap(nativeNode);
194 return panda::JSValueRef::Undefined(vm);
195 }
196
SetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)197 ArkUINativeModuleValue ScrollBridge::SetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
198 {
199 EcmaVM* vm = runtimeCallInfo->GetVM();
200 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
201 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
202 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
203 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
204 auto value = static_cast<int32_t>(DisplayMode::AUTO);
205 if (!jsValue->IsUndefined()) {
206 ArkTSUtils::ParseJsInteger(vm, jsValue, value);
207 }
208 GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBar(nativeNode, value);
209 return panda::JSValueRef::Undefined(vm);
210 }
211
ResetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)212 ArkUINativeModuleValue ScrollBridge::ResetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
213 {
214 EcmaVM* vm = runtimeCallInfo->GetVM();
215 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
216 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
217 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
218 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBar(nativeNode);
219 return panda::JSValueRef::Undefined(vm);
220 }
221
SetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)222 ArkUINativeModuleValue ScrollBridge::SetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
223 {
224 EcmaVM* vm = runtimeCallInfo->GetVM();
225 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
226 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
227 Local<JSValueRef> scrollDirectionArg = runtimeCallInfo->GetCallArgRef(1);
228 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
229 if (scrollDirectionArg->IsUndefined() || scrollDirectionArg->IsNull()) {
230 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
231 return panda::JSValueRef::Undefined(vm);
232 }
233
234 int32_t scrollDirection = scrollDirectionArg->Int32Value(vm);
235 if (scrollDirection != static_cast<int32_t>(Axis::VERTICAL) &&
236 scrollDirection != static_cast<int32_t>(Axis::HORIZONTAL) &&
237 scrollDirection != static_cast<int32_t>(Axis::FREE) && scrollDirection != static_cast<int32_t>(Axis::NONE)) {
238 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
239 } else {
240 GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollable(nativeNode, scrollDirection);
241 }
242
243 return panda::JSValueRef::Undefined(vm);
244 }
245
ResetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)246 ArkUINativeModuleValue ScrollBridge::ResetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
247 {
248 EcmaVM* vm = runtimeCallInfo->GetVM();
249 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
250 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
251 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
252 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
253 return panda::JSValueRef::Undefined(vm);
254 }
255
SetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)256 ArkUINativeModuleValue ScrollBridge::SetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
257 {
258 EcmaVM* vm = runtimeCallInfo->GetVM();
259 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
260 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
261 Local<JSValueRef> barcolorArg = runtimeCallInfo->GetCallArgRef(1);
262 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
263 Color color;
264 if (!ArkTSUtils::ParseJsColorAlpha(vm, barcolorArg, color)) {
265 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarColor(nativeNode);
266 } else {
267 GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBarColor(nativeNode, color.GetValue());
268 }
269
270 return panda::JSValueRef::Undefined(vm);
271 }
272
ResetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)273 ArkUINativeModuleValue ScrollBridge::ResetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
274 {
275 EcmaVM* vm = runtimeCallInfo->GetVM();
276 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
277 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
278 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
279 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarColor(nativeNode);
280 return panda::JSValueRef::Undefined(vm);
281 }
282
SetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)283 ArkUINativeModuleValue ScrollBridge::SetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
284 {
285 EcmaVM* vm = runtimeCallInfo->GetVM();
286 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
287 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
288 Local<JSValueRef> scrollBarArg = runtimeCallInfo->GetCallArgRef(1);
289 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
290 CalcDimension scrollBarWidth;
291 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, scrollBarArg, scrollBarWidth, false)) {
292 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
293 } else {
294 if (LessNotEqual(scrollBarWidth.Value(), 0.0)) {
295 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
296 } else {
297 GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBarWidth(
298 nativeNode, scrollBarWidth.Value(), static_cast<int32_t>(scrollBarWidth.Unit()));
299 }
300 }
301
302 return panda::JSValueRef::Undefined(vm);
303 }
304
ResetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)305 ArkUINativeModuleValue ScrollBridge::ResetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
306 {
307 EcmaVM* vm = runtimeCallInfo->GetVM();
308 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
309 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
310 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
311 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
312 return panda::JSValueRef::Undefined(vm);
313 }
314
SetEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)315 ArkUINativeModuleValue ScrollBridge::SetEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
316 {
317 EcmaVM* vm = runtimeCallInfo->GetVM();
318 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
319 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
320 Local<JSValueRef> effectArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of effect value
321 Local<JSValueRef> isEffectArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of isEffect value
322 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
323 int32_t effect = static_cast<int32_t>(EdgeEffect::NONE);
324 if (!effectArg->IsUndefined() && !effectArg->IsNull()) {
325 effect = effectArg->Int32Value(vm);
326 }
327
328 if (effect != static_cast<int32_t>(EdgeEffect::SPRING) && effect != static_cast<int32_t>(EdgeEffect::NONE) &&
329 effect != static_cast<int32_t>(EdgeEffect::FADE)) {
330 effect = static_cast<int32_t>(EdgeEffect::NONE);
331 }
332
333 if (isEffectArg->IsUndefined() || isEffectArg->IsNull()) {
334 GetArkUINodeModifiers()->getScrollModifier()->setScrollEdgeEffect(nativeNode, effect, true);
335 } else {
336 GetArkUINodeModifiers()->getScrollModifier()->setScrollEdgeEffect(
337 nativeNode, effect, isEffectArg->ToBoolean(vm)->Value());
338 }
339
340 return panda::JSValueRef::Undefined(vm);
341 }
342
ResetEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)343 ArkUINativeModuleValue ScrollBridge::ResetEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
344 {
345 EcmaVM* vm = runtimeCallInfo->GetVM();
346 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
347 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
348 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
349 GetArkUINodeModifiers()->getScrollModifier()->resetScrollEdgeEffect(nativeNode);
350 return panda::JSValueRef::Undefined(vm);
351 }
352
SetEnablePaging(ArkUIRuntimeCallInfo * runtimeCallInfo)353 ArkUINativeModuleValue ScrollBridge::SetEnablePaging(ArkUIRuntimeCallInfo* runtimeCallInfo)
354 {
355 EcmaVM* vm = runtimeCallInfo->GetVM();
356 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
357 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
358 Local<JSValueRef> enablePagingArg = runtimeCallInfo->GetCallArgRef(1);
359 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
360 bool enablePaging;
361 if (enablePagingArg->IsBoolean()) {
362 enablePaging = enablePagingArg->ToBoolean(vm)->Value();
363 GetArkUINodeModifiers()->getScrollModifier()->setScrollEnablePaging(nativeNode, enablePaging);
364 } else {
365 GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnablePaging(nativeNode);
366 }
367 return panda::JSValueRef::Undefined(vm);
368 }
369
ResetEnablePaging(ArkUIRuntimeCallInfo * runtimeCallInfo)370 ArkUINativeModuleValue ScrollBridge::ResetEnablePaging(ArkUIRuntimeCallInfo* runtimeCallInfo)
371 {
372 EcmaVM* vm = runtimeCallInfo->GetVM();
373 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
374 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
375 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
376 GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnablePaging(nativeNode);
377 return panda::JSValueRef::Undefined(vm);
378 }
379
SetInitialOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)380 ArkUINativeModuleValue ScrollBridge::SetInitialOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
381 {
382 EcmaVM* vm = runtimeCallInfo->GetVM();
383 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
384 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
385 Local<JSValueRef> xOffsetArg = runtimeCallInfo->GetCallArgRef(NUM_1);
386 Local<JSValueRef> yOffsetArg = runtimeCallInfo->GetCallArgRef(NUM_2);
387 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
388
389 CalcDimension x;
390 ArkTSUtils::ParseJsDimensionVpNG(vm, xOffsetArg, x, false);
391 CalcDimension y;
392 ArkTSUtils::ParseJsDimensionVpNG(vm, yOffsetArg, y, false);
393
394 GetArkUINodeModifiers()->getScrollModifier()->setScrollInitialOffset(nativeNode, x.Value(),
395 static_cast<int32_t>(x.Unit()), y.Value(), static_cast<int32_t>(y.Unit()));
396 return panda::JSValueRef::Undefined(vm);
397 }
398
ResetInitialOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)399 ArkUINativeModuleValue ScrollBridge::ResetInitialOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
400 {
401 EcmaVM* vm = runtimeCallInfo->GetVM();
402 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
403 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
404 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
405 GetArkUINodeModifiers()->getScrollModifier()->resetScrollInitialOffset(nativeNode);
406 return panda::JSValueRef::Undefined(vm);
407 }
408
SetFlingSpeedLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)409 ArkUINativeModuleValue ScrollBridge::SetFlingSpeedLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
410 {
411 EcmaVM* vm = runtimeCallInfo->GetVM();
412 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
413 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
414 Local<JSValueRef> flingSpeedLimitArg = runtimeCallInfo->GetCallArgRef(NUM_1);
415 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
416 double max = -1.0;
417 if (!ArkTSUtils::ParseJsDouble(vm, flingSpeedLimitArg, max)) {
418 GetArkUINodeModifiers()->getScrollModifier()->resetScrollFlingSpeedLimit(nativeNode);
419 } else {
420 GetArkUINodeModifiers()->getScrollModifier()->setScrollFlingSpeedLimit(nativeNode,
421 static_cast<ArkUI_Float32>(max));
422 }
423 return panda::JSValueRef::Undefined(vm);
424 }
425
ResetFlingSpeedLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)426 ArkUINativeModuleValue ScrollBridge::ResetFlingSpeedLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
427 {
428 EcmaVM* vm = runtimeCallInfo->GetVM();
429 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
430 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
431 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
432 GetArkUINodeModifiers()->getScrollModifier()->resetScrollFlingSpeedLimit(nativeNode);
433 return panda::JSValueRef::Undefined(vm);
434 }
435
SetScrollInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)436 ArkUINativeModuleValue ScrollBridge::SetScrollInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
437 {
438 EcmaVM* vm = runtimeCallInfo->GetVM();
439 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
440 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
441 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
442
443 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
444 if (!info[1]->IsNull() && info[1]->IsObject()) {
445 Framework::JSScroller* jsScroller =
446 Framework::JSRef<Framework::JSObject>::Cast(info[1])->Unwrap<Framework::JSScroller>();
447 if (jsScroller) {
448 jsScroller->SetInstanceId(Container::CurrentId());
449 auto positionController = GetArkUINodeModifiers()->getScrollModifier()->getScroll(nativeNode);
450 auto nodePositionController =
451 AceType::Claim(reinterpret_cast<OHOS::Ace::ScrollControllerBase*>(positionController));
452 jsScroller->SetController(nodePositionController);
453 // Init scroll bar proxy.
454 auto proxy = jsScroller->GetScrollBarProxy();
455 if (!proxy) {
456 proxy = ScrollModel::GetInstance()->CreateScrollBarProxy();
457 jsScroller->SetScrollBarProxy(proxy);
458 }
459 auto proxyPtr = reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(proxy));
460 GetArkUINodeModifiers()->getScrollModifier()->setScrollBarProxy(nativeNode, proxyPtr);
461 }
462 }
463 return panda::JSValueRef::Undefined(vm);
464 }
465
ResetScrollInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)466 ArkUINativeModuleValue ScrollBridge::ResetScrollInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
467 {
468 EcmaVM* vm = runtimeCallInfo->GetVM();
469 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
470 return panda::JSValueRef::Undefined(vm);
471 }
472
SetScrollOnScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)473 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
474 {
475 EcmaVM *vm = runtimeCallInfo->GetVM();
476 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
477 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
478 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
479 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
480 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
481 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStart(nativeNode);
482 return panda::JSValueRef::Undefined(vm);
483 }
484 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
485 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
486 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
487
488 std::function<void()> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
489 panda::LocalScope pandaScope(vm);
490 panda::TryCatch trycatch(vm);
491 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
492 func->Call(vm, func.ToLocal(), nullptr, 0);
493 };
494 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollStart(
495 nativeNode, reinterpret_cast<void*>(&callback));
496 return panda::JSValueRef::Undefined(vm);
497 }
498
ResetScrollOnScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)499 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
500 {
501 EcmaVM* vm = runtimeCallInfo->GetVM();
502 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
503 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
504 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
505 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStart(nativeNode);
506 return panda::JSValueRef::Undefined(vm);
507 }
508
SetScrollOnScrollEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)509 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
510 {
511 EcmaVM *vm = runtimeCallInfo->GetVM();
512 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
513 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
514 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
515 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
516 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
517 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEnd(nativeNode);
518 return panda::JSValueRef::Undefined(vm);
519 }
520 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
521 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
522 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
523 std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
524 panda::LocalScope pandaScope(vm);
525 panda::TryCatch trycatch(vm);
526 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
527 func->Call(vm, func.ToLocal(), nullptr, 0);
528 };
529 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollEnd(nativeNode, reinterpret_cast<void*>(&callback));
530 return panda::JSValueRef::Undefined(vm);
531 }
532
ResetScrollOnScrollEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)533 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
534 {
535 EcmaVM* vm = runtimeCallInfo->GetVM();
536 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
537 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
538 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
539 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEnd(nativeNode);
540 return panda::JSValueRef::Undefined(vm);
541 }
542
SetScrollOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)543 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
544 {
545 EcmaVM *vm = runtimeCallInfo->GetVM();
546 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
547 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
548 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
549 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
550 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
551 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStop(nativeNode);
552 return panda::JSValueRef::Undefined(vm);
553 }
554 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
555 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
556 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
557 std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
558 panda::LocalScope pandaScope(vm);
559 panda::TryCatch trycatch(vm);
560 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
561 func->Call(vm, func.ToLocal(), nullptr, 0);
562 };
563 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollStop(nativeNode, reinterpret_cast<void*>(&callback));
564 return panda::JSValueRef::Undefined(vm);
565 }
566
ResetScrollOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)567 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
568 {
569 EcmaVM* vm = runtimeCallInfo->GetVM();
570 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
571 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
572 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
573 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStop(nativeNode);
574 return panda::JSValueRef::Undefined(vm);
575 }
576
SetScrollOnScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)577 ArkUINativeModuleValue ScrollBridge::SetScrollOnScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
578 {
579 EcmaVM* vm = runtimeCallInfo->GetVM();
580 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
581 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
582 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
583 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
584 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
585 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScroll(nativeNode);
586 return panda::JSValueRef::Undefined(vm);
587 }
588 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
589 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
590 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
591 std::function<void(OHOS::Ace::Dimension, OHOS::Ace::Dimension)> callback =
592 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
593 OHOS::Ace::Dimension xOffset, OHOS::Ace::Dimension yOffset) {
594 panda::LocalScope pandaScope(vm);
595 panda::TryCatch trycatch(vm);
596 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
597
598 panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
599 vm, static_cast<int32_t>(xOffset.ConvertToVp()));
600 panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
601 vm, static_cast<int32_t>(yOffset.ConvertToVp()));
602 panda::Local<panda::JSValueRef> params[2] = { xOffsetParam, yOffsetParam }; // 2: Array .length
603 func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
604 };
605 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScroll(nativeNode,
606 reinterpret_cast<void*>(&callback));
607 return panda::JSValueRef::Undefined(vm);
608 }
609
ResetScrollOnScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)610 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
611 {
612 EcmaVM* vm = runtimeCallInfo->GetVM();
613 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
614 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
615 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
616 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScroll(nativeNode);
617 return panda::JSValueRef::Undefined(vm);
618 }
619
SetScrollOnScrollEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)620 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
621 {
622 EcmaVM* vm = runtimeCallInfo->GetVM();
623 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
624 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
625 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
626 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
627 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
628 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEdge(nativeNode);
629 return panda::JSValueRef::Undefined(vm);
630 }
631 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
632 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
633 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
634 std::function<void(OHOS::Ace::NG::ScrollEdge)> callback =
635 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
636 OHOS::Ace::NG::ScrollEdge edge) {
637 panda::LocalScope pandaScope(vm);
638 panda::TryCatch trycatch(vm);
639 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
640
641 panda::Local<panda::NumberRef> edgeParam = panda::NumberRef::New(vm, static_cast<int32_t>(edge));
642 panda::Local<panda::JSValueRef> params[1] = { edgeParam }; // 1: Array length
643 func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
644 };
645 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollEdge(nativeNode,
646 reinterpret_cast<void*>(&callback));
647 return panda::JSValueRef::Undefined(vm);
648 }
649
ResetScrollOnScrollEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)650 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
651 {
652 EcmaVM* vm = runtimeCallInfo->GetVM();
653 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
654 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
655 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
656 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEdge(nativeNode);
657 return panda::JSValueRef::Undefined(vm);
658 }
659
SetScrollOnDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)660 ArkUINativeModuleValue ScrollBridge::SetScrollOnDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
661 {
662 EcmaVM* vm = runtimeCallInfo->GetVM();
663 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
664 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
665 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
666 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
667 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
668 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnDidScroll(nativeNode);
669 return panda::JSValueRef::Undefined(vm);
670 }
671 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
672 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
673 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
674 std::function<void(Dimension, Dimension, ScrollState)> callback =
675 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
676 Dimension xOffset, Dimension yOffset, ScrollState state) {
677 panda::LocalScope pandaScope(vm);
678 panda::TryCatch trycatch(vm);
679 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
680
681 panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
682 vm, static_cast<int32_t>(xOffset.ConvertToVp()));
683 panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
684 vm, static_cast<int32_t>(yOffset.ConvertToVp()));
685 panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<int32_t>(state));
686 // 3: Array length
687 panda::Local<panda::JSValueRef> params[3] = { xOffsetParam, yOffsetParam, stateParam };
688 func->Call(vm, func.ToLocal(), params, 3); // 3: Array length
689 };
690 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnDidScrollCallBack(nativeNode,
691 reinterpret_cast<void*>(&callback));
692 return panda::JSValueRef::Undefined(vm);
693 }
694
ResetScrollOnDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)695 ArkUINativeModuleValue ScrollBridge::ResetScrollOnDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
696 {
697 EcmaVM* vm = runtimeCallInfo->GetVM();
698 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
699 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
700 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
701 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnDidScroll(nativeNode);
702 return panda::JSValueRef::Undefined(vm);
703 }
704
SetScrollOnWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)705 ArkUINativeModuleValue ScrollBridge::SetScrollOnWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
706 {
707 EcmaVM* vm = runtimeCallInfo->GetVM();
708 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
709 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
710 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
711 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
712 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
713 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnWillScrollCallBack(nativeNode);
714 return panda::JSValueRef::Undefined(vm);
715 }
716 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
717 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
718 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
719 std::function<TwoDimensionScrollResult(Dimension, Dimension, ScrollState, ScrollSource)> callback =
720 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](Dimension xOffset,
721 Dimension yOffset, ScrollState state, ScrollSource scrollState) -> TwoDimensionScrollResult {
722 panda::LocalScope pandaScope(vm);
723 panda::TryCatch trycatch(vm);
724 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
725
726 panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
727 vm, static_cast<double>(xOffset.ConvertToVp()));
728 panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
729 vm, static_cast<double>(yOffset.ConvertToVp()));
730 panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
731 panda::Local<panda::NumberRef> sourceParam = panda::NumberRef::New(vm, static_cast<double>(scrollState));
732 // 4: Array length
733 panda::Local<panda::JSValueRef> params[4] = { xOffsetParam, yOffsetParam, stateParam, sourceParam};
734 auto result = func->Call(vm, func.ToLocal(), params, 4); // 4: Array length
735 NG::TwoDimensionScrollResult scrollRes { .xOffset = xOffset, .yOffset = yOffset };
736
737 if (result->IsObject(vm)) {
738 auto resultObj = result->ToObject(vm);
739 panda::Local<panda::JSValueRef> x = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "xOffset"));
740 panda::Local<panda::JSValueRef> y = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "yOffset"));
741 if (x->IsNumber()) {
742 scrollRes.xOffset = Dimension(x->ToNumber(vm)->Value(), DimensionUnit::VP);
743 }
744 if (y->IsNumber()) {
745 scrollRes.yOffset = Dimension(y->ToNumber(vm)->Value(), DimensionUnit::VP);
746 }
747 }
748 return scrollRes;
749 };
750 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnWillScrollCallBack(nativeNode,
751 reinterpret_cast<void*>(&callback));
752 return panda::JSValueRef::Undefined(vm);
753 }
754
ResetScrollOnWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)755 ArkUINativeModuleValue ScrollBridge::ResetScrollOnWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
756 {
757 EcmaVM* vm = runtimeCallInfo->GetVM();
758 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
759 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
760 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
761 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnWillScrollCallBack(nativeNode);
762 return panda::JSValueRef::Undefined(vm);
763 }
764
SetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)765 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
766 {
767 EcmaVM* vm = runtimeCallInfo->GetVM();
768 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
769 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
770 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
771 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
772 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
773 GetArkUINodeModifiers()->getScrollModifier()->resetOnScrollFrameBeginCallBack(nativeNode);
774 return panda::JSValueRef::Undefined(vm);
775 }
776 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
777 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
778 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
779 std::function<ScrollFrameResult(Dimension, ScrollState)> callback = [vm, frameNode,
780 func = panda::CopyableGlobal(vm, func)](Dimension offset, ScrollState state) -> ScrollFrameResult {
781 panda::LocalScope pandaScope(vm);
782 panda::TryCatch trycatch(vm);
783 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
784
785 panda::Local<panda::NumberRef> offsetParam = panda::NumberRef::New(
786 vm, static_cast<double>(offset.ConvertToVp()));
787 panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
788 // 2: Array length
789 panda::Local<panda::JSValueRef> params[2] = { offsetParam, stateParam };
790 auto value = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
791
792 OHOS::Ace::ScrollFrameResult scrollRes { .offset = offset };
793 if (value->IsNumber()) {
794 scrollRes.offset = Dimension(value->ToNumber(vm)->Value(), DimensionUnit::VP);
795 }
796 if (value->IsObject(vm)) {
797 auto resultObj = value->ToObject(vm);
798 panda::Local<panda::JSValueRef> remain = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm,
799 "offsetRemain"));
800 if (remain->IsNumber()) {
801 scrollRes.offset = Dimension(remain->ToNumber(vm)->Value(), DimensionUnit::VP);
802 }
803 }
804 return scrollRes;
805 };
806 GetArkUINodeModifiers()->getScrollModifier()->setOnScrollFrameBeginCallBack(nativeNode,
807 reinterpret_cast<void*>(&callback));
808 return panda::JSValueRef::Undefined(vm);
809 }
810
ResetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)811 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
812 {
813 EcmaVM* vm = runtimeCallInfo->GetVM();
814 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
815 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
816 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
817 GetArkUINodeModifiers()->getScrollModifier()->resetOnScrollFrameBeginCallBack(nativeNode);
818 return panda::JSValueRef::Undefined(vm);
819 }
820 } // namespace OHOS::Ace::NG
821