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 const int32_t DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_BORDER_RADIUS = 24;
28 constexpr uint32_t DEFAULT_TIME_PICKER_TEXT_COLOR = 0xFF182431;
29 constexpr uint32_t DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR = 0xFF0A59F7;
30 constexpr uint32_t DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_COLOR = 0x0C182431;
31
32 constexpr int32_t NODE_INDEX = 0;
33 constexpr int32_t STROKE_WIDTH_INDEX = 1;
34 constexpr int32_t COLOR_INDEX = 2;
35 constexpr int32_t START_MARGIN_INDEX = 3;
36 constexpr int32_t END_MARGIN_INDEX = 4;
37 constexpr int32_t NUM_1 = 1;
38 constexpr int32_t UNIT_VP = 1;
39
40 constexpr int32_t ARG_GROUP_LENGTH = 3;
41 constexpr int PARAM_ARR_LENGTH_2 = 2;
42 constexpr int NUM_0 = 0;
43 constexpr int NUM_2 = 2;
44 constexpr int VALUE_MAX_SIZE = 4;
45 constexpr int GETVALUE_MAX_SIZE = 5;
46
47 constexpr int32_t NODE_ARG_INDEX = 0;
48 constexpr int32_t COLOR_ARG_INDEX = 1;
49 constexpr int32_t FONT_SIZE_ARG_INDEX = 2;
50 constexpr int32_t FONT_WEIGHT_ARG_INDEX = 3;
51 constexpr int32_t FONT_FAMILY_ARG_INDEX = 4;
52 constexpr int32_t FONT_STYLE_ARG_INDEX = 5;
53 constexpr int32_t MIN_FONT_SIZE_ARG_INDEX = 6;
54 constexpr int32_t MAX_FONT_SIZE_ARG_INDEX = 7;
55 constexpr int32_t OVER_FLOW_ARG_INDEX = 8;
56
57 enum GetValueArrayIndex {
58 GETCOLOR,
59 GETTOPLEFT,
60 GETTOPRIGHT,
61 GETBOTTOMLEFT,
62 GETBOTTOMRIGHT,
63 };
64 enum ValueArrayIndex {
65 TOPLEFT,
66 TOPRIGHT,
67 BOTTOMLEFT,
68 BOTTOMRIGHT,
69 };
ParseDividerDimension(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & valueDim,RefPtr<ResourceObject> & resourceObject)70 bool ParseDividerDimension(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& valueDim,
71 RefPtr<ResourceObject>& resourceObject)
72 {
73 return !ArkTSUtils::ParseJsDimensionVpNG(vm, value, valueDim, resourceObject, false) ||
74 LessNotEqual(valueDim.Value(), 0.0f) ||
75 (valueDim.Unit() != DimensionUnit::PX && valueDim.Unit() != DimensionUnit::VP &&
76 valueDim.Unit() != DimensionUnit::LPX && valueDim.Unit() != DimensionUnit::FP);
77 }
78
PopulateValues(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,ArkUI_Float32 values[],uint32_t size)79 void PopulateValues(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
80 const CalcDimension& dividerEndMargin, ArkUI_Float32 values[], uint32_t size)
81 {
82 values[NODE_INDEX] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
83 values[STROKE_WIDTH_INDEX] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
84 values[COLOR_INDEX] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
85 }
86
PopulateUnits(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,int32_t units[],uint32_t size)87 void PopulateUnits(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
88 const CalcDimension& dividerEndMargin, int32_t units[], uint32_t size)
89 {
90 units[NODE_INDEX] = static_cast<int32_t>(dividerStrokeWidth.Unit());
91 units[STROKE_WIDTH_INDEX] = static_cast<int32_t>(dividerStartMargin.Unit());
92 units[COLOR_INDEX] = static_cast<int32_t>(dividerEndMargin.Unit());
93 }
94
ParseFontSize(const EcmaVM * vm,ArkUIRuntimeCallInfo * runtimeCallInfo,int32_t argIndex,RefPtr<ResourceObject> & fontSizeResObj)95 std::string ParseFontSize(const EcmaVM* vm, ArkUIRuntimeCallInfo* runtimeCallInfo, int32_t argIndex,
96 RefPtr<ResourceObject>& fontSizeResObj)
97 {
98 CalcDimension fontSizeData;
99 Local<JSValueRef> arg = runtimeCallInfo->GetCallArgRef(argIndex);
100 if (arg->IsNull() || arg->IsUndefined()) {
101 fontSizeData = Dimension(DEFAULT_NEGATIVE_NUM);
102 } else {
103 if (!ArkTSUtils::ParseJsDimensionNG(vm, arg, fontSizeData, DimensionUnit::FP, fontSizeResObj, false)) {
104 fontSizeData = Dimension(DEFAULT_NEGATIVE_NUM);
105 }
106 }
107 return fontSizeData.ToString();
108 }
109
ParseFontWeight(const EcmaVM * vm,const Local<JSValueRef> & value)110 std::string ParseFontWeight(const EcmaVM* vm, const Local<JSValueRef>& value)
111 {
112 std::string weight = DEFAULT_ERR_CODE;
113 if (!value->IsNull() && !value->IsUndefined()) {
114 if (value->IsNumber()) {
115 weight = std::to_string(value->Int32Value(vm));
116 } else {
117 if (!ArkTSUtils::ParseJsString(vm, value, weight) || weight.empty()) {
118 weight = DEFAULT_ERR_CODE;
119 }
120 }
121 }
122 return weight;
123 }
124
ParseFontFamily(const EcmaVM * vm,const Local<JSValueRef> & fontFamilyArg,RefPtr<ResourceObject> & fontFamilyResObj)125 std::string ParseFontFamily(const EcmaVM* vm, const Local<JSValueRef>& fontFamilyArg,
126 RefPtr<ResourceObject>& fontFamilyResObj)
127 {
128 std::string fontFamily;
129 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily, fontFamilyResObj) ||
130 fontFamily.empty()) {
131 fontFamily = DEFAULT_ERR_CODE;
132 }
133 return fontFamily;
134 }
135
ParseTextColor(const EcmaVM * vm,ArkUIRuntimeCallInfo * runtimeCallInfo,int32_t argIndex,RefPtr<ResourceObject> & textColorResObj,uint32_t defaultTextColor,ArkUINodeHandle nativeNode,int32_t & isSetByUser)136 Color ParseTextColor(const EcmaVM* vm, ArkUIRuntimeCallInfo* runtimeCallInfo, int32_t argIndex,
137 RefPtr<ResourceObject>& textColorResObj, uint32_t defaultTextColor,
138 ArkUINodeHandle nativeNode, int32_t& isSetByUser)
139 {
140 Color textColor;
141 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(argIndex);
142
143 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
144 if (colorArg->IsNull() || colorArg->IsUndefined() ||
145 !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor, textColorResObj, nodeInfo)) {
146 textColor.SetValue(defaultTextColor);
147 isSetByUser = false;
148 } else {
149 isSetByUser = true;
150 }
151 return textColor;
152 }
153
ParseSelectedBackgroundStyleRadius(const EcmaVM * vm,ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Bool * isHasValue,ArkUIPickerBackgroundStyleStruct & backgroundStyleStruct,RefPtr<ResourceObject> * radiusResObjs)154 void ParseSelectedBackgroundStyleRadius(const EcmaVM* vm, ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Bool* isHasValue,
155 ArkUIPickerBackgroundStyleStruct& backgroundStyleStruct, RefPtr<ResourceObject>* radiusResObjs)
156 {
157 ArkUI_Float32 value[VALUE_MAX_SIZE] = {
158 DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_BORDER_RADIUS, DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_BORDER_RADIUS,
159 DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_BORDER_RADIUS, DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_BORDER_RADIUS};
160 ArkUI_Int32 unit[VALUE_MAX_SIZE] = {UNIT_VP, UNIT_VP, UNIT_VP, UNIT_VP};
161 auto isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
162 CalcDimension calcDimension;
163 RefPtr<ResourceObject> tmpResObj;
164 for (int i = 0; i < VALUE_MAX_SIZE; i++) {
165 if (ArkTSUtils::ParseJsLengthMetrics(vm, runtimeCallInfo->GetCallArgRef(i + NUM_2), calcDimension, tmpResObj) &&
166 !calcDimension.IsNegative()) {
167 isHasValue[i + COLOR_ARG_INDEX] = true;
168 value[i] = calcDimension.Value();
169 unit[i] = static_cast<int>(calcDimension.Unit());
170 radiusResObjs[i] = tmpResObj;
171 }
172 if (ArkTSUtils::ParseJsDimensionVp(vm, runtimeCallInfo->GetCallArgRef(i + NUM_2), calcDimension, tmpResObj) &&
173 !calcDimension.IsNegative()) {
174 isHasValue[i + COLOR_ARG_INDEX] = true;
175 value[i] = calcDimension.Value();
176 unit[i] = static_cast<int>(calcDimension.Unit());
177 radiusResObjs[i] = tmpResObj;
178 }
179 }
180 if (isRightToLeft && (value[TOPLEFT] != value[BOTTOMLEFT] || value[TOPRIGHT] != value[BOTTOMRIGHT]) &&
181 (unit[TOPLEFT] != unit[BOTTOMLEFT] || unit[TOPRIGHT] != unit[BOTTOMRIGHT])) {
182 std::swap(value[TOPLEFT], value[BOTTOMLEFT]);
183 std::swap(value[TOPRIGHT], value[BOTTOMRIGHT]);
184 std::swap(unit[TOPLEFT], unit[BOTTOMLEFT]);
185 std::swap(unit[TOPRIGHT], unit[BOTTOMRIGHT]);
186 std::swap(isHasValue[GETTOPLEFT], isHasValue[GETTOPRIGHT]);
187 std::swap(isHasValue[GETBOTTOMLEFT], isHasValue[GETBOTTOMRIGHT]);
188 std::swap(radiusResObjs[TOPLEFT], radiusResObjs[BOTTOMLEFT]);
189 std::swap(radiusResObjs[TOPRIGHT], radiusResObjs[BOTTOMRIGHT]);
190 }
191 backgroundStyleStruct.values = value;
192 backgroundStyleStruct.units = unit;
193 backgroundStyleStruct.length = VALUE_MAX_SIZE;
194 }
195
196 } // namespace
197
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)198 ArkUINativeModuleValue TextPickerBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
199 {
200 EcmaVM* vm = runtimeCallInfo->GetVM();
201 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
202 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
203 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
204 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
205 CommonBridge::SetBackgroundColor(runtimeCallInfo);
206 Color color;
207 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
208 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
209 } else {
210 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerBackgroundColor(nativeNode, color.GetValue());
211 }
212 return panda::JSValueRef::Undefined(vm);
213 }
214
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)215 ArkUINativeModuleValue TextPickerBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
216 {
217 EcmaVM* vm = runtimeCallInfo->GetVM();
218 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
219 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
220 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
221 CommonBridge::ResetBackgroundColor(runtimeCallInfo);
222 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
223 return panda::JSValueRef::Undefined(vm);
224 }
225
SetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)226 ArkUINativeModuleValue TextPickerBridge::SetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
227 {
228 EcmaVM* vm = runtimeCallInfo->GetVM();
229 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
230 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
231 Local<JSValueRef> canLoopArg = runtimeCallInfo->GetCallArgRef(1);
232 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
233 bool canLoop = true;
234 if (canLoopArg->IsBoolean()) {
235 canLoop = canLoopArg->ToBoolean(vm)->Value();
236 }
237 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerCanLoop(nativeNode, canLoop);
238 return panda::JSValueRef::Undefined(vm);
239 }
240
SetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)241 ArkUINativeModuleValue TextPickerBridge::SetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
242 {
243 EcmaVM* vm = runtimeCallInfo->GetVM();
244 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
245 Local<JSValueRef> indexArg = runtimeCallInfo->GetCallArgRef(1);
246 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
247 std::vector<uint32_t> selectedValues;
248
249 if (indexArg->IsArray(vm)) {
250 if (!ArkTSUtils::ParseJsIntegerArray(vm, indexArg, selectedValues)) {
251 selectedValues.clear();
252 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
253 return panda::JSValueRef::Undefined(vm);
254 }
255 if (selectedValues.size() > 0) {
256 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
257 nativeNode, selectedValues.data(), selectedValues.size());
258 } else {
259 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
260 }
261 } else {
262 uint32_t selectedValue = 0;
263 if (indexArg->IsNumber()) {
264 selectedValue = indexArg->Uint32Value(vm);
265 selectedValues.emplace_back(selectedValue);
266 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
267 nativeNode, selectedValues.data(), DEFAULT_NEGATIVE_NUM); // represent this is a number.
268 } else {
269 selectedValues.clear();
270 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
271 }
272 }
273 return panda::JSValueRef::Undefined(vm);
274 }
275
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)276 ArkUINativeModuleValue TextPickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
277 {
278 EcmaVM* vm = runtimeCallInfo->GetVM();
279 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
280 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_ARG_INDEX);
281 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(FONT_WEIGHT_ARG_INDEX);
282 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(FONT_FAMILY_ARG_INDEX);
283 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(FONT_STYLE_ARG_INDEX);
284 Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(OVER_FLOW_ARG_INDEX);
285 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
286
287 ArkUIPickerTextStyleStruct textStyleStruct;
288 RefPtr<ResourceObject> textColorResObj;
289 Color textColor = ParseTextColor(vm, runtimeCallInfo, COLOR_ARG_INDEX, textColorResObj,
290 DEFAULT_TIME_PICKER_TEXT_COLOR, nativeNode, textStyleStruct.textColorSetByUser);
291
292 RefPtr<ResourceObject> fontSizeResObj;
293 std::string fontSizeStr = ParseFontSize(vm, runtimeCallInfo, FONT_SIZE_ARG_INDEX, fontSizeResObj);
294
295 std::string weight = ParseFontWeight(vm, fontWeightArg);
296
297 std::string fontFamily;
298 RefPtr<ResourceObject> fontFamilyResObj;
299 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily, fontFamilyResObj) ||
300 fontFamily.empty()) {
301 fontFamily = DEFAULT_ERR_CODE;
302 }
303
304 int32_t styleVal = 0;
305 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
306 styleVal = fontStyleArg->Int32Value(vm);
307 }
308
309 RefPtr<ResourceObject> minFontSizeResObj;
310 std::string minSize = ParseFontSize(vm, runtimeCallInfo, MIN_FONT_SIZE_ARG_INDEX, minFontSizeResObj);
311
312 RefPtr<ResourceObject> maxFontSizeResObj;
313 std::string maxSize = ParseFontSize(vm, runtimeCallInfo, MAX_FONT_SIZE_ARG_INDEX, maxFontSizeResObj);
314
315 int32_t overflowVal = 0;
316 if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
317 overflowVal = overflowArg->Int32Value(vm);
318 }
319 std::string fontInfo =
320 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
321
322 textStyleStruct.textColor = textColor.GetValue();
323 textStyleStruct.fontStyle = styleVal;
324 textStyleStruct.textOverflow = overflowVal;
325 textStyleStruct.fontInfo = fontInfo.c_str();
326 textStyleStruct.minFontSize = minSize.c_str();
327 textStyleStruct.maxFontSize = maxSize.c_str();
328 textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
329 textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
330 textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
331 textStyleStruct.minFontSizeRawPtr = AceType::RawPtr(minFontSizeResObj);
332 textStyleStruct.maxFontSizeRawPtr = AceType::RawPtr(maxFontSizeResObj);
333 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerTextStyleWithResObj(nativeNode, &textStyleStruct);
334 return panda::JSValueRef::Undefined(vm);
335 }
336
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)337 ArkUINativeModuleValue TextPickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
338 {
339 EcmaVM* vm = runtimeCallInfo->GetVM();
340 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
341 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_ARG_INDEX);
342 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(FONT_WEIGHT_ARG_INDEX);
343 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(FONT_FAMILY_ARG_INDEX);
344 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(FONT_STYLE_ARG_INDEX);
345 Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(OVER_FLOW_ARG_INDEX);
346 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
347
348 ArkUIPickerTextStyleStruct textStyleStruct;
349 RefPtr<ResourceObject> textColorResObj;
350 Color textColor = ParseTextColor(vm, runtimeCallInfo, COLOR_ARG_INDEX, textColorResObj,
351 DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR, nativeNode, textStyleStruct.textColorSetByUser);
352
353 RefPtr<ResourceObject> fontSizeResObj;
354 std::string fontSizeStr = ParseFontSize(vm, runtimeCallInfo, FONT_SIZE_ARG_INDEX, fontSizeResObj);
355
356 std::string weight = ParseFontWeight(vm, fontWeightArg);
357
358 std::string fontFamily;
359 RefPtr<ResourceObject> fontFamilyResObj;
360 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily, fontFamilyResObj) ||
361 fontFamily.empty()) {
362 fontFamily = DEFAULT_ERR_CODE;
363 }
364 int32_t styleVal = 0;
365 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
366 styleVal = fontStyleArg->Int32Value(vm);
367 }
368
369 RefPtr<ResourceObject> minFontSizeResObj;
370 std::string minSize = ParseFontSize(vm, runtimeCallInfo, MIN_FONT_SIZE_ARG_INDEX, minFontSizeResObj);
371
372 RefPtr<ResourceObject> maxFontSizeResObj;
373 std::string maxSize = ParseFontSize(vm, runtimeCallInfo, MAX_FONT_SIZE_ARG_INDEX, maxFontSizeResObj);
374
375 int32_t overflowVal = 0;
376 if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
377 overflowVal = overflowArg->Int32Value(vm);
378 }
379 std::string fontInfo =
380 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
381
382 textStyleStruct.textColor = textColor.GetValue();
383 textStyleStruct.fontStyle = styleVal;
384 textStyleStruct.textOverflow = overflowVal;
385 textStyleStruct.fontInfo = fontInfo.c_str();
386 textStyleStruct.minFontSize = minSize.c_str();
387 textStyleStruct.maxFontSize = maxSize.c_str();
388 textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
389 textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
390 textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
391 textStyleStruct.minFontSizeRawPtr = AceType::RawPtr(minFontSizeResObj);
392 textStyleStruct.maxFontSizeRawPtr = AceType::RawPtr(maxFontSizeResObj);
393 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedTextStyleWithResObj(nativeNode,
394 &textStyleStruct);
395 return panda::JSValueRef::Undefined(vm);
396 }
397
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)398 ArkUINativeModuleValue TextPickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
399 {
400 EcmaVM* vm = runtimeCallInfo->GetVM();
401 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
402 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_ARG_INDEX);
403 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(FONT_WEIGHT_ARG_INDEX);
404 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(FONT_FAMILY_ARG_INDEX);
405 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(FONT_STYLE_ARG_INDEX);
406 Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(OVER_FLOW_ARG_INDEX);
407 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
408
409 ArkUIPickerTextStyleStruct textStyleStruct;
410 RefPtr<ResourceObject> textColorResObj;
411 Color textColor = ParseTextColor(vm, runtimeCallInfo, COLOR_ARG_INDEX, textColorResObj,
412 DEFAULT_TIME_PICKER_TEXT_COLOR, nativeNode, textStyleStruct.textColorSetByUser);
413
414 RefPtr<ResourceObject> fontSizeResObj;
415 std::string fontSizeStr = ParseFontSize(vm, runtimeCallInfo, FONT_SIZE_ARG_INDEX, fontSizeResObj);
416
417 std::string weight = ParseFontWeight(vm, fontWeightArg);
418
419 std::string fontFamily;
420 RefPtr<ResourceObject> fontFamilyResObj;
421 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily, fontFamilyResObj) ||
422 fontFamily.empty()) {
423 fontFamily = DEFAULT_ERR_CODE;
424 }
425
426 int32_t styleVal = 0;
427 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
428 styleVal = fontStyleArg->Int32Value(vm);
429 }
430
431 RefPtr<ResourceObject> minFontSizeResObj;
432 std::string minSize = ParseFontSize(vm, runtimeCallInfo, MIN_FONT_SIZE_ARG_INDEX, minFontSizeResObj);
433
434 RefPtr<ResourceObject> maxFontSizeResObj;
435 std::string maxSize = ParseFontSize(vm, runtimeCallInfo, MAX_FONT_SIZE_ARG_INDEX, maxFontSizeResObj);
436
437 int32_t overflowVal = 0;
438 if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
439 overflowVal = overflowArg->Int32Value(vm);
440 }
441 std::string fontInfo =
442 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
443
444 textStyleStruct.textColor = textColor.GetValue();
445 textStyleStruct.fontStyle = styleVal;
446 textStyleStruct.textOverflow = overflowVal;
447 textStyleStruct.fontInfo = fontInfo.c_str();
448 textStyleStruct.minFontSize = minSize.c_str();
449 textStyleStruct.maxFontSize = maxSize.c_str();
450 textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
451 textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
452 textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
453 textStyleStruct.minFontSizeRawPtr = AceType::RawPtr(minFontSizeResObj);
454 textStyleStruct.maxFontSizeRawPtr = AceType::RawPtr(maxFontSizeResObj);
455 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisappearTextStyleWithResObj(nativeNode,
456 &textStyleStruct);
457 return panda::JSValueRef::Undefined(vm);
458 }
459
SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)460 ArkUINativeModuleValue TextPickerBridge::SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
461 {
462 EcmaVM* vm = runtimeCallInfo->GetVM();
463 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
464 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
465 Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
466 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
467
468 CalcDimension height;
469 if (itemHeightValue->IsNumber() || itemHeightValue->IsString(vm)) {
470 if (!ArkTSUtils::ParseJsDimensionFp(vm, itemHeightValue, height)) {
471 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
472 return panda::JSValueRef::Undefined(vm);
473 }
474 }
475
476 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultPickerItemHeight(
477 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
478
479 return panda::JSValueRef::Undefined(vm);
480 }
481
ResetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)482 ArkUINativeModuleValue TextPickerBridge::ResetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
483 {
484 EcmaVM* vm = runtimeCallInfo->GetVM();
485 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
486 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
487 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
488 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerCanLoop(nativeNode);
489 return panda::JSValueRef::Undefined(vm);
490 }
491
ResetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)492 ArkUINativeModuleValue TextPickerBridge::ResetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
493 {
494 EcmaVM* vm = runtimeCallInfo->GetVM();
495 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
496 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
497 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
498 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
499 return panda::JSValueRef::Undefined(vm);
500 }
501
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)502 ArkUINativeModuleValue TextPickerBridge::ResetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
503 {
504 EcmaVM* vm = runtimeCallInfo->GetVM();
505 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
506 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
507 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
508 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerTextStyle(nativeNode);
509 return panda::JSValueRef::Undefined(vm);
510 }
511
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)512 ArkUINativeModuleValue TextPickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
513 {
514 EcmaVM* vm = runtimeCallInfo->GetVM();
515 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
516 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
517 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
518 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedTextStyle(nativeNode);
519 return panda::JSValueRef::Undefined(vm);
520 }
521
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)522 ArkUINativeModuleValue TextPickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
523 {
524 EcmaVM* vm = runtimeCallInfo->GetVM();
525 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
526 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
527 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
528 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisappearTextStyle(nativeNode);
529 return panda::JSValueRef::Undefined(vm);
530 }
531
ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)532 ArkUINativeModuleValue TextPickerBridge::ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
533 {
534 EcmaVM* vm = runtimeCallInfo->GetVM();
535 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
536 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
537 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
538 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
539 return panda::JSValueRef::Undefined(vm);
540 }
541
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)542 ArkUINativeModuleValue TextPickerBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
543 {
544 EcmaVM* vm = runtimeCallInfo->GetVM();
545 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
546 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
547 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
548 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(STROKE_WIDTH_INDEX);
549 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(COLOR_INDEX);
550 Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(START_MARGIN_INDEX);
551 Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(END_MARGIN_INDEX);
552 CalcDimension dividerStrokeWidth;
553 CalcDimension dividerStartMargin;
554 CalcDimension dividerEndMargin;
555 Color colorObj;
556 RefPtr<ResourceObject> strokeWidthResObj;
557 RefPtr<ResourceObject> colorResObj;
558 RefPtr<ResourceObject> startMarginResObj;
559 RefPtr<ResourceObject> endMarginResObj;
560 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
561 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
562 auto context = frameNode->GetContext();
563 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
564 auto themeManager = context->GetThemeManager();
565 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
566 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
567 CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
568 if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth, strokeWidthResObj)) {
569 dividerStrokeWidth = pickerTheme ? pickerTheme->GetDividerThickness() : 0.0_vp;
570 }
571
572 ArkUI_Bool isDefaultColor = false;
573 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
574 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj, colorResObj, nodeInfo)) {
575 colorObj = pickerTheme ? pickerTheme->GetDividerColor() : Color::TRANSPARENT;
576 isDefaultColor = true;
577 }
578 if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin, startMarginResObj)) {
579 dividerStartMargin = 0.0_vp;
580 }
581 if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin, endMarginResObj)) {
582 dividerEndMargin = 0.0_vp;
583 }
584 uint32_t size = ARG_GROUP_LENGTH;
585 ArkUI_Float32 values[size];
586 int32_t units[size];
587 PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
588 PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
589
590 ArkUIPickerDividerResObjStruct dividerResObjStr;
591 dividerResObjStr.colorRawPtr = AceType::RawPtr(colorResObj);
592 dividerResObjStr.strokeWidthRawPtr = AceType::RawPtr(strokeWidthResObj);
593 dividerResObjStr.startMarginRawPtr = AceType::RawPtr(startMarginResObj);
594 dividerResObjStr.endMarginRawPtr = AceType::RawPtr(endMarginResObj);
595 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDividerWithResObj(
596 nativeNode, colorObj.GetValue(), values, units, size, ÷rResObjStr, isDefaultColor);
597 return panda::JSValueRef::Undefined(vm);
598 }
599
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)600 ArkUINativeModuleValue TextPickerBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
601 {
602 EcmaVM* vm = runtimeCallInfo->GetVM();
603 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
604 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
605 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
606 Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
607 if (valueArg->IsNull()) {
608 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDividerNull(nativeNode);
609 } else {
610 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDivider(nativeNode);
611 }
612 return panda::JSValueRef::Undefined(vm);
613 }
614
SetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)615 ArkUINativeModuleValue TextPickerBridge::SetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
616 {
617 EcmaVM* vm = runtimeCallInfo->GetVM();
618 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
619 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
620 Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
621 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
622 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
623 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
624 auto context = frameNode->GetContext();
625 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
626 auto themeManager = context->GetThemeManager();
627 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
628 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
629 CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
630 CalcDimension height;
631 RefPtr<ResourceObject> heightResObj;
632 if (ArkTSUtils::ParseJsDimensionVpNG(vm, itemHeightValue, height, heightResObj, true)) {
633 auto heightRawPtr = AceType::RawPtr(heightResObj);
634 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerGradientHeightWithResObj(
635 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightRawPtr);
636 } else {
637 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
638 }
639 return panda::JSValueRef::Undefined(vm);
640 }
641
ResetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)642 ArkUINativeModuleValue TextPickerBridge::ResetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
643 {
644 EcmaVM* vm = runtimeCallInfo->GetVM();
645 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
646 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
647 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
648 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
649 return panda::JSValueRef::Undefined(vm);
650 }
651
SetDisableTextStyleAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)652 ArkUINativeModuleValue TextPickerBridge::SetDisableTextStyleAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
653 {
654 EcmaVM* vm = runtimeCallInfo->GetVM();
655 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
656 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
657 Local<JSValueRef> disableTextStyleAnimationArg = runtimeCallInfo->GetCallArgRef(1);
658 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
659 bool disableTextStyleAnimation = false;
660 if (disableTextStyleAnimationArg->IsBoolean()) {
661 disableTextStyleAnimation = disableTextStyleAnimationArg->ToBoolean(vm)->Value();
662 }
663 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisableTextStyleAnimation(
664 nativeNode, disableTextStyleAnimation);
665 return panda::JSValueRef::Undefined(vm);
666 }
667
ResetDisableTextStyleAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)668 ArkUINativeModuleValue TextPickerBridge::ResetDisableTextStyleAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
669 {
670 EcmaVM* vm = runtimeCallInfo->GetVM();
671 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
672 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
673 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
674 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisableTextStyleAnimation(nativeNode);
675 return panda::JSValueRef::Undefined(vm);
676 }
677
SetDefaultTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)678 ArkUINativeModuleValue TextPickerBridge::SetDefaultTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
679 {
680 EcmaVM* vm = runtimeCallInfo->GetVM();
681 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
682 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_ARG_INDEX);
683 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(FONT_WEIGHT_ARG_INDEX);
684 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(FONT_FAMILY_ARG_INDEX);
685 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(FONT_STYLE_ARG_INDEX);
686 Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(OVER_FLOW_ARG_INDEX);
687 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
688
689 ArkUIPickerTextStyleStruct textStyleStruct;
690 RefPtr<ResourceObject> textColorResObj;
691 Color textColor = ParseTextColor(vm, runtimeCallInfo, COLOR_ARG_INDEX, textColorResObj,
692 DEFAULT_TIME_PICKER_TEXT_COLOR, nativeNode, textStyleStruct.textColorSetByUser);
693
694 RefPtr<ResourceObject> fontSizeResObj;
695 std::string fontSize = ParseFontSize(vm, runtimeCallInfo, FONT_SIZE_ARG_INDEX, fontSizeResObj);
696
697 std::string weight = ParseFontWeight(vm, fontWeightArg);
698
699 RefPtr<ResourceObject> fontFamilyResObj;
700 std::string fontFamily = ParseFontFamily(vm, fontFamilyArg, fontFamilyResObj);
701
702 int32_t styleVal = 0;
703 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined() && fontStyleArg->IsNumber()) {
704 styleVal = fontStyleArg->Int32Value(vm);
705 }
706
707 RefPtr<ResourceObject> minFontSizeResObj;
708 std::string minSize = ParseFontSize(vm, runtimeCallInfo, MIN_FONT_SIZE_ARG_INDEX, minFontSizeResObj);
709
710 RefPtr<ResourceObject> maxFontSizeResObj;
711 std::string maxSize = ParseFontSize(vm, runtimeCallInfo, MAX_FONT_SIZE_ARG_INDEX, maxFontSizeResObj);
712
713 int32_t overflowVal = 0;
714 if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
715 overflowVal = overflowArg->Int32Value(vm);
716 }
717 std::string fontInfo =
718 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSize.c_str(), weight.c_str(), fontFamily.c_str());
719
720 textStyleStruct.textColor = textColor.GetValue();
721 textStyleStruct.fontStyle = styleVal;
722 textStyleStruct.textOverflow = overflowVal;
723 textStyleStruct.fontInfo = fontInfo.c_str();
724 textStyleStruct.minFontSize = minSize.c_str();
725 textStyleStruct.maxFontSize = maxSize.c_str();
726 textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
727 textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
728 textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
729 textStyleStruct.minFontSizeRawPtr = AceType::RawPtr(minFontSizeResObj);
730 textStyleStruct.maxFontSizeRawPtr = AceType::RawPtr(maxFontSizeResObj);
731 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultTextStyleWithResObj(
732 nativeNode, &textStyleStruct);
733 return panda::JSValueRef::Undefined(vm);
734 }
735
ResetDefaultTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)736 ArkUINativeModuleValue TextPickerBridge::ResetDefaultTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
737 {
738 EcmaVM* vm = runtimeCallInfo->GetVM();
739 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
740 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
741 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
742 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultTextStyle(nativeNode);
743 return panda::JSValueRef::Undefined(vm);
744 }
745
SetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)746 ArkUINativeModuleValue TextPickerBridge::SetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
747 {
748 EcmaVM* vm = runtimeCallInfo->GetVM();
749 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
750 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // framenode
751 Local<JSValueRef> enableHapticFeedbackArg = runtimeCallInfo->GetCallArgRef(1); // isEnableHapticFeedback
752 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
753 CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
754 auto modifiers = GetArkUINodeModifiers();
755 CHECK_NULL_RETURN(modifiers, panda::NativePointerRef::New(vm, nullptr));
756 auto textPickerModifier = modifiers->getTextPickerModifier();
757 CHECK_NULL_RETURN(textPickerModifier, panda::NativePointerRef::New(vm, nullptr));
758 if (enableHapticFeedbackArg->IsBoolean()) {
759 bool value = enableHapticFeedbackArg->ToBoolean(vm)->Value();
760 textPickerModifier->setTextPickerEnableHapticFeedback(nativeNode, value);
761 } else {
762 textPickerModifier->resetTextPickerEnableHapticFeedback(nativeNode);
763 }
764 return panda::JSValueRef::Undefined(vm);
765 }
766
ResetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)767 ArkUINativeModuleValue TextPickerBridge::ResetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
768 {
769 EcmaVM* vm = runtimeCallInfo->GetVM();
770 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
771 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // framenode
772 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
773 CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
774 auto modifiers = GetArkUINodeModifiers();
775 CHECK_NULL_RETURN(modifiers, panda::NativePointerRef::New(vm, nullptr));
776 auto textPickerModifier = modifiers->getTextPickerModifier();
777 CHECK_NULL_RETURN(textPickerModifier, panda::NativePointerRef::New(vm, nullptr));
778 textPickerModifier->resetTextPickerEnableHapticFeedback(nativeNode);
779 return panda::JSValueRef::Undefined(vm);
780 }
781
SetTextPickerSelectedBackgroundStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)782 ArkUINativeModuleValue TextPickerBridge::SetTextPickerSelectedBackgroundStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
783 {
784 EcmaVM* vm = runtimeCallInfo->GetVM();
785 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
786 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // frameNode
787 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // background color
788 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
789 CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
790 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
791
792 ArkUI_Bool isHasValue[GETVALUE_MAX_SIZE] = {false, false, false, false, false};
793 ArkUIPickerBackgroundStyleStruct backgroundStyleStruct;
794 backgroundStyleStruct.colorValue = DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_COLOR;
795 Color color;
796 RefPtr<ResourceObject> colorResObj;
797 if (ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color, colorResObj, nodeInfo)) {
798 isHasValue[GETCOLOR] = true;
799 backgroundStyleStruct.isColorSetByUser = true;
800 backgroundStyleStruct.colorValue = color.GetValue();
801 }
802 backgroundStyleStruct.colorRawPtr = AceType::RawPtr(colorResObj);
803
804 RefPtr<ResourceObject> radiusResObjs[VALUE_MAX_SIZE] = {nullptr, nullptr, nullptr, nullptr};
805 ParseSelectedBackgroundStyleRadius(vm, runtimeCallInfo, isHasValue, backgroundStyleStruct, radiusResObjs);
806 backgroundStyleStruct.topLeftRawPtr = AceType::RawPtr(radiusResObjs[TOPLEFT]);
807 backgroundStyleStruct.topRightRawPtr = AceType::RawPtr(radiusResObjs[TOPRIGHT]);
808 backgroundStyleStruct.bottomLeftRawPtr = AceType::RawPtr(radiusResObjs[BOTTOMLEFT]);
809 backgroundStyleStruct.bottomRightRawPtr = AceType::RawPtr(radiusResObjs[BOTTOMRIGHT]);
810
811 auto modifiers = GetArkUINodeModifiers();
812 CHECK_NULL_RETURN(modifiers, panda::NativePointerRef::New(vm, nullptr));
813 auto textPickerModifier = modifiers->getTextPickerModifier();
814 CHECK_NULL_RETURN(textPickerModifier, panda::NativePointerRef::New(vm, nullptr));
815 textPickerModifier->setTextPickerSelectedBackgroundStyleWithResObj(nativeNode, isHasValue, &backgroundStyleStruct);
816 return panda::JSValueRef::Undefined(vm);
817 }
818
ResetTextPickerSelectedBackgroundStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)819 ArkUINativeModuleValue TextPickerBridge::ResetTextPickerSelectedBackgroundStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
820 {
821 EcmaVM* vm = runtimeCallInfo->GetVM();
822 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
823 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
824 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
825 auto modifier = GetArkUINodeModifiers();
826 CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
827 modifier->getTextPickerModifier()->resetTextPickerSelectedBackgroundStyle(nativeNode);
828 return panda::JSValueRef::Undefined(vm);
829 }
830
SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)831 ArkUINativeModuleValue TextPickerBridge::SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
832 {
833 EcmaVM* vm = runtimeCallInfo->GetVM();
834 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
835 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
836 Local<JSValueRef> crownSensitivityArg = runtimeCallInfo->GetCallArgRef(NUM_1);
837 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
838 int32_t crownSensitivity = OHOS::Ace::NG::DEFAULT_CROWNSENSITIVITY;
839 if (crownSensitivityArg->IsNumber()) {
840 crownSensitivity = crownSensitivityArg->ToNumber(vm)->Value();
841 }
842 auto modifier = GetArkUINodeModifiers();
843 CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
844 modifier->getTextPickerModifier()->setTextPickerDigitalCrownSensitivity(nativeNode, crownSensitivity);
845 return panda::JSValueRef::Undefined(vm);
846 }
847
ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)848 ArkUINativeModuleValue TextPickerBridge::ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
849 {
850 EcmaVM* vm = runtimeCallInfo->GetVM();
851 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
852 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
853 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
854 auto modifier = GetArkUINodeModifiers();
855 CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
856 modifier->getTextPickerModifier()->resetTextPickerDigitalCrownSensitivity(nativeNode);
857 return panda::JSValueRef::Undefined(vm);
858 }
859 template<typename T>
StringToStringValueWithVM(const EcmaVM * vm,T val)860 panda::Local<panda::JSValueRef> StringToStringValueWithVM(const EcmaVM* vm, T val)
861 {
862 if constexpr (std::is_same_v<T, std::string>) {
863 return panda::StringRef::NewFromUtf8(vm, val.c_str());
864 } else if constexpr (std::is_same_v<T, const char*>) {
865 return panda::StringRef::NewFromUtf8(vm, val);
866 } else if constexpr (std::is_same_v<T, std::u16string>) {
867 return panda::StringRef::NewFromUtf16(vm, val.c_str());
868 }
869 return panda::JSValueRef::Undefined(vm);
870 }
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)871 ArkUINativeModuleValue TextPickerBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
872 {
873 EcmaVM* vm = runtimeCallInfo->GetVM();
874 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
875 uint32_t argsNumber = runtimeCallInfo->GetArgsNumber();
876 if (argsNumber != NUM_2) {
877 return panda::JSValueRef::Undefined(vm);
878 }
879 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
880 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
881 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
882 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
883 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
884 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
885 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnChange(nativeNode);
886 return panda::JSValueRef::Undefined(vm);
887 }
888 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
889 std::function<void(const std::vector<std::string>&, const std::vector<double>&)> callback =
890 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
891 const std::vector<std::string>& value, const std::vector<double>& index) {
892 panda::LocalScope pandaScope(vm);
893 panda::TryCatch trycatch(vm);
894 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
895 if (value.size() == NUM_1 && index.size() == NUM_1) {
896 panda::Local<panda::NumberRef> paramIndex = panda::NumberRef::New(vm, index[NUM_0]);
897 panda::Local<panda::StringRef> paramVaule = StringToStringValueWithVM(vm, value[NUM_0].c_str());
898 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { paramVaule, paramIndex };
899 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
900 } else {
901 int32_t i = NUM_0;
902 int32_t j = NUM_0;
903 auto valueArray = panda::ArrayRef::New(vm);
904 auto indexArray = panda::ArrayRef::New(vm);
905 for (const double& it : index) {
906 panda::Local<panda::NumberRef> item = panda::NumberRef::New(vm, it);
907 panda::ArrayRef::SetValueAt(vm, indexArray, i++, item);
908 }
909 for (const std::string& str : value) {
910 panda::Local<panda::StringRef> item = StringToStringValueWithVM(vm, str.c_str());
911 panda::ArrayRef::SetValueAt(vm, valueArray, j++, item);
912 }
913 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { valueArray, indexArray };
914 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
915 }
916 };
917 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerOnChange(
918 nativeNode, reinterpret_cast<void*>(&callback));
919 return panda::JSValueRef::Undefined(vm);
920 }
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)921 ArkUINativeModuleValue TextPickerBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
922 {
923 EcmaVM* vm = runtimeCallInfo->GetVM();
924 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
925 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
926 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
927 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnChange(nativeNode);
928 return panda::JSValueRef::Undefined(vm);
929 }
SetOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)930 ArkUINativeModuleValue TextPickerBridge::SetOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
931 {
932 EcmaVM* vm = runtimeCallInfo->GetVM();
933 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
934 uint32_t argsNumber = runtimeCallInfo->GetArgsNumber();
935 if (argsNumber != NUM_2) {
936 return panda::JSValueRef::Undefined(vm);
937 }
938 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
939 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
940 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
941 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
942 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
943 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
944 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnScrollStop(nativeNode);
945 return panda::JSValueRef::Undefined(vm);
946 }
947 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
948 std::function<void(const std::vector<std::string>&, const std::vector<double>&)> callback =
949 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
950 const std::vector<std::string>& value, const std::vector<double>& index) {
951 panda::LocalScope pandaScope(vm);
952 panda::TryCatch trycatch(vm);
953 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
954 if (value.size() == NUM_1 && index.size() == NUM_1) {
955 panda::Local<panda::NumberRef> paramIndex = panda::NumberRef::New(vm, index[NUM_0]);
956 panda::Local<panda::StringRef> paramVaule = StringToStringValueWithVM(vm, value[NUM_0].c_str());
957 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { paramVaule, paramIndex };
958 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
959 } else {
960 int32_t i = NUM_0;
961 int32_t j = NUM_0;
962 auto valueArray = panda::ArrayRef::New(vm);
963 auto indexArray = panda::ArrayRef::New(vm);
964 for (const double& it : index) {
965 panda::Local<panda::NumberRef> item = panda::NumberRef::New(vm, it);
966 panda::ArrayRef::SetValueAt(vm, indexArray, i++, item);
967 }
968 for (const std::string& str : value) {
969 panda::Local<panda::StringRef> item = StringToStringValueWithVM(vm, str.c_str());
970 panda::ArrayRef::SetValueAt(vm, valueArray, j++, item);
971 }
972 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { valueArray, indexArray };
973 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
974 }
975 };
976 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerOnScrollStop(
977 nativeNode, reinterpret_cast<void*>(&callback));
978 return panda::JSValueRef::Undefined(vm);
979 }
ResetOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)980 ArkUINativeModuleValue TextPickerBridge::ResetOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
981 {
982 EcmaVM* vm = runtimeCallInfo->GetVM();
983 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
984 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
985 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
986 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnScrollStop(nativeNode);
987 return panda::JSValueRef::Undefined(vm);
988 }
989 } // namespace OHOS::Ace::NG
990