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 } // namespace
58
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)59 ArkUINativeModuleValue TextPickerBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
60 {
61 EcmaVM* vm = runtimeCallInfo->GetVM();
62 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
63 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
64 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
65 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
66 CommonBridge::SetBackgroundColor(runtimeCallInfo);
67 Color color;
68 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
69 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
70 } else {
71 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerBackgroundColor(nativeNode, color.GetValue());
72 }
73 return panda::JSValueRef::Undefined(vm);
74 }
75
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)76 ArkUINativeModuleValue TextPickerBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
77 {
78 EcmaVM* vm = runtimeCallInfo->GetVM();
79 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
80 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
81 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
82 CommonBridge::ResetBackgroundColor(runtimeCallInfo);
83 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
84 return panda::JSValueRef::Undefined(vm);
85 }
86
SetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)87 ArkUINativeModuleValue TextPickerBridge::SetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
88 {
89 EcmaVM* vm = runtimeCallInfo->GetVM();
90 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
91 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
92 Local<JSValueRef> canLoopArg = runtimeCallInfo->GetCallArgRef(1);
93 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
94 bool canLoop = true;
95 if (canLoopArg->IsBoolean()) {
96 canLoop = canLoopArg->ToBoolean(vm)->Value();
97 }
98 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerCanLoop(nativeNode, canLoop);
99 return panda::JSValueRef::Undefined(vm);
100 }
101
SetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)102 ArkUINativeModuleValue TextPickerBridge::SetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
103 {
104 EcmaVM* vm = runtimeCallInfo->GetVM();
105 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
106 Local<JSValueRef> indexArg = runtimeCallInfo->GetCallArgRef(1);
107 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
108 std::vector<uint32_t> selectedValues;
109
110 if (indexArg->IsArray(vm)) {
111 if (!ArkTSUtils::ParseJsIntegerArray(vm, indexArg, selectedValues)) {
112 selectedValues.clear();
113 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
114 return panda::JSValueRef::Undefined(vm);
115 }
116 if (selectedValues.size() > 0) {
117 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
118 nativeNode, selectedValues.data(), selectedValues.size());
119 } else {
120 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
121 }
122 } else {
123 uint32_t selectedValue = 0;
124 if (indexArg->IsNumber()) {
125 selectedValue = indexArg->Uint32Value(vm);
126 selectedValues.emplace_back(selectedValue);
127 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
128 nativeNode, selectedValues.data(), DEFAULT_NEGATIVE_NUM); // represent this is a number.
129 } else {
130 selectedValues.clear();
131 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
132 }
133 }
134 return panda::JSValueRef::Undefined(vm);
135 }
136
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)137 ArkUINativeModuleValue TextPickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
138 {
139 EcmaVM* vm = runtimeCallInfo->GetVM();
140 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
141 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
142 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
143 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
144 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
145 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
146 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
147 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
148 Color textColor;
149 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
150 textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
151 }
152 CalcDimension size;
153 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
154 size = Dimension(DEFAULT_NEGATIVE_NUM);
155 } else {
156 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
157 size = Dimension(DEFAULT_NEGATIVE_NUM);
158 }
159 }
160 std::string weight = DEFAULT_ERR_CODE;
161 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
162 if (fontWeightArg->IsNumber()) {
163 weight = std::to_string(fontWeightArg->Int32Value(vm));
164 } else {
165 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
166 weight = DEFAULT_ERR_CODE;
167 }
168 }
169 }
170 std::string fontFamily;
171 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
172 fontFamily = DEFAULT_ERR_CODE;
173 }
174 int32_t styleVal = 0;
175 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
176 styleVal = fontStyleArg->Int32Value(vm);
177 }
178 std::string fontSizeStr = size.ToString();
179 std::string fontInfo =
180 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
181 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerTextStyle(
182 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
183 return panda::JSValueRef::Undefined(vm);
184 }
185
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)186 ArkUINativeModuleValue TextPickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
187 {
188 EcmaVM* vm = runtimeCallInfo->GetVM();
189 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
190 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
191 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
192 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
193 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
194 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
195 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
196 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
197 Color textColor;
198 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
199 textColor.SetValue(DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR);
200 }
201 CalcDimension size;
202 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
203 size = Dimension(DEFAULT_NEGATIVE_NUM);
204 } else {
205 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
206 size = Dimension(DEFAULT_NEGATIVE_NUM);
207 }
208 }
209 std::string weight = DEFAULT_ERR_CODE;
210 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
211 if (fontWeightArg->IsNumber()) {
212 weight = std::to_string(fontWeightArg->Int32Value(vm));
213 } else {
214 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
215 weight = DEFAULT_ERR_CODE;
216 }
217 }
218 }
219 std::string fontFamily;
220 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
221 fontFamily = DEFAULT_ERR_CODE;
222 }
223 int32_t styleVal = 0;
224 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
225 styleVal = fontStyleArg->Int32Value(vm);
226 }
227 std::string fontSizeStr = size.ToString();
228 std::string fontInfo =
229 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
230 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedTextStyle(
231 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
232 return panda::JSValueRef::Undefined(vm);
233 }
234
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)235 ArkUINativeModuleValue TextPickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
236 {
237 EcmaVM* vm = runtimeCallInfo->GetVM();
238 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
239 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
240 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // text color
241 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2); // text font size
242 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
243 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
244 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5); // text font style
245 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
246 Color textColor;
247 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
248 textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
249 }
250 CalcDimension size;
251 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
252 size = Dimension(DEFAULT_NEGATIVE_NUM);
253 } else {
254 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
255 size = Dimension(DEFAULT_NEGATIVE_NUM);
256 }
257 }
258 std::string weight = DEFAULT_ERR_CODE;
259 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
260 if (fontWeightArg->IsNumber()) {
261 weight = std::to_string(fontWeightArg->Int32Value(vm));
262 } else {
263 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
264 weight = DEFAULT_ERR_CODE;
265 }
266 }
267 }
268 std::string fontFamily;
269 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
270 fontFamily = DEFAULT_ERR_CODE;
271 }
272 int32_t styleVal = 0;
273 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
274 styleVal = fontStyleArg->Int32Value(vm);
275 }
276 std::string fontSizeStr = size.ToString();
277 std::string fontInfo =
278 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
279 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisappearTextStyle(
280 nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
281 return panda::JSValueRef::Undefined(vm);
282 }
283
SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)284 ArkUINativeModuleValue TextPickerBridge::SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
285 {
286 EcmaVM* vm = runtimeCallInfo->GetVM();
287 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
288 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
289 Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
290 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
291
292 CalcDimension height;
293 if (itemHeightValue->IsNumber() || itemHeightValue->IsString(vm)) {
294 if (!ArkTSUtils::ParseJsDimensionFp(vm, itemHeightValue, height)) {
295 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
296 return panda::JSValueRef::Undefined(vm);
297 }
298 }
299
300 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultPickerItemHeight(
301 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
302
303 return panda::JSValueRef::Undefined(vm);
304 }
305
ResetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue TextPickerBridge::ResetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
307 {
308 EcmaVM* vm = runtimeCallInfo->GetVM();
309 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
310 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
311 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
312 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerCanLoop(nativeNode);
313 return panda::JSValueRef::Undefined(vm);
314 }
315
ResetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)316 ArkUINativeModuleValue TextPickerBridge::ResetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
317 {
318 EcmaVM* vm = runtimeCallInfo->GetVM();
319 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
320 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
321 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
322 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
323 return panda::JSValueRef::Undefined(vm);
324 }
325
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)326 ArkUINativeModuleValue TextPickerBridge::ResetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
327 {
328 EcmaVM* vm = runtimeCallInfo->GetVM();
329 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
330 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
331 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
332 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerTextStyle(nativeNode);
333 return panda::JSValueRef::Undefined(vm);
334 }
335
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)336 ArkUINativeModuleValue TextPickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
337 {
338 EcmaVM* vm = runtimeCallInfo->GetVM();
339 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
340 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
341 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
342 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedTextStyle(nativeNode);
343 return panda::JSValueRef::Undefined(vm);
344 }
345
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)346 ArkUINativeModuleValue TextPickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
347 {
348 EcmaVM* vm = runtimeCallInfo->GetVM();
349 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
350 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
351 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
352 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisappearTextStyle(nativeNode);
353 return panda::JSValueRef::Undefined(vm);
354 }
355
ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)356 ArkUINativeModuleValue TextPickerBridge::ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
357 {
358 EcmaVM* vm = runtimeCallInfo->GetVM();
359 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
360 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
361 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
362 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
363 return panda::JSValueRef::Undefined(vm);
364 }
365
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)366 ArkUINativeModuleValue TextPickerBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
367 {
368 EcmaVM* vm = runtimeCallInfo->GetVM();
369 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
370 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
371 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
372 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(STROKE_WIDTH_INDEX);
373 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(COLOR_INDEX);
374 Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(START_MARGIN_INDEX);
375 Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(END_MARGIN_INDEX);
376 CalcDimension dividerStrokeWidth;
377 CalcDimension dividerStartMargin;
378 CalcDimension dividerEndMargin;
379 Color colorObj;
380 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
381 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
382 auto context = frameNode->GetContext();
383 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
384 auto themeManager = context->GetThemeManager();
385 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
386 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
387 CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
388 if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth)) {
389 if (pickerTheme) {
390 dividerStrokeWidth = pickerTheme->GetDividerThickness();
391 } else {
392 dividerStrokeWidth = 0.0_vp;
393 }
394 }
395 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
396 if (pickerTheme) {
397 colorObj = pickerTheme->GetDividerColor();
398 } else {
399 colorObj = Color::TRANSPARENT;
400 }
401 }
402 if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin)) {
403 dividerStartMargin = 0.0_vp;
404 }
405 if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin)) {
406 dividerEndMargin = 0.0_vp;
407 }
408 uint32_t size = ARG_GROUP_LENGTH;
409 ArkUI_Float32 values[size];
410 int32_t units[size];
411 PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
412 PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
413 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDivider(
414 nativeNode, colorObj.GetValue(), values, units, size);
415 return panda::JSValueRef::Undefined(vm);
416 }
417
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)418 ArkUINativeModuleValue TextPickerBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
419 {
420 EcmaVM* vm = runtimeCallInfo->GetVM();
421 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
422 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
423 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
424 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDivider(nativeNode);
425 return panda::JSValueRef::Undefined(vm);
426 }
427
SetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)428 ArkUINativeModuleValue TextPickerBridge::SetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
429 {
430 EcmaVM* vm = runtimeCallInfo->GetVM();
431 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
432 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
433 Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
434 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
435 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
436 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
437 auto context = frameNode->GetContext();
438 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
439 auto themeManager = context->GetThemeManager();
440 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
441 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
442 CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
443 CalcDimension height;
444 if (ArkTSUtils::ParseJsDimensionVpNG(vm, itemHeightValue, height, true)) {
445 GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerGradientHeight(
446 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
447 } else {
448 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
449 }
450 return panda::JSValueRef::Undefined(vm);
451 }
452
ResetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)453 ArkUINativeModuleValue TextPickerBridge::ResetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
454 {
455 EcmaVM* vm = runtimeCallInfo->GetVM();
456 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
457 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
458 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
459 GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
460 return panda::JSValueRef::Undefined(vm);
461 }
462 } // namespace OHOS::Ace::NG
463
464