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_select_bridge.h"
16
17 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
18 #include "bridge/declarative_frontend/jsview/js_view_abstract.h"
19 #include "bridge/declarative_frontend/jsview/js_symbol_modifier.h"
20 #include "core/components_ng/base/frame_node.h"
21
22 namespace OHOS::Ace::NG {
23 namespace {
24 constexpr int NUM_0 = 0;
25 constexpr int NUM_1 = 1;
26 constexpr int NUM_2 = 2;
27 constexpr int NUM_3 = 3;
28 constexpr int NUM_4 = 4;
29 constexpr int NUM_5 = 5;
30 const int32_t SIZE_OF_TWO = 2;
31 const std::string FORMAT_FONT = "%s|%s|%s";
32 const std::string DEFAULT_STR = "-1";
33 const char* SELECT_NODEPTR_OF_UINODE = "nodePtr_";
34 const Dimension invalidDimension = Dimension(0.0, DimensionUnit::INVALID);
35
BuildSelectDividerStyleOptions(EcmaVM * vm,Local<JSValueRef> strokeWidthArg,Local<JSValueRef> startMarginArg,Local<JSValueRef> endMarginArg)36 ArkUIMenuDividerOptions BuildSelectDividerStyleOptions(
37 EcmaVM* vm, Local<JSValueRef> strokeWidthArg, Local<JSValueRef> startMarginArg, Local<JSValueRef> endMarginArg)
38 {
39 ArkUIDimensionType strokeWidthOption;
40 ArkUIDimensionType startMarginOption;
41 ArkUIDimensionType endMarginOption;
42
43 CalcDimension strokeWidth;
44 if (!ArkTSUtils::ParseJsLengthMetrics(vm, strokeWidthArg, strokeWidth)) {
45 strokeWidth = invalidDimension;
46 }
47 strokeWidthOption.value = strokeWidth.Value();
48 strokeWidthOption.units = static_cast<int32_t>(strokeWidth.Unit());
49
50 CalcDimension startMargin;
51 if (!ArkTSUtils::ParseJsLengthMetrics(vm, startMarginArg, startMargin)) {
52 startMargin = invalidDimension;
53 }
54 startMarginOption.value = startMargin.Value();
55 startMarginOption.units = static_cast<int32_t>(startMargin.Unit());
56
57 CalcDimension endMargin;
58 if (!ArkTSUtils::ParseJsLengthMetrics(vm, endMarginArg, endMargin)) {
59 endMargin = invalidDimension;
60 }
61 endMarginOption.value = endMargin.Value();
62 endMarginOption.units = static_cast<int32_t>(endMargin.Unit());
63
64 ArkUIMenuDividerOptions dividerOptions;
65 dividerOptions.strokeWidth = strokeWidthOption;
66 dividerOptions.startMargin = startMarginOption;
67 dividerOptions.endMargin = endMarginOption;
68 return dividerOptions;
69 }
70
71 constexpr int32_t ARG_GROUP_LENGTH = 3;
ParseDividerDimension(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & valueDim)72 bool ParseDividerDimension(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& valueDim)
73 {
74 return !ArkTSUtils::ParseJsDimensionVpNG(vm, value, valueDim, false) || 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[0] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
83 values[1] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
84 values[2] = 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[0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
91 units[1] = static_cast<int32_t>(dividerStartMargin.Unit());
92 units[2] = static_cast<int32_t>(dividerEndMargin.Unit());
93 }
94 } // namespace
95
JsSelectChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)96 panda::Local<panda::JSValueRef> JsSelectChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
97 {
98 auto vm = runtimeCallInfo->GetVM();
99 auto firstArg = runtimeCallInfo->GetCallArgRef(0);
100 auto secondArg = runtimeCallInfo->GetCallArgRef(1);
101 if (!firstArg->IsNumber()) {
102 return panda::JSValueRef::Undefined(vm);
103 }
104 auto index = firstArg->ToNumber(vm)->Value();
105 auto value = secondArg->ToString(vm)->ToString(vm);
106 auto ref = runtimeCallInfo->GetThisRef();
107 auto obj = ref->ToObject(vm);
108 FrameNode* frameNode = nullptr;
109 if (obj->GetNativePointerFieldCount(vm) < 1) {
110 if (!ref->IsProxy(vm)) {
111 return panda::JSValueRef::Undefined(vm);
112 }
113 auto frameNodeIdValue = obj->Get(vm, "frameNodeId_");
114 CHECK_EQUAL_RETURN(
115 frameNodeIdValue.IsEmpty() || frameNodeIdValue->IsNull(), true, panda::JSValueRef::Undefined(vm));
116 auto frameNodeId = frameNodeIdValue->Int32Value(vm);
117 frameNode = ElementRegister::GetInstance()->GetFrameNodePtrById(frameNodeId);
118 } else {
119 frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
120 }
121 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
122 SelectModelNG::SetChangeValue(frameNode, index, value);
123 return panda::JSValueRef::Undefined(vm);
124 }
125
SetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)126 ArkUINativeModuleValue SelectBridge::SelectBridge::SetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
127 {
128 EcmaVM* vm = runtimeCallInfo->GetVM();
129 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
130 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
131 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
132 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
133 auto pipeline = PipelineBase::GetCurrentContext();
134 CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
135 auto selectTheme = pipeline->GetTheme<SelectTheme>();
136 CHECK_NULL_RETURN(selectTheme, panda::NativePointerRef::New(vm, nullptr));
137
138 CalcDimension space;
139 if (!ArkTSUtils::ParseJsDimensionVp(vm, secondArg, space)) {
140 space = selectTheme->GetContentSpinnerPadding();
141 }
142 if (LessNotEqual(space.Value(), 0.0) || space.Unit() == DimensionUnit::PERCENT) {
143 space = selectTheme->GetContentSpinnerPadding();
144 }
145
146 GetArkUINodeModifiers()->getSelectModifier()->setSpace(
147 nativeNode, space.Value(), static_cast<int32_t>(space.Unit()));
148 return panda::JSValueRef::Undefined(vm);
149 }
150
SetValue(ArkUIRuntimeCallInfo * runtimeCallInfo)151 ArkUINativeModuleValue SelectBridge::SetValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
152 {
153 EcmaVM* vm = runtimeCallInfo->GetVM();
154 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
155 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
156 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
157 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
158 std::string value;
159 ArkTSUtils::ParseJsString(vm, secondArg, value);
160 GetArkUINodeModifiers()->getSelectModifier()->setValue(nativeNode, value.c_str());
161 return panda::JSValueRef::Undefined(vm);
162 }
163
SetSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)164 ArkUINativeModuleValue SelectBridge::SetSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
165 {
166 EcmaVM* vm = runtimeCallInfo->GetVM();
167 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
168 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
169 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
170 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
171 int32_t value = 0;
172 if (ArkTSUtils::ParseJsIntegerWithResource(vm, secondArg, value)) {
173 GetArkUINodeModifiers()->getSelectModifier()->setSelected(nativeNode, value);
174 } else {
175 GetArkUINodeModifiers()->getSelectModifier()->resetSelected(nativeNode);
176 }
177 return panda::JSValueRef::Undefined(vm);
178 }
179
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)180 ArkUINativeModuleValue SelectBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
181 {
182 EcmaVM* vm = runtimeCallInfo->GetVM();
183 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
184 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
185 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
186 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
187
188 Color fontColor;
189 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, fontColor)) {
190 return ResetFontColor(runtimeCallInfo);
191 }
192 GetArkUINodeModifiers()->getSelectModifier()->setSelectFontColor(nativeNode, fontColor.GetValue());
193 return panda::JSValueRef::Undefined(vm);
194 }
195
SetSelectedOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)196 ArkUINativeModuleValue SelectBridge::SetSelectedOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
197 {
198 EcmaVM* vm = runtimeCallInfo->GetVM();
199 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
200 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
201 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
202 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
203
204 Color selectedOptionBgColor;
205 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, selectedOptionBgColor)) {
206 return ResetSelectedOptionBgColor(runtimeCallInfo);
207 }
208
209 GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionBgColor(
210 nativeNode, selectedOptionBgColor.GetValue());
211 return panda::JSValueRef::Undefined(vm);
212 }
213
SetOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)214 ArkUINativeModuleValue SelectBridge::SetOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
215 {
216 EcmaVM* vm = runtimeCallInfo->GetVM();
217 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
218 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
219 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
220 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
221
222 Color optionBgColor;
223 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionBgColor)) {
224 return ResetOptionBgColor(runtimeCallInfo);
225 }
226 GetArkUINodeModifiers()->getSelectModifier()->setOptionBgColor(nativeNode, optionBgColor.GetValue());
227 return panda::JSValueRef::Undefined(vm);
228 }
229
SetOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)230 ArkUINativeModuleValue SelectBridge::SetOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
231 {
232 EcmaVM* vm = runtimeCallInfo->GetVM();
233 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
234 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
235 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
236 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
237
238 Color optionFontColor;
239 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionFontColor)) {
240 return ResetOptionFontColor(runtimeCallInfo);
241 }
242 GetArkUINodeModifiers()->getSelectModifier()->setOptionFontColor(nativeNode, optionFontColor.GetValue());
243 return panda::JSValueRef::Undefined(vm);
244 }
245
SetSelectedOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)246 ArkUINativeModuleValue SelectBridge::SetSelectedOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
247 {
248 EcmaVM* vm = runtimeCallInfo->GetVM();
249 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
250 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
251 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
252 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
253 Color optionFontColor;
254 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionFontColor)) {
255 return ResetSelectedOptionFontColor(runtimeCallInfo);
256 }
257 GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionFontColor(nativeNode, optionFontColor.GetValue());
258 return panda::JSValueRef::Undefined(vm);
259 }
260
SetArrowPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)261 ArkUINativeModuleValue SelectBridge::SelectBridge::SetArrowPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
262 {
263 EcmaVM* vm = runtimeCallInfo->GetVM();
264 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
265 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
266 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
267 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
268 int32_t arrowPosition = secondArg->Int32Value(vm);
269 GetArkUINodeModifiers()->getSelectModifier()->setArrowPosition(nativeNode, arrowPosition);
270 return panda::JSValueRef::Undefined(vm);
271 }
272
SetMenuAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)273 ArkUINativeModuleValue SelectBridge::SetMenuAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
274 {
275 EcmaVM* vm = runtimeCallInfo->GetVM();
276 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
277 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
278 Local<JSValueRef> alignTypeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of alignType
279 Local<JSValueRef> offsetDx = runtimeCallInfo->GetCallArgRef(2); // 2: index of offset Dx
280 Local<JSValueRef> offsetDy = runtimeCallInfo->GetCallArgRef(3); // 3: index of offset Dy
281 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
282
283 int32_t alignType = 0;
284 if (alignTypeArg->IsNumber()) {
285 alignType = alignTypeArg->Int32Value(vm);
286 }
287
288 CalcDimension menuAlignOffsetDx = Dimension(0.0);
289 CalcDimension menuAlignOffsetDy = Dimension(0.0);
290 if (offsetDx->IsNull() || !ArkTSUtils::ParseJsDimensionVp(vm, offsetDx, menuAlignOffsetDx)) {
291 menuAlignOffsetDx = Dimension(0.0);
292 }
293
294 if (offsetDy->IsNull() || !ArkTSUtils::ParseJsDimensionVp(vm, offsetDy, menuAlignOffsetDy)) {
295 menuAlignOffsetDy = Dimension(0.0);
296 }
297
298 uint32_t size = SIZE_OF_TWO;
299 float values[size];
300 int32_t units[size];
301 values[0] = menuAlignOffsetDx.Value();
302 units[0] = static_cast<int32_t>(menuAlignOffsetDx.Unit());
303 values[1] = menuAlignOffsetDy.Value();
304 units[1] = static_cast<int32_t>(menuAlignOffsetDy.Unit());
305 GetArkUINodeModifiers()->getSelectModifier()->setMenuAlign(nativeNode, alignType, values, units, SIZE_OF_TWO);
306 return panda::JSValueRef::Undefined(vm);
307 }
308
SetAvoidance(ArkUIRuntimeCallInfo * runtimeCallInfo)309 ArkUINativeModuleValue SelectBridge::SetAvoidance(ArkUIRuntimeCallInfo* runtimeCallInfo)
310 {
311 EcmaVM* vm = runtimeCallInfo->GetVM();
312 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
313 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
314 CHECK_NULL_RETURN(!nodeArg.IsNull(), panda::NativePointerRef::New(vm, nullptr));
315 Local<JSValueRef> modeArg = runtimeCallInfo->GetCallArgRef(1);
316 CHECK_NULL_RETURN(!modeArg.IsNull(), panda::NativePointerRef::New(vm, nullptr));
317 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
318 int32_t mode = 0;
319 if (modeArg->IsNumber()) {
320 mode = modeArg->Int32Value(vm);
321 }
322 GetArkUINodeModifiers()->getSelectModifier()->setAvoidance(nativeNode, mode);
323 return panda::JSValueRef::Undefined(vm);
324 }
325
SetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)326 ArkUINativeModuleValue SelectBridge::SetFont(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 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of font size value
332 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
333 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
334 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4); // 4: index of font style value
335 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
336
337 std::string fontSizeStr = DEFAULT_STR;
338 CalcDimension fontSize;
339 if (!fontSizeArg->IsNull() && !fontSizeArg->IsUndefined() &&
340 ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
341 fontSizeStr = fontSize.ToString();
342 }
343
344 std::string fontWeight = DEFAULT_STR;
345 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
346 if (fontWeightArg->IsNumber()) {
347 fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
348 } else {
349 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
350 fontWeight = DEFAULT_STR;
351 }
352 }
353 }
354 std::string fontFamily;
355 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
356 fontFamily = DEFAULT_STR;
357 }
358 int32_t styleVal = 0;
359 if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
360 styleVal = styleArg->Int32Value(vm);
361 }
362
363 std::string fontInfo =
364 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
365
366 GetArkUINodeModifiers()->getSelectModifier()->setFont(nativeNode, fontInfo.c_str(), styleVal);
367 return panda::JSValueRef::Undefined(vm);
368 }
369
SetOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)370 ArkUINativeModuleValue SelectBridge::SetOptionFont(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 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of font size value
376 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
377 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
378 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4); // 4: index of font style value
379 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
380 auto pipeline = PipelineBase::GetCurrentContext();
381 CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
382 auto selectTheme = pipeline->GetTheme<SelectTheme>();
383
384 CalcDimension fontSize;
385 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined() ||
386 !ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
387 fontSize = selectTheme->GetMenuFontSize();
388 }
389
390 std::string fontWeight = DEFAULT_STR;
391 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
392 if (fontWeightArg->IsNumber()) {
393 fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
394 } else {
395 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
396 fontWeight = DEFAULT_STR;
397 }
398 }
399 }
400 std::string fontFamily;
401 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
402 fontFamily = DEFAULT_STR;
403 }
404 int32_t styleVal = 0;
405 if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
406 styleVal = styleArg->Int32Value(vm);
407 }
408 std::string fontSizeStr = fontSize.ToString();
409 std::string fontInfo =
410 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
411
412 GetArkUINodeModifiers()->getSelectModifier()->setOptionFont(nativeNode, fontInfo.c_str(), styleVal);
413 return panda::JSValueRef::Undefined(vm);
414 }
415
SetSelectedOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)416 ArkUINativeModuleValue SelectBridge::SetSelectedOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
417 {
418 EcmaVM* vm = runtimeCallInfo->GetVM();
419 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
420 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
421 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of font size value
422 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
423 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
424 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4); // 4: index of font style value
425 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
426
427 auto pipeline = PipelineBase::GetCurrentContext();
428 CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
429 auto selectTheme = pipeline->GetTheme<SelectTheme>();
430
431 CalcDimension fontSize;
432 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined() ||
433 !ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
434 fontSize = selectTheme->GetFontSize();
435 }
436
437 std::string fontWeight = DEFAULT_STR;
438 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
439 if (fontWeightArg->IsNumber()) {
440 fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
441 } else {
442 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
443 fontWeight = DEFAULT_STR;
444 }
445 }
446 }
447 std::string fontFamily;
448 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
449 fontFamily = DEFAULT_STR;
450 }
451 int32_t styleVal = 0;
452 if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
453 styleVal = styleArg->Int32Value(vm);
454 }
455 std::string fontSizeStr = fontSize.ToString();
456 std::string fontInfo =
457 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
458
459 GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionFont(nativeNode, fontInfo.c_str(), styleVal);
460 return panda::JSValueRef::Undefined(vm);
461 }
462
ResetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)463 ArkUINativeModuleValue SelectBridge::ResetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
464 {
465 EcmaVM* vm = runtimeCallInfo->GetVM();
466 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
467 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
468 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
469 GetArkUINodeModifiers()->getSelectModifier()->resetSpace(nativeNode);
470 return panda::JSValueRef::Undefined(vm);
471 }
472
ResetValue(ArkUIRuntimeCallInfo * runtimeCallInfo)473 ArkUINativeModuleValue SelectBridge::ResetValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
474 {
475 EcmaVM* vm = runtimeCallInfo->GetVM();
476 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
477 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
478 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
479 GetArkUINodeModifiers()->getSelectModifier()->resetValue(nativeNode);
480 return panda::JSValueRef::Undefined(vm);
481 }
482
ResetSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)483 ArkUINativeModuleValue SelectBridge::ResetSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
484 {
485 EcmaVM* vm = runtimeCallInfo->GetVM();
486 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
487 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
488 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
489 GetArkUINodeModifiers()->getSelectModifier()->resetSelected(nativeNode);
490 return panda::JSValueRef::Undefined(vm);
491 }
492
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)493 ArkUINativeModuleValue SelectBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
494 {
495 EcmaVM* vm = runtimeCallInfo->GetVM();
496 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
497 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
498 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
499 GetArkUINodeModifiers()->getSelectModifier()->resetSelectFontColor(nativeNode);
500 return panda::JSValueRef::Undefined(vm);
501 }
502
ResetSelectedOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)503 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionBgColor(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()->getSelectModifier()->resetSelectedOptionBgColor(nativeNode);
510 return panda::JSValueRef::Undefined(vm);
511 }
512
ResetOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)513 ArkUINativeModuleValue SelectBridge::ResetOptionBgColor(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 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
519 GetArkUINodeModifiers()->getSelectModifier()->resetOptionBgColor(nativeNode);
520 return panda::JSValueRef::Undefined(vm);
521 }
522
ResetOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)523 ArkUINativeModuleValue SelectBridge::ResetOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
524 {
525 EcmaVM* vm = runtimeCallInfo->GetVM();
526 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
527 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
528 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
529 GetArkUINodeModifiers()->getSelectModifier()->resetOptionFontColor(nativeNode);
530 return panda::JSValueRef::Undefined(vm);
531 }
532
ResetSelectedOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)533 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
534 {
535 EcmaVM* vm = runtimeCallInfo->GetVM();
536 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
537 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
538 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
539 GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionFontColor(nativeNode);
540 return panda::JSValueRef::Undefined(vm);
541 }
542
ResetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)543 ArkUINativeModuleValue SelectBridge::ResetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
544 {
545 EcmaVM* vm = runtimeCallInfo->GetVM();
546 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
547 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
548 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
549 GetArkUINodeModifiers()->getSelectModifier()->resetFont(nativeNode);
550 return panda::JSValueRef::Undefined(vm);
551 }
552
ResetOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)553 ArkUINativeModuleValue SelectBridge::ResetOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
554 {
555 EcmaVM* vm = runtimeCallInfo->GetVM();
556 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
557 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
558 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
559 GetArkUINodeModifiers()->getSelectModifier()->resetOptionFont(nativeNode);
560 return panda::JSValueRef::Undefined(vm);
561 }
562
ResetSelectedOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)563 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
564 {
565 EcmaVM* vm = runtimeCallInfo->GetVM();
566 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
567 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
568 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
569 GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionFont(nativeNode);
570 return panda::JSValueRef::Undefined(vm);
571 }
572
ResetMenuAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)573 ArkUINativeModuleValue SelectBridge::ResetMenuAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
574 {
575 EcmaVM* vm = runtimeCallInfo->GetVM();
576 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
577 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
578 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
579 GetArkUINodeModifiers()->getSelectModifier()->resetMenuAlign(nativeNode);
580 return panda::JSValueRef::Undefined(vm);
581 }
582
ResetAvoidance(ArkUIRuntimeCallInfo * runtimeCallInfo)583 ArkUINativeModuleValue SelectBridge::ResetAvoidance(ArkUIRuntimeCallInfo* runtimeCallInfo)
584 {
585 EcmaVM* vm = runtimeCallInfo->GetVM();
586 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
587 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
588 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
589 GetArkUINodeModifiers()->getSelectModifier()->resetAvoidance(nativeNode);
590 return panda::JSValueRef::Undefined(vm);
591 }
592
ResetArrowPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)593 ArkUINativeModuleValue SelectBridge::ResetArrowPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
594 {
595 EcmaVM* vm = runtimeCallInfo->GetVM();
596 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
597 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
598 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
599 GetArkUINodeModifiers()->getSelectModifier()->resetArrowPosition(nativeNode);
600 return panda::JSValueRef::Undefined(vm);
601 }
602
SetOptionWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)603 ArkUINativeModuleValue SelectBridge::SetOptionWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
604 {
605 EcmaVM* vm = runtimeCallInfo->GetVM();
606 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
607 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
608 Local<JSValueRef> optionWidthArg = runtimeCallInfo->GetCallArgRef(1);
609 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
610 CalcDimension width;
611 if (optionWidthArg->IsString(vm)) {
612 std::string modeFlag = optionWidthArg->ToString(vm)->ToString(vm);
613 if (modeFlag.compare("fit_content") == 0) {
614 GetArkUINodeModifiers()->getSelectModifier()->setOptionWidthFitTrigger(nativeNode, false);
615 return panda::JSValueRef::Undefined(vm);
616 } else if (modeFlag.compare("fit_trigger") == 0) {
617 GetArkUINodeModifiers()->getSelectModifier()->setOptionWidthFitTrigger(nativeNode, true);
618 return panda::JSValueRef::Undefined(vm);
619 } else if (ArkTSUtils::IsPercentStr(modeFlag)) {
620 return panda::JSValueRef::Undefined(vm);
621 } else {
622 ArkTSUtils::ParseJsDimensionVpNG(vm, optionWidthArg, width, false);
623 if (width.IsNegative()) {
624 width.Reset();
625 }
626 }
627 } else {
628 ArkTSUtils::ParseJsDimensionVpNG(vm, optionWidthArg, width, false);
629 if (width.IsNegative()) {
630 width.Reset();
631 }
632 }
633
634 GetArkUINodeModifiers()->getSelectModifier()->setSelectOptionWidth(
635 nativeNode, width.Value(), static_cast<int32_t>(width.Unit()));
636 return panda::JSValueRef::Undefined(vm);
637 }
638
ResetOptionWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)639 ArkUINativeModuleValue SelectBridge::ResetOptionWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
640 {
641 EcmaVM* vm = runtimeCallInfo->GetVM();
642 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
643 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
644 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
645 GetArkUINodeModifiers()->getSelectModifier()->resetSelectOptionWidth(nativeNode);
646 return panda::JSValueRef::Undefined(vm);
647 }
648
SetOptionHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)649 ArkUINativeModuleValue SelectBridge::SetOptionHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
650 {
651 EcmaVM* vm = runtimeCallInfo->GetVM();
652 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
653 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
654 Local<JSValueRef> optionHeightArg = runtimeCallInfo->GetCallArgRef(1);
655 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
656 CalcDimension height;
657 if (optionHeightArg->IsString(vm)) {
658 std::string modeFlag = optionHeightArg->ToString(vm)->ToString(vm);
659 if (ArkTSUtils::IsPercentStr(modeFlag)) {
660 return panda::JSValueRef::Undefined(vm);
661 }
662 }
663
664 ArkTSUtils::ParseJsDimensionVpNG(vm, optionHeightArg, height, false);
665 if (height.IsNegative()) {
666 return panda::JSValueRef::Undefined(vm);
667 }
668 if (NEAR_ZERO(height.Value())) {
669 return panda::JSValueRef::Undefined(vm);
670 }
671
672 GetArkUINodeModifiers()->getSelectModifier()->setSelectOptionHeight(
673 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
674 return panda::JSValueRef::Undefined(vm);
675 }
676
ResetOptionHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)677 ArkUINativeModuleValue SelectBridge::ResetOptionHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
678 {
679 EcmaVM* vm = runtimeCallInfo->GetVM();
680 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
681 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
682 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
683 GetArkUINodeModifiers()->getSelectModifier()->resetSelectOptionHeight(nativeNode);
684 return panda::JSValueRef::Undefined(vm);
685 }
686
SetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)687 ArkUINativeModuleValue SelectBridge::SetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
688 {
689 EcmaVM* vm = runtimeCallInfo->GetVM();
690 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
691 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
692 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);
693 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
694 CalcDimension width;
695 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
696 GetArkUINodeModifiers()->getSelectModifier()->resetSelectWidth(nativeNode);
697 return panda::JSValueRef::Undefined(vm);
698 }
699 if (LessNotEqual(width.Value(), 0.0)) {
700 width.SetValue(0.0);
701 }
702 std::string widthCalc = width.CalcValue();
703 GetArkUINodeModifiers()->getSelectModifier()->setSelectWidth(
704 nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
705 return panda::JSValueRef::Undefined(vm);
706 }
707
ResetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)708 ArkUINativeModuleValue SelectBridge::ResetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
709 {
710 EcmaVM* vm = runtimeCallInfo->GetVM();
711 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
712 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
713 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
714 GetArkUINodeModifiers()->getSelectModifier()->resetSelectWidth(nativeNode);
715 return panda::JSValueRef::Undefined(vm);
716 }
717
SetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)718 ArkUINativeModuleValue SelectBridge::SetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
719 {
720 EcmaVM* vm = runtimeCallInfo->GetVM();
721 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
722 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
723 Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(1);
724 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
725 CalcDimension height;
726 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
727 GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
728 return panda::JSValueRef::Undefined(vm);
729 }
730 if (LessNotEqual(height.Value(), 0.0)) {
731 height.SetValue(0.0);
732 }
733 std::string heightCalc = height.CalcValue();
734 GetArkUINodeModifiers()->getSelectModifier()->setSelectHeight(
735 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
736 return panda::JSValueRef::Undefined(vm);
737 }
738
ResetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)739 ArkUINativeModuleValue SelectBridge::ResetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
740 {
741 EcmaVM* vm = runtimeCallInfo->GetVM();
742 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
743 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
744 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
745 GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
746 return panda::JSValueRef::Undefined(vm);
747 }
748
SetSize(ArkUIRuntimeCallInfo * runtimeCallInfo)749 ArkUINativeModuleValue SelectBridge::SetSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
750 {
751 EcmaVM* vm = runtimeCallInfo->GetVM();
752 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
753 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
754 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of width value
755 Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of heigth value
756 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
757 CalcDimension width;
758 CalcDimension height;
759 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
760 GetArkUINodeModifiers()->getSelectModifier()->resetSelectWidth(nativeNode);
761 } else {
762 std::string widthCalc = width.CalcValue();
763 if (LessNotEqual(width.Value(), 0.0)) {
764 width.SetValue(0.0);
765 }
766 GetArkUINodeModifiers()->getSelectModifier()->setSelectWidth(
767 nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
768 }
769 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
770 GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
771 } else {
772 std::string heightCalc = height.CalcValue();
773 if (LessNotEqual(height.Value(), 0.0)) {
774 height.SetValue(0.0);
775 }
776 GetArkUINodeModifiers()->getSelectModifier()->setSelectHeight(
777 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
778 }
779 return panda::JSValueRef::Undefined(vm);
780 }
781
SetControlSize(ArkUIRuntimeCallInfo * runtimeCallInfo)782 ArkUINativeModuleValue SelectBridge::SetControlSize(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);
787 Local<JSValueRef> controlSizeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of width value
788 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
789 auto controlSize = controlSizeArg->Int32Value(vm);
790 if (!ArkTSUtils::ParseJsInteger(vm, controlSizeArg, controlSize)) {
791 GetArkUINodeModifiers()->getSelectModifier()->resetControlSize(nativeNode);
792 } else {
793 GetArkUINodeModifiers()->getSelectModifier()->setControlSize(nativeNode, controlSize);
794 }
795 return panda::JSValueRef::Undefined(vm);
796 }
797
ResetControlSize(ArkUIRuntimeCallInfo * runtimeCallInfo)798 ArkUINativeModuleValue SelectBridge::ResetControlSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
799 {
800 EcmaVM* vm = runtimeCallInfo->GetVM();
801 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
802 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
803 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
804 GetArkUINodeModifiers()->getSelectModifier()->resetControlSize(nativeNode);
805 return panda::JSValueRef::Undefined(vm);
806 }
807
ResetSize(ArkUIRuntimeCallInfo * runtimeCallInfo)808 ArkUINativeModuleValue SelectBridge::ResetSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
809 {
810 EcmaVM* vm = runtimeCallInfo->GetVM();
811 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
812 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
813 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
814 GetArkUINodeModifiers()->getSelectModifier()->resetSelectSize(nativeNode);
815 return panda::JSValueRef::Undefined(vm);
816 }
817
ConstructSelect(EcmaVM * vm,FrameNode * frameNode,MenuItemConfiguration & config)818 Local<panda::ObjectRef> SelectBridge::ConstructSelect(EcmaVM* vm, FrameNode* frameNode, MenuItemConfiguration& config)
819 {
820 RefPtr<Framework::JSSymbolGlyphModifier> selectSymbol =
821 AceType::DynamicCast<Framework::JSSymbolGlyphModifier>(config.symbolModifier_);
822 const char* keysOfSelect[] = { "value", "icon", "symbolIcon", "selected", "index", "triggerSelect",
823 "frameNodeId_"};
824 Local<JSValueRef> valuesOfSelect[] = { panda::StringRef::NewFromUtf8(vm, config.value_.c_str()),
825 panda::StringRef::NewFromUtf8(vm, config.icon_.c_str()),
826 selectSymbol->symbol_->GetLocalHandle(),
827 panda::BooleanRef::New(vm, config.selected_),
828 panda::NumberRef::New(vm, config.index_),
829 panda::FunctionRef::New(vm, JsSelectChangeCallback),
830 panda::NumberRef::New(vm, frameNode->GetId())};
831 return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfSelect), keysOfSelect, valuesOfSelect);
832 }
833
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)834 ArkUINativeModuleValue SelectBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
835 {
836 EcmaVM* vm = runtimeCallInfo->GetVM();
837 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
838 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
839 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
840 auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
841 if (!secondArg->IsObject(vm)) {
842 SelectModelNG::ResetBuilderFunc(frameNode);
843 return panda::JSValueRef::Undefined(vm);
844 }
845 panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
846 SelectModelNG::SetBuilderFunc(frameNode,
847 [vm, frameNode, obj = std::move(obj), containerId = Container::CurrentId()](
848 MenuItemConfiguration config) -> RefPtr<FrameNode> {
849 ContainerScope scope(containerId);
850 auto context = ArkTSUtils::GetContext(vm);
851 CHECK_EQUAL_RETURN(context->IsUndefined(), true, nullptr);
852 auto select = ConstructSelect(vm, frameNode, config);
853 select->SetNativePointerFieldCount(vm, 1);
854 select->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
855 panda::Local<panda::JSValueRef> params[] = { context, select };
856 LocalScope pandaScope(vm);
857 panda::TryCatch trycatch(vm);
858 auto jsObject = obj.ToLocal();
859 auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
860 CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
861 panda::Local<panda::FunctionRef> func = makeFunc;
862 auto result = func->Call(vm, jsObject, params, 2);
863 JSNApi::ExecutePendingJob(vm);
864 CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
865 auto resultObj = result->ToObject(vm);
866 panda::Local<panda::JSValueRef> nodeptr =
867 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, SELECT_NODEPTR_OF_UINODE));
868 CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
869 auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
870 CHECK_NULL_RETURN(frameNode, nullptr);
871 return AceType::Claim(frameNode);
872 });
873 return panda::JSValueRef::Undefined(vm);
874 }
875
SetMenuBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)876 ArkUINativeModuleValue SelectBridge::SetMenuBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
877 {
878 EcmaVM* vm = runtimeCallInfo->GetVM();
879 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
880 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
881 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
882 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
883 Color color;
884 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
885 return ResetMenuBackgroundColor(runtimeCallInfo);
886 }
887 GetArkUINodeModifiers()->getSelectModifier()->setMenuBgColor(nativeNode, color.GetValue());
888 return panda::JSValueRef::Undefined(vm);
889 }
890
ResetMenuBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)891 ArkUINativeModuleValue SelectBridge::ResetMenuBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
892 {
893 EcmaVM* vm = runtimeCallInfo->GetVM();
894 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
895 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
896 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
897 GetArkUINodeModifiers()->getSelectModifier()->resetMenuBgColor(nativeNode);
898 return panda::JSValueRef::Undefined(vm);
899 }
900
SetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)901 ArkUINativeModuleValue SelectBridge::SetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
902 {
903 EcmaVM* vm = runtimeCallInfo->GetVM();
904 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
905 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
906 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(1);
907 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
908 if (styleArg->IsUndefined() || !styleArg->IsNumber()) {
909 return ResetMenuBackgroundBlurStyle(runtimeCallInfo);
910 }
911 int32_t styleVal = styleArg->Int32Value(vm);
912 GetArkUINodeModifiers()->getSelectModifier()->setMenuBgBlurStyle(nativeNode, styleVal);
913 return panda::JSValueRef::Undefined(vm);
914 }
915
ResetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)916 ArkUINativeModuleValue SelectBridge::ResetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
917 {
918 EcmaVM* vm = runtimeCallInfo->GetVM();
919 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
920 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
921 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
922 GetArkUINodeModifiers()->getSelectModifier()->resetMenuBgBlurStyle(nativeNode);
923 return panda::JSValueRef::Undefined(vm);
924 }
925
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)926 ArkUINativeModuleValue SelectBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
927 {
928 EcmaVM* vm = runtimeCallInfo->GetVM();
929 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
930 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
931 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
932 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(1);
933 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(2);
934 Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(3);
935 Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(4);
936 CalcDimension dividerStrokeWidth;
937 CalcDimension dividerStartMargin;
938 CalcDimension dividerEndMargin;
939 Color colorObj;
940 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
941 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
942 auto context = frameNode->GetContext();
943 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
944 auto themeManager = context->GetThemeManager();
945 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
946 auto selectTheme = themeManager->GetTheme<SelectTheme>();
947 CHECK_NULL_RETURN(selectTheme, panda::NativePointerRef::New(vm, nullptr));
948 if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth)) {
949 if (selectTheme) {
950 dividerStrokeWidth = selectTheme->GetDefaultDividerWidth();
951 } else {
952 dividerStrokeWidth = 0.0_vp;
953 }
954 }
955 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
956 if (selectTheme) {
957 colorObj = selectTheme->GetLineColor();
958 } else {
959 colorObj = Color::TRANSPARENT;
960 }
961 }
962 if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin)) {
963 dividerStartMargin = -1.0_vp;
964 }
965 if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin)) {
966 dividerEndMargin = -1.0_vp;
967 }
968 uint32_t size = ARG_GROUP_LENGTH;
969 ArkUI_Float32 values[size];
970 int32_t units[size];
971 PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
972 PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
973 GetArkUINodeModifiers()->getSelectModifier()->setSelectDivider(
974 nativeNode, colorObj.GetValue(), values, units, size);
975 return panda::JSValueRef::Undefined(vm);
976 }
977
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)978 ArkUINativeModuleValue SelectBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
979 {
980 EcmaVM* vm = runtimeCallInfo->GetVM();
981 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
982 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
983 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
984 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(NUM_1);
985 if (dividerStrokeWidthArgs->IsNull()) {
986 GetArkUINodeModifiers()->getSelectModifier()->resetSelectDividerNull(nativeNode);
987 } else {
988 GetArkUINodeModifiers()->getSelectModifier()->resetSelectDivider(nativeNode);
989 }
990 return panda::JSValueRef::Undefined(vm);
991 }
992
SetDividerStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)993 ArkUINativeModuleValue SelectBridge::SetDividerStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
994 {
995 EcmaVM* vm = runtimeCallInfo->GetVM();
996 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
997 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
998 Local<JSValueRef> strokeWidthArg = runtimeCallInfo->GetCallArgRef(NUM_1);
999 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1000 Local<JSValueRef> startMarginArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1001 Local<JSValueRef> endMarginArg = runtimeCallInfo->GetCallArgRef(NUM_4);
1002 Local<JSValueRef> modeArg = runtimeCallInfo->GetCallArgRef(NUM_5);
1003 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1004 if (strokeWidthArg->IsUndefined() && colorArg->IsUndefined() && startMarginArg->IsUndefined()
1005 && endMarginArg->IsUndefined() && modeArg->IsUndefined()) {
1006 GetArkUINodeModifiers()->getSelectModifier()->resetSelectDividerStyle(nativeNode);
1007 return panda::JSValueRef::Undefined(vm);
1008 }
1009 auto dividerOptions = BuildSelectDividerStyleOptions(vm, strokeWidthArg, startMarginArg, endMarginArg);
1010 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1011 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1012 auto context = frameNode->GetContext();
1013 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
1014 auto themeManager = context->GetThemeManager();
1015 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
1016 auto selectTheme = themeManager->GetTheme<SelectTheme>();
1017 CHECK_NULL_RETURN(selectTheme, panda::NativePointerRef::New(vm, nullptr));
1018 if (dividerOptions.strokeWidth.units == static_cast<int32_t>(DimensionUnit::INVALID)) {
1019 auto themeDividerStrokeWidth = selectTheme->GetDefaultDividerWidth();
1020 dividerOptions.strokeWidth.value = themeDividerStrokeWidth.Value();
1021 dividerOptions.strokeWidth.units = static_cast<int32_t>(themeDividerStrokeWidth.Unit());
1022 }
1023 if (dividerOptions.startMargin.units == static_cast<int32_t>(DimensionUnit::INVALID)) {
1024 dividerOptions.startMargin.value = -1.0;
1025 dividerOptions.startMargin.units = static_cast<int32_t>(DimensionUnit::VP);
1026 }
1027 if (dividerOptions.endMargin.units == static_cast<int32_t>(DimensionUnit::INVALID)) {
1028 dividerOptions.endMargin.value = -1.0;
1029 dividerOptions.endMargin.units = static_cast<int32_t>(DimensionUnit::VP);
1030 }
1031 Color color;
1032 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
1033 color = selectTheme->GetLineColor();
1034 }
1035 dividerOptions.color = color.GetValue();
1036 int32_t mode = 0;
1037 if (modeArg->IsNumber()) {
1038 mode = modeArg->Int32Value(vm);
1039 }
1040 dividerOptions.mode = mode;
1041 GetArkUINodeModifiers()->getSelectModifier()->setSelectDividerStyle(nativeNode, ÷rOptions);
1042 return panda::JSValueRef::Undefined(vm);
1043 }
1044
ResetDividerStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1045 ArkUINativeModuleValue SelectBridge::ResetDividerStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
1046 {
1047 EcmaVM* vm = runtimeCallInfo->GetVM();
1048 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1049 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1050 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1051 GetArkUINodeModifiers()->getSelectModifier()->resetSelectDividerStyle(nativeNode);
1052 return panda::JSValueRef::Undefined(vm);
1053 }
1054
ParseValues(const EcmaVM * vm,const Local<JSValueRef> & jsValue)1055 static std::string ParseValues(const EcmaVM* vm, const Local<JSValueRef>& jsValue)
1056 {
1057 std::string result;
1058 ArkTSUtils::ParseJsString(vm, jsValue, result);
1059 return result;
1060 }
1061
SetOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1062 ArkUINativeModuleValue SelectBridge::SetOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1063 {
1064 EcmaVM* vm = runtimeCallInfo->GetVM();
1065 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1066 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1067 Local<JSValueRef> valuesArg = runtimeCallInfo->GetCallArgRef(1);
1068 Local<JSValueRef> iconsArg = runtimeCallInfo->GetCallArgRef(2);
1069 Local<JSValueRef> symbolIconArg = runtimeCallInfo->GetCallArgRef(3);
1070 Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(4);
1071 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1072 auto length = lengthArg->Uint32Value(vm);
1073 auto valueArray = std::make_unique<std::string[]>(length);
1074 auto iconArray = std::make_unique<std::string[]>(length);
1075 auto selectParamArray = std::make_unique<SelectParam[]>(length);
1076
1077 bool valueParseResult = ArkTSUtils::ParseArray<std::string>(vm, valuesArg, valueArray.get(), length, ParseValues);
1078 bool iconParseResult = ArkTSUtils::ParseArray<std::string>(
1079 vm, iconsArg, iconArray.get(), length, [](const EcmaVM* vm, const Local<JSValueRef>& jsValue) {
1080 std::string result;
1081 ArkTSUtils::ParseJsMedia(vm, jsValue, result);
1082 return result;
1083 });
1084 bool symbolIconParseResult = ArkTSUtils::ParseArray<SelectParam>(
1085 vm, symbolIconArg, selectParamArray.get(), length, [runtimeCallInfo](const EcmaVM* vm,
1086 const Local<JSValueRef>& jsValue) {
1087 auto selectSymbol = AceType::MakeRefPtr<Framework::JSSymbolGlyphModifier>();
1088 auto jsRefValue = Framework::JSRef<Framework::JsiValue>(Framework::JsiValue(jsValue));
1089 selectSymbol->symbol_ = jsRefValue;
1090 std::function<void(WeakPtr<NG::FrameNode>)> symbolIcoResult;
1091 RefPtr<SymbolModifier> symbolModifier;
1092 if (jsValue->IsObject(vm)) {
1093 std::function<void(WeakPtr<NG::FrameNode>)> symbolApply = nullptr;
1094 Framework::JSViewAbstract::SetSymbolOptionApply(runtimeCallInfo, symbolApply, jsRefValue);
1095 symbolIcoResult = symbolApply;
1096 }
1097 return SelectParam{.symbolIcon=symbolIcoResult, .symbolModifier= selectSymbol};
1098 });
1099 std::vector<SelectParam> params(length);
1100 if (valueParseResult && iconParseResult && symbolIconParseResult) {
1101 for (uint32_t i = 0; i < length; i++) {
1102 params[i].text = valueArray[i];
1103 params[i].symbolModifier = selectParamArray[i].symbolModifier;
1104 params[i].symbolIcon = selectParamArray[i].symbolIcon;
1105 if (!(selectParamArray[i].symbolIcon)) {
1106 params[i].icon = iconArray[i];
1107 }
1108 }
1109 }
1110 SelectModelNG::InitSelect(reinterpret_cast<FrameNode*>(nativeNode), params);
1111 return panda::JSValueRef::Undefined(vm);
1112 }
1113
SetSelectDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)1114 ArkUINativeModuleValue SelectBridge::SetSelectDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
1115 {
1116 EcmaVM* vm = runtimeCallInfo->GetVM();
1117 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1118 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1119 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1120 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1121 std::string dir;
1122 int32_t direction = NUM_3;
1123 if (secondArg->IsString(vm)) {
1124 dir = secondArg->ToString(vm)->ToString(vm);
1125 if (dir == "Ltr") {
1126 direction = NUM_0;
1127 } else if (dir == "Rtl") {
1128 direction = NUM_1;
1129 } else if (dir == "Auto") {
1130 direction = NUM_3;
1131 }
1132 }
1133 GetArkUINodeModifiers()->getSelectModifier()->setSelectDirection(nativeNode, direction);
1134 return panda::JSValueRef::Undefined(vm);
1135 }
1136
ResetSelectDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)1137 ArkUINativeModuleValue SelectBridge::ResetSelectDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
1138 {
1139 EcmaVM* vm = runtimeCallInfo->GetVM();
1140 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1141 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1142 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1143 GetArkUINodeModifiers()->getSelectModifier()->resetSelectDirection(nativeNode);
1144 return panda::JSValueRef::Undefined(vm);
1145 }
1146 } // namespace OHOS::Ace::NG