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
ParsePaginationNG(const EcmaVM * vm,const Local<JSValueRef> & paginationValue,std::vector<ArkUI_Float32> & vPaginationValue,std::vector<RefPtr<ResourceObject>> & resObjs,std::vector<int32_t> & vPaginationUnit)65 bool ParsePaginationNG(const EcmaVM* vm, const Local<JSValueRef>& paginationValue,
66 std::vector<ArkUI_Float32>& vPaginationValue, std::vector<RefPtr<ResourceObject>>& resObjs,
67 std::vector<int32_t>& vPaginationUnit)
68 {
69 uint32_t pLength = 0;
70 resObjs.clear();
71 if (paginationValue->IsArray(vm)) {
72 auto paginationArray = panda::Local<panda::ArrayRef>(paginationValue);
73 pLength = paginationArray->Length(vm);
74 if (pLength <= 0) {
75 return false;
76 }
77 resObjs.resize(pLength);
78 for (uint32_t i = 0; i < pLength; i++) {
79 CalcDimension dims;
80 Local<JSValueRef> xValue = panda::ArrayRef::GetValueAt(vm, paginationArray, i);
81 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, xValue, dims, resObjs[i], true)) {
82 continue;
83 }
84 vPaginationValue.push_back(static_cast<ArkUI_Float32>(dims.Value()));
85 vPaginationUnit.push_back(static_cast<int32_t>(dims.Unit()));
86 }
87 } else {
88 CalcDimension intervalSize;
89 resObjs.resize(1);
90 if (!ArkTSUtils::ParseJsDimensionVp(vm, paginationValue, intervalSize, resObjs[0]) ||
91 intervalSize.IsNegative()) {
92 intervalSize = CalcDimension(0.0);
93 }
94 vPaginationValue.push_back(static_cast<ArkUI_Float32>(intervalSize.Value()));
95 vPaginationUnit.push_back(static_cast<int32_t>(intervalSize.Unit()));
96 }
97
98 return true;
99 }
100
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)101 ArkUINativeModuleValue ScrollBridge::SetNestedScroll(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> scrollForwardValue = runtimeCallInfo->GetCallArgRef(1); // 1: index of scroll forward value
107 Local<JSValueRef> scrollBackwardValue = runtimeCallInfo->GetCallArgRef(2); // 2: index of scroll backward value
108 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
109 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
110 auto froward = 0;
111 auto backward = 0;
112 ArkTSUtils::ParseJsInteger(vm, scrollForwardValue, froward);
113 if (froward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
114 froward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
115 froward = FROWARD_INITIAL_VALUE;
116 }
117 ArkTSUtils::ParseJsInteger(vm, scrollBackwardValue, backward);
118 if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
119 backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
120 backward = BACKWARD_INITIAL_VALUE;
121 }
122 GetArkUINodeModifiers()->getScrollModifier()->setScrollNestedScroll(nativeNode, froward, backward);
123 return panda::JSValueRef::Undefined(vm);
124 }
125
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)126 ArkUINativeModuleValue ScrollBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
127 {
128 EcmaVM* vm = runtimeCallInfo->GetVM();
129 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
130 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
131 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
132 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
133 GetArkUINodeModifiers()->getScrollModifier()->resetScrollNestedScroll(nativeNode);
134 return panda::JSValueRef::Undefined(vm);
135 }
136
SetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)137 ArkUINativeModuleValue ScrollBridge::SetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
138 {
139 EcmaVM* vm = runtimeCallInfo->GetVM();
140 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
141 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
142 Local<JSValueRef> isEnabledArg = runtimeCallInfo->GetCallArgRef(1);
143 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
144 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
145 bool isEnabled = isEnabledArg->IsBoolean() ? isEnabledArg->ToBoolean(vm)->Value() : true;
146 GetArkUINodeModifiers()->getScrollModifier()->setScrollEnableScroll(nativeNode, isEnabled);
147 return panda::JSValueRef::Undefined(vm);
148 }
149
ResetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)150 ArkUINativeModuleValue ScrollBridge::ResetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
151 {
152 EcmaVM* vm = runtimeCallInfo->GetVM();
153 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
154 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
155 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
156 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
157 GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnableScroll(nativeNode);
158 return panda::JSValueRef::Undefined(vm);
159 }
160
SetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)161 ArkUINativeModuleValue ScrollBridge::SetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
162 {
163 EcmaVM* vm = runtimeCallInfo->GetVM();
164 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
165 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
166 Local<JSValueRef> scrollFrictionArg = runtimeCallInfo->GetCallArgRef(1);
167 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
168 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
169 double friction = FRICTION_DEFAULT;
170 RefPtr<ResourceObject> resObj;
171 if (!ArkTSUtils::ParseJsDouble(vm, scrollFrictionArg, friction, resObj)) {
172 GetArkUINodeModifiers()->getScrollModifier()->resetScrollFriction(nativeNode);
173 } else {
174 if (SystemProperties::ConfigChangePerform()) {
175 GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjFriction(
176 nativeNode, reinterpret_cast<void*>(AceType::RawPtr(resObj)));
177 }
178 GetArkUINodeModifiers()->getScrollModifier()->setScrollFriction(
179 nativeNode, static_cast<ArkUI_Float32>(friction));
180 }
181 return panda::JSValueRef::Undefined(vm);
182 }
183
ResetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)184 ArkUINativeModuleValue ScrollBridge::ResetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
185 {
186 EcmaVM* vm = runtimeCallInfo->GetVM();
187 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
188 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
189 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
190 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
191 GetArkUINodeModifiers()->getScrollModifier()->resetScrollFriction(nativeNode);
192 if (SystemProperties::ConfigChangePerform()) {
193 GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjFriction(nativeNode, nullptr);
194 }
195 return panda::JSValueRef::Undefined(vm);
196 }
197
SetScrollSnap(ArkUIRuntimeCallInfo * runtimeCallInfo)198 ArkUINativeModuleValue ScrollBridge::SetScrollSnap(ArkUIRuntimeCallInfo* runtimeCallInfo)
199 {
200 EcmaVM* vm = runtimeCallInfo->GetVM();
201 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
202 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
203 Local<JSValueRef> snapAlignValue = runtimeCallInfo->GetCallArgRef(1); // 1: index of snap align value
204 Local<JSValueRef> paginationValue = runtimeCallInfo->GetCallArgRef(2); // 2: index of pagination value
205 Local<JSValueRef> enableSnapToStartValue = runtimeCallInfo->GetCallArgRef(3); // 3: index of enableSnapToStart value
206 Local<JSValueRef> enableSnapToEndValue = runtimeCallInfo->GetCallArgRef(4); // 4: index of enableSnapToEnd value
207 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
208 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
209 auto snapAlign = static_cast<int32_t>(ScrollSnapAlign::NONE);
210 if (snapAlignValue->IsNull() || snapAlignValue->IsUndefined() ||
211 !ArkTSUtils::ParseJsInteger(vm, snapAlignValue, snapAlign) ||
212 snapAlign < static_cast<int32_t>(ScrollSnapAlign::NONE) ||
213 snapAlign > static_cast<int32_t>(ScrollSnapAlign::END)) {
214 snapAlign = static_cast<int32_t>(ScrollSnapAlign::NONE);
215 }
216 std::vector<ArkUI_Float32> vPaginationValue;
217 std::vector<int32_t> vPaginationUnit;
218 std::vector<RefPtr<ResourceObject>> resObjs;
219 auto parseOK = ParsePaginationNG(vm, paginationValue, vPaginationValue, resObjs, vPaginationUnit);
220 bool isArray = true;
221 if (!paginationValue->IsArray(vm)) {
222 isArray = false;
223 }
224 auto pLength = vPaginationValue.size();
225 vPaginationUnit.push_back(snapAlign);
226 vPaginationUnit.push_back(static_cast<int32_t>(enableSnapToStartValue->ToBoolean(vm)->Value()));
227 vPaginationUnit.push_back(static_cast<int32_t>(enableSnapToEndValue->ToBoolean(vm)->Value()));
228 vPaginationUnit.push_back(static_cast<int32_t>(isArray));
229 auto uLength = pLength + 4;
230
231 if (SystemProperties::ConfigChangePerform()) {
232 GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjSnap(
233 nativeNode, vPaginationValue.data(), pLength, vPaginationUnit.data(), &resObjs);
234 }
235 if (!parseOK) {
236 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollSnap(nativeNode);
237 return panda::JSValueRef::Undefined(vm);
238 }
239 GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollSnap(
240 nativeNode, vPaginationValue.data(), pLength, vPaginationUnit.data(), uLength);
241 return panda::JSValueRef::Undefined(vm);
242 }
243
ResetScrollSnap(ArkUIRuntimeCallInfo * runtimeCallInfo)244 ArkUINativeModuleValue ScrollBridge::ResetScrollSnap(ArkUIRuntimeCallInfo* runtimeCallInfo)
245 {
246 EcmaVM* vm = runtimeCallInfo->GetVM();
247 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
248 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
249 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
250 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
251 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollSnap(nativeNode);
252 if (SystemProperties::ConfigChangePerform()) {
253 GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjSnap(
254 nativeNode, nullptr, 0, nullptr, nullptr);
255 }
256 return panda::JSValueRef::Undefined(vm);
257 }
258
SetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)259 ArkUINativeModuleValue ScrollBridge::SetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
260 {
261 EcmaVM* vm = runtimeCallInfo->GetVM();
262 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
263 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
264 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
265 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
266 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
267 auto value = static_cast<int32_t>(DisplayMode::AUTO);
268 if (!jsValue->IsUndefined()) {
269 ArkTSUtils::ParseJsInteger(vm, jsValue, value);
270 }
271 GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBar(nativeNode, value);
272 return panda::JSValueRef::Undefined(vm);
273 }
274
ResetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)275 ArkUINativeModuleValue ScrollBridge::ResetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
276 {
277 EcmaVM* vm = runtimeCallInfo->GetVM();
278 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
279 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
280 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
281 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
282 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBar(nativeNode);
283 return panda::JSValueRef::Undefined(vm);
284 }
285
SetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)286 ArkUINativeModuleValue ScrollBridge::SetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
287 {
288 EcmaVM* vm = runtimeCallInfo->GetVM();
289 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
290 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
291 Local<JSValueRef> scrollDirectionArg = runtimeCallInfo->GetCallArgRef(1);
292 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
293 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
294 if (scrollDirectionArg->IsUndefined() || scrollDirectionArg->IsNull()) {
295 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
296 return panda::JSValueRef::Undefined(vm);
297 }
298
299 int32_t scrollDirection = scrollDirectionArg->Int32Value(vm);
300 if (scrollDirection != static_cast<int32_t>(Axis::VERTICAL) &&
301 scrollDirection != static_cast<int32_t>(Axis::HORIZONTAL) &&
302 scrollDirection != static_cast<int32_t>(Axis::FREE) && scrollDirection != static_cast<int32_t>(Axis::NONE)) {
303 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
304 } else {
305 GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollable(nativeNode, scrollDirection);
306 }
307
308 return panda::JSValueRef::Undefined(vm);
309 }
310
ResetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)311 ArkUINativeModuleValue ScrollBridge::ResetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
312 {
313 EcmaVM* vm = runtimeCallInfo->GetVM();
314 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
315 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
316 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
317 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
318 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
319 return panda::JSValueRef::Undefined(vm);
320 }
321
SetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)322 ArkUINativeModuleValue ScrollBridge::SetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
323 {
324 EcmaVM* vm = runtimeCallInfo->GetVM();
325 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
326 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
327 Local<JSValueRef> barcolorArg = runtimeCallInfo->GetCallArgRef(1);
328 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
329 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
330 Color color;
331 RefPtr<ResourceObject> resObj;
332 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
333 if (!ArkTSUtils::ParseJsColorAlpha(vm, barcolorArg, color, resObj, nodeInfo)) {
334 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarColor(nativeNode);
335 } else {
336 if (SystemProperties::ConfigChangePerform()) {
337 GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjScrollBarColor(
338 nativeNode, reinterpret_cast<void*>(AceType::RawPtr(resObj)));
339 }
340 GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBarColor(nativeNode, color.GetValue());
341 }
342
343 return panda::JSValueRef::Undefined(vm);
344 }
345
ResetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)346 ArkUINativeModuleValue ScrollBridge::ResetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
347 {
348 EcmaVM* vm = runtimeCallInfo->GetVM();
349 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
350 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
351 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
352 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
353 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarColor(nativeNode);
354 if (SystemProperties::ConfigChangePerform()) {
355 GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjScrollBarColor(nativeNode, nullptr);
356 }
357 return panda::JSValueRef::Undefined(vm);
358 }
359
SetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)360 ArkUINativeModuleValue ScrollBridge::SetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
361 {
362 EcmaVM* vm = runtimeCallInfo->GetVM();
363 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
364 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
365 Local<JSValueRef> scrollBarArg = runtimeCallInfo->GetCallArgRef(1);
366 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
367 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
368 CalcDimension scrollBarWidth;
369 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, scrollBarArg, scrollBarWidth, false)) {
370 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
371 } else {
372 if (LessNotEqual(scrollBarWidth.Value(), 0.0)) {
373 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
374 } else {
375 GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBarWidth(
376 nativeNode, scrollBarWidth.Value(), static_cast<int32_t>(scrollBarWidth.Unit()));
377 }
378 }
379
380 return panda::JSValueRef::Undefined(vm);
381 }
382
ResetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)383 ArkUINativeModuleValue ScrollBridge::ResetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
384 {
385 EcmaVM* vm = runtimeCallInfo->GetVM();
386 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
387 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
388 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
389 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
390 GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
391 return panda::JSValueRef::Undefined(vm);
392 }
393
SetEnablePaging(ArkUIRuntimeCallInfo * runtimeCallInfo)394 ArkUINativeModuleValue ScrollBridge::SetEnablePaging(ArkUIRuntimeCallInfo* runtimeCallInfo)
395 {
396 EcmaVM* vm = runtimeCallInfo->GetVM();
397 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
398 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
399 Local<JSValueRef> enablePagingArg = runtimeCallInfo->GetCallArgRef(1);
400 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
401 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
402 bool enablePaging;
403 if (enablePagingArg->IsBoolean()) {
404 enablePaging = enablePagingArg->ToBoolean(vm)->Value();
405 GetArkUINodeModifiers()->getScrollModifier()->setScrollEnablePaging(nativeNode, enablePaging);
406 } else {
407 GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnablePaging(nativeNode);
408 }
409 return panda::JSValueRef::Undefined(vm);
410 }
411
ResetEnablePaging(ArkUIRuntimeCallInfo * runtimeCallInfo)412 ArkUINativeModuleValue ScrollBridge::ResetEnablePaging(ArkUIRuntimeCallInfo* runtimeCallInfo)
413 {
414 EcmaVM* vm = runtimeCallInfo->GetVM();
415 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
416 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
417 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
418 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
419 GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnablePaging(nativeNode);
420 return panda::JSValueRef::Undefined(vm);
421 }
422
SetInitialOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)423 ArkUINativeModuleValue ScrollBridge::SetInitialOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
424 {
425 EcmaVM* vm = runtimeCallInfo->GetVM();
426 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
427 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
428 Local<JSValueRef> xOffsetArg = runtimeCallInfo->GetCallArgRef(NUM_1);
429 Local<JSValueRef> yOffsetArg = runtimeCallInfo->GetCallArgRef(NUM_2);
430 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
431 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
432
433 CalcDimension x;
434 ArkTSUtils::ParseJsDimensionVpNG(vm, xOffsetArg, x, false);
435 CalcDimension y;
436 ArkTSUtils::ParseJsDimensionVpNG(vm, yOffsetArg, y, false);
437
438 GetArkUINodeModifiers()->getScrollModifier()->setScrollInitialOffset(nativeNode, x.Value(),
439 static_cast<int32_t>(x.Unit()), y.Value(), static_cast<int32_t>(y.Unit()));
440 return panda::JSValueRef::Undefined(vm);
441 }
442
ResetInitialOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)443 ArkUINativeModuleValue ScrollBridge::ResetInitialOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
444 {
445 EcmaVM* vm = runtimeCallInfo->GetVM();
446 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
447 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
448 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
449 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
450 GetArkUINodeModifiers()->getScrollModifier()->resetScrollInitialOffset(nativeNode);
451 return panda::JSValueRef::Undefined(vm);
452 }
453
SetScrollInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)454 ArkUINativeModuleValue ScrollBridge::SetScrollInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
455 {
456 EcmaVM* vm = runtimeCallInfo->GetVM();
457 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
458 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
459 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
460 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
461
462 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
463 if (!info[1]->IsNull() && info[1]->IsObject()) {
464 Framework::JSScroller* jsScroller =
465 Framework::JSRef<Framework::JSObject>::Cast(info[1])->Unwrap<Framework::JSScroller>();
466 if (jsScroller) {
467 jsScroller->SetInstanceId(Container::CurrentId());
468 auto positionController = GetArkUINodeModifiers()->getScrollModifier()->getScroll(nativeNode);
469 auto nodePositionController =
470 AceType::Claim(reinterpret_cast<OHOS::Ace::ScrollControllerBase*>(positionController));
471 jsScroller->SetController(nodePositionController);
472 // Init scroll bar proxy.
473 auto proxy = jsScroller->GetScrollBarProxy();
474 if (!proxy) {
475 proxy = ScrollModel::GetInstance()->CreateScrollBarProxy();
476 jsScroller->SetScrollBarProxy(proxy);
477 }
478 auto proxyPtr = reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(proxy));
479 GetArkUINodeModifiers()->getScrollModifier()->setScrollBarProxy(nativeNode, proxyPtr);
480 }
481 }
482 return panda::JSValueRef::Undefined(vm);
483 }
484
ResetScrollInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)485 ArkUINativeModuleValue ScrollBridge::ResetScrollInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
486 {
487 EcmaVM* vm = runtimeCallInfo->GetVM();
488 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
489 return panda::JSValueRef::Undefined(vm);
490 }
491
SetScrollOnScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)492 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
493 {
494 EcmaVM *vm = runtimeCallInfo->GetVM();
495 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
496 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
497 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
498 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
499 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
500 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
501 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStart(nativeNode);
502 return panda::JSValueRef::Undefined(vm);
503 }
504 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
505 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
506 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
507
508 std::function<void()> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
509 panda::LocalScope pandaScope(vm);
510 panda::TryCatch trycatch(vm);
511 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
512 func->Call(vm, func.ToLocal(), nullptr, 0);
513 };
514 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollStart(
515 nativeNode, reinterpret_cast<void*>(&callback));
516 return panda::JSValueRef::Undefined(vm);
517 }
518
ResetScrollOnScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)519 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
520 {
521 EcmaVM* vm = runtimeCallInfo->GetVM();
522 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
523 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
524 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
525 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
526 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStart(nativeNode);
527 return panda::JSValueRef::Undefined(vm);
528 }
529
SetScrollOnScrollEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)530 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
531 {
532 EcmaVM *vm = runtimeCallInfo->GetVM();
533 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
534 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
535 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
536 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
537 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
538 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
539 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEnd(nativeNode);
540 return panda::JSValueRef::Undefined(vm);
541 }
542 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
543 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
544 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
545 std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
546 panda::LocalScope pandaScope(vm);
547 panda::TryCatch trycatch(vm);
548 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
549 func->Call(vm, func.ToLocal(), nullptr, 0);
550 };
551 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollEnd(nativeNode, reinterpret_cast<void*>(&callback));
552 return panda::JSValueRef::Undefined(vm);
553 }
554
ResetScrollOnScrollEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)555 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
556 {
557 EcmaVM* vm = runtimeCallInfo->GetVM();
558 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
559 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
560 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
561 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
562 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEnd(nativeNode);
563 return panda::JSValueRef::Undefined(vm);
564 }
565
SetScrollOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)566 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
567 {
568 EcmaVM *vm = runtimeCallInfo->GetVM();
569 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
570 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
571 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
572 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
573 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
574 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
575 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStop(nativeNode);
576 return panda::JSValueRef::Undefined(vm);
577 }
578 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
579 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
580 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
581 std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
582 panda::LocalScope pandaScope(vm);
583 panda::TryCatch trycatch(vm);
584 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
585 func->Call(vm, func.ToLocal(), nullptr, 0);
586 };
587 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollStop(nativeNode, reinterpret_cast<void*>(&callback));
588 return panda::JSValueRef::Undefined(vm);
589 }
590
ResetScrollOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)591 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
592 {
593 EcmaVM* vm = runtimeCallInfo->GetVM();
594 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
595 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
596 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
597 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
598 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStop(nativeNode);
599 return panda::JSValueRef::Undefined(vm);
600 }
601
SetScrollOnScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)602 ArkUINativeModuleValue ScrollBridge::SetScrollOnScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
603 {
604 EcmaVM* vm = runtimeCallInfo->GetVM();
605 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
606 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
607 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
608 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
609 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
610 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
611 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScroll(nativeNode);
612 return panda::JSValueRef::Undefined(vm);
613 }
614 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
615 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
616 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
617 std::function<void(OHOS::Ace::Dimension, OHOS::Ace::Dimension)> callback =
618 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
619 OHOS::Ace::Dimension xOffset, OHOS::Ace::Dimension yOffset) {
620 panda::LocalScope pandaScope(vm);
621 panda::TryCatch trycatch(vm);
622 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
623
624 panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
625 vm, static_cast<int32_t>(xOffset.ConvertToVp()));
626 panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
627 vm, static_cast<int32_t>(yOffset.ConvertToVp()));
628 panda::Local<panda::JSValueRef> params[2] = { xOffsetParam, yOffsetParam }; // 2: Array .length
629 func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
630 };
631 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScroll(nativeNode,
632 reinterpret_cast<void*>(&callback));
633 return panda::JSValueRef::Undefined(vm);
634 }
635
ResetScrollOnScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)636 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
637 {
638 EcmaVM* vm = runtimeCallInfo->GetVM();
639 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
640 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
641 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
642 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
643 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScroll(nativeNode);
644 return panda::JSValueRef::Undefined(vm);
645 }
646
SetScrollOnScrollEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)647 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
648 {
649 EcmaVM* vm = runtimeCallInfo->GetVM();
650 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
651 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
652 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
653 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
654 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
655 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
656 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEdge(nativeNode);
657 return panda::JSValueRef::Undefined(vm);
658 }
659 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
660 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
661 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
662 std::function<void(OHOS::Ace::NG::ScrollEdge)> callback =
663 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
664 OHOS::Ace::NG::ScrollEdge edge) {
665 panda::LocalScope pandaScope(vm);
666 panda::TryCatch trycatch(vm);
667 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
668
669 panda::Local<panda::NumberRef> edgeParam = panda::NumberRef::New(vm, static_cast<int32_t>(edge));
670 panda::Local<panda::JSValueRef> params[1] = { edgeParam }; // 1: Array length
671 func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
672 };
673 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollEdge(nativeNode,
674 reinterpret_cast<void*>(&callback));
675 return panda::JSValueRef::Undefined(vm);
676 }
677
ResetScrollOnScrollEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)678 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
679 {
680 EcmaVM* vm = runtimeCallInfo->GetVM();
681 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
682 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
683 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
684 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
685 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEdge(nativeNode);
686 return panda::JSValueRef::Undefined(vm);
687 }
688
SetScrollOnDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)689 ArkUINativeModuleValue ScrollBridge::SetScrollOnDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
690 {
691 EcmaVM* vm = runtimeCallInfo->GetVM();
692 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
693 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
694 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
695 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
696 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
697 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
698 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnDidScroll(nativeNode);
699 return panda::JSValueRef::Undefined(vm);
700 }
701 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
702 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
703 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
704 std::function<void(Dimension, Dimension, ScrollState)> callback =
705 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
706 Dimension xOffset, Dimension yOffset, ScrollState state) {
707 panda::LocalScope pandaScope(vm);
708 panda::TryCatch trycatch(vm);
709 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
710
711 panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
712 vm, static_cast<double>(xOffset.ConvertToVp()));
713 panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
714 vm, static_cast<double>(yOffset.ConvertToVp()));
715 panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<int32_t>(state));
716 // 3: Array length
717 panda::Local<panda::JSValueRef> params[3] = { xOffsetParam, yOffsetParam, stateParam };
718 func->Call(vm, func.ToLocal(), params, 3); // 3: Array length
719 };
720 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnDidScrollCallBack(nativeNode,
721 reinterpret_cast<void*>(&callback));
722 return panda::JSValueRef::Undefined(vm);
723 }
724
ResetScrollOnDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)725 ArkUINativeModuleValue ScrollBridge::ResetScrollOnDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
726 {
727 EcmaVM* vm = runtimeCallInfo->GetVM();
728 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
729 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
730 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
731 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
732 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnDidScroll(nativeNode);
733 return panda::JSValueRef::Undefined(vm);
734 }
735
SetScrollOnWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)736 ArkUINativeModuleValue ScrollBridge::SetScrollOnWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
737 {
738 EcmaVM* vm = runtimeCallInfo->GetVM();
739 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
740 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
741 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
742 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
743 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
744 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
745 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnWillScrollCallBack(nativeNode);
746 return panda::JSValueRef::Undefined(vm);
747 }
748 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
749 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
750 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
751 std::function<TwoDimensionScrollResult(Dimension, Dimension, ScrollState, ScrollSource)> callback =
752 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](Dimension xOffset,
753 Dimension yOffset, ScrollState state, ScrollSource scrollState) -> TwoDimensionScrollResult {
754 panda::LocalScope pandaScope(vm);
755 panda::TryCatch trycatch(vm);
756 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
757
758 panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
759 vm, static_cast<double>(xOffset.ConvertToVp()));
760 panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
761 vm, static_cast<double>(yOffset.ConvertToVp()));
762 panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
763 panda::Local<panda::NumberRef> sourceParam = panda::NumberRef::New(vm, static_cast<double>(scrollState));
764 // 4: Array length
765 panda::Local<panda::JSValueRef> params[4] = { xOffsetParam, yOffsetParam, stateParam, sourceParam};
766 auto result = func->Call(vm, func.ToLocal(), params, 4); // 4: Array length
767 NG::TwoDimensionScrollResult scrollRes { .xOffset = xOffset, .yOffset = yOffset };
768
769 if (result->IsObject(vm)) {
770 auto resultObj = result->ToObject(vm);
771 panda::Local<panda::JSValueRef> x = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "xOffset"));
772 panda::Local<panda::JSValueRef> y = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "yOffset"));
773 if (x->IsNumber()) {
774 scrollRes.xOffset = Dimension(x->ToNumber(vm)->Value(), DimensionUnit::VP);
775 }
776 if (y->IsNumber()) {
777 scrollRes.yOffset = Dimension(y->ToNumber(vm)->Value(), DimensionUnit::VP);
778 }
779 }
780 return scrollRes;
781 };
782 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnWillScrollCallBack(nativeNode,
783 reinterpret_cast<void*>(&callback));
784 return panda::JSValueRef::Undefined(vm);
785 }
786
ResetScrollOnWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)787 ArkUINativeModuleValue ScrollBridge::ResetScrollOnWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
788 {
789 EcmaVM* vm = runtimeCallInfo->GetVM();
790 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
791 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
792 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
793 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
794 GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnWillScrollCallBack(nativeNode);
795 return panda::JSValueRef::Undefined(vm);
796 }
797
SetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)798 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
799 {
800 EcmaVM* vm = runtimeCallInfo->GetVM();
801 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
802 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
803 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
804 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
805 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
806 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
807 GetArkUINodeModifiers()->getScrollModifier()->resetOnScrollFrameBeginCallBack(nativeNode);
808 return panda::JSValueRef::Undefined(vm);
809 }
810 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
811 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
812 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
813 std::function<ScrollFrameResult(Dimension, ScrollState)> callback = [vm, frameNode,
814 func = panda::CopyableGlobal(vm, func)](Dimension offset, ScrollState state) -> ScrollFrameResult {
815 panda::LocalScope pandaScope(vm);
816 panda::TryCatch trycatch(vm);
817 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
818
819 panda::Local<panda::NumberRef> offsetParam = panda::NumberRef::New(
820 vm, static_cast<double>(offset.ConvertToVp()));
821 panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
822 // 2: Array length
823 panda::Local<panda::JSValueRef> params[2] = { offsetParam, stateParam };
824 auto value = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
825
826 OHOS::Ace::ScrollFrameResult scrollRes { .offset = offset };
827 if (value->IsNumber()) {
828 scrollRes.offset = Dimension(value->ToNumber(vm)->Value(), DimensionUnit::VP);
829 }
830 if (value->IsObject(vm)) {
831 auto resultObj = value->ToObject(vm);
832 panda::Local<panda::JSValueRef> remain = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm,
833 "offsetRemain"));
834 if (remain->IsNumber()) {
835 scrollRes.offset = Dimension(remain->ToNumber(vm)->Value(), DimensionUnit::VP);
836 }
837 }
838 return scrollRes;
839 };
840 GetArkUINodeModifiers()->getScrollModifier()->setOnScrollFrameBeginCallBack(nativeNode,
841 reinterpret_cast<void*>(&callback));
842 return panda::JSValueRef::Undefined(vm);
843 }
844
ResetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)845 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
846 {
847 EcmaVM* vm = runtimeCallInfo->GetVM();
848 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
849 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
850 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
851 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
852 GetArkUINodeModifiers()->getScrollModifier()->resetOnScrollFrameBeginCallBack(nativeNode);
853 return panda::JSValueRef::Undefined(vm);
854 }
855
SetMaxZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)856 ArkUINativeModuleValue ScrollBridge::SetMaxZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
857 {
858 EcmaVM* vm = runtimeCallInfo->GetVM();
859 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
860 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
861 Local<JSValueRef> scaleArg = runtimeCallInfo->GetCallArgRef(1);
862 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
863 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
864 double scale = 1.0;
865 if (!ArkTSUtils::ParseJsDouble(vm, scaleArg, scale)) {
866 GetArkUINodeModifiers()->getScrollModifier()->resetMaxZoomScale(nativeNode);
867 } else {
868 GetArkUINodeModifiers()->getScrollModifier()->setMaxZoomScale(nativeNode, scale);
869 }
870 return panda::JSValueRef::Undefined(vm);
871 }
872
ResetMaxZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)873 ArkUINativeModuleValue ScrollBridge::ResetMaxZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
874 {
875 EcmaVM* vm = runtimeCallInfo->GetVM();
876 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
877 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
878 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
879 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
880 GetArkUINodeModifiers()->getScrollModifier()->resetMaxZoomScale(nativeNode);
881 return panda::JSValueRef::Undefined(vm);
882 }
883
SetMinZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)884 ArkUINativeModuleValue ScrollBridge::SetMinZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
885 {
886 EcmaVM* vm = runtimeCallInfo->GetVM();
887 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
888 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
889 Local<JSValueRef> scaleArg = runtimeCallInfo->GetCallArgRef(1);
890 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
891 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
892 double scale = 1.0;
893 if (!ArkTSUtils::ParseJsDouble(vm, scaleArg, scale)) {
894 GetArkUINodeModifiers()->getScrollModifier()->resetMinZoomScale(nativeNode);
895 } else {
896 GetArkUINodeModifiers()->getScrollModifier()->setMinZoomScale(nativeNode, scale);
897 }
898 return panda::JSValueRef::Undefined(vm);
899 }
900
ResetMinZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)901 ArkUINativeModuleValue ScrollBridge::ResetMinZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
902 {
903 EcmaVM* vm = runtimeCallInfo->GetVM();
904 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
905 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
906 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
907 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
908 GetArkUINodeModifiers()->getScrollModifier()->resetMinZoomScale(nativeNode);
909 return panda::JSValueRef::Undefined(vm);
910 }
911
SetZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)912 ArkUINativeModuleValue ScrollBridge::SetZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
913 {
914 EcmaVM* vm = runtimeCallInfo->GetVM();
915 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
916 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
917 Local<JSValueRef> scaleArg = runtimeCallInfo->GetCallArgRef(1);
918 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
919 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
920 double scale = 1.0;
921 if (!ArkTSUtils::ParseJsDouble(vm, scaleArg, scale)) {
922 GetArkUINodeModifiers()->getScrollModifier()->resetZoomScale(nativeNode);
923 } else {
924 GetArkUINodeModifiers()->getScrollModifier()->setZoomScale(nativeNode, scale);
925 }
926 return panda::JSValueRef::Undefined(vm);
927 }
928
ResetZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)929 ArkUINativeModuleValue ScrollBridge::ResetZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
930 {
931 EcmaVM* vm = runtimeCallInfo->GetVM();
932 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
933 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
934 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
935 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
936 GetArkUINodeModifiers()->getScrollModifier()->resetZoomScale(nativeNode);
937 return panda::JSValueRef::Undefined(vm);
938 }
939
SetEnableBouncesZoom(ArkUIRuntimeCallInfo * runtimeCallInfo)940 ArkUINativeModuleValue ScrollBridge::SetEnableBouncesZoom(ArkUIRuntimeCallInfo* runtimeCallInfo)
941 {
942 EcmaVM* vm = runtimeCallInfo->GetVM();
943 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
944 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
945 Local<JSValueRef> isEnabledArg = runtimeCallInfo->GetCallArgRef(1);
946 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
947 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
948 bool isEnabled = isEnabledArg->IsBoolean() ? isEnabledArg->ToBoolean(vm)->Value() : true;
949 GetArkUINodeModifiers()->getScrollModifier()->setEnableBouncesZoom(nativeNode, isEnabled);
950 return panda::JSValueRef::Undefined(vm);
951 }
952
ResetEnableBouncesZoom(ArkUIRuntimeCallInfo * runtimeCallInfo)953 ArkUINativeModuleValue ScrollBridge::ResetEnableBouncesZoom(ArkUIRuntimeCallInfo* runtimeCallInfo)
954 {
955 EcmaVM* vm = runtimeCallInfo->GetVM();
956 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
957 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
958 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
959 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
960 GetArkUINodeModifiers()->getScrollModifier()->resetEnableBouncesZoom(nativeNode);
961 return panda::JSValueRef::Undefined(vm);
962 }
963
SetScrollOnDidZoom(ArkUIRuntimeCallInfo * runtimeCallInfo)964 ArkUINativeModuleValue ScrollBridge::SetScrollOnDidZoom(ArkUIRuntimeCallInfo* runtimeCallInfo)
965 {
966 EcmaVM* vm = runtimeCallInfo->GetVM();
967 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
968 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
969 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
970 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
971 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
972 if (!callbackArg->IsFunction(vm)) {
973 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnDidZoom(nativeNode, nullptr);
974 return panda::JSValueRef::Undefined(vm);
975 }
976 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
977 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
978 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
979 std::function<void(float)> callback =
980 [vm, weak = AceType::WeakClaim(frameNode), func = panda::CopyableGlobal(vm, func)](float scale) {
981 panda::LocalScope pandaScope(vm);
982 panda::TryCatch trycatch(vm);
983 PipelineContext::SetCallBackNode(weak);
984 panda::Local<panda::NumberRef> scaleParam = panda::NumberRef::New(vm, static_cast<double>(scale));
985 panda::Local<panda::JSValueRef> params[1] = { scaleParam };
986 func->Call(vm, func.ToLocal(), params, 1);
987 };
988 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnDidZoom(nativeNode,
989 reinterpret_cast<void*>(&callback));
990 return panda::JSValueRef::Undefined(vm);
991 }
992
ResetScrollOnDidZoom(ArkUIRuntimeCallInfo * runtimeCallInfo)993 ArkUINativeModuleValue ScrollBridge::ResetScrollOnDidZoom(ArkUIRuntimeCallInfo* runtimeCallInfo)
994 {
995 EcmaVM* vm = runtimeCallInfo->GetVM();
996 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
997 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
998 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
999 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1000 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnDidZoom(nativeNode, nullptr);
1001 return panda::JSValueRef::Undefined(vm);
1002 }
1003
SetScrollOnZoomStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1004 ArkUINativeModuleValue ScrollBridge::SetScrollOnZoomStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1005 {
1006 EcmaVM *vm = runtimeCallInfo->GetVM();
1007 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1008 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1009 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1010 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1011 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1012 if (!callbackArg->IsFunction(vm)) {
1013 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStart(nativeNode, nullptr);
1014 return panda::JSValueRef::Undefined(vm);
1015 }
1016 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1017 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1018 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1019 std::function<void()> callback =
1020 [vm, weak = AceType::WeakClaim(frameNode), func = panda::CopyableGlobal(vm, func)]() {
1021 panda::LocalScope pandaScope(vm);
1022 panda::TryCatch trycatch(vm);
1023 PipelineContext::SetCallBackNode(weak);
1024 func->Call(vm, func.ToLocal(), nullptr, 0);
1025 };
1026 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStart(
1027 nativeNode, reinterpret_cast<void*>(&callback));
1028 return panda::JSValueRef::Undefined(vm);
1029 }
1030
ResetScrollOnZoomStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1031 ArkUINativeModuleValue ScrollBridge::ResetScrollOnZoomStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1032 {
1033 EcmaVM* vm = runtimeCallInfo->GetVM();
1034 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1035 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1036 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1037 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1038 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStart(nativeNode, nullptr);
1039 return panda::JSValueRef::Undefined(vm);
1040 }
1041
SetScrollOnZoomStop(ArkUIRuntimeCallInfo * runtimeCallInfo)1042 ArkUINativeModuleValue ScrollBridge::SetScrollOnZoomStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1043 {
1044 EcmaVM *vm = runtimeCallInfo->GetVM();
1045 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1046 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1047 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1048 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1049 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1050 if (!callbackArg->IsFunction(vm)) {
1051 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStop(nativeNode, nullptr);
1052 return panda::JSValueRef::Undefined(vm);
1053 }
1054 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1055 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1056 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1057 std::function<void(void)> callback =
1058 [vm, weak = AceType::WeakClaim(frameNode), func = panda::CopyableGlobal(vm, func)]() {
1059 panda::LocalScope pandaScope(vm);
1060 panda::TryCatch trycatch(vm);
1061 PipelineContext::SetCallBackNode(weak);
1062 func->Call(vm, func.ToLocal(), nullptr, 0);
1063 };
1064 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStop(nativeNode, reinterpret_cast<void*>(&callback));
1065 return panda::JSValueRef::Undefined(vm);
1066 }
1067
ResetScrollOnZoomStop(ArkUIRuntimeCallInfo * runtimeCallInfo)1068 ArkUINativeModuleValue ScrollBridge::ResetScrollOnZoomStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1069 {
1070 EcmaVM* vm = runtimeCallInfo->GetVM();
1071 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1072 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1073 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1074 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1075 GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStop(nativeNode, nullptr);
1076 return panda::JSValueRef::Undefined(vm);
1077 }
1078 } // namespace OHOS::Ace::NG
1079