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
21 namespace OHOS::Ace::NG {
22 namespace {
23 const std::string FORMAT_FONT = "%s|%s|%s";
24 const std::string DEFAULT_ERR_CODE = "-1";
25 const int32_t DEFAULT_NEGATIVE_NUM = -1;
26 constexpr uint32_t DEFAULT_TIME_PICKER_TEXT_COLOR = 0xFF182431;
27 constexpr uint32_t DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR = 0xFF007DFF;
28
29 constexpr int32_t NODE_INDEX = 0;
30 constexpr int32_t STROKE_WIDTH_INDEX = 1;
31 constexpr int32_t COLOR_INDEX = 2;
32 constexpr int32_t START_MARGIN_INDEX = 3;
33 constexpr int32_t END_MARGIN_INDEX = 4;
34
35 constexpr int32_t ARG_GROUP_LENGTH = 3;
ParseDividerDimension(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & valueDim)36 bool ParseDividerDimension(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& valueDim)
37 {
38 return !ArkTSUtils::ParseJsDimensionVpNG(vm, value, valueDim, false) || LessNotEqual(valueDim.Value(), 0.0f) ||
39 (valueDim.Unit() != DimensionUnit::PX && valueDim.Unit() != DimensionUnit::VP);
40 }
41
PopulateValues(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,ArkUI_Float32 values[],uint32_t size)42 void PopulateValues(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
43 const CalcDimension& dividerEndMargin, ArkUI_Float32 values[], uint32_t size)
44 {
45 values[NODE_INDEX] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
46 values[STROKE_WIDTH_INDEX] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
47 values[COLOR_INDEX] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
48 }
49
PopulateUnits(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,int32_t units[],uint32_t size)50 void PopulateUnits(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
51 const CalcDimension& dividerEndMargin, int32_t units[], uint32_t size)
52 {
53 units[NODE_INDEX] = static_cast<int32_t>(dividerStrokeWidth.Unit());
54 units[STROKE_WIDTH_INDEX] = static_cast<int32_t>(dividerStartMargin.Unit());
55 units[COLOR_INDEX] = static_cast<int32_t>(dividerEndMargin.Unit());
56 }
57
ParseFontSize(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & dimen)58 void ParseFontSize(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen)
59 {
60 if (value->IsNull() || value->IsUndefined()) {
61 dimen = Dimension(DEFAULT_NEGATIVE_NUM);
62 } else {
63 if (!ArkTSUtils::ParseJsDimensionNG(vm, value, dimen, DimensionUnit::FP, false)) {
64 dimen = Dimension(DEFAULT_NEGATIVE_NUM);
65 }
66 }
67 }
68
ParseFontWeight(const EcmaVM * vm,const Local<JSValueRef> & value,std::string & weight)69 void ParseFontWeight(const EcmaVM* vm, const Local<JSValueRef>& value, std::string& weight)
70 {
71 if (!value->IsNull() && !value->IsUndefined()) {
72 if (value->IsNumber()) {
73 weight = std::to_string(value->Int32Value(vm));
74 } else {
75 if (!ArkTSUtils::ParseJsString(vm, value, weight) || weight.empty()) {
76 weight = DEFAULT_ERR_CODE;
77 }
78 }
79 }
80 }
81 } // namespace
82
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)83 ArkUINativeModuleValue TextPickerBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
84 {
85 EcmaVM* vm = runtimeCallInfo->GetVM();
86 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
87 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
88 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
89 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
90 CommonBridge::SetBackgroundColor(runtimeCallInfo);
91 Color color;
92 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
93 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
94 } else {
95 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerBackgroundColor(nativeNode, color.GetValue());
96 }
97 return panda::JSValueRef::Undefined(vm);
98 }
99
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)100 ArkUINativeModuleValue TextPickerBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
101 {
102 EcmaVM* vm = runtimeCallInfo->GetVM();
103 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
104 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
105 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
106 CommonBridge::ResetBackgroundColor(runtimeCallInfo);
107 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
108 return panda::JSValueRef::Undefined(vm);
109 }
110
SetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)111 ArkUINativeModuleValue TextPickerBridge::SetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
112 {
113 EcmaVM* vm = runtimeCallInfo->GetVM();
114 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
115 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
116 Local<JSValueRef> canLoopArg = runtimeCallInfo->GetCallArgRef(1);
117 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
118 bool canLoop = true;
119 if (canLoopArg->IsBoolean()) {
120 canLoop = canLoopArg->ToBoolean(vm)->Value();
121 }
122 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerCanLoop(nativeNode, canLoop);
123 return panda::JSValueRef::Undefined(vm);
124 }
125
SetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)126 ArkUINativeModuleValue TextPickerBridge::SetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
127 {
128 EcmaVM* vm = runtimeCallInfo->GetVM();
129 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
130 Local<JSValueRef> indexArg = runtimeCallInfo->GetCallArgRef(1);
131 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
132 std::vector<uint32_t> selectedValues;
133
134 if (indexArg->IsArray(vm)) {
135 if (!ArkTSUtils::ParseJsIntegerArray(vm, indexArg, selectedValues)) {
136 selectedValues.clear();
137 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
138 return panda::JSValueRef::Undefined(vm);
139 }
140 if (selectedValues.size() > 0) {
141 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
142 nativeNode, selectedValues.data(), selectedValues.size());
143 } else {
144 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
145 }
146 } else {
147 uint32_t selectedValue = 0;
148 if (indexArg->IsNumber()) {
149 selectedValue = indexArg->Uint32Value(vm);
150 selectedValues.emplace_back(selectedValue);
151 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
152 nativeNode, selectedValues.data(), DEFAULT_NEGATIVE_NUM); // represent this is a number.
153 } else {
154 selectedValues.clear();
155 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
156 }
157 }
158 return panda::JSValueRef::Undefined(vm);
159 }
160
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)161 ArkUINativeModuleValue TextPickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
162 {
163 EcmaVM* vm = runtimeCallInfo->GetVM();
164 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
165 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
166 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
167 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
168 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
169 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
170 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
171 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
172 Color textColor;
173 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
174 textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
175 }
176 CalcDimension size;
177 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
178 size = Dimension(DEFAULT_NEGATIVE_NUM);
179 } else {
180 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
181 size = Dimension(DEFAULT_NEGATIVE_NUM);
182 }
183 }
184 std::string weight = DEFAULT_ERR_CODE;
185 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
186 if (fontWeightArg->IsNumber()) {
187 weight = std::to_string(fontWeightArg->Int32Value(vm));
188 } else {
189 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
190 weight = DEFAULT_ERR_CODE;
191 }
192 }
193 }
194 std::string fontFamily;
195 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
196 fontFamily = DEFAULT_ERR_CODE;
197 }
198 int32_t styleVal = 0;
199 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
200 styleVal = fontStyleArg->Int32Value(vm);
201 }
202 std::string fontSizeStr = size.ToString();
203 std::string fontInfo =
204 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
205 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerTextStyle(
206 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
207 return panda::JSValueRef::Undefined(vm);
208 }
209
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)210 ArkUINativeModuleValue TextPickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
211 {
212 EcmaVM* vm = runtimeCallInfo->GetVM();
213 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
214 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
215 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
216 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
217 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
218 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
219 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
220 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
221 Color textColor;
222 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
223 textColor.SetValue(DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR);
224 }
225 CalcDimension size;
226 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
227 size = Dimension(DEFAULT_NEGATIVE_NUM);
228 } else {
229 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
230 size = Dimension(DEFAULT_NEGATIVE_NUM);
231 }
232 }
233 std::string weight = DEFAULT_ERR_CODE;
234 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
235 if (fontWeightArg->IsNumber()) {
236 weight = std::to_string(fontWeightArg->Int32Value(vm));
237 } else {
238 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
239 weight = DEFAULT_ERR_CODE;
240 }
241 }
242 }
243 std::string fontFamily;
244 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
245 fontFamily = DEFAULT_ERR_CODE;
246 }
247 int32_t styleVal = 0;
248 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
249 styleVal = fontStyleArg->Int32Value(vm);
250 }
251 std::string fontSizeStr = size.ToString();
252 std::string fontInfo =
253 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
254 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedTextStyle(
255 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
256 return panda::JSValueRef::Undefined(vm);
257 }
258
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)259 ArkUINativeModuleValue TextPickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
260 {
261 EcmaVM* vm = runtimeCallInfo->GetVM();
262 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
263 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
264 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
265 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
266 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
267 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
268 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
269 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
270 Color textColor;
271 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
272 textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
273 }
274 CalcDimension size;
275 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
276 size = Dimension(DEFAULT_NEGATIVE_NUM);
277 } else {
278 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
279 size = Dimension(DEFAULT_NEGATIVE_NUM);
280 }
281 }
282 std::string weight = DEFAULT_ERR_CODE;
283 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
284 if (fontWeightArg->IsNumber()) {
285 weight = std::to_string(fontWeightArg->Int32Value(vm));
286 } else {
287 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
288 weight = DEFAULT_ERR_CODE;
289 }
290 }
291 }
292 std::string fontFamily;
293 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
294 fontFamily = DEFAULT_ERR_CODE;
295 }
296 int32_t styleVal = 0;
297 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
298 styleVal = fontStyleArg->Int32Value(vm);
299 }
300 std::string fontSizeStr = size.ToString();
301 std::string fontInfo =
302 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
303 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisappearTextStyle(
304 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
305 return panda::JSValueRef::Undefined(vm);
306 }
307
SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)308 ArkUINativeModuleValue TextPickerBridge::SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
309 {
310 EcmaVM* vm = runtimeCallInfo->GetVM();
311 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
312 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
313 Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
314 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
315
316 CalcDimension height;
317 if (itemHeightValue->IsNumber() || itemHeightValue->IsString(vm)) {
318 if (!ArkTSUtils::ParseJsDimensionFp(vm, itemHeightValue, height)) {
319 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
320 return panda::JSValueRef::Undefined(vm);
321 }
322 }
323
324 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultPickerItemHeight(
325 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
326
327 return panda::JSValueRef::Undefined(vm);
328 }
329
ResetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)330 ArkUINativeModuleValue TextPickerBridge::ResetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
331 {
332 EcmaVM* vm = runtimeCallInfo->GetVM();
333 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
334 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
335 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
336 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerCanLoop(nativeNode);
337 return panda::JSValueRef::Undefined(vm);
338 }
339
ResetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)340 ArkUINativeModuleValue TextPickerBridge::ResetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
341 {
342 EcmaVM* vm = runtimeCallInfo->GetVM();
343 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
344 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
345 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
346 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
347 return panda::JSValueRef::Undefined(vm);
348 }
349
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)350 ArkUINativeModuleValue TextPickerBridge::ResetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
351 {
352 EcmaVM* vm = runtimeCallInfo->GetVM();
353 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
354 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
355 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
356 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerTextStyle(nativeNode);
357 return panda::JSValueRef::Undefined(vm);
358 }
359
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)360 ArkUINativeModuleValue TextPickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
361 {
362 EcmaVM* vm = runtimeCallInfo->GetVM();
363 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
364 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
365 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
366 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedTextStyle(nativeNode);
367 return panda::JSValueRef::Undefined(vm);
368 }
369
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)370 ArkUINativeModuleValue TextPickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
371 {
372 EcmaVM* vm = runtimeCallInfo->GetVM();
373 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
374 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
375 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
376 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisappearTextStyle(nativeNode);
377 return panda::JSValueRef::Undefined(vm);
378 }
379
ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)380 ArkUINativeModuleValue TextPickerBridge::ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
381 {
382 EcmaVM* vm = runtimeCallInfo->GetVM();
383 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
384 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
385 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
386 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
387 return panda::JSValueRef::Undefined(vm);
388 }
389
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)390 ArkUINativeModuleValue TextPickerBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
391 {
392 EcmaVM* vm = runtimeCallInfo->GetVM();
393 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
394 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
395 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
396 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(STROKE_WIDTH_INDEX);
397 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(COLOR_INDEX);
398 Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(START_MARGIN_INDEX);
399 Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(END_MARGIN_INDEX);
400 CalcDimension dividerStrokeWidth;
401 CalcDimension dividerStartMargin;
402 CalcDimension dividerEndMargin;
403 Color colorObj;
404 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
405 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
406 auto context = frameNode->GetContext();
407 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
408 auto themeManager = context->GetThemeManager();
409 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
410 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
411 CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
412 if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth)) {
413 if (pickerTheme) {
414 dividerStrokeWidth = pickerTheme->GetDividerThickness();
415 } else {
416 dividerStrokeWidth = 0.0_vp;
417 }
418 }
419 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
420 if (pickerTheme) {
421 colorObj = pickerTheme->GetDividerColor();
422 } else {
423 colorObj = Color::TRANSPARENT;
424 }
425 }
426 if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin)) {
427 dividerStartMargin = 0.0_vp;
428 }
429 if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin)) {
430 dividerEndMargin = 0.0_vp;
431 }
432 uint32_t size = ARG_GROUP_LENGTH;
433 ArkUI_Float32 values[size];
434 int32_t units[size];
435 PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
436 PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
437 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDivider(
438 nativeNode, colorObj.GetValue(), values, units, size);
439 return panda::JSValueRef::Undefined(vm);
440 }
441
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)442 ArkUINativeModuleValue TextPickerBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
443 {
444 EcmaVM* vm = runtimeCallInfo->GetVM();
445 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
446 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
447 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
448 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDivider(nativeNode);
449 return panda::JSValueRef::Undefined(vm);
450 }
451
SetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)452 ArkUINativeModuleValue TextPickerBridge::SetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
453 {
454 EcmaVM* vm = runtimeCallInfo->GetVM();
455 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
456 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
457 Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
458 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
459 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
460 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
461 auto context = frameNode->GetContext();
462 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
463 auto themeManager = context->GetThemeManager();
464 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
465 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
466 CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
467 CalcDimension height;
468 if (ArkTSUtils::ParseJsDimensionVpNG(vm, itemHeightValue, height, true)) {
469 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerGradientHeight(
470 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
471 } else {
472 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
473 }
474 return panda::JSValueRef::Undefined(vm);
475 }
476
ResetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)477 ArkUINativeModuleValue TextPickerBridge::ResetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
478 {
479 EcmaVM* vm = runtimeCallInfo->GetVM();
480 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
481 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
482 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
483 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
484 return panda::JSValueRef::Undefined(vm);
485 }
486
SetDisableTextStyleAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)487 ArkUINativeModuleValue TextPickerBridge::SetDisableTextStyleAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
488 {
489 EcmaVM* vm = runtimeCallInfo->GetVM();
490 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
491 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
492 Local<JSValueRef> disableTextStyleAnimationArg = runtimeCallInfo->GetCallArgRef(1);
493 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
494 bool disableTextStyleAnimation = false;
495 if (disableTextStyleAnimationArg->IsBoolean()) {
496 disableTextStyleAnimation = disableTextStyleAnimationArg->ToBoolean(vm)->Value();
497 }
498 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisableTextStyleAnimation(
499 nativeNode, disableTextStyleAnimation);
500 return panda::JSValueRef::Undefined(vm);
501 }
502
ResetDisableTextStyleAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)503 ArkUINativeModuleValue TextPickerBridge::ResetDisableTextStyleAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
504 {
505 EcmaVM* vm = runtimeCallInfo->GetVM();
506 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
507 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
508 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
509 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisableTextStyleAnimation(nativeNode);
510 return panda::JSValueRef::Undefined(vm);
511 }
512
SetDefaultTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)513 ArkUINativeModuleValue TextPickerBridge::SetDefaultTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
514 {
515 EcmaVM* vm = runtimeCallInfo->GetVM();
516 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
517 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
518 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
519 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
520 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
521 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
522 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
523 Local<JSValueRef> minFontSizeArg = runtimeCallInfo->GetCallArgRef(6); // text minFontSize
524 Local<JSValueRef> maxFontSizeArg = runtimeCallInfo->GetCallArgRef(7); // text maxFontSize
525 Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(8);
526 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
527 Color textColor;
528 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
529 textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
530 }
531 CalcDimension size;
532 ParseFontSize(vm, fontSizeArg, size);
533 std::string weight = DEFAULT_ERR_CODE;
534 ParseFontWeight(vm, fontWeightArg, weight);
535 std::string fontFamily;
536 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
537 fontFamily = DEFAULT_ERR_CODE;
538 }
539 int32_t styleVal = 0;
540 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined() && fontStyleArg->IsNumber()) {
541 styleVal = fontStyleArg->Int32Value(vm);
542 }
543 CalcDimension minSize;
544 ParseFontSize(vm, minFontSizeArg, minSize);
545 CalcDimension maxSize;
546 ParseFontSize(vm, maxFontSizeArg, maxSize);
547 int32_t overflowVal = 0;
548 if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
549 overflowVal = overflowArg->Int32Value(vm);
550 }
551 std::string fontInfo =
552 StringUtils::FormatString(FORMAT_FONT.c_str(), size.ToString().c_str(), weight.c_str(), fontFamily.c_str());
553 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultTextStyle(
554 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal, minSize.ToString().c_str(),
555 maxSize.ToString().c_str(), overflowVal);
556 return panda::JSValueRef::Undefined(vm);
557 }
558
ResetDefaultTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)559 ArkUINativeModuleValue TextPickerBridge::ResetDefaultTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
560 {
561 EcmaVM* vm = runtimeCallInfo->GetVM();
562 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
563 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
564 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
565 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultTextStyle(nativeNode);
566 return panda::JSValueRef::Undefined(vm);
567 }
568 } // namespace OHOS::Ace::NG
569
570