1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_slider_bridge.h"
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
17 #include "bridge/declarative_frontend/jsview/js_shape_abstract.h"
18 #include "core/components_ng/base/frame_node.h"
19 #include "core/components_ng/pattern/slider/slider_model_ng.h"
20 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
21 
22 namespace OHOS::Ace::NG {
23 constexpr int NUM_0 = 0;
24 constexpr int NUM_1 = 1;
25 constexpr int NUM_2 = 2;
26 const char* SLIDER_NODEPTR_OF_UINODE = "nodePtr_";
JsSliderChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)27 panda::Local<panda::JSValueRef> JsSliderChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
28 {
29     auto vm = runtimeCallInfo->GetVM();
30     int32_t argc = static_cast<int32_t>(runtimeCallInfo->GetArgsNumber());
31     if (argc != NUM_2) {
32         return panda::JSValueRef::Undefined(vm);
33     }
34     auto valueArg = runtimeCallInfo->GetCallArgRef(NUM_0);
35     auto modeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
36     if (!valueArg->IsNumber() || !modeArg->IsNumber()) {
37         return panda::JSValueRef::Undefined(vm);
38     }
39     double value = valueArg->ToNumber(vm)->Value();
40     int32_t mode = modeArg->ToNumber(vm)->Value();
41     auto ref = runtimeCallInfo->GetThisRef();
42     auto obj = ref->ToObject(vm);
43     if (obj->GetNativePointerFieldCount(vm) < NUM_1) {
44         return panda::JSValueRef::Undefined(vm);
45     }
46     auto frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
47     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
48     SliderModelNG::SetChangeValue(frameNode, value, mode);
49     return panda::JSValueRef::Undefined(vm);
50 }
51 
SetShowTips(ArkUIRuntimeCallInfo * runtimeCallInfo)52 ArkUINativeModuleValue SliderBridge::SetShowTips(ArkUIRuntimeCallInfo* runtimeCallInfo)
53 {
54     EcmaVM* vm = runtimeCallInfo->GetVM();
55     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
56     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
57     Local<JSValueRef> showTipArg = runtimeCallInfo->GetCallArgRef(NUM_1);
58     Local<JSValueRef> contentArg = runtimeCallInfo->GetCallArgRef(NUM_2);
59     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
60 
61     bool showTips = false;
62     if (showTipArg->IsBoolean()) {
63         showTips = showTipArg->ToBoolean(vm)->Value();
64     }
65 
66     std::string content;
67     if (ArkTSUtils::ParseJsString(vm, contentArg, content)) {
68         GetArkUINodeModifiers()->getSliderModifier()->setShowTips(nativeNode, showTips, content.c_str());
69     } else {
70         GetArkUINodeModifiers()->getSliderModifier()->setShowTips(nativeNode, showTips, nullptr);
71     }
72     return panda::JSValueRef::Undefined(vm);
73 }
74 
ResetShowTips(ArkUIRuntimeCallInfo * runtimeCallInfo)75 ArkUINativeModuleValue SliderBridge::ResetShowTips(ArkUIRuntimeCallInfo* runtimeCallInfo)
76 {
77     EcmaVM* vm = runtimeCallInfo->GetVM();
78     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
79     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
80     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
81     GetArkUINodeModifiers()->getSliderModifier()->resetShowTips(nativeNode);
82     return panda::JSValueRef::Undefined(vm);
83 }
84 
SetSliderStepSize(ArkUIRuntimeCallInfo * runtimeCallInfo)85 ArkUINativeModuleValue SliderBridge::SetSliderStepSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
86 {
87     EcmaVM* vm = runtimeCallInfo->GetVM();
88     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
89     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
90     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
91     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
92     CalcDimension stepSize;
93     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, stepSize, false)) {
94         GetArkUINodeModifiers()->getSliderModifier()->resetSliderStepSize(nativeNode);
95         return panda::JSValueRef::Undefined(vm);
96     } else {
97         if (LessNotEqual(stepSize.Value(), 0.0)) {
98             GetArkUINodeModifiers()->getSliderModifier()->resetSliderStepSize(nativeNode);
99             return panda::JSValueRef::Undefined(vm);
100         }
101 
102         GetArkUINodeModifiers()->getSliderModifier()->setSliderStepSize(
103             nativeNode, stepSize.Value(), static_cast<int>(stepSize.Unit()));
104     }
105 
106     return panda::JSValueRef::Undefined(vm);
107 }
108 
ResetSliderStepSize(ArkUIRuntimeCallInfo * runtimeCallInfo)109 ArkUINativeModuleValue SliderBridge::ResetSliderStepSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
110 {
111     EcmaVM* vm = runtimeCallInfo->GetVM();
112     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
113     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
114     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
115     GetArkUINodeModifiers()->getSliderModifier()->resetSliderStepSize(nativeNode);
116     return panda::JSValueRef::Undefined(vm);
117 }
118 
SetBlockSize(ArkUIRuntimeCallInfo * runtimeCallInfo)119 ArkUINativeModuleValue SliderBridge::SetBlockSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
120 {
121     EcmaVM* vm = runtimeCallInfo->GetVM();
122     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
123     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
124     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
125     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
126     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
127 
128     CalcDimension blockWidth;
129     CalcDimension blockHeight;
130     bool hasBlockWidth = ArkTSUtils::ParseJsDimensionVp(vm, secondArg, blockWidth);
131     bool hasBlockHeight = ArkTSUtils::ParseJsDimensionVp(vm, thirdArg, blockHeight);
132     if (!hasBlockWidth && !hasBlockHeight) {
133         GetArkUINodeModifiers()->getSliderModifier()->resetBlockSize(nativeNode);
134         return panda::JSValueRef::Undefined(vm);
135     }
136 
137     GetArkUINodeModifiers()->getSliderModifier()->setBlockSize(nativeNode,
138         blockWidth.Value(), static_cast<int>(blockWidth.Unit()),
139         blockHeight.Value(), static_cast<int>(blockHeight.Unit()));
140     return panda::JSValueRef::Undefined(vm);
141 }
142 
ResetBlockSize(ArkUIRuntimeCallInfo * runtimeCallInfo)143 ArkUINativeModuleValue SliderBridge::ResetBlockSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
144 {
145     EcmaVM* vm = runtimeCallInfo->GetVM();
146     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
147     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
148     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
149     GetArkUINodeModifiers()->getSliderModifier()->resetBlockSize(nativeNode);
150     return panda::JSValueRef::Undefined(vm);
151 }
152 
SetTrackBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)153 ArkUINativeModuleValue SliderBridge::SetTrackBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
154 {
155     EcmaVM* vm = runtimeCallInfo->GetVM();
156     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
157     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
158     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
159     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
160 
161     CalcDimension trackBorderRadius;
162     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, trackBorderRadius, true)) {
163         GetArkUINodeModifiers()->getSliderModifier()->resetTrackBorderRadius(nativeNode);
164         return panda::JSValueRef::Undefined(vm);
165     }
166 
167     if (LessNotEqual(trackBorderRadius.Value(), 0.0)) {
168         GetArkUINodeModifiers()->getSliderModifier()->resetTrackBorderRadius(nativeNode);
169         return panda::JSValueRef::Undefined(vm);
170     }
171 
172     GetArkUINodeModifiers()->getSliderModifier()->setTrackBorderRadius(nativeNode,
173         trackBorderRadius.Value(), static_cast<int>(trackBorderRadius.Unit()));
174     return panda::JSValueRef::Undefined(vm);
175 }
176 
ResetTrackBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)177 ArkUINativeModuleValue SliderBridge::ResetTrackBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
178 {
179     EcmaVM* vm = runtimeCallInfo->GetVM();
180     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
181     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
182     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
183     GetArkUINodeModifiers()->getSliderModifier()->resetTrackBorderRadius(nativeNode);
184     return panda::JSValueRef::Undefined(vm);
185 }
186 
SetStepColor(ArkUIRuntimeCallInfo * runtimeCallInfo)187 ArkUINativeModuleValue SliderBridge::SetStepColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
188 {
189     EcmaVM* vm = runtimeCallInfo->GetVM();
190     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
191     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
192     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
193     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
194     Color color;
195     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
196         GetArkUINodeModifiers()->getSliderModifier()->resetStepColor(nativeNode);
197     } else {
198         GetArkUINodeModifiers()->getSliderModifier()->setStepColor(nativeNode, color.GetValue());
199     }
200 
201     return panda::JSValueRef::Undefined(vm);
202 }
203 
ResetStepColor(ArkUIRuntimeCallInfo * runtimeCallInfo)204 ArkUINativeModuleValue SliderBridge::ResetStepColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
205 {
206     EcmaVM* vm = runtimeCallInfo->GetVM();
207     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
208     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
209     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
210     GetArkUINodeModifiers()->getSliderModifier()->resetStepColor(nativeNode);
211     return panda::JSValueRef::Undefined(vm);
212 }
213 
SetBlockBorderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)214 ArkUINativeModuleValue SliderBridge::SetBlockBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
215 {
216     EcmaVM* vm = runtimeCallInfo->GetVM();
217     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
218     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
219     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
220     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
221     Color color;
222     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
223         GetArkUINodeModifiers()->getSliderModifier()->resetBlockBorderColor(nativeNode);
224     } else {
225         GetArkUINodeModifiers()->getSliderModifier()->setBlockBorderColor(nativeNode, color.GetValue());
226     }
227     return panda::JSValueRef::Undefined(vm);
228 }
229 
ResetBlockBorderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)230 ArkUINativeModuleValue SliderBridge::ResetBlockBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
231 {
232     EcmaVM* vm = runtimeCallInfo->GetVM();
233     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
234     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
235     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
236     GetArkUINodeModifiers()->getSliderModifier()->resetBlockBorderColor(nativeNode);
237     return panda::JSValueRef::Undefined(vm);
238 }
239 
SetBlockBorderWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)240 ArkUINativeModuleValue SliderBridge::SetBlockBorderWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
241 {
242     EcmaVM* vm = runtimeCallInfo->GetVM();
243     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
244     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
245     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
246     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
247 
248     CalcDimension blockBorderWidth;
249     if (!ArkTSUtils::ParseJsDimensionVp(vm, secondArg, blockBorderWidth)) {
250         GetArkUINodeModifiers()->getSliderModifier()->resetBlockBorderWidth(nativeNode);
251         return panda::JSValueRef::Undefined(vm);
252     }
253 
254     if (LessNotEqual(blockBorderWidth.Value(), 0.0)) {
255         GetArkUINodeModifiers()->getSliderModifier()->resetBlockBorderWidth(nativeNode);
256         return panda::JSValueRef::Undefined(vm);
257     }
258 
259     GetArkUINodeModifiers()->getSliderModifier()->setBlockBorderWidth(nativeNode,
260         blockBorderWidth.Value(), static_cast<int>(blockBorderWidth.Unit()));
261     return panda::JSValueRef::Undefined(vm);
262 }
263 
ResetBlockBorderWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)264 ArkUINativeModuleValue SliderBridge::ResetBlockBorderWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
265 {
266     EcmaVM* vm = runtimeCallInfo->GetVM();
267     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
268     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
269     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
270     GetArkUINodeModifiers()->getSliderModifier()->resetBlockBorderWidth(nativeNode);
271     return panda::JSValueRef::Undefined(vm);
272 }
273 
SetBlockColor(ArkUIRuntimeCallInfo * runtimeCallInfo)274 ArkUINativeModuleValue SliderBridge::SetBlockColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
275 {
276     EcmaVM* vm = runtimeCallInfo->GetVM();
277     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
278     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
279     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
280     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
281     Color color;
282     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
283         GetArkUINodeModifiers()->getSliderModifier()->resetBlockColor(nativeNode);
284     } else {
285         GetArkUINodeModifiers()->getSliderModifier()->setBlockColor(nativeNode, color.GetValue());
286     }
287     return panda::JSValueRef::Undefined(vm);
288 }
289 
ResetBlockColor(ArkUIRuntimeCallInfo * runtimeCallInfo)290 ArkUINativeModuleValue SliderBridge::ResetBlockColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
291 {
292     EcmaVM* vm = runtimeCallInfo->GetVM();
293     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
294     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
295     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
296     GetArkUINodeModifiers()->getSliderModifier()->resetBlockColor(nativeNode);
297     return panda::JSValueRef::Undefined(vm);
298 }
299 
SetTrackBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)300 ArkUINativeModuleValue SliderBridge::SetTrackBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
301 {
302     EcmaVM* vm = runtimeCallInfo->GetVM();
303     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
304     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
305     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
306     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
307     Color color;
308     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
309         GetArkUINodeModifiers()->getSliderModifier()->resetTrackBackgroundColor(nativeNode);
310     } else {
311         GetArkUINodeModifiers()->getSliderModifier()->setTrackBackgroundColor(nativeNode, color.GetValue());
312     }
313     return panda::JSValueRef::Undefined(vm);
314 }
315 
ResetTrackBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)316 ArkUINativeModuleValue SliderBridge::ResetTrackBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
317 {
318     EcmaVM* vm = runtimeCallInfo->GetVM();
319     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
320     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
321     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
322     GetArkUINodeModifiers()->getSliderModifier()->resetTrackBackgroundColor(nativeNode);
323     return panda::JSValueRef::Undefined(vm);
324 }
325 
SetSelectColor(ArkUIRuntimeCallInfo * runtimeCallInfo)326 ArkUINativeModuleValue SliderBridge::SetSelectColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
327 {
328     EcmaVM* vm = runtimeCallInfo->GetVM();
329     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
330     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
331     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
332     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
333         Color color;
334     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
335         GetArkUINodeModifiers()->getSliderModifier()->resetSelectColor(nativeNode);
336     } else {
337         GetArkUINodeModifiers()->getSliderModifier()->setSelectColor(nativeNode, color.GetValue());
338     }
339     return panda::JSValueRef::Undefined(vm);
340 }
341 
ResetSelectColor(ArkUIRuntimeCallInfo * runtimeCallInfo)342 ArkUINativeModuleValue SliderBridge::ResetSelectColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
343 {
344     EcmaVM* vm = runtimeCallInfo->GetVM();
345     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
346     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
347     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
348     GetArkUINodeModifiers()->getSliderModifier()->resetSelectColor(nativeNode);
349     return panda::JSValueRef::Undefined(vm);
350 }
351 
SetShowSteps(ArkUIRuntimeCallInfo * runtimeCallInfo)352 ArkUINativeModuleValue SliderBridge::SetShowSteps(ArkUIRuntimeCallInfo* runtimeCallInfo)
353 {
354     EcmaVM* vm = runtimeCallInfo->GetVM();
355     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
356     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
357     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
358     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
359     bool flag = secondArg->ToBoolean(vm)->Value();
360     GetArkUINodeModifiers()->getSliderModifier()->setShowSteps(nativeNode, flag);
361     return panda::JSValueRef::Undefined(vm);
362 }
363 
ResetShowSteps(ArkUIRuntimeCallInfo * runtimeCallInfo)364 ArkUINativeModuleValue SliderBridge::ResetShowSteps(ArkUIRuntimeCallInfo* runtimeCallInfo)
365 {
366     EcmaVM* vm = runtimeCallInfo->GetVM();
367     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
368     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
369     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
370     GetArkUINodeModifiers()->getSliderModifier()->resetShowSteps(nativeNode);
371     return panda::JSValueRef::Undefined(vm);
372 }
373 
SetThickness(ArkUIRuntimeCallInfo * runtimeCallInfo)374 ArkUINativeModuleValue SliderBridge::SetThickness(ArkUIRuntimeCallInfo* runtimeCallInfo)
375 {
376     EcmaVM* vm = runtimeCallInfo->GetVM();
377     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
378     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
379     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
380     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
381 
382     CalcDimension thickness;
383     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, thickness, true)) {
384         GetArkUINodeModifiers()->getSliderModifier()->resetThickness(nativeNode);
385         return panda::JSValueRef::Undefined(vm);
386     }
387 
388     GetArkUINodeModifiers()->getSliderModifier()->setThickness(nativeNode,
389         thickness.Value(), static_cast<int>(thickness.Unit()));
390     return panda::JSValueRef::Undefined(vm);
391 }
392 
ResetThickness(ArkUIRuntimeCallInfo * runtimeCallInfo)393 ArkUINativeModuleValue SliderBridge::ResetThickness(ArkUIRuntimeCallInfo* runtimeCallInfo)
394 {
395     EcmaVM* vm = runtimeCallInfo->GetVM();
396     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
397     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
398     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
399     GetArkUINodeModifiers()->getSliderModifier()->resetThickness(nativeNode);
400     return panda::JSValueRef::Undefined(vm);
401 }
402 
SetBlockStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)403 ArkUINativeModuleValue SliderBridge::SetBlockStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
404 {
405     EcmaVM* vm = runtimeCallInfo->GetVM();
406     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
407     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
408     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
409     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
410     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
411     if (!info[1]->IsObject()) {
412         SliderBridge::ResetBlockStyle(runtimeCallInfo);
413         return panda::JSValueRef::Undefined(vm);
414     }
415     auto jsObj = Framework::JSRef<Framework::JSObject>::Cast(info[1]);
416     auto getType = jsObj->GetProperty("type");
417     if (getType->IsNull() || !getType->IsNumber()) {
418         SliderBridge::ResetBlockStyle(runtimeCallInfo);
419         return panda::JSValueRef::Undefined(vm);
420     }
421     auto type = static_cast<SliderModel::BlockStyleType>(getType->ToNumber<int32_t>());
422     if (type == SliderModel::BlockStyleType::IMAGE) {
423         std::string src;
424         auto image = jsObj->GetProperty("image");
425         if (!Framework::JSShapeAbstract::ParseJsMedia(image, src)) {
426             SliderBridge::ResetBlockStyle(runtimeCallInfo);
427             return panda::JSValueRef::Undefined(vm);
428         }
429         std::string bundleName;
430         std::string moduleName;
431         Framework::JSViewAbstract::GetJsMediaBundleInfo(image, bundleName, moduleName);
432         SliderModelNG::SetBlockImage(frameNode, src, bundleName, moduleName);
433     } else if (type == SliderModel::BlockStyleType::SHAPE) {
434         auto shape = jsObj->GetProperty("shape");
435         if (!shape->IsObject()) {
436             SliderBridge::ResetBlockStyle(runtimeCallInfo);
437             return panda::JSValueRef::Undefined(vm);
438         }
439         Framework::JSShapeAbstract* shapeAbstract =
440             Framework::JSRef<Framework::JSObject>::Cast(shape)->Unwrap<Framework::JSShapeAbstract>();
441         if (shapeAbstract == nullptr) {
442             SliderBridge::ResetBlockStyle(runtimeCallInfo);
443             return panda::JSValueRef::Undefined(vm);
444         }
445         SliderModelNG::SetBlockShape(frameNode, shapeAbstract->GetBasicShape());
446     }
447     SliderModelNG::SetBlockType(frameNode, type);
448     return panda::JSValueRef::Undefined(vm);
449 }
450 
ResetBlockStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)451 ArkUINativeModuleValue SliderBridge::ResetBlockStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
452 {
453     EcmaVM* vm = runtimeCallInfo->GetVM();
454     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
455     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
456     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
457     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
458     SliderModelNG::ResetBlockType(frameNode);
459     SliderModelNG::ResetBlockImage(frameNode);
460     SliderModelNG::ResetBlockShape(frameNode);
461     return panda::JSValueRef::Undefined(vm);
462 }
463 
SetValidSlideRange(ArkUIRuntimeCallInfo * runtimeCallInfo)464 ArkUINativeModuleValue SliderBridge::SetValidSlideRange(ArkUIRuntimeCallInfo* runtimeCallInfo)
465 {
466     EcmaVM* vm = runtimeCallInfo->GetVM();
467     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
468     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
469     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
470     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
471     if (!info[1]->IsObject()) {
472         GetArkUINodeModifiers()->getSliderModifier()->resetSliderValidSlideRange(nativeNode);
473         return panda::JSValueRef::Undefined(vm);
474     }
475     float from = std::numeric_limits<float>::infinity();
476     float to = std::numeric_limits<float>::infinity();
477     auto jsObj = Framework::JSRef<Framework::JSObject>::Cast(info[1]);
478     auto fromType = jsObj->GetProperty("from");
479     if (!fromType->IsEmpty() && fromType->IsNumber()) {
480         from = fromType->ToNumber<float>();
481     }
482     auto toType = jsObj->GetProperty("to");
483     if (!toType->IsEmpty() && toType->IsNumber()) {
484         to = toType->ToNumber<float>();
485     }
486     if ((std::isinf(from) && std::isinf(to)) || std::isnan(from) || std::isnan(to)) {
487         GetArkUINodeModifiers()->getSliderModifier()->resetSliderValidSlideRange(nativeNode);
488         return panda::JSValueRef::Undefined(vm);
489     }
490     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
491     SliderModelNG::SetValidSlideRange(frameNode, from, to);
492     return panda::JSValueRef::Undefined(vm);
493 }
494 
ResetValidSlideRange(ArkUIRuntimeCallInfo * runtimeCallInfo)495 ArkUINativeModuleValue SliderBridge::ResetValidSlideRange(ArkUIRuntimeCallInfo* runtimeCallInfo)
496 {
497     EcmaVM* vm = runtimeCallInfo->GetVM();
498     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
499     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
500     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
501     GetArkUINodeModifiers()->getSliderModifier()->resetSliderValidSlideRange(nativeNode);
502     return panda::JSValueRef::Undefined(vm);
503 }
504 
SetSelectedBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)505 ArkUINativeModuleValue SliderBridge::SetSelectedBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
506 {
507     EcmaVM* vm = runtimeCallInfo->GetVM();
508     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
509     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
510     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
511     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
512 
513     CalcDimension borderRadius;
514     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, borderRadius, true)) {
515         GetArkUINodeModifiers()->getSliderModifier()->resetSelectedBorderRadius(nativeNode);
516         return panda::JSValueRef::Undefined(vm);
517     }
518 
519     if (LessNotEqual(borderRadius.Value(), 0.0)) {
520         GetArkUINodeModifiers()->getSliderModifier()->resetSelectedBorderRadius(nativeNode);
521         return panda::JSValueRef::Undefined(vm);
522     }
523 
524     GetArkUINodeModifiers()->getSliderModifier()->setSelectedBorderRadius(nativeNode,
525         borderRadius.Value(), static_cast<int>(borderRadius.Unit()));
526     return panda::JSValueRef::Undefined(vm);
527 }
528 
ResetSelectedBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)529 ArkUINativeModuleValue SliderBridge::ResetSelectedBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
530 {
531     EcmaVM* vm = runtimeCallInfo->GetVM();
532     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
533     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
534     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
535     GetArkUINodeModifiers()->getSliderModifier()->resetSelectedBorderRadius(nativeNode);
536     return panda::JSValueRef::Undefined(vm);
537 }
538 
SetInteractionMode(ArkUIRuntimeCallInfo * runtimeCallInfo)539 ArkUINativeModuleValue SliderBridge::SetInteractionMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
540 {
541     EcmaVM* vm = runtimeCallInfo->GetVM();
542     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
543     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
544     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
545     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
546     if (!secondArg->IsNumber()) {
547         GetArkUINodeModifiers()->getSliderModifier()->resetInteractionMode(nativeNode);
548         return panda::JSValueRef::Undefined(vm);
549     }
550     int32_t interactionMode = secondArg->Int32Value(vm);
551     GetArkUINodeModifiers()->getSliderModifier()->setInteractionMode(nativeNode, interactionMode);
552     return panda::JSValueRef::Undefined(vm);
553 }
554 
ResetInteractionMode(ArkUIRuntimeCallInfo * runtimeCallInfo)555 ArkUINativeModuleValue SliderBridge::ResetInteractionMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
556 {
557     EcmaVM* vm = runtimeCallInfo->GetVM();
558     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
559     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
560     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
561     GetArkUINodeModifiers()->getSliderModifier()->resetInteractionMode(nativeNode);
562     return panda::JSValueRef::Undefined(vm);
563 }
564 
SetMinResponsiveDistance(ArkUIRuntimeCallInfo * runtimeCallInfo)565 ArkUINativeModuleValue SliderBridge::SetMinResponsiveDistance(ArkUIRuntimeCallInfo* runtimeCallInfo)
566 {
567     EcmaVM* vm = runtimeCallInfo->GetVM();
568     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
569     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
570     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
571     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
572     if (!secondArg->IsNumber()) {
573         GetArkUINodeModifiers()->getSliderModifier()->resetMinResponsiveDistance(nativeNode);
574         return panda::JSValueRef::Undefined(vm);
575     }
576     float distance = secondArg->ToNumber(vm)->Value();
577     GetArkUINodeModifiers()->getSliderModifier()->setMinResponsiveDistance(nativeNode, distance);
578     return panda::JSValueRef::Undefined(vm);
579 }
580 
ResetMinResponsiveDistance(ArkUIRuntimeCallInfo * runtimeCallInfo)581 ArkUINativeModuleValue SliderBridge::ResetMinResponsiveDistance(ArkUIRuntimeCallInfo* runtimeCallInfo)
582 {
583     EcmaVM* vm = runtimeCallInfo->GetVM();
584     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
585     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
586     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
587     GetArkUINodeModifiers()->getSliderModifier()->resetMinResponsiveDistance(nativeNode);
588     return panda::JSValueRef::Undefined(vm);
589 }
590 
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)591 ArkUINativeModuleValue SliderBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
592 {
593     EcmaVM* vm = runtimeCallInfo->GetVM();
594     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
595     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
596     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
597     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
598     if (!secondArg->IsObject(vm)) {
599         SliderModelNG::SetBuilderFunc(frameNode, nullptr);
600         return panda::JSValueRef::Undefined(vm);
601     }
602     panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
603     auto containerId = Container::CurrentId();
604     SliderModelNG::SetBuilderFunc(frameNode,
605         [vm, frameNode, obj = std::move(obj), containerId](
606             SliderConfiguration config) -> RefPtr<FrameNode> {
607             ContainerScope scope(containerId);
608             auto context = ArkTSUtils::GetContext(vm);
609             const char* keyOfSlider[] = { "value", "min", "max", "step", "enabled", "triggerChange" };
610             Local<JSValueRef> valuesOfSlider[] = { panda::NumberRef::New(vm, config.value_),
611                 panda::NumberRef::New(vm, config.min_), panda::NumberRef::New(vm, config.max_),
612                 panda::NumberRef::New(vm, config.step_), panda::BooleanRef::New(vm, config.enabled_),
613                 panda::FunctionRef::New(vm, JsSliderChangeCallback) };
614             auto slider = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keyOfSlider),
615                 keyOfSlider, valuesOfSlider);
616             slider->SetNativePointerFieldCount(vm, 1);
617             slider->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
618             panda::Local<panda::JSValueRef> params[NUM_2] = { context, slider };
619             LocalScope pandaScope(vm);
620             panda::TryCatch trycatch(vm);
621             auto jsObject = obj.ToLocal();
622             auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
623             CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
624             panda::Local<panda::FunctionRef> func = makeFunc;
625             auto result = func->Call(vm, jsObject, params, NUM_2);
626             JSNApi::ExecutePendingJob(vm);
627             CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
628             auto resultObj = result->ToObject(vm);
629             panda::Local<panda::JSValueRef> nodeptr =
630                 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, SLIDER_NODEPTR_OF_UINODE));
631             CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
632             auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
633             CHECK_NULL_RETURN(frameNode, nullptr);
634             return AceType::Claim(frameNode);
635         });
636     return panda::JSValueRef::Undefined(vm);
637 }
638 } // namespace OHOS::Ace::NG
639