• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_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 "bridge/declarative_frontend/jsview/js_linear_gradient.h"
19 #include "core/components_ng/base/frame_node.h"
20 #include "core/components_ng/pattern/slider/slider_model_ng.h"
21 #include "frameworks/bridge/common/utils/engine_helper.h"
22 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
23 
24 namespace OHOS::Ace::NG {
25 constexpr int NUM_0 = 0;
26 constexpr int NUM_1 = 1;
27 constexpr int NUM_2 = 2;
28 constexpr int32_t NUM_3 = 3;
29 constexpr int32_t NUM_4 = 4;
30 constexpr int32_t NUM_5 = 5;
31 constexpr int32_t NUM_6 = 6;
32 constexpr int NUM_8 = 8;
33 constexpr int SLIDER_MIN = 0;
34 constexpr int SLIDER_MAX = 100;
35 constexpr int PARAM_ARR_LENGTH_2 = 2;
36 const char* SLIDER_NODEPTR_OF_UINODE = "nodePtr_";
37 constexpr char STEPS_STRING[] = "stepsAccessibility";
38 constexpr char ENTRIES_STRING[] = "entries";
39 constexpr char NEXT_STRING[] = "next";
40 constexpr char VALUE_STRING[] = "value";
41 constexpr char TEXT_STRING[] = "text";
42 constexpr char DONE_STRING[] = "done";
43 namespace {
ConvertSliderGradientColor(const EcmaVM * vm,const Local<JSValueRef> & value,OHOS::Ace::NG::Gradient & gradient)44 bool ConvertSliderGradientColor(const EcmaVM* vm, const Local<JSValueRef>& value, OHOS::Ace::NG::Gradient& gradient)
45 {
46     if (!value->IsObject(vm)) {
47         return false;
48     }
49     Framework::JSLinearGradient* jsLinearGradient =
50         static_cast<Framework::JSLinearGradient*>(value->ToObject(vm)->GetNativePointerField(vm, 0));
51     if (!jsLinearGradient) {
52         return false;
53     }
54 
55     size_t colorLength = jsLinearGradient->GetGradient().size();
56     if (colorLength == 0) {
57         return false;
58     }
59     for (size_t colorIndex = 0; colorIndex < colorLength; ++colorIndex) {
60         OHOS::Ace::NG::GradientColor gradientColor;
61         gradientColor.SetLinearColor(LinearColor(jsLinearGradient->GetGradient().at(colorIndex).first));
62         gradientColor.SetDimension(jsLinearGradient->GetGradient().at(colorIndex).second);
63         gradient.AddColor(gradientColor);
64     }
65     return true;
66 }
67 } // namespace
68 
JsSliderChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)69 panda::Local<panda::JSValueRef> JsSliderChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
70 {
71     auto vm = runtimeCallInfo->GetVM();
72     int32_t argc = static_cast<int32_t>(runtimeCallInfo->GetArgsNumber());
73     if (argc != NUM_2) {
74         return panda::JSValueRef::Undefined(vm);
75     }
76     auto valueArg = runtimeCallInfo->GetCallArgRef(NUM_0);
77     auto modeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
78     if (!valueArg->IsNumber() || !modeArg->IsNumber()) {
79         return panda::JSValueRef::Undefined(vm);
80     }
81     double value = valueArg->ToNumber(vm)->Value();
82     int32_t mode = modeArg->ToNumber(vm)->Value();
83     auto ref = runtimeCallInfo->GetThisRef();
84     auto obj = ref->ToObject(vm);
85     if (obj->GetNativePointerFieldCount(vm) < NUM_1) {
86         return panda::JSValueRef::Undefined(vm);
87     }
88     auto frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
89     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
90     SliderModelNG::SetChangeValue(frameNode, value, mode);
91     return panda::JSValueRef::Undefined(vm);
92 }
93 
SetShowTips(ArkUIRuntimeCallInfo * runtimeCallInfo)94 ArkUINativeModuleValue SliderBridge::SetShowTips(ArkUIRuntimeCallInfo* runtimeCallInfo)
95 {
96     EcmaVM* vm = runtimeCallInfo->GetVM();
97     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
98     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
99     Local<JSValueRef> showTipArg = runtimeCallInfo->GetCallArgRef(NUM_1);
100     Local<JSValueRef> contentArg = runtimeCallInfo->GetCallArgRef(NUM_2);
101     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
102 
103     bool showTips = false;
104     if (showTipArg->IsBoolean()) {
105         showTips = showTipArg->ToBoolean(vm)->Value();
106     }
107 
108     std::string content;
109     RefPtr<ResourceObject> strResObj;
110     if (ArkTSUtils::ParseJsString(vm, contentArg, content, strResObj)) {
111         auto strRawPtr = AceType::RawPtr(strResObj);
112         GetArkUINodeModifiers()->getSliderModifier()->setShowTipsPtr(nativeNode, showTips, content.c_str(), strRawPtr);
113     } else {
114         GetArkUINodeModifiers()->getSliderModifier()->setShowTipsPtr(nativeNode, showTips, nullptr, nullptr);
115     }
116     return panda::JSValueRef::Undefined(vm);
117 }
118 
ResetShowTips(ArkUIRuntimeCallInfo * runtimeCallInfo)119 ArkUINativeModuleValue SliderBridge::ResetShowTips(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     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
125     GetArkUINodeModifiers()->getSliderModifier()->resetShowTips(nativeNode);
126     return panda::JSValueRef::Undefined(vm);
127 }
128 
SetSliderStepSize(ArkUIRuntimeCallInfo * runtimeCallInfo)129 ArkUINativeModuleValue SliderBridge::SetSliderStepSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
130 {
131     EcmaVM* vm = runtimeCallInfo->GetVM();
132     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
133     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
134     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
135     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
136     CalcDimension stepSize;
137     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, stepSize, false)) {
138         GetArkUINodeModifiers()->getSliderModifier()->resetSliderStepSize(nativeNode);
139         return panda::JSValueRef::Undefined(vm);
140     } else {
141         if (LessNotEqual(stepSize.Value(), 0.0)) {
142             GetArkUINodeModifiers()->getSliderModifier()->resetSliderStepSize(nativeNode);
143             return panda::JSValueRef::Undefined(vm);
144         }
145 
146         GetArkUINodeModifiers()->getSliderModifier()->setSliderStepSize(
147             nativeNode, stepSize.Value(), static_cast<int>(stepSize.Unit()));
148     }
149 
150     return panda::JSValueRef::Undefined(vm);
151 }
152 
ResetSliderStepSize(ArkUIRuntimeCallInfo * runtimeCallInfo)153 ArkUINativeModuleValue SliderBridge::ResetSliderStepSize(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     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
159     GetArkUINodeModifiers()->getSliderModifier()->resetSliderStepSize(nativeNode);
160     return panda::JSValueRef::Undefined(vm);
161 }
162 
SetBlockSize(ArkUIRuntimeCallInfo * runtimeCallInfo)163 ArkUINativeModuleValue SliderBridge::SetBlockSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
164 {
165     EcmaVM* vm = runtimeCallInfo->GetVM();
166     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
167     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
168     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
169     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
170     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
171 
172     CalcDimension blockWidth;
173     CalcDimension blockHeight;
174     bool hasBlockWidth = ArkTSUtils::ParseJsDimensionVp(vm, secondArg, blockWidth);
175     bool hasBlockHeight = ArkTSUtils::ParseJsDimensionVp(vm, thirdArg, blockHeight);
176     if (!hasBlockWidth && !hasBlockHeight) {
177         GetArkUINodeModifiers()->getSliderModifier()->resetBlockSize(nativeNode);
178         return panda::JSValueRef::Undefined(vm);
179     }
180 
181     GetArkUINodeModifiers()->getSliderModifier()->setBlockSize(nativeNode,
182         blockWidth.Value(), static_cast<int>(blockWidth.Unit()),
183         blockHeight.Value(), static_cast<int>(blockHeight.Unit()));
184     return panda::JSValueRef::Undefined(vm);
185 }
186 
ResetBlockSize(ArkUIRuntimeCallInfo * runtimeCallInfo)187 ArkUINativeModuleValue SliderBridge::ResetBlockSize(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     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
193     GetArkUINodeModifiers()->getSliderModifier()->resetBlockSize(nativeNode);
194     return panda::JSValueRef::Undefined(vm);
195 }
196 
SetTrackBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)197 ArkUINativeModuleValue SliderBridge::SetTrackBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
198 {
199     EcmaVM* vm = runtimeCallInfo->GetVM();
200     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
201     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
202     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
203     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
204 
205     CalcDimension trackBorderRadius;
206     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, trackBorderRadius, true)) {
207         GetArkUINodeModifiers()->getSliderModifier()->resetTrackBorderRadius(nativeNode);
208         return panda::JSValueRef::Undefined(vm);
209     }
210 
211     if (LessNotEqual(trackBorderRadius.Value(), 0.0)) {
212         GetArkUINodeModifiers()->getSliderModifier()->resetTrackBorderRadius(nativeNode);
213         return panda::JSValueRef::Undefined(vm);
214     }
215 
216     GetArkUINodeModifiers()->getSliderModifier()->setTrackBorderRadius(nativeNode,
217         trackBorderRadius.Value(), static_cast<int>(trackBorderRadius.Unit()));
218     return panda::JSValueRef::Undefined(vm);
219 }
220 
ResetTrackBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)221 ArkUINativeModuleValue SliderBridge::ResetTrackBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
222 {
223     EcmaVM* vm = runtimeCallInfo->GetVM();
224     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
225     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
226     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
227     GetArkUINodeModifiers()->getSliderModifier()->resetTrackBorderRadius(nativeNode);
228     return panda::JSValueRef::Undefined(vm);
229 }
230 
SetStepColor(ArkUIRuntimeCallInfo * runtimeCallInfo)231 ArkUINativeModuleValue SliderBridge::SetStepColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
232 {
233     EcmaVM* vm = runtimeCallInfo->GetVM();
234     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
235     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
236     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
237     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
238     Color color;
239     RefPtr<ResourceObject> colorResObj;
240     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
241     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, colorResObj, nodeInfo)) {
242         GetArkUINodeModifiers()->getSliderModifier()->resetStepColor(nativeNode);
243     } else {
244         auto colorRawPtr = AceType::RawPtr(colorResObj);
245         GetArkUINodeModifiers()->getSliderModifier()->setStepColorPtr(nativeNode, color.GetValue(), colorRawPtr);
246     }
247 
248     return panda::JSValueRef::Undefined(vm);
249 }
250 
ResetStepColor(ArkUIRuntimeCallInfo * runtimeCallInfo)251 ArkUINativeModuleValue SliderBridge::ResetStepColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
252 {
253     EcmaVM* vm = runtimeCallInfo->GetVM();
254     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
255     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
256     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
257     GetArkUINodeModifiers()->getSliderModifier()->resetStepColor(nativeNode);
258     return panda::JSValueRef::Undefined(vm);
259 }
260 
SetBlockBorderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)261 ArkUINativeModuleValue SliderBridge::SetBlockBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
262 {
263     EcmaVM* vm = runtimeCallInfo->GetVM();
264     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
265     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
266     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
267     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
268     Color color;
269     RefPtr<ResourceObject> colorResObj;
270     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
271     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, colorResObj, nodeInfo)) {
272         GetArkUINodeModifiers()->getSliderModifier()->resetBlockBorderColor(nativeNode);
273     } else {
274         auto colorRawPtr = AceType::RawPtr(colorResObj);
275         GetArkUINodeModifiers()->getSliderModifier()->setBlockBorderColorPtr(nativeNode, color.GetValue(), colorRawPtr);
276     }
277     return panda::JSValueRef::Undefined(vm);
278 }
279 
ResetBlockBorderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)280 ArkUINativeModuleValue SliderBridge::ResetBlockBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
281 {
282     EcmaVM* vm = runtimeCallInfo->GetVM();
283     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
284     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
285     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
286     GetArkUINodeModifiers()->getSliderModifier()->resetBlockBorderColor(nativeNode);
287     return panda::JSValueRef::Undefined(vm);
288 }
289 
SetBlockBorderWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)290 ArkUINativeModuleValue SliderBridge::SetBlockBorderWidth(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     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
296     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
297 
298     CalcDimension blockBorderWidth;
299     if (!ArkTSUtils::ParseJsDimensionVp(vm, secondArg, blockBorderWidth)) {
300         GetArkUINodeModifiers()->getSliderModifier()->resetBlockBorderWidth(nativeNode);
301         return panda::JSValueRef::Undefined(vm);
302     }
303 
304     if (LessNotEqual(blockBorderWidth.Value(), 0.0)) {
305         GetArkUINodeModifiers()->getSliderModifier()->resetBlockBorderWidth(nativeNode);
306         return panda::JSValueRef::Undefined(vm);
307     }
308 
309     GetArkUINodeModifiers()->getSliderModifier()->setBlockBorderWidth(nativeNode,
310         blockBorderWidth.Value(), static_cast<int>(blockBorderWidth.Unit()));
311     return panda::JSValueRef::Undefined(vm);
312 }
313 
ResetBlockBorderWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)314 ArkUINativeModuleValue SliderBridge::ResetBlockBorderWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
315 {
316     EcmaVM* vm = runtimeCallInfo->GetVM();
317     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
318     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
319     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
320     GetArkUINodeModifiers()->getSliderModifier()->resetBlockBorderWidth(nativeNode);
321     return panda::JSValueRef::Undefined(vm);
322 }
323 
SetBlockColor(ArkUIRuntimeCallInfo * runtimeCallInfo)324 ArkUINativeModuleValue SliderBridge::SetBlockColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
325 {
326     EcmaVM* vm = runtimeCallInfo->GetVM();
327     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
328     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
329     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
330     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
331     Color color;
332     RefPtr<ResourceObject> colorResObj;
333     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
334     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, colorResObj, nodeInfo)) {
335         GetArkUINodeModifiers()->getSliderModifier()->resetBlockColor(nativeNode);
336     } else {
337         auto colorRawPtr = AceType::RawPtr(colorResObj);
338         GetArkUINodeModifiers()->getSliderModifier()->setBlockColorPtr(nativeNode, color.GetValue(), colorRawPtr);
339     }
340     return panda::JSValueRef::Undefined(vm);
341 }
342 
ResetBlockColor(ArkUIRuntimeCallInfo * runtimeCallInfo)343 ArkUINativeModuleValue SliderBridge::ResetBlockColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
344 {
345     EcmaVM* vm = runtimeCallInfo->GetVM();
346     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
347     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
348     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
349     GetArkUINodeModifiers()->getSliderModifier()->resetBlockColor(nativeNode);
350     return panda::JSValueRef::Undefined(vm);
351 }
352 
SetTrackBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)353 ArkUINativeModuleValue SliderBridge::SetTrackBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
354 {
355     EcmaVM* vm = runtimeCallInfo->GetVM();
356     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
357     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
358     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
359     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
360     Gradient gradient;
361     Color color;
362     RefPtr<ResourceObject> colorResObj;
363     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
364     if (ConvertSliderGradientColor(vm, secondArg, gradient)) {
365         ArkUIGradientType gradientObj;
366         auto colorLength = gradient.GetColors().size();
367         std::vector<uint32_t> colorValues;
368         std::vector<ArkUILengthType> offsetValues;
369         GetArkUINodeModifiers()->getSliderModifier()->resetTrackBackgroundColor(nativeNode);
370         if (colorLength <= 0) {
371             return panda::JSValueRef::Undefined(vm);
372         }
373         for (int32_t i = 0; i < static_cast<int32_t>(colorLength); i++) {
374             colorValues.push_back(gradient.GetColors()[i].GetLinearColor().GetValue());
375             offsetValues.push_back(ArkUILengthType {
376                 .number = static_cast<ArkUI_Float32>(gradient.GetColors()[i].GetDimension().Value()),
377                 .unit = static_cast<int8_t>(gradient.GetColors()[i].GetDimension().Unit()) });
378         }
379 
380         gradientObj.color = &(*colorValues.begin());
381         gradientObj.offset = &(*offsetValues.begin());
382         GetArkUINodeModifiers()->getSliderModifier()->setLinearTrackBackgroundColor(
383             nativeNode, &gradientObj, colorLength);
384     } else if (ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, colorResObj, nodeInfo)) {
385         auto colorRawPtr = AceType::RawPtr(colorResObj);
386         GetArkUINodeModifiers()->getSliderModifier()->setTrackBackgroundColorPtr(
387             nativeNode, color.GetValue(), colorRawPtr);
388     } else {
389         GetArkUINodeModifiers()->getSliderModifier()->resetTrackBackgroundColor(nativeNode);
390     }
391     return panda::JSValueRef::Undefined(vm);
392 }
393 
ResetTrackBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)394 ArkUINativeModuleValue SliderBridge::ResetTrackBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
395 {
396     EcmaVM* vm = runtimeCallInfo->GetVM();
397     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
398     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
399     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
400     GetArkUINodeModifiers()->getSliderModifier()->resetTrackBackgroundColor(nativeNode);
401     return panda::JSValueRef::Undefined(vm);
402 }
403 
SetSelectColor(ArkUIRuntimeCallInfo * runtimeCallInfo)404 ArkUINativeModuleValue SliderBridge::SetSelectColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
405 {
406     EcmaVM* vm = runtimeCallInfo->GetVM();
407     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
408     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
409     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
410     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
411     Gradient gradient;
412     Color color;
413     RefPtr<ResourceObject> colorResObj;
414     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
415     if (ConvertSliderGradientColor(vm, secondArg, gradient)) {
416         ArkUIGradientType gradientObj;
417         auto colorLength = gradient.GetColors().size();
418         std::vector<uint32_t> colorValues;
419         std::vector<ArkUILengthType> offsetValues;
420         if (colorLength <= 0) {
421             GetArkUINodeModifiers()->getSliderModifier()->resetSelectColor(nativeNode);
422             return panda::JSValueRef::Undefined(vm);
423         }
424 
425         for (int32_t i = 0; i < static_cast<int32_t>(colorLength); i++) {
426             colorValues.push_back(gradient.GetColors()[i].GetLinearColor().GetValue());
427             offsetValues.push_back(ArkUILengthType {
428                 .number = static_cast<ArkUI_Float32>(gradient.GetColors()[i].GetDimension().Value()),
429                 .unit = static_cast<int8_t>(gradient.GetColors()[i].GetDimension().Unit()) });
430         }
431 
432         gradientObj.color = &(*colorValues.begin());
433         gradientObj.offset = &(*offsetValues.begin());
434         GetArkUINodeModifiers()->getSliderModifier()->setLinearSelectColor(nativeNode, &gradientObj, colorLength);
435     } else if (ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, colorResObj, nodeInfo)) {
436         auto colorRawPtr = AceType::RawPtr(colorResObj);
437         GetArkUINodeModifiers()->getSliderModifier()->setSelectColorPtr(nativeNode, color.GetValue(), colorRawPtr);
438     } else {
439         GetArkUINodeModifiers()->getSliderModifier()->resetSelectColor(nativeNode);
440     }
441     return panda::JSValueRef::Undefined(vm);
442 }
443 
ResetSelectColor(ArkUIRuntimeCallInfo * runtimeCallInfo)444 ArkUINativeModuleValue SliderBridge::ResetSelectColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
445 {
446     EcmaVM* vm = runtimeCallInfo->GetVM();
447     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
448     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
449     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
450     GetArkUINodeModifiers()->getSliderModifier()->resetSelectColor(nativeNode);
451     return panda::JSValueRef::Undefined(vm);
452 }
453 
SetShowSteps(ArkUIRuntimeCallInfo * runtimeCallInfo)454 ArkUINativeModuleValue SliderBridge::SetShowSteps(ArkUIRuntimeCallInfo* runtimeCallInfo)
455 {
456     EcmaVM* vm = runtimeCallInfo->GetVM();
457     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
458     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
459     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
460     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
461     bool flag = secondArg->ToBoolean(vm)->Value();
462     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
463     if ((info.Length() < NUM_3) || (!info[NUM_2]->IsObject())) {
464         GetArkUINodeModifiers()->getSliderModifier()->setShowSteps(nativeNode, flag);
465         return panda::JSValueRef::Undefined(vm);
466     }
467     StepOptions optionsMap{};
468     auto optionsObject = Framework::JSRef<Framework::JSObject>::Cast(info[NUM_2]);
469     Framework::JSRef<Framework::JSVal> jsOptionsMap = optionsObject->GetProperty(STEPS_STRING);
470     if (jsOptionsMap->IsObject()) {
471         SliderBridge::ParseStepOptionsMap(vm, jsOptionsMap, optionsMap);
472     }
473     if (optionsMap.size() > 0) {
474         auto optionLength = NUM_0;
475         auto options = new ArkUISliderShowStepOptions[optionsMap.size()];
476         for (auto& option : optionsMap) {
477             options[optionLength].step = option.first;
478             options[optionLength].text = option.second.c_str();
479             optionLength++;
480         }
481         GetArkUINodeModifiers()->getSliderModifier()->setShowStepsWithOptions(nativeNode, flag, options, optionLength);
482         delete[] options;
483     }
484     return panda::JSValueRef::Undefined(vm);
485 }
486 
ResetShowSteps(ArkUIRuntimeCallInfo * runtimeCallInfo)487 ArkUINativeModuleValue SliderBridge::ResetShowSteps(ArkUIRuntimeCallInfo* runtimeCallInfo)
488 {
489     EcmaVM* vm = runtimeCallInfo->GetVM();
490     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
491     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
492     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
493     GetArkUINodeModifiers()->getSliderModifier()->resetShowSteps(nativeNode);
494     return panda::JSValueRef::Undefined(vm);
495 }
496 
SetThickness(ArkUIRuntimeCallInfo * runtimeCallInfo)497 ArkUINativeModuleValue SliderBridge::SetThickness(ArkUIRuntimeCallInfo* runtimeCallInfo)
498 {
499     EcmaVM* vm = runtimeCallInfo->GetVM();
500     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
501     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
502     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
503     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
504 
505     CalcDimension thickness;
506     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, thickness, true)) {
507         GetArkUINodeModifiers()->getSliderModifier()->resetThickness(nativeNode);
508         return panda::JSValueRef::Undefined(vm);
509     }
510 
511     GetArkUINodeModifiers()->getSliderModifier()->setThickness(nativeNode,
512         thickness.Value(), static_cast<int>(thickness.Unit()));
513     return panda::JSValueRef::Undefined(vm);
514 }
515 
ResetThickness(ArkUIRuntimeCallInfo * runtimeCallInfo)516 ArkUINativeModuleValue SliderBridge::ResetThickness(ArkUIRuntimeCallInfo* runtimeCallInfo)
517 {
518     EcmaVM* vm = runtimeCallInfo->GetVM();
519     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
520     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
521     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
522     GetArkUINodeModifiers()->getSliderModifier()->resetThickness(nativeNode);
523     return panda::JSValueRef::Undefined(vm);
524 }
525 
SetBlockStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)526 ArkUINativeModuleValue SliderBridge::SetBlockStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
527 {
528     EcmaVM* vm = runtimeCallInfo->GetVM();
529     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
530     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
531     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
532     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
533     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
534     if (!info[1]->IsObject()) {
535         SliderBridge::ResetBlockStyle(runtimeCallInfo);
536         return panda::JSValueRef::Undefined(vm);
537     }
538     auto jsObj = Framework::JSRef<Framework::JSObject>::Cast(info[1]);
539     auto getType = jsObj->GetProperty("type");
540     if (getType->IsNull() || !getType->IsNumber()) {
541         SliderBridge::ResetBlockStyle(runtimeCallInfo);
542         return panda::JSValueRef::Undefined(vm);
543     }
544     auto type = static_cast<SliderModel::BlockStyleType>(getType->ToNumber<int32_t>());
545     if (type == SliderModel::BlockStyleType::IMAGE) {
546         std::string src;
547         RefPtr<ResourceObject> mediaResObj;
548         auto image = jsObj->GetProperty("image");
549         if (!Framework::JSShapeAbstract::ParseJsMedia(image, src, mediaResObj)) {
550             SliderBridge::ResetBlockStyle(runtimeCallInfo);
551             return panda::JSValueRef::Undefined(vm);
552         }
553         std::string bundleName;
554         std::string moduleName;
555         Framework::JSViewAbstract::GetJsMediaBundleInfo(image, bundleName, moduleName);
556         SliderModelNG::SetBlockImage(frameNode, src, bundleName, moduleName);
557         if (SystemProperties::ConfigChangePerform()) {
558             SliderModelNG::CreateWithMediaResourceObj(frameNode, mediaResObj, bundleName, moduleName);
559         }
560     } else if (type == SliderModel::BlockStyleType::SHAPE) {
561         auto shape = jsObj->GetProperty("shape");
562         if (!shape->IsObject()) {
563             SliderBridge::ResetBlockStyle(runtimeCallInfo);
564             return panda::JSValueRef::Undefined(vm);
565         }
566         Framework::JSShapeAbstract* shapeAbstract =
567             Framework::JSRef<Framework::JSObject>::Cast(shape)->Unwrap<Framework::JSShapeAbstract>();
568         if (shapeAbstract == nullptr) {
569             SliderBridge::ResetBlockStyle(runtimeCallInfo);
570             return panda::JSValueRef::Undefined(vm);
571         }
572         SliderModelNG::SetBlockShape(frameNode, shapeAbstract->GetBasicShape());
573     }
574     SliderModelNG::SetBlockType(frameNode, type);
575     return panda::JSValueRef::Undefined(vm);
576 }
577 
ResetBlockStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)578 ArkUINativeModuleValue SliderBridge::ResetBlockStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
579 {
580     EcmaVM* vm = runtimeCallInfo->GetVM();
581     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
582     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
583     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
584     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
585     SliderModelNG::ResetBlockType(frameNode);
586     SliderModelNG::ResetBlockImage(frameNode);
587     SliderModelNG::ResetBlockShape(frameNode);
588     return panda::JSValueRef::Undefined(vm);
589 }
590 
SetValidSlideRange(ArkUIRuntimeCallInfo * runtimeCallInfo)591 ArkUINativeModuleValue SliderBridge::SetValidSlideRange(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     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
597     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
598     if (!info[1]->IsObject()) {
599         GetArkUINodeModifiers()->getSliderModifier()->resetSliderValidSlideRange(nativeNode);
600         return panda::JSValueRef::Undefined(vm);
601     }
602     float from = std::numeric_limits<float>::infinity();
603     float to = std::numeric_limits<float>::infinity();
604     auto jsObj = Framework::JSRef<Framework::JSObject>::Cast(info[1]);
605     auto fromType = jsObj->GetProperty("from");
606     if (!fromType->IsEmpty() && fromType->IsNumber()) {
607         from = fromType->ToNumber<float>();
608     }
609     auto toType = jsObj->GetProperty("to");
610     if (!toType->IsEmpty() && toType->IsNumber()) {
611         to = toType->ToNumber<float>();
612     }
613     if ((std::isinf(from) && std::isinf(to)) || std::isnan(from) || std::isnan(to)) {
614         GetArkUINodeModifiers()->getSliderModifier()->resetSliderValidSlideRange(nativeNode);
615         return panda::JSValueRef::Undefined(vm);
616     }
617     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
618     SliderModelNG::SetValidSlideRange(frameNode, from, to);
619     return panda::JSValueRef::Undefined(vm);
620 }
621 
ResetValidSlideRange(ArkUIRuntimeCallInfo * runtimeCallInfo)622 ArkUINativeModuleValue SliderBridge::ResetValidSlideRange(ArkUIRuntimeCallInfo* runtimeCallInfo)
623 {
624     EcmaVM* vm = runtimeCallInfo->GetVM();
625     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
626     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
627     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
628     GetArkUINodeModifiers()->getSliderModifier()->resetSliderValidSlideRange(nativeNode);
629     return panda::JSValueRef::Undefined(vm);
630 }
631 
SetSelectedBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)632 ArkUINativeModuleValue SliderBridge::SetSelectedBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
633 {
634     EcmaVM* vm = runtimeCallInfo->GetVM();
635     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
636     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
637     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
638     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
639 
640     CalcDimension borderRadius;
641     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, borderRadius, true)) {
642         GetArkUINodeModifiers()->getSliderModifier()->resetSelectedBorderRadius(nativeNode);
643         return panda::JSValueRef::Undefined(vm);
644     }
645 
646     if (LessNotEqual(borderRadius.Value(), 0.0)) {
647         GetArkUINodeModifiers()->getSliderModifier()->resetSelectedBorderRadius(nativeNode);
648         return panda::JSValueRef::Undefined(vm);
649     }
650 
651     GetArkUINodeModifiers()->getSliderModifier()->setSelectedBorderRadius(nativeNode,
652         borderRadius.Value(), static_cast<int>(borderRadius.Unit()));
653     return panda::JSValueRef::Undefined(vm);
654 }
655 
ResetSelectedBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)656 ArkUINativeModuleValue SliderBridge::ResetSelectedBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
657 {
658     EcmaVM* vm = runtimeCallInfo->GetVM();
659     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
660     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
661     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
662     GetArkUINodeModifiers()->getSliderModifier()->resetSelectedBorderRadius(nativeNode);
663     return panda::JSValueRef::Undefined(vm);
664 }
665 
SetInteractionMode(ArkUIRuntimeCallInfo * runtimeCallInfo)666 ArkUINativeModuleValue SliderBridge::SetInteractionMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
667 {
668     EcmaVM* vm = runtimeCallInfo->GetVM();
669     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
670     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
671     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
672     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
673     if (!secondArg->IsNumber()) {
674         GetArkUINodeModifiers()->getSliderModifier()->resetInteractionMode(nativeNode);
675         return panda::JSValueRef::Undefined(vm);
676     }
677     int32_t interactionMode = secondArg->Int32Value(vm);
678     GetArkUINodeModifiers()->getSliderModifier()->setInteractionMode(nativeNode, interactionMode);
679     return panda::JSValueRef::Undefined(vm);
680 }
681 
ResetInteractionMode(ArkUIRuntimeCallInfo * runtimeCallInfo)682 ArkUINativeModuleValue SliderBridge::ResetInteractionMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
683 {
684     EcmaVM* vm = runtimeCallInfo->GetVM();
685     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
686     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
687     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
688     GetArkUINodeModifiers()->getSliderModifier()->resetInteractionMode(nativeNode);
689     return panda::JSValueRef::Undefined(vm);
690 }
691 
SetMinResponsiveDistance(ArkUIRuntimeCallInfo * runtimeCallInfo)692 ArkUINativeModuleValue SliderBridge::SetMinResponsiveDistance(ArkUIRuntimeCallInfo* runtimeCallInfo)
693 {
694     EcmaVM* vm = runtimeCallInfo->GetVM();
695     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
696     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
697     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
698     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
699     if (!secondArg->IsNumber()) {
700         GetArkUINodeModifiers()->getSliderModifier()->resetMinResponsiveDistance(nativeNode);
701         return panda::JSValueRef::Undefined(vm);
702     }
703     float distance = secondArg->ToNumber(vm)->Value();
704     GetArkUINodeModifiers()->getSliderModifier()->setMinResponsiveDistance(nativeNode, distance);
705     return panda::JSValueRef::Undefined(vm);
706 }
707 
ResetMinResponsiveDistance(ArkUIRuntimeCallInfo * runtimeCallInfo)708 ArkUINativeModuleValue SliderBridge::ResetMinResponsiveDistance(ArkUIRuntimeCallInfo* runtimeCallInfo)
709 {
710     EcmaVM* vm = runtimeCallInfo->GetVM();
711     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
712     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
713     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
714     GetArkUINodeModifiers()->getSliderModifier()->resetMinResponsiveDistance(nativeNode);
715     return panda::JSValueRef::Undefined(vm);
716 }
717 
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)718 ArkUINativeModuleValue SliderBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
719 {
720     EcmaVM* vm = runtimeCallInfo->GetVM();
721     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
722     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
723     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
724     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
725     if (!secondArg->IsObject(vm)) {
726         SliderModelNG::SetBuilderFunc(frameNode, nullptr);
727         return panda::JSValueRef::Undefined(vm);
728     }
729     panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
730     auto containerId = Container::CurrentId();
731     SliderModelNG::SetBuilderFunc(frameNode,
732         [vm, frameNode, obj = std::move(obj), containerId](
733             SliderConfiguration config) -> RefPtr<FrameNode> {
734             ContainerScope scope(containerId);
735             auto context = ArkTSUtils::GetContext(vm);
736             const char* keyOfSlider[] = { "value", "min", "max", "step", "enabled", "triggerChange" };
737             Local<JSValueRef> valuesOfSlider[] = { panda::NumberRef::New(vm, config.value_),
738                 panda::NumberRef::New(vm, config.min_), panda::NumberRef::New(vm, config.max_),
739                 panda::NumberRef::New(vm, config.step_), panda::BooleanRef::New(vm, config.enabled_),
740                 panda::FunctionRef::New(vm, JsSliderChangeCallback) };
741             auto slider = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keyOfSlider),
742                 keyOfSlider, valuesOfSlider);
743             slider->SetNativePointerFieldCount(vm, 1);
744             slider->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
745             panda::Local<panda::JSValueRef> params[NUM_2] = { context, slider };
746             LocalScope pandaScope(vm);
747             panda::TryCatch trycatch(vm);
748             auto jsObject = obj.ToLocal();
749             auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
750             CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
751             panda::Local<panda::FunctionRef> func = makeFunc;
752             auto result = func->Call(vm, jsObject, params, NUM_2);
753             JSNApi::ExecutePendingJob(vm);
754             CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
755             auto resultObj = result->ToObject(vm);
756             panda::Local<panda::JSValueRef> nodeptr =
757                 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, SLIDER_NODEPTR_OF_UINODE));
758             CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
759             auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
760             CHECK_NULL_RETURN(frameNode, nullptr);
761             return AceType::Claim(frameNode);
762         });
763     return panda::JSValueRef::Undefined(vm);
764 }
765 
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)766 ArkUINativeModuleValue SliderBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
767 {
768     EcmaVM* vm = runtimeCallInfo->GetVM();
769     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
770     uint32_t argsNumber = runtimeCallInfo->GetArgsNumber();
771     if (argsNumber != NUM_2) {
772         return panda::JSValueRef::Undefined(vm);
773     }
774     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
775     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
776     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
777     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
778     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
779     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
780         GetArkUINodeModifiers()->getToggleModifier()->resetToggleOnChange(nativeNode);
781         return panda::JSValueRef::Undefined(vm);
782     }
783     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
784     std::function<void(float, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
785                                                        float number, int32_t mode) {
786         panda::LocalScope pandaScope(vm);
787         panda::TryCatch trycatch(vm);
788         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
789 
790         panda::Local<panda::NumberRef> numberParam = panda::NumberRef::New(vm, number);
791         panda::Local<panda::NumberRef> modeParam = panda::NumberRef::New(vm, mode);
792         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { numberParam, modeParam };
793         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
794     };
795     GetArkUINodeModifiers()->getSliderModifier()->setOnChange(nativeNode, reinterpret_cast<void*>(&callback));
796     return panda::JSValueRef::Undefined(vm);
797 }
798 
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)799 ArkUINativeModuleValue SliderBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
800 {
801     EcmaVM* vm = runtimeCallInfo->GetVM();
802     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
803     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
804     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
805     GetArkUINodeModifiers()->getSliderModifier()->resetOnChange(nativeNode);
806     return panda::JSValueRef::Undefined(vm);
807 }
808 
809 struct SliderOptions {
810     double value = 0;
811     double min = 0;
812     double max = 100;
813     double step = 1;
814     bool reverse = false;
815     int32_t style = 0;
816     int32_t direction = 1;
817 };
818 
GetStep(SliderOptions & options)819 static void GetStep(SliderOptions& options)
820 {
821     if (LessOrEqual(options.step, 0.0) || options.step > options.max - options.min) {
822         options.step = 1;
823     }
824 }
825 
GetValue(SliderOptions & options)826 static void GetValue(SliderOptions& options)
827 {
828     if (options.value < options.min) {
829         options.value = options.min;
830     }
831 
832     if (options.value > options.max) {
833         options.value = options.max;
834     }
835 }
836 
ParseStyleOptions(ArkUIRuntimeCallInfo * runtimeCallInfo,SliderOptions & options)837 static void ParseStyleOptions(ArkUIRuntimeCallInfo* runtimeCallInfo, SliderOptions& options)
838 {
839     EcmaVM* vm = runtimeCallInfo->GetVM();
840     CHECK_NULL_VOID(vm);
841     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(5);     // 5: parameter index
842     Local<JSValueRef> directionArg = runtimeCallInfo->GetCallArgRef(6); // 6: parameter index
843     Local<JSValueRef> reverseArg = runtimeCallInfo->GetCallArgRef(7);   // 7: parameter index
844 
845     if (!reverseArg.IsNull() && !reverseArg->IsUndefined() && reverseArg->IsBoolean()) {
846         options.reverse = reverseArg->ToBoolean(vm)->Value();
847     }
848     if (!styleArg.IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
849         auto tempStyle = styleArg->Int32Value(vm);
850         if (tempStyle >= static_cast<int32_t>(SliderMode::OUTSET) &&
851                 tempStyle <= static_cast<int32_t>(SliderMode::CAPSULE)) {
852             options.style = tempStyle;
853         }
854     }
855     if (!directionArg.IsNull() && !directionArg->IsUndefined() && directionArg->IsNumber()) {
856         auto tempDirection = directionArg->Int32Value(vm);
857         if (tempDirection >= static_cast<int32_t>(Axis::VERTICAL) &&
858                 tempDirection <= static_cast<int32_t>(Axis::HORIZONTAL)) {
859             options.direction = tempDirection;
860         }
861     }
862 }
863 
ParseOptions(ArkUIRuntimeCallInfo * runtimeCallInfo,SliderOptions & options)864 static void ParseOptions(ArkUIRuntimeCallInfo* runtimeCallInfo, SliderOptions& options)
865 {
866     static const double valueMin = -1000000.0f;
867     options.value = valueMin;
868     EcmaVM* vm = runtimeCallInfo->GetVM();
869     CHECK_NULL_VOID(vm);
870     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1); // 1: parameter index
871     Local<JSValueRef> minArg = runtimeCallInfo->GetCallArgRef(2);   // 2: parameter index
872     Local<JSValueRef> maxArg = runtimeCallInfo->GetCallArgRef(3);   // 3: parameter index
873     Local<JSValueRef> stepArg = runtimeCallInfo->GetCallArgRef(4);  // 4: parameter index
874     if (!valueArg.IsNull() && !valueArg->IsUndefined() && valueArg->IsNumber()) {
875         options.value = valueArg->ToNumber(vm)->Value();
876     }
877     if (!minArg.IsNull() && !minArg->IsUndefined() && minArg->IsNumber()) {
878         options.min = minArg->ToNumber(vm)->Value();
879     }
880     if (!maxArg.IsNull() && !maxArg->IsUndefined() && maxArg->IsNumber()) {
881         options.max = maxArg->ToNumber(vm)->Value();
882     }
883     if (!stepArg.IsNull() && !stepArg->IsUndefined() && stepArg->IsNumber()) {
884         options.step = stepArg->ToNumber(vm)->Value();
885     }
886 
887     if (GreatOrEqual(options.min, options.max)) {
888         options.min = SLIDER_MIN;
889         options.max = SLIDER_MAX;
890     }
891 
892     GetStep(options);
893     GetValue(options);
894     ParseStyleOptions(runtimeCallInfo, options);
895 }
896 
SetSliderOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)897 ArkUINativeModuleValue SliderBridge::SetSliderOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
898 {
899     auto sliderModifier = GetArkUINodeModifiers()->getSliderModifier();
900     EcmaVM* vm = runtimeCallInfo->GetVM();
901     CHECK_EQUAL_RETURN(runtimeCallInfo->GetArgsNumber() != NUM_8, true, panda::JSValueRef::Undefined(vm));
902     SliderOptions options;
903     ParseOptions(runtimeCallInfo, options);
904     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
905     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
906     auto pointer = nodeArg->ToNativePointer(vm);
907     CHECK_EQUAL_RETURN(pointer.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
908     auto nativeNode = nodePtr(pointer->Value());
909     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
910     sliderModifier->setStep(nativeNode, options.step);
911     sliderModifier->setMinLabel(nativeNode, options.min);
912     sliderModifier->setMaxLabel(nativeNode, options.max);
913     sliderModifier->setSliderValue(nativeNode, options.value);
914     sliderModifier->setSliderStyle(nativeNode, options.style);
915     sliderModifier->setDirection(nativeNode, options.direction);
916     sliderModifier->setReverse(nativeNode, options.reverse);
917     return panda::JSValueRef::Undefined(vm);
918 }
919 
SetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)920 ArkUINativeModuleValue SliderBridge::SetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
921 {
922     EcmaVM* vm = runtimeCallInfo->GetVM();
923     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
924     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
925     Local<JSValueRef> enableHapticFeedbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
926     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
927     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
928     auto nodeModifiers = GetArkUINodeModifiers();
929     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
930     auto SliderModifier = nodeModifiers->getSliderModifier();
931     CHECK_NULL_RETURN(SliderModifier, panda::NativePointerRef::New(vm, nullptr));
932     if (enableHapticFeedbackArg->IsBoolean()) {
933         bool value = enableHapticFeedbackArg->ToBoolean(vm)->Value();
934         SliderModifier->setEnableHapticFeedback(nativeNode, value);
935     } else {
936         SliderModifier->resetEnableHapticFeedback(nativeNode);
937     }
938     return panda::JSValueRef::Undefined(vm);
939 }
940 
ResetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)941 ArkUINativeModuleValue SliderBridge::ResetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
942 {
943     EcmaVM* vm = runtimeCallInfo->GetVM();
944     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
945     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
946     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
947     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
948     auto nodeModifiers = GetArkUINodeModifiers();
949     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
950     auto SliderModifier = nodeModifiers->getSliderModifier();
951     CHECK_NULL_RETURN(SliderModifier, panda::NativePointerRef::New(vm, nullptr));
952     SliderModifier->resetEnableHapticFeedback(nativeNode);
953     return panda::JSValueRef::Undefined(vm);
954 }
955 
ParsePrefixOrSuffixOptions(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUISliderCustomContentOptions & options)956 static void ParsePrefixOrSuffixOptions(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUISliderCustomContentOptions& options)
957 {
958     EcmaVM* vm = runtimeCallInfo->GetVM();
959     CHECK_NULL_VOID(vm);
960     if (runtimeCallInfo->GetArgsNumber() < NUM_6) {
961         return;
962     }
963     Local<JSValueRef> textArg = runtimeCallInfo->GetCallArgRef(NUM_2);
964     Local<JSValueRef> descriptionArg = runtimeCallInfo->GetCallArgRef(NUM_3);
965     Local<JSValueRef> levelArg = runtimeCallInfo->GetCallArgRef(NUM_4);
966     Local<JSValueRef> groupArg = runtimeCallInfo->GetCallArgRef(NUM_5);
967     CalcDimension dimension;
968     if (!textArg.IsNull() && !textArg->IsUndefined()) {
969         if (textArg->IsString(vm)) {
970             options.accessibilityText = textArg->ToString(vm)->ToString(vm).c_str();
971         } else if (ArkTSUtils::ParseJsResource(vm, textArg, dimension)) {
972             options.accessibilityText = dimension.ToString().c_str();
973         }
974     }
975 
976     if (!descriptionArg.IsNull() && !descriptionArg->IsUndefined()) {
977         if (descriptionArg->IsString(vm)) {
978             options.accessibilityDescription = descriptionArg->ToString(vm)->ToString(vm).c_str();
979         } else if (ArkTSUtils::ParseJsResource(vm, descriptionArg, dimension)) {
980             options.accessibilityDescription = dimension.ToString().c_str();
981         }
982     }
983 
984     if (!levelArg.IsNull() && !levelArg->IsUndefined()) {
985         if (levelArg->IsString(vm)) {
986             options.accessibilityLevel = levelArg->ToString(vm)->ToString(vm).c_str();
987         } else if (ArkTSUtils::ParseJsResource(vm, levelArg, dimension)) {
988             options.accessibilityLevel = dimension.ToString().c_str();
989         }
990     }
991     if (!groupArg.IsNull() && !groupArg->IsUndefined() && groupArg->IsBoolean()) {
992         options.accessibilityGroup = groupArg->ToBoolean(vm)->Value();
993     }
994 }
995 
SetPrefix(ArkUIRuntimeCallInfo * runtimeCallInfo)996 ArkUINativeModuleValue SliderBridge::SetPrefix(ArkUIRuntimeCallInfo* runtimeCallInfo)
997 {
998     EcmaVM* vm = runtimeCallInfo->GetVM();
999     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1000     if (runtimeCallInfo->GetArgsNumber() < NUM_3) {
1001         return panda::JSValueRef::Undefined(vm);
1002     }
1003 
1004     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1005     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1006     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
1007 
1008     Local<JSValueRef> prefixArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1009     auto prefixNode = nodePtr(prefixArg->ToNativePointer(vm)->Value());
1010     CHECK_NULL_RETURN(prefixNode, panda::NativePointerRef::New(vm, nullptr));
1011 
1012     ArkUISliderCustomContentOptions options;
1013     ParsePrefixOrSuffixOptions(runtimeCallInfo, options);
1014 
1015     auto nodeModifiers = GetArkUINodeModifiers();
1016     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
1017     auto SliderModifier = nodeModifiers->getSliderModifier();
1018     CHECK_NULL_RETURN(SliderModifier, panda::NativePointerRef::New(vm, nullptr));
1019     SliderModifier->setPrefix(nativeNode, prefixNode, static_cast<ArkUISliderCustomContentOptions*>(&options));
1020     return panda::JSValueRef::Undefined(vm);
1021 }
1022 
ResetPrefix(ArkUIRuntimeCallInfo * runtimeCallInfo)1023 ArkUINativeModuleValue SliderBridge::ResetPrefix(ArkUIRuntimeCallInfo* runtimeCallInfo)
1024 {
1025     EcmaVM* vm = runtimeCallInfo->GetVM();
1026     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1027 
1028     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1029     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1030     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
1031 
1032     Local<JSValueRef> prefixArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1033     auto prefixNode = nodePtr(prefixArg->ToNativePointer(vm)->Value());
1034     CHECK_NULL_RETURN(prefixNode, panda::NativePointerRef::New(vm, nullptr));
1035 
1036     auto nodeModifiers = GetArkUINodeModifiers();
1037     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
1038 
1039     auto SliderModifier = nodeModifiers->getSliderModifier();
1040     CHECK_NULL_RETURN(SliderModifier, panda::NativePointerRef::New(vm, nullptr));
1041     SliderModifier->resetPrefix(nativeNode);
1042     return panda::JSValueRef::Undefined(vm);
1043 }
1044 
SetSuffix(ArkUIRuntimeCallInfo * runtimeCallInfo)1045 ArkUINativeModuleValue SliderBridge::SetSuffix(ArkUIRuntimeCallInfo* runtimeCallInfo)
1046 {
1047     EcmaVM* vm = runtimeCallInfo->GetVM();
1048     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1049     if (runtimeCallInfo->GetArgsNumber() < NUM_3) {
1050         return panda::JSValueRef::Undefined(vm);
1051     }
1052 
1053     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1054     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1055     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
1056 
1057     Local<JSValueRef> suffixtArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1058     auto suffixNode = nodePtr(suffixtArg->ToNativePointer(vm)->Value());
1059     CHECK_NULL_RETURN(suffixNode, panda::NativePointerRef::New(vm, nullptr));
1060 
1061     ArkUISliderCustomContentOptions options;
1062     ParsePrefixOrSuffixOptions(runtimeCallInfo, options);
1063 
1064     auto nodeModifiers = GetArkUINodeModifiers();
1065     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
1066     auto SliderModifier = nodeModifiers->getSliderModifier();
1067     CHECK_NULL_RETURN(SliderModifier, panda::NativePointerRef::New(vm, nullptr));
1068     SliderModifier->setSuffix(nativeNode, suffixNode, static_cast<ArkUISliderCustomContentOptions*>(&options));
1069     return panda::JSValueRef::Undefined(vm);
1070 }
1071 
ResetSuffix(ArkUIRuntimeCallInfo * runtimeCallInfo)1072 ArkUINativeModuleValue SliderBridge::ResetSuffix(ArkUIRuntimeCallInfo* runtimeCallInfo)
1073 {
1074     EcmaVM* vm = runtimeCallInfo->GetVM();
1075     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1076 
1077     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1078     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1079     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
1080 
1081     Local<JSValueRef> suffixtArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1082     auto suffixNode = nodePtr(suffixtArg->ToNativePointer(vm)->Value());
1083     CHECK_NULL_RETURN(suffixNode, panda::NativePointerRef::New(vm, nullptr));
1084 
1085     auto nodeModifiers = GetArkUINodeModifiers();
1086     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
1087 
1088     auto SliderModifier = nodeModifiers->getSliderModifier();
1089     CHECK_NULL_RETURN(SliderModifier, panda::NativePointerRef::New(vm, nullptr));
1090     SliderModifier->resetSuffix(nativeNode);
1091     return panda::JSValueRef::Undefined(vm);
1092 }
1093 
GetIteratorNext(const napi_env env,napi_value iterator,napi_value func,bool * done)1094 napi_value SliderBridge::GetIteratorNext(const napi_env env, napi_value iterator, napi_value func, bool *done)
1095 {
1096     napi_value next = nullptr;
1097     NAPI_CALL_BASE(env, napi_call_function(env, iterator, func, 0, nullptr, &next), nullptr);
1098     CHECK_NULL_RETURN(next, nullptr);
1099     napi_value doneValue = nullptr;
1100     NAPI_CALL_BASE(env, napi_get_named_property(env, next, DONE_STRING, &doneValue), nullptr);
1101     CHECK_NULL_RETURN(doneValue, nullptr);
1102     NAPI_CALL_BASE(env, napi_get_value_bool(env, doneValue, done), nullptr);
1103     return next;
1104 }
1105 
ParseStepOptionItemKey(const napi_env env,napi_value item)1106 int32_t SliderBridge::ParseStepOptionItemKey(const napi_env env, napi_value item)
1107 {
1108     int32_t result = INT32_MIN;
1109     napi_value entry = nullptr;
1110     napi_value key = nullptr;
1111     napi_valuetype kType = napi_undefined;
1112     NAPI_CALL_BASE(env, napi_get_named_property(env, item, VALUE_STRING, &entry), result);
1113     CHECK_NULL_RETURN(entry, result);
1114     NAPI_CALL_BASE(env, napi_get_element(env, entry, NUM_0, &key), result);
1115     CHECK_NULL_RETURN(key, result);
1116     NAPI_CALL_BASE(env, napi_typeof(env, key, &kType), result);
1117     CHECK_NULL_RETURN(kType, result);
1118     if (napi_number == kType) {
1119         double step = NUM_0;
1120         NAPI_CALL_BASE(env, napi_get_value_double(env, key, &step), result);
1121         if ((step >= 0) && (NearZero(std::abs(step - std::floor(step)))) && (step <= INT32_MAX)) {
1122             result = static_cast<int32_t>(step);
1123         }
1124     }
1125     return result;
1126 }
1127 
ParseStepOptionItemValue(EcmaVM * vm,const napi_env env,napi_value item,std::string & stepText)1128 bool SliderBridge::ParseStepOptionItemValue(EcmaVM* vm, const napi_env env, napi_value item, std::string& stepText)
1129 {
1130     bool result = false;
1131     CHECK_NULL_RETURN(vm, result);
1132     napi_value entry = nullptr;
1133     napi_value value = nullptr;
1134     napi_value textObject = nullptr;
1135     napi_valuetype vType = napi_undefined;
1136     NAPI_CALL_BASE(env, napi_get_named_property(env, item, VALUE_STRING, &entry), result);
1137     CHECK_NULL_RETURN(entry, result);
1138     NAPI_CALL_BASE(env, napi_get_element(env, entry, NUM_1, &value), result);
1139     CHECK_NULL_RETURN(value, result);
1140     NAPI_CALL_BASE(env, napi_typeof(env, value, &vType), result);
1141     CHECK_NULL_RETURN(vType, result);
1142     if (napi_object == vType) {
1143         NAPI_CALL_BASE(env, napi_get_named_property(env, value, TEXT_STRING, &textObject), result);
1144         CHECK_NULL_RETURN(textObject, result);
1145         panda::Local<panda::JSValueRef> localValue = NapiValueToLocalValue(textObject);
1146         result = ArkTSUtils::ParseJsString(vm, localValue, stepText);
1147     }
1148     return result;
1149 }
1150 
ParseStepOptionsMap(EcmaVM * vm,Framework::JSRef<Framework::JSVal> jsStepOptionsMap,StepOptions & stepOptionsMap)1151 napi_value SliderBridge::ParseStepOptionsMap(
1152     EcmaVM* vm, Framework::JSRef<Framework::JSVal> jsStepOptionsMap, StepOptions& stepOptionsMap)
1153 {
1154     CHECK_NULL_RETURN(vm, nullptr);
1155     auto engine = EngineHelper::GetCurrentEngine();
1156     CHECK_NULL_RETURN(engine, nullptr);
1157     NativeEngine* nativeEngine = engine->GetNativeEngine();
1158     CHECK_NULL_RETURN(nativeEngine, nullptr);
1159     auto env = reinterpret_cast<napi_env>(nativeEngine);
1160     panda::Local<Framework::JsiValue> localValue = jsStepOptionsMap.Get().GetLocalHandle();
1161     JSValueWrapper valueWrapper = localValue;
1162     napi_value nativeValue = nativeEngine->ValueToNapiValue(valueWrapper);
1163     napi_value entriesFunc = nullptr;
1164     napi_value iterator = nullptr;
1165     napi_value nextFunc = nullptr;
1166     bool done = false;
1167     NAPI_CALL_BASE(env, napi_get_named_property(env, nativeValue, ENTRIES_STRING, &entriesFunc), nullptr);
1168     CHECK_NULL_RETURN(entriesFunc, nullptr);
1169     NAPI_CALL_BASE(env, napi_call_function(env, nativeValue, entriesFunc, NUM_0, nullptr, &iterator), nullptr);
1170     CHECK_NULL_RETURN(iterator, nullptr);
1171     NAPI_CALL_BASE(env, napi_get_named_property(env, iterator, NEXT_STRING, &nextFunc), nullptr);
1172     CHECK_NULL_RETURN(nextFunc, nullptr);
1173     napi_value next = SliderBridge::GetIteratorNext(env, iterator, nextFunc, &done);
1174     while ((nullptr != next) && !done) {
1175         auto optionKey = SliderBridge::ParseStepOptionItemKey(env, next);
1176         std::string optionStr = "";
1177         auto praseResult = SliderBridge::ParseStepOptionItemValue(vm, env, next, optionStr);
1178         next = SliderBridge::GetIteratorNext(env, iterator, nextFunc, &done);
1179         if ((optionKey < 0) || (!praseResult)) {
1180             continue;
1181         }
1182         stepOptionsMap[static_cast<uint32_t>(optionKey)] = optionStr;
1183     }
1184     return next;
1185 }
1186 } // namespace OHOS::Ace::NG
1187