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