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