• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_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