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 const int32_t SIZE_OF_TWO = 2;
25 const std::string FORMAT_FONT = "%s|%s|%s";
26 const std::string DEFAULT_STR = "-1";
27 const char* SELECT_NODEPTR_OF_UINODE = "nodePtr_";
28
29 constexpr int32_t ARG_GROUP_LENGTH = 3;
ParseDividerDimension(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & valueDim)30 bool ParseDividerDimension(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& valueDim)
31 {
32 return !ArkTSUtils::ParseJsDimensionVpNG(vm, value, valueDim, false) || LessNotEqual(valueDim.Value(), 0.0f) ||
33 (valueDim.Unit() != DimensionUnit::PX && valueDim.Unit() != DimensionUnit::VP &&
34 valueDim.Unit() != DimensionUnit::LPX && valueDim.Unit() != DimensionUnit::FP);
35 }
36
PopulateValues(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,ArkUI_Float32 values[],uint32_t size)37 void PopulateValues(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
38 const CalcDimension& dividerEndMargin, ArkUI_Float32 values[], uint32_t size)
39 {
40 values[0] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
41 values[1] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
42 values[2] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
43 }
44
PopulateUnits(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,int32_t units[],uint32_t size)45 void PopulateUnits(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
46 const CalcDimension& dividerEndMargin, int32_t units[], uint32_t size)
47 {
48 units[0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
49 units[1] = static_cast<int32_t>(dividerStartMargin.Unit());
50 units[2] = static_cast<int32_t>(dividerEndMargin.Unit());
51 }
52 } // namespace
53
JsSelectChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)54 panda::Local<panda::JSValueRef> JsSelectChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
55 {
56 auto vm = runtimeCallInfo->GetVM();
57 auto firstArg = runtimeCallInfo->GetCallArgRef(0);
58 auto secondArg = runtimeCallInfo->GetCallArgRef(1);
59 if (!firstArg->IsNumber()) {
60 return panda::JSValueRef::Undefined(vm);
61 }
62 auto index = firstArg->ToNumber(vm)->Value();
63 auto value = secondArg->ToString(vm)->ToString(vm);
64 auto ref = runtimeCallInfo->GetThisRef();
65 auto obj = ref->ToObject(vm);
66 FrameNode* frameNode = nullptr;
67 if (obj->GetNativePointerFieldCount(vm) < 1) {
68 if (!ref->IsProxy(vm)) {
69 return panda::JSValueRef::Undefined(vm);
70 }
71 auto frameNodeIdValue = obj->Get(vm, "frameNodeId_");
72 CHECK_EQUAL_RETURN(
73 frameNodeIdValue.IsEmpty() || frameNodeIdValue->IsNull(), true, panda::JSValueRef::Undefined(vm));
74 auto frameNodeId = frameNodeIdValue->Int32Value(vm);
75 frameNode = ElementRegister::GetInstance()->GetFrameNodePtrById(frameNodeId);
76 } else {
77 frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
78 }
79 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
80 SelectModelNG::SetChangeValue(frameNode, index, value);
81 return panda::JSValueRef::Undefined(vm);
82 }
83
SetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)84 ArkUINativeModuleValue SelectBridge::SelectBridge::SetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
85 {
86 EcmaVM* vm = runtimeCallInfo->GetVM();
87 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
88 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
89 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
90 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
91 auto pipeline = PipelineBase::GetCurrentContext();
92 CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
93 auto selectTheme = pipeline->GetTheme<SelectTheme>();
94 CHECK_NULL_RETURN(selectTheme, panda::NativePointerRef::New(vm, nullptr));
95
96 CalcDimension space;
97 if (!ArkTSUtils::ParseJsDimensionVp(vm, secondArg, space)) {
98 space = selectTheme->GetContentSpinnerPadding();
99 }
100 if (LessNotEqual(space.Value(), 0.0) || space.Unit() == DimensionUnit::PERCENT) {
101 space = selectTheme->GetContentSpinnerPadding();
102 }
103
104 GetArkUINodeModifiers()->getSelectModifier()->setSpace(
105 nativeNode, space.Value(), static_cast<int32_t>(space.Unit()));
106 return panda::JSValueRef::Undefined(vm);
107 }
108
SetValue(ArkUIRuntimeCallInfo * runtimeCallInfo)109 ArkUINativeModuleValue SelectBridge::SetValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
110 {
111 EcmaVM* vm = runtimeCallInfo->GetVM();
112 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
113 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
114 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
115 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
116 std::string value;
117 ArkTSUtils::ParseJsString(vm, secondArg, value);
118 GetArkUINodeModifiers()->getSelectModifier()->setValue(nativeNode, value.c_str());
119 return panda::JSValueRef::Undefined(vm);
120 }
121
SetSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)122 ArkUINativeModuleValue SelectBridge::SetSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
123 {
124 EcmaVM* vm = runtimeCallInfo->GetVM();
125 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
126 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
127 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
128 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
129 int32_t value = 0;
130 if (ArkTSUtils::ParseJsIntegerWithResource(vm, secondArg, value)) {
131 GetArkUINodeModifiers()->getSelectModifier()->setSelected(nativeNode, value);
132 } else {
133 GetArkUINodeModifiers()->getSelectModifier()->resetSelected(nativeNode);
134 }
135 return panda::JSValueRef::Undefined(vm);
136 }
137
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)138 ArkUINativeModuleValue SelectBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
139 {
140 EcmaVM* vm = runtimeCallInfo->GetVM();
141 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
142 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
143 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
144 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
145
146 Color fontColor;
147 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, fontColor)) {
148 return ResetFontColor(runtimeCallInfo);
149 }
150 GetArkUINodeModifiers()->getSelectModifier()->setSelectFontColor(nativeNode, fontColor.GetValue());
151 return panda::JSValueRef::Undefined(vm);
152 }
153
SetSelectedOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue SelectBridge::SetSelectedOptionBgColor(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> colorArg = runtimeCallInfo->GetCallArgRef(1);
160 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
161
162 Color selectedOptionBgColor;
163 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, selectedOptionBgColor)) {
164 return ResetSelectedOptionBgColor(runtimeCallInfo);
165 }
166
167 GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionBgColor(
168 nativeNode, selectedOptionBgColor.GetValue());
169 return panda::JSValueRef::Undefined(vm);
170 }
171
SetOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)172 ArkUINativeModuleValue SelectBridge::SetOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
173 {
174 EcmaVM* vm = runtimeCallInfo->GetVM();
175 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
176 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
177 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
178 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
179
180 Color optionBgColor;
181 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionBgColor)) {
182 return ResetOptionBgColor(runtimeCallInfo);
183 }
184 GetArkUINodeModifiers()->getSelectModifier()->setOptionBgColor(nativeNode, optionBgColor.GetValue());
185 return panda::JSValueRef::Undefined(vm);
186 }
187
SetOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)188 ArkUINativeModuleValue SelectBridge::SetOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
189 {
190 EcmaVM* vm = runtimeCallInfo->GetVM();
191 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
192 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
193 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
194 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
195
196 Color optionFontColor;
197 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionFontColor)) {
198 return ResetOptionFontColor(runtimeCallInfo);
199 }
200 GetArkUINodeModifiers()->getSelectModifier()->setOptionFontColor(nativeNode, optionFontColor.GetValue());
201 return panda::JSValueRef::Undefined(vm);
202 }
203
SetSelectedOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)204 ArkUINativeModuleValue SelectBridge::SetSelectedOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
205 {
206 EcmaVM* vm = runtimeCallInfo->GetVM();
207 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
208 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
209 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
210 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
211 Color optionFontColor;
212 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionFontColor)) {
213 return ResetSelectedOptionFontColor(runtimeCallInfo);
214 }
215 GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionFontColor(nativeNode, optionFontColor.GetValue());
216 return panda::JSValueRef::Undefined(vm);
217 }
218
SetArrowPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)219 ArkUINativeModuleValue SelectBridge::SelectBridge::SetArrowPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
220 {
221 EcmaVM* vm = runtimeCallInfo->GetVM();
222 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
223 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
224 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
225 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
226 int32_t arrowPosition = secondArg->Int32Value(vm);
227 GetArkUINodeModifiers()->getSelectModifier()->setArrowPosition(nativeNode, arrowPosition);
228 return panda::JSValueRef::Undefined(vm);
229 }
230
SetMenuAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)231 ArkUINativeModuleValue SelectBridge::SetMenuAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
232 {
233 EcmaVM* vm = runtimeCallInfo->GetVM();
234 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
235 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
236 Local<JSValueRef> alignTypeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of alignType
237 Local<JSValueRef> offsetDx = runtimeCallInfo->GetCallArgRef(2); // 2: index of offset Dx
238 Local<JSValueRef> offsetDy = runtimeCallInfo->GetCallArgRef(3); // 3: index of offset Dy
239 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
240
241 int32_t alignType = 0;
242 if (alignTypeArg->IsNumber()) {
243 alignType = alignTypeArg->Int32Value(vm);
244 }
245
246 CalcDimension menuAlignOffsetDx = Dimension(0.0);
247 CalcDimension menuAlignOffsetDy = Dimension(0.0);
248 if (offsetDx->IsNull() || !ArkTSUtils::ParseJsDimensionVp(vm, offsetDx, menuAlignOffsetDx)) {
249 menuAlignOffsetDx = Dimension(0.0);
250 }
251
252 if (offsetDy->IsNull() || !ArkTSUtils::ParseJsDimensionVp(vm, offsetDy, menuAlignOffsetDy)) {
253 menuAlignOffsetDy = Dimension(0.0);
254 }
255
256 uint32_t size = SIZE_OF_TWO;
257 float values[size];
258 int32_t units[size];
259 values[0] = menuAlignOffsetDx.Value();
260 units[0] = static_cast<int32_t>(menuAlignOffsetDx.Unit());
261 values[1] = menuAlignOffsetDy.Value();
262 units[1] = static_cast<int32_t>(menuAlignOffsetDy.Unit());
263 GetArkUINodeModifiers()->getSelectModifier()->setMenuAlign(nativeNode, alignType, values, units, SIZE_OF_TWO);
264 return panda::JSValueRef::Undefined(vm);
265 }
266
SetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)267 ArkUINativeModuleValue SelectBridge::SetFont(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> fontSizeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of font size value
273 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
274 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
275 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4); // 4: index of font style value
276 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
277
278 std::string fontSizeStr = DEFAULT_STR;
279 CalcDimension fontSize;
280 if (!fontSizeArg->IsNull() && !fontSizeArg->IsUndefined() &&
281 ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
282 fontSizeStr = fontSize.ToString();
283 }
284
285 std::string fontWeight = DEFAULT_STR;
286 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
287 if (fontWeightArg->IsNumber()) {
288 fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
289 } else {
290 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
291 fontWeight = DEFAULT_STR;
292 }
293 }
294 }
295 std::string fontFamily;
296 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
297 fontFamily = DEFAULT_STR;
298 }
299 int32_t styleVal = 0;
300 if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
301 styleVal = styleArg->Int32Value(vm);
302 }
303
304 std::string fontInfo =
305 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
306
307 GetArkUINodeModifiers()->getSelectModifier()->setFont(nativeNode, fontInfo.c_str(), styleVal);
308 return panda::JSValueRef::Undefined(vm);
309 }
310
SetOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)311 ArkUINativeModuleValue SelectBridge::SetOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
312 {
313 EcmaVM* vm = runtimeCallInfo->GetVM();
314 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
315 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
316 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of font size value
317 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
318 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
319 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4); // 4: index of font style value
320 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
321 auto pipeline = PipelineBase::GetCurrentContext();
322 CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
323 auto selectTheme = pipeline->GetTheme<SelectTheme>();
324
325 CalcDimension fontSize;
326 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined() ||
327 !ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
328 fontSize = selectTheme->GetMenuFontSize();
329 }
330
331 std::string fontWeight = DEFAULT_STR;
332 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
333 if (fontWeightArg->IsNumber()) {
334 fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
335 } else {
336 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
337 fontWeight = DEFAULT_STR;
338 }
339 }
340 }
341 std::string fontFamily;
342 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
343 fontFamily = DEFAULT_STR;
344 }
345 int32_t styleVal = 0;
346 if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
347 styleVal = styleArg->Int32Value(vm);
348 }
349 std::string fontSizeStr = fontSize.ToString();
350 std::string fontInfo =
351 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
352
353 GetArkUINodeModifiers()->getSelectModifier()->setOptionFont(nativeNode, fontInfo.c_str(), styleVal);
354 return panda::JSValueRef::Undefined(vm);
355 }
356
SetSelectedOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)357 ArkUINativeModuleValue SelectBridge::SetSelectedOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
358 {
359 EcmaVM* vm = runtimeCallInfo->GetVM();
360 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
361 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
362 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of font size value
363 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
364 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
365 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4); // 4: index of font style value
366 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
367
368 auto pipeline = PipelineBase::GetCurrentContext();
369 CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
370 auto selectTheme = pipeline->GetTheme<SelectTheme>();
371
372 CalcDimension fontSize;
373 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined() ||
374 !ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
375 fontSize = selectTheme->GetFontSize();
376 }
377
378 std::string fontWeight = DEFAULT_STR;
379 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
380 if (fontWeightArg->IsNumber()) {
381 fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
382 } else {
383 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
384 fontWeight = DEFAULT_STR;
385 }
386 }
387 }
388 std::string fontFamily;
389 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
390 fontFamily = DEFAULT_STR;
391 }
392 int32_t styleVal = 0;
393 if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
394 styleVal = styleArg->Int32Value(vm);
395 }
396 std::string fontSizeStr = fontSize.ToString();
397 std::string fontInfo =
398 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
399
400 GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionFont(nativeNode, fontInfo.c_str(), styleVal);
401 return panda::JSValueRef::Undefined(vm);
402 }
403
ResetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)404 ArkUINativeModuleValue SelectBridge::ResetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
405 {
406 EcmaVM* vm = runtimeCallInfo->GetVM();
407 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
408 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
409 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
410 GetArkUINodeModifiers()->getSelectModifier()->resetSpace(nativeNode);
411 return panda::JSValueRef::Undefined(vm);
412 }
413
ResetValue(ArkUIRuntimeCallInfo * runtimeCallInfo)414 ArkUINativeModuleValue SelectBridge::ResetValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
415 {
416 EcmaVM* vm = runtimeCallInfo->GetVM();
417 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
418 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
419 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
420 GetArkUINodeModifiers()->getSelectModifier()->resetValue(nativeNode);
421 return panda::JSValueRef::Undefined(vm);
422 }
423
ResetSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)424 ArkUINativeModuleValue SelectBridge::ResetSelected(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 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
430 GetArkUINodeModifiers()->getSelectModifier()->resetSelected(nativeNode);
431 return panda::JSValueRef::Undefined(vm);
432 }
433
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)434 ArkUINativeModuleValue SelectBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
435 {
436 EcmaVM* vm = runtimeCallInfo->GetVM();
437 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
438 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
439 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
440 GetArkUINodeModifiers()->getSelectModifier()->resetSelectFontColor(nativeNode);
441 return panda::JSValueRef::Undefined(vm);
442 }
443
ResetSelectedOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)444 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
445 {
446 EcmaVM* vm = runtimeCallInfo->GetVM();
447 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
448 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
449 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
450 GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionBgColor(nativeNode);
451 return panda::JSValueRef::Undefined(vm);
452 }
453
ResetOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)454 ArkUINativeModuleValue SelectBridge::ResetOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
455 {
456 EcmaVM* vm = runtimeCallInfo->GetVM();
457 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
458 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
459 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
460 GetArkUINodeModifiers()->getSelectModifier()->resetOptionBgColor(nativeNode);
461 return panda::JSValueRef::Undefined(vm);
462 }
463
ResetOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)464 ArkUINativeModuleValue SelectBridge::ResetOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
465 {
466 EcmaVM* vm = runtimeCallInfo->GetVM();
467 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
468 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
469 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
470 GetArkUINodeModifiers()->getSelectModifier()->resetOptionFontColor(nativeNode);
471 return panda::JSValueRef::Undefined(vm);
472 }
473
ResetSelectedOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)474 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
475 {
476 EcmaVM* vm = runtimeCallInfo->GetVM();
477 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
478 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
479 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
480 GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionFontColor(nativeNode);
481 return panda::JSValueRef::Undefined(vm);
482 }
483
ResetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)484 ArkUINativeModuleValue SelectBridge::ResetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
485 {
486 EcmaVM* vm = runtimeCallInfo->GetVM();
487 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
488 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
489 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
490 GetArkUINodeModifiers()->getSelectModifier()->resetFont(nativeNode);
491 return panda::JSValueRef::Undefined(vm);
492 }
493
ResetOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)494 ArkUINativeModuleValue SelectBridge::ResetOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
495 {
496 EcmaVM* vm = runtimeCallInfo->GetVM();
497 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
498 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
499 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
500 GetArkUINodeModifiers()->getSelectModifier()->resetOptionFont(nativeNode);
501 return panda::JSValueRef::Undefined(vm);
502 }
503
ResetSelectedOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)504 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
505 {
506 EcmaVM* vm = runtimeCallInfo->GetVM();
507 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
508 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
509 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
510 GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionFont(nativeNode);
511 return panda::JSValueRef::Undefined(vm);
512 }
513
ResetMenuAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)514 ArkUINativeModuleValue SelectBridge::ResetMenuAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
515 {
516 EcmaVM* vm = runtimeCallInfo->GetVM();
517 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
518 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
519 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
520 GetArkUINodeModifiers()->getSelectModifier()->resetMenuAlign(nativeNode);
521 return panda::JSValueRef::Undefined(vm);
522 }
523
ResetArrowPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)524 ArkUINativeModuleValue SelectBridge::ResetArrowPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
525 {
526 EcmaVM* vm = runtimeCallInfo->GetVM();
527 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
528 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
529 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
530 GetArkUINodeModifiers()->getSelectModifier()->resetArrowPosition(nativeNode);
531 return panda::JSValueRef::Undefined(vm);
532 }
533
SetOptionWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)534 ArkUINativeModuleValue SelectBridge::SetOptionWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
535 {
536 EcmaVM* vm = runtimeCallInfo->GetVM();
537 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
538 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
539 Local<JSValueRef> optionWidthArg = runtimeCallInfo->GetCallArgRef(1);
540 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
541 CalcDimension width;
542 if (optionWidthArg->IsString(vm)) {
543 std::string modeFlag = optionWidthArg->ToString(vm)->ToString(vm);
544 if (modeFlag.compare("fit_content") == 0) {
545 GetArkUINodeModifiers()->getSelectModifier()->setOptionWidthFitTrigger(nativeNode, false);
546 return panda::JSValueRef::Undefined(vm);
547 } else if (modeFlag.compare("fit_trigger") == 0) {
548 GetArkUINodeModifiers()->getSelectModifier()->setOptionWidthFitTrigger(nativeNode, true);
549 return panda::JSValueRef::Undefined(vm);
550 } else if (ArkTSUtils::IsPercentStr(modeFlag)) {
551 return panda::JSValueRef::Undefined(vm);
552 } else {
553 ArkTSUtils::ParseJsDimensionVpNG(vm, optionWidthArg, width, false);
554 if (width.IsNegative()) {
555 width.Reset();
556 }
557 }
558 } else {
559 ArkTSUtils::ParseJsDimensionVpNG(vm, optionWidthArg, width, false);
560 if (width.IsNegative()) {
561 width.Reset();
562 }
563 }
564
565 GetArkUINodeModifiers()->getSelectModifier()->setSelectOptionWidth(
566 nativeNode, width.Value(), static_cast<int32_t>(width.Unit()));
567 return panda::JSValueRef::Undefined(vm);
568 }
569
ResetOptionWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)570 ArkUINativeModuleValue SelectBridge::ResetOptionWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
571 {
572 EcmaVM* vm = runtimeCallInfo->GetVM();
573 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
574 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
575 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
576 GetArkUINodeModifiers()->getSelectModifier()->resetSelectOptionWidth(nativeNode);
577 return panda::JSValueRef::Undefined(vm);
578 }
579
SetOptionHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)580 ArkUINativeModuleValue SelectBridge::SetOptionHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
581 {
582 EcmaVM* vm = runtimeCallInfo->GetVM();
583 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
584 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
585 Local<JSValueRef> optionHeightArg = runtimeCallInfo->GetCallArgRef(1);
586 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
587 CalcDimension height;
588 if (optionHeightArg->IsString(vm)) {
589 std::string modeFlag = optionHeightArg->ToString(vm)->ToString(vm);
590 if (ArkTSUtils::IsPercentStr(modeFlag)) {
591 return panda::JSValueRef::Undefined(vm);
592 }
593 }
594
595 ArkTSUtils::ParseJsDimensionVpNG(vm, optionHeightArg, height, false);
596 if (height.IsNegative()) {
597 return panda::JSValueRef::Undefined(vm);
598 }
599 if (NEAR_ZERO(height.Value())) {
600 return panda::JSValueRef::Undefined(vm);
601 }
602
603 GetArkUINodeModifiers()->getSelectModifier()->setSelectOptionHeight(
604 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
605 return panda::JSValueRef::Undefined(vm);
606 }
607
ResetOptionHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)608 ArkUINativeModuleValue SelectBridge::ResetOptionHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
609 {
610 EcmaVM* vm = runtimeCallInfo->GetVM();
611 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
612 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
613 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
614 GetArkUINodeModifiers()->getSelectModifier()->resetSelectOptionHeight(nativeNode);
615 return panda::JSValueRef::Undefined(vm);
616 }
617
SetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)618 ArkUINativeModuleValue SelectBridge::SetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
619 {
620 EcmaVM* vm = runtimeCallInfo->GetVM();
621 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
622 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
623 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);
624 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
625 CalcDimension width;
626 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
627 GetArkUINodeModifiers()->getSelectModifier()->resetSelectWidth(nativeNode);
628 return panda::JSValueRef::Undefined(vm);
629 }
630 if (LessNotEqual(width.Value(), 0.0)) {
631 width.SetValue(0.0);
632 }
633 std::string widthCalc = width.CalcValue();
634 GetArkUINodeModifiers()->getSelectModifier()->setSelectWidth(
635 nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
636 return panda::JSValueRef::Undefined(vm);
637 }
638
ResetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)639 ArkUINativeModuleValue SelectBridge::ResetWidth(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()->resetSelectWidth(nativeNode);
646 return panda::JSValueRef::Undefined(vm);
647 }
648
SetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)649 ArkUINativeModuleValue SelectBridge::SetHeight(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> heightArg = runtimeCallInfo->GetCallArgRef(1);
655 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
656 CalcDimension height;
657 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
658 GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
659 return panda::JSValueRef::Undefined(vm);
660 }
661 if (LessNotEqual(height.Value(), 0.0)) {
662 height.SetValue(0.0);
663 }
664 std::string heightCalc = height.CalcValue();
665 GetArkUINodeModifiers()->getSelectModifier()->setSelectHeight(
666 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
667 return panda::JSValueRef::Undefined(vm);
668 }
669
ResetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)670 ArkUINativeModuleValue SelectBridge::ResetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
671 {
672 EcmaVM* vm = runtimeCallInfo->GetVM();
673 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
674 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
675 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
676 GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
677 return panda::JSValueRef::Undefined(vm);
678 }
679
SetSize(ArkUIRuntimeCallInfo * runtimeCallInfo)680 ArkUINativeModuleValue SelectBridge::SetSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
681 {
682 EcmaVM* vm = runtimeCallInfo->GetVM();
683 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
684 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
685 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of width value
686 Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of heigth value
687 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
688 CalcDimension width;
689 CalcDimension height;
690 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
691 GetArkUINodeModifiers()->getSelectModifier()->resetSelectWidth(nativeNode);
692 } else {
693 std::string widthCalc = width.CalcValue();
694 if (LessNotEqual(width.Value(), 0.0)) {
695 width.SetValue(0.0);
696 }
697 GetArkUINodeModifiers()->getSelectModifier()->setSelectWidth(
698 nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
699 }
700 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
701 GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
702 } else {
703 std::string heightCalc = height.CalcValue();
704 if (LessNotEqual(height.Value(), 0.0)) {
705 height.SetValue(0.0);
706 }
707 GetArkUINodeModifiers()->getSelectModifier()->setSelectHeight(
708 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
709 }
710 return panda::JSValueRef::Undefined(vm);
711 }
712
SetControlSize(ArkUIRuntimeCallInfo * runtimeCallInfo)713 ArkUINativeModuleValue SelectBridge::SetControlSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
714 {
715 EcmaVM* vm = runtimeCallInfo->GetVM();
716 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
717 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
718 Local<JSValueRef> controlSizeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of width value
719 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
720 auto controlSize = controlSizeArg->Int32Value(vm);
721 if (!ArkTSUtils::ParseJsInteger(vm, controlSizeArg, controlSize)) {
722 GetArkUINodeModifiers()->getSelectModifier()->resetControlSize(nativeNode);
723 } else {
724 GetArkUINodeModifiers()->getSelectModifier()->setControlSize(nativeNode, controlSize);
725 }
726 return panda::JSValueRef::Undefined(vm);
727 }
728
ResetControlSize(ArkUIRuntimeCallInfo * runtimeCallInfo)729 ArkUINativeModuleValue SelectBridge::ResetControlSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
730 {
731 EcmaVM* vm = runtimeCallInfo->GetVM();
732 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
733 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
734 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
735 GetArkUINodeModifiers()->getSelectModifier()->resetControlSize(nativeNode);
736 return panda::JSValueRef::Undefined(vm);
737 }
738
ResetSize(ArkUIRuntimeCallInfo * runtimeCallInfo)739 ArkUINativeModuleValue SelectBridge::ResetSize(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()->resetSelectSize(nativeNode);
746 return panda::JSValueRef::Undefined(vm);
747 }
748
ConstructSelect(EcmaVM * vm,FrameNode * frameNode,MenuItemConfiguration & config)749 Local<panda::ObjectRef> SelectBridge::ConstructSelect(EcmaVM* vm, FrameNode* frameNode, MenuItemConfiguration& config)
750 {
751 RefPtr<Framework::JSSymbolGlyphModifier> selectSymbol =
752 AceType::DynamicCast<Framework::JSSymbolGlyphModifier>(config.symbolModifier_);
753 const char* keysOfSelect[] = { "value", "icon", "symbolIcon", "selected", "index", "triggerSelect",
754 "frameNodeId_"};
755 Local<JSValueRef> valuesOfSelect[] = { panda::StringRef::NewFromUtf8(vm, config.value_.c_str()),
756 panda::StringRef::NewFromUtf8(vm, config.icon_.c_str()),
757 selectSymbol->symbol_->GetLocalHandle(),
758 panda::BooleanRef::New(vm, config.selected_),
759 panda::NumberRef::New(vm, config.index_),
760 panda::FunctionRef::New(vm, JsSelectChangeCallback),
761 panda::NumberRef::New(vm, frameNode->GetId())};
762 return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfSelect), keysOfSelect, valuesOfSelect);
763 }
764
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)765 ArkUINativeModuleValue SelectBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
766 {
767 EcmaVM* vm = runtimeCallInfo->GetVM();
768 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
769 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
770 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
771 auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
772 if (!secondArg->IsObject(vm)) {
773 SelectModelNG::ResetBuilderFunc(frameNode);
774 return panda::JSValueRef::Undefined(vm);
775 }
776 panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
777 SelectModelNG::SetBuilderFunc(frameNode,
778 [vm, frameNode, obj = std::move(obj), containerId = Container::CurrentId()](
779 MenuItemConfiguration config) -> RefPtr<FrameNode> {
780 ContainerScope scope(containerId);
781 auto context = ArkTSUtils::GetContext(vm);
782 CHECK_EQUAL_RETURN(context->IsUndefined(), true, nullptr);
783 auto select = ConstructSelect(vm, frameNode, config);
784 select->SetNativePointerFieldCount(vm, 1);
785 select->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
786 panda::Local<panda::JSValueRef> params[] = { context, select };
787 LocalScope pandaScope(vm);
788 panda::TryCatch trycatch(vm);
789 auto jsObject = obj.ToLocal();
790 auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
791 CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
792 panda::Local<panda::FunctionRef> func = makeFunc;
793 auto result = func->Call(vm, jsObject, params, 2);
794 JSNApi::ExecutePendingJob(vm);
795 CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
796 auto resultObj = result->ToObject(vm);
797 panda::Local<panda::JSValueRef> nodeptr =
798 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, SELECT_NODEPTR_OF_UINODE));
799 CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
800 auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
801 CHECK_NULL_RETURN(frameNode, nullptr);
802 return AceType::Claim(frameNode);
803 });
804 return panda::JSValueRef::Undefined(vm);
805 }
806
SetMenuBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)807 ArkUINativeModuleValue SelectBridge::SetMenuBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
808 {
809 EcmaVM* vm = runtimeCallInfo->GetVM();
810 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
811 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
812 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
813 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
814 Color color;
815 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
816 return ResetMenuBackgroundColor(runtimeCallInfo);
817 }
818 GetArkUINodeModifiers()->getSelectModifier()->setMenuBgColor(nativeNode, color.GetValue());
819 return panda::JSValueRef::Undefined(vm);
820 }
821
ResetMenuBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)822 ArkUINativeModuleValue SelectBridge::ResetMenuBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
823 {
824 EcmaVM* vm = runtimeCallInfo->GetVM();
825 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
826 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
827 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
828 GetArkUINodeModifiers()->getSelectModifier()->resetMenuBgColor(nativeNode);
829 return panda::JSValueRef::Undefined(vm);
830 }
831
SetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)832 ArkUINativeModuleValue SelectBridge::SetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
833 {
834 EcmaVM* vm = runtimeCallInfo->GetVM();
835 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
836 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
837 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(1);
838 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
839 if (styleArg->IsUndefined() || !styleArg->IsNumber()) {
840 return ResetMenuBackgroundBlurStyle(runtimeCallInfo);
841 }
842 int32_t styleVal = styleArg->Int32Value(vm);
843 GetArkUINodeModifiers()->getSelectModifier()->setMenuBgBlurStyle(nativeNode, styleVal);
844 return panda::JSValueRef::Undefined(vm);
845 }
846
ResetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)847 ArkUINativeModuleValue SelectBridge::ResetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
848 {
849 EcmaVM* vm = runtimeCallInfo->GetVM();
850 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
851 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
852 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
853 GetArkUINodeModifiers()->getSelectModifier()->resetMenuBgBlurStyle(nativeNode);
854 return panda::JSValueRef::Undefined(vm);
855 }
856
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)857 ArkUINativeModuleValue SelectBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
858 {
859 EcmaVM* vm = runtimeCallInfo->GetVM();
860 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
861 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
862 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
863 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(1);
864 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(2);
865 Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(3);
866 Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(4);
867 CalcDimension dividerStrokeWidth;
868 CalcDimension dividerStartMargin;
869 CalcDimension dividerEndMargin;
870 Color colorObj;
871 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
872 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
873 auto context = frameNode->GetContext();
874 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
875 auto themeManager = context->GetThemeManager();
876 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
877 auto selectTheme = themeManager->GetTheme<SelectTheme>();
878 CHECK_NULL_RETURN(selectTheme, panda::NativePointerRef::New(vm, nullptr));
879 if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth)) {
880 if (selectTheme) {
881 dividerStrokeWidth = selectTheme->GetDefaultDividerWidth();
882 } else {
883 dividerStrokeWidth = 0.0_vp;
884 }
885 }
886 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
887 if (selectTheme) {
888 colorObj = selectTheme->GetLineColor();
889 } else {
890 colorObj = Color::TRANSPARENT;
891 }
892 }
893 if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin)) {
894 dividerStartMargin = -1.0_vp;
895 }
896 if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin)) {
897 dividerEndMargin = -1.0_vp;
898 }
899 uint32_t size = ARG_GROUP_LENGTH;
900 ArkUI_Float32 values[size];
901 int32_t units[size];
902 PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
903 PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
904 GetArkUINodeModifiers()->getSelectModifier()->setSelectDivider(
905 nativeNode, colorObj.GetValue(), values, units, size);
906 return panda::JSValueRef::Undefined(vm);
907 }
908
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)909 ArkUINativeModuleValue SelectBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
910 {
911 EcmaVM* vm = runtimeCallInfo->GetVM();
912 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
913 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
914 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
915 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(1);
916 if (dividerStrokeWidthArgs->IsNull()) {
917 GetArkUINodeModifiers()->getSelectModifier()->resetSelectDividerNull(nativeNode);
918 } else {
919 GetArkUINodeModifiers()->getSelectModifier()->resetSelectDivider(nativeNode);
920 }
921 return panda::JSValueRef::Undefined(vm);
922 }
923 } // namespace OHOS::Ace::NG