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_textpicker_bridge.h"
16
17 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "core/components/picker/picker_theme.h"
20 #include "core/components_ng/pattern/picker/picker_type_define.h"
21
22 namespace OHOS::Ace::NG {
23 namespace {
24 const std::string FORMAT_FONT = "%s|%s|%s";
25 const std::string DEFAULT_ERR_CODE = "-1";
26 const int32_t DEFAULT_NEGATIVE_NUM = -1;
27 constexpr uint32_t DEFAULT_TIME_PICKER_TEXT_COLOR = 0xFF182431;
28 constexpr uint32_t DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR = 0xFF0A59F7;
29
30 constexpr int32_t NODE_INDEX = 0;
31 constexpr int32_t STROKE_WIDTH_INDEX = 1;
32 constexpr int32_t COLOR_INDEX = 2;
33 constexpr int32_t START_MARGIN_INDEX = 3;
34 constexpr int32_t END_MARGIN_INDEX = 4;
35 constexpr int32_t NUM_1 = 1;
36
37 constexpr int32_t ARG_GROUP_LENGTH = 3;
38 constexpr int PARAM_ARR_LENGTH_2 = 2;
39 constexpr int NUM_0 = 0;
40 constexpr int NUM_2 = 2;
ParseDividerDimension(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & valueDim)41 bool ParseDividerDimension(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& valueDim)
42 {
43 return !ArkTSUtils::ParseJsDimensionVpNG(vm, value, valueDim, false) || LessNotEqual(valueDim.Value(), 0.0f) ||
44 (valueDim.Unit() != DimensionUnit::PX && valueDim.Unit() != DimensionUnit::VP &&
45 valueDim.Unit() != DimensionUnit::LPX && valueDim.Unit() != DimensionUnit::FP);
46 }
47
PopulateValues(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,ArkUI_Float32 values[],uint32_t size)48 void PopulateValues(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
49 const CalcDimension& dividerEndMargin, ArkUI_Float32 values[], uint32_t size)
50 {
51 values[NODE_INDEX] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
52 values[STROKE_WIDTH_INDEX] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
53 values[COLOR_INDEX] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
54 }
55
PopulateUnits(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,int32_t units[],uint32_t size)56 void PopulateUnits(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
57 const CalcDimension& dividerEndMargin, int32_t units[], uint32_t size)
58 {
59 units[NODE_INDEX] = static_cast<int32_t>(dividerStrokeWidth.Unit());
60 units[STROKE_WIDTH_INDEX] = static_cast<int32_t>(dividerStartMargin.Unit());
61 units[COLOR_INDEX] = static_cast<int32_t>(dividerEndMargin.Unit());
62 }
63
ParseFontSize(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & dimen)64 void ParseFontSize(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen)
65 {
66 if (value->IsNull() || value->IsUndefined()) {
67 dimen = Dimension(DEFAULT_NEGATIVE_NUM);
68 } else {
69 if (!ArkTSUtils::ParseJsDimensionNG(vm, value, dimen, DimensionUnit::FP, false)) {
70 dimen = Dimension(DEFAULT_NEGATIVE_NUM);
71 }
72 }
73 }
74
ParseFontWeight(const EcmaVM * vm,const Local<JSValueRef> & value,std::string & weight)75 void ParseFontWeight(const EcmaVM* vm, const Local<JSValueRef>& value, std::string& weight)
76 {
77 if (!value->IsNull() && !value->IsUndefined()) {
78 if (value->IsNumber()) {
79 weight = std::to_string(value->Int32Value(vm));
80 } else {
81 if (!ArkTSUtils::ParseJsString(vm, value, weight) || weight.empty()) {
82 weight = DEFAULT_ERR_CODE;
83 }
84 }
85 }
86 }
87 } // namespace
88
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)89 ArkUINativeModuleValue TextPickerBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
90 {
91 EcmaVM* vm = runtimeCallInfo->GetVM();
92 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
93 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
94 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
95 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
96 CommonBridge::SetBackgroundColor(runtimeCallInfo);
97 Color color;
98 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
99 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
100 } else {
101 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerBackgroundColor(nativeNode, color.GetValue());
102 }
103 return panda::JSValueRef::Undefined(vm);
104 }
105
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)106 ArkUINativeModuleValue TextPickerBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
107 {
108 EcmaVM* vm = runtimeCallInfo->GetVM();
109 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
110 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
111 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
112 CommonBridge::ResetBackgroundColor(runtimeCallInfo);
113 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
114 return panda::JSValueRef::Undefined(vm);
115 }
116
SetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)117 ArkUINativeModuleValue TextPickerBridge::SetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
118 {
119 EcmaVM* vm = runtimeCallInfo->GetVM();
120 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
121 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
122 Local<JSValueRef> canLoopArg = runtimeCallInfo->GetCallArgRef(1);
123 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
124 bool canLoop = true;
125 if (canLoopArg->IsBoolean()) {
126 canLoop = canLoopArg->ToBoolean(vm)->Value();
127 }
128 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerCanLoop(nativeNode, canLoop);
129 return panda::JSValueRef::Undefined(vm);
130 }
131
SetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)132 ArkUINativeModuleValue TextPickerBridge::SetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
133 {
134 EcmaVM* vm = runtimeCallInfo->GetVM();
135 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
136 Local<JSValueRef> indexArg = runtimeCallInfo->GetCallArgRef(1);
137 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
138 std::vector<uint32_t> selectedValues;
139
140 if (indexArg->IsArray(vm)) {
141 if (!ArkTSUtils::ParseJsIntegerArray(vm, indexArg, selectedValues)) {
142 selectedValues.clear();
143 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
144 return panda::JSValueRef::Undefined(vm);
145 }
146 if (selectedValues.size() > 0) {
147 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
148 nativeNode, selectedValues.data(), selectedValues.size());
149 } else {
150 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
151 }
152 } else {
153 uint32_t selectedValue = 0;
154 if (indexArg->IsNumber()) {
155 selectedValue = indexArg->Uint32Value(vm);
156 selectedValues.emplace_back(selectedValue);
157 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
158 nativeNode, selectedValues.data(), DEFAULT_NEGATIVE_NUM); // represent this is a number.
159 } else {
160 selectedValues.clear();
161 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
162 }
163 }
164 return panda::JSValueRef::Undefined(vm);
165 }
166
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)167 ArkUINativeModuleValue TextPickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
168 {
169 EcmaVM* vm = runtimeCallInfo->GetVM();
170 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
171 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
172 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
173 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
174 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
175 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
176 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
177 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
178 Color textColor;
179 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
180 textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
181 }
182 CalcDimension size;
183 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
184 size = Dimension(DEFAULT_NEGATIVE_NUM);
185 } else {
186 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
187 size = Dimension(DEFAULT_NEGATIVE_NUM);
188 }
189 }
190 std::string weight = DEFAULT_ERR_CODE;
191 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
192 if (fontWeightArg->IsNumber()) {
193 weight = std::to_string(fontWeightArg->Int32Value(vm));
194 } else {
195 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
196 weight = DEFAULT_ERR_CODE;
197 }
198 }
199 }
200 std::string fontFamily;
201 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
202 fontFamily = DEFAULT_ERR_CODE;
203 }
204 int32_t styleVal = 0;
205 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
206 styleVal = fontStyleArg->Int32Value(vm);
207 }
208 std::string fontSizeStr = size.ToString();
209 std::string fontInfo =
210 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
211 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerTextStyle(
212 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
213 return panda::JSValueRef::Undefined(vm);
214 }
215
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)216 ArkUINativeModuleValue TextPickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
217 {
218 EcmaVM* vm = runtimeCallInfo->GetVM();
219 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
220 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
221 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
222 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
223 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
224 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
225 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
226 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
227 Color textColor;
228 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
229 textColor.SetValue(DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR);
230 }
231 CalcDimension size;
232 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
233 size = Dimension(DEFAULT_NEGATIVE_NUM);
234 } else {
235 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
236 size = Dimension(DEFAULT_NEGATIVE_NUM);
237 }
238 }
239 std::string weight = DEFAULT_ERR_CODE;
240 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
241 if (fontWeightArg->IsNumber()) {
242 weight = std::to_string(fontWeightArg->Int32Value(vm));
243 } else {
244 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
245 weight = DEFAULT_ERR_CODE;
246 }
247 }
248 }
249 std::string fontFamily;
250 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
251 fontFamily = DEFAULT_ERR_CODE;
252 }
253 int32_t styleVal = 0;
254 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
255 styleVal = fontStyleArg->Int32Value(vm);
256 }
257 std::string fontSizeStr = size.ToString();
258 std::string fontInfo =
259 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
260 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedTextStyle(
261 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
262 return panda::JSValueRef::Undefined(vm);
263 }
264
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)265 ArkUINativeModuleValue TextPickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
266 {
267 EcmaVM* vm = runtimeCallInfo->GetVM();
268 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
269 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
270 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
271 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
272 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
273 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
274 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
275 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
276 Color textColor;
277 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
278 textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
279 }
280 CalcDimension size;
281 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
282 size = Dimension(DEFAULT_NEGATIVE_NUM);
283 } else {
284 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
285 size = Dimension(DEFAULT_NEGATIVE_NUM);
286 }
287 }
288 std::string weight = DEFAULT_ERR_CODE;
289 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
290 if (fontWeightArg->IsNumber()) {
291 weight = std::to_string(fontWeightArg->Int32Value(vm));
292 } else {
293 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
294 weight = DEFAULT_ERR_CODE;
295 }
296 }
297 }
298 std::string fontFamily;
299 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
300 fontFamily = DEFAULT_ERR_CODE;
301 }
302 int32_t styleVal = 0;
303 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
304 styleVal = fontStyleArg->Int32Value(vm);
305 }
306 std::string fontSizeStr = size.ToString();
307 std::string fontInfo =
308 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
309 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisappearTextStyle(
310 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
311 return panda::JSValueRef::Undefined(vm);
312 }
313
SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)314 ArkUINativeModuleValue TextPickerBridge::SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
315 {
316 EcmaVM* vm = runtimeCallInfo->GetVM();
317 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
318 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
319 Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
320 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
321
322 CalcDimension height;
323 if (itemHeightValue->IsNumber() || itemHeightValue->IsString(vm)) {
324 if (!ArkTSUtils::ParseJsDimensionFp(vm, itemHeightValue, height)) {
325 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
326 return panda::JSValueRef::Undefined(vm);
327 }
328 }
329
330 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultPickerItemHeight(
331 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
332
333 return panda::JSValueRef::Undefined(vm);
334 }
335
ResetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)336 ArkUINativeModuleValue TextPickerBridge::ResetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
337 {
338 EcmaVM* vm = runtimeCallInfo->GetVM();
339 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
340 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
341 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
342 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerCanLoop(nativeNode);
343 return panda::JSValueRef::Undefined(vm);
344 }
345
ResetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)346 ArkUINativeModuleValue TextPickerBridge::ResetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
347 {
348 EcmaVM* vm = runtimeCallInfo->GetVM();
349 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
350 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
351 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
352 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
353 return panda::JSValueRef::Undefined(vm);
354 }
355
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)356 ArkUINativeModuleValue TextPickerBridge::ResetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
357 {
358 EcmaVM* vm = runtimeCallInfo->GetVM();
359 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
360 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
361 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
362 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerTextStyle(nativeNode);
363 return panda::JSValueRef::Undefined(vm);
364 }
365
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)366 ArkUINativeModuleValue TextPickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
367 {
368 EcmaVM* vm = runtimeCallInfo->GetVM();
369 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
370 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
371 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
372 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedTextStyle(nativeNode);
373 return panda::JSValueRef::Undefined(vm);
374 }
375
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)376 ArkUINativeModuleValue TextPickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
377 {
378 EcmaVM* vm = runtimeCallInfo->GetVM();
379 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
380 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
381 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
382 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisappearTextStyle(nativeNode);
383 return panda::JSValueRef::Undefined(vm);
384 }
385
ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)386 ArkUINativeModuleValue TextPickerBridge::ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
387 {
388 EcmaVM* vm = runtimeCallInfo->GetVM();
389 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
390 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
391 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
392 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
393 return panda::JSValueRef::Undefined(vm);
394 }
395
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)396 ArkUINativeModuleValue TextPickerBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
397 {
398 EcmaVM* vm = runtimeCallInfo->GetVM();
399 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
400 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
401 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
402 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(STROKE_WIDTH_INDEX);
403 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(COLOR_INDEX);
404 Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(START_MARGIN_INDEX);
405 Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(END_MARGIN_INDEX);
406 CalcDimension dividerStrokeWidth;
407 CalcDimension dividerStartMargin;
408 CalcDimension dividerEndMargin;
409 Color colorObj;
410 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
411 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
412 auto context = frameNode->GetContext();
413 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
414 auto themeManager = context->GetThemeManager();
415 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
416 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
417 CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
418 if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth)) {
419 if (pickerTheme) {
420 dividerStrokeWidth = pickerTheme->GetDividerThickness();
421 } else {
422 dividerStrokeWidth = 0.0_vp;
423 }
424 }
425 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
426 if (pickerTheme) {
427 colorObj = pickerTheme->GetDividerColor();
428 } else {
429 colorObj = Color::TRANSPARENT;
430 }
431 }
432 if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin)) {
433 dividerStartMargin = 0.0_vp;
434 }
435 if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin)) {
436 dividerEndMargin = 0.0_vp;
437 }
438 uint32_t size = ARG_GROUP_LENGTH;
439 ArkUI_Float32 values[size];
440 int32_t units[size];
441 PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
442 PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
443 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDivider(
444 nativeNode, colorObj.GetValue(), values, units, size);
445 return panda::JSValueRef::Undefined(vm);
446 }
447
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)448 ArkUINativeModuleValue TextPickerBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
449 {
450 EcmaVM* vm = runtimeCallInfo->GetVM();
451 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
452 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
453 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
454 Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
455 if (valueArg->IsNull()) {
456 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDividerNull(nativeNode);
457 } else {
458 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDivider(nativeNode);
459 }
460 return panda::JSValueRef::Undefined(vm);
461 }
462
SetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)463 ArkUINativeModuleValue TextPickerBridge::SetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
464 {
465 EcmaVM* vm = runtimeCallInfo->GetVM();
466 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
467 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
468 Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
469 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
470 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
471 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
472 auto context = frameNode->GetContext();
473 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
474 auto themeManager = context->GetThemeManager();
475 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
476 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
477 CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
478 CalcDimension height;
479 if (ArkTSUtils::ParseJsDimensionVpNG(vm, itemHeightValue, height, true)) {
480 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerGradientHeight(
481 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
482 } else {
483 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
484 }
485 return panda::JSValueRef::Undefined(vm);
486 }
487
ResetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)488 ArkUINativeModuleValue TextPickerBridge::ResetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
489 {
490 EcmaVM* vm = runtimeCallInfo->GetVM();
491 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
492 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
493 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
494 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
495 return panda::JSValueRef::Undefined(vm);
496 }
497
SetDisableTextStyleAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)498 ArkUINativeModuleValue TextPickerBridge::SetDisableTextStyleAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
499 {
500 EcmaVM* vm = runtimeCallInfo->GetVM();
501 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
502 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
503 Local<JSValueRef> disableTextStyleAnimationArg = runtimeCallInfo->GetCallArgRef(1);
504 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
505 bool disableTextStyleAnimation = false;
506 if (disableTextStyleAnimationArg->IsBoolean()) {
507 disableTextStyleAnimation = disableTextStyleAnimationArg->ToBoolean(vm)->Value();
508 }
509 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisableTextStyleAnimation(
510 nativeNode, disableTextStyleAnimation);
511 return panda::JSValueRef::Undefined(vm);
512 }
513
ResetDisableTextStyleAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)514 ArkUINativeModuleValue TextPickerBridge::ResetDisableTextStyleAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
515 {
516 EcmaVM* vm = runtimeCallInfo->GetVM();
517 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
518 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
519 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
520 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisableTextStyleAnimation(nativeNode);
521 return panda::JSValueRef::Undefined(vm);
522 }
523
SetDefaultTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)524 ArkUINativeModuleValue TextPickerBridge::SetDefaultTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
525 {
526 EcmaVM* vm = runtimeCallInfo->GetVM();
527 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
528 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
529 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
530 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
531 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
532 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
533 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
534 Local<JSValueRef> minFontSizeArg = runtimeCallInfo->GetCallArgRef(6); // text minFontSize
535 Local<JSValueRef> maxFontSizeArg = runtimeCallInfo->GetCallArgRef(7); // text maxFontSize
536 Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(8);
537 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
538 Color textColor;
539 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
540 textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
541 }
542 CalcDimension size;
543 ParseFontSize(vm, fontSizeArg, size);
544 std::string weight = DEFAULT_ERR_CODE;
545 ParseFontWeight(vm, fontWeightArg, weight);
546 std::string fontFamily;
547 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
548 fontFamily = DEFAULT_ERR_CODE;
549 }
550 int32_t styleVal = 0;
551 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined() && fontStyleArg->IsNumber()) {
552 styleVal = fontStyleArg->Int32Value(vm);
553 }
554 CalcDimension minSize;
555 ParseFontSize(vm, minFontSizeArg, minSize);
556 CalcDimension maxSize;
557 ParseFontSize(vm, maxFontSizeArg, maxSize);
558 int32_t overflowVal = 0;
559 if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
560 overflowVal = overflowArg->Int32Value(vm);
561 }
562 std::string fontInfo =
563 StringUtils::FormatString(FORMAT_FONT.c_str(), size.ToString().c_str(), weight.c_str(), fontFamily.c_str());
564 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultTextStyle(
565 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal, minSize.ToString().c_str(),
566 maxSize.ToString().c_str(), overflowVal);
567 return panda::JSValueRef::Undefined(vm);
568 }
569
ResetDefaultTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)570 ArkUINativeModuleValue TextPickerBridge::ResetDefaultTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
571 {
572 EcmaVM* vm = runtimeCallInfo->GetVM();
573 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
574 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
575 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
576 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultTextStyle(nativeNode);
577 return panda::JSValueRef::Undefined(vm);
578 }
579
SetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)580 ArkUINativeModuleValue TextPickerBridge::SetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
581 {
582 EcmaVM* vm = runtimeCallInfo->GetVM();
583 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
584 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // framenode
585 Local<JSValueRef> enableHapticFeedbackArg = runtimeCallInfo->GetCallArgRef(1); // isEnableHapticFeedback
586 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
587 CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
588 auto modifiers = GetArkUINodeModifiers();
589 CHECK_NULL_RETURN(modifiers, panda::NativePointerRef::New(vm, nullptr));
590 auto textPickerModifier = modifiers->getTextPickerModifier();
591 CHECK_NULL_RETURN(textPickerModifier, panda::NativePointerRef::New(vm, nullptr));
592 if (enableHapticFeedbackArg->IsBoolean()) {
593 bool value = enableHapticFeedbackArg->ToBoolean(vm)->Value();
594 textPickerModifier->setTextPickerEnableHapticFeedback(nativeNode, value);
595 } else {
596 textPickerModifier->resetTextPickerEnableHapticFeedback(nativeNode);
597 }
598 return panda::JSValueRef::Undefined(vm);
599 }
600
ResetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)601 ArkUINativeModuleValue TextPickerBridge::ResetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
602 {
603 EcmaVM* vm = runtimeCallInfo->GetVM();
604 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
605 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // framenode
606 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
607 CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
608 auto modifiers = GetArkUINodeModifiers();
609 CHECK_NULL_RETURN(modifiers, panda::NativePointerRef::New(vm, nullptr));
610 auto textPickerModifier = modifiers->getTextPickerModifier();
611 CHECK_NULL_RETURN(textPickerModifier, panda::NativePointerRef::New(vm, nullptr));
612 textPickerModifier->resetTextPickerEnableHapticFeedback(nativeNode);
613 return panda::JSValueRef::Undefined(vm);
614 }
615
SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)616 ArkUINativeModuleValue TextPickerBridge::SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
617 {
618 EcmaVM* vm = runtimeCallInfo->GetVM();
619 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
620 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
621 Local<JSValueRef> crownSensitivityArg = runtimeCallInfo->GetCallArgRef(NUM_1);
622 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
623 int32_t crownSensitivity = OHOS::Ace::NG::DEFAULT_CROWNSENSITIVITY;
624 if (crownSensitivityArg->IsNumber()) {
625 crownSensitivity = crownSensitivityArg->ToNumber(vm)->Value();
626 }
627 auto modifier = GetArkUINodeModifiers();
628 CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
629 modifier->getTextPickerModifier()->setTextPickerDigitalCrownSensitivity(nativeNode, crownSensitivity);
630 return panda::JSValueRef::Undefined(vm);
631 }
632
ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)633 ArkUINativeModuleValue TextPickerBridge::ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
634 {
635 EcmaVM* vm = runtimeCallInfo->GetVM();
636 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
637 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
638 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
639 auto modifier = GetArkUINodeModifiers();
640 CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
641 modifier->getTextPickerModifier()->resetTextPickerDigitalCrownSensitivity(nativeNode);
642 return panda::JSValueRef::Undefined(vm);
643 }
644 template<typename T>
StringToStringValueWithVM(const EcmaVM * vm,T val)645 panda::Local<panda::JSValueRef> StringToStringValueWithVM(const EcmaVM* vm, T val)
646 {
647 if constexpr (std::is_same_v<T, std::string>) {
648 return panda::StringRef::NewFromUtf8(vm, val.c_str());
649 } else if constexpr (std::is_same_v<T, const char*>) {
650 return panda::StringRef::NewFromUtf8(vm, val);
651 } else if constexpr (std::is_same_v<T, std::u16string>) {
652 return panda::StringRef::NewFromUtf16(vm, val.c_str());
653 }
654 return panda::JSValueRef::Undefined(vm);
655 }
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)656 ArkUINativeModuleValue TextPickerBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
657 {
658 EcmaVM* vm = runtimeCallInfo->GetVM();
659 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
660 int32_t argsNumber = runtimeCallInfo->GetArgsNumber();
661 if (argsNumber != NUM_2) {
662 return panda::JSValueRef::Undefined(vm);
663 }
664 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
665 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
666 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
667 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
668 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
669 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
670 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnChange(nativeNode);
671 return panda::JSValueRef::Undefined(vm);
672 }
673 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
674 std::function<void(const std::vector<std::string>&, const std::vector<double>&)> callback =
675 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
676 const std::vector<std::string>& value, const std::vector<double>& index) {
677 panda::LocalScope pandaScope(vm);
678 panda::TryCatch trycatch(vm);
679 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
680 if (value.size() == NUM_1 && index.size() == NUM_1) {
681 panda::Local<panda::NumberRef> paramIndex = panda::NumberRef::New(vm, index[NUM_0]);
682 panda::Local<panda::StringRef> paramVaule = StringToStringValueWithVM(vm, value[NUM_0].c_str());
683 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { paramVaule, paramIndex };
684 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
685 } else {
686 int32_t i = NUM_0;
687 int32_t j = NUM_0;
688 auto valueArray = panda::ArrayRef::New(vm);
689 auto indexArray = panda::ArrayRef::New(vm);
690 for (const double& it : index) {
691 panda::Local<panda::NumberRef> item = panda::NumberRef::New(vm, it);
692 panda::ArrayRef::SetValueAt(vm, indexArray, i++, item);
693 }
694 for (const std::string& str : value) {
695 panda::Local<panda::StringRef> item = StringToStringValueWithVM(vm, str.c_str());
696 panda::ArrayRef::SetValueAt(vm, valueArray, j++, item);
697 }
698 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { valueArray, indexArray };
699 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
700 }
701 };
702 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerOnChange(
703 nativeNode, reinterpret_cast<void*>(&callback));
704 return panda::JSValueRef::Undefined(vm);
705 }
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)706 ArkUINativeModuleValue TextPickerBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
707 {
708 EcmaVM* vm = runtimeCallInfo->GetVM();
709 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
710 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
711 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
712 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnChange(nativeNode);
713 return panda::JSValueRef::Undefined(vm);
714 }
SetOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)715 ArkUINativeModuleValue TextPickerBridge::SetOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
716 {
717 EcmaVM* vm = runtimeCallInfo->GetVM();
718 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
719 int32_t argsNumber = runtimeCallInfo->GetArgsNumber();
720 if (argsNumber != NUM_2) {
721 return panda::JSValueRef::Undefined(vm);
722 }
723 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
724 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
725 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
726 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
727 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
728 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
729 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnScrollStop(nativeNode);
730 return panda::JSValueRef::Undefined(vm);
731 }
732 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
733 std::function<void(const std::vector<std::string>&, const std::vector<double>&)> callback =
734 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
735 const std::vector<std::string>& value, const std::vector<double>& index) {
736 panda::LocalScope pandaScope(vm);
737 panda::TryCatch trycatch(vm);
738 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
739 if (value.size() == NUM_1 && index.size() == NUM_1) {
740 panda::Local<panda::NumberRef> paramIndex = panda::NumberRef::New(vm, index[NUM_0]);
741 panda::Local<panda::StringRef> paramVaule = StringToStringValueWithVM(vm, value[NUM_0].c_str());
742 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { paramVaule, paramIndex };
743 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
744 } else {
745 int32_t i = NUM_0;
746 int32_t j = NUM_0;
747 auto valueArray = panda::ArrayRef::New(vm);
748 auto indexArray = panda::ArrayRef::New(vm);
749 for (const double& it : index) {
750 panda::Local<panda::NumberRef> item = panda::NumberRef::New(vm, it);
751 panda::ArrayRef::SetValueAt(vm, indexArray, i++, item);
752 }
753 for (const std::string& str : value) {
754 panda::Local<panda::StringRef> item = StringToStringValueWithVM(vm, str.c_str());
755 panda::ArrayRef::SetValueAt(vm, valueArray, j++, item);
756 }
757 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { valueArray, indexArray };
758 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
759 }
760 };
761 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerOnScrollStop(
762 nativeNode, reinterpret_cast<void*>(&callback));
763 return panda::JSValueRef::Undefined(vm);
764 }
ResetOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)765 ArkUINativeModuleValue TextPickerBridge::ResetOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
766 {
767 EcmaVM* vm = runtimeCallInfo->GetVM();
768 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
769 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
770 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
771 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnScrollStop(nativeNode);
772 return panda::JSValueRef::Undefined(vm);
773 }
774 } // namespace OHOS::Ace::NG
775