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