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_radio_bridge.h"
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
17 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
18 #include "core/components/checkable/checkable_theme.h"
19 #include "core/components_ng/base/frame_node.h"
20 #include "core/components_ng/pattern/radio/radio_model_ng.h"
21
22 namespace OHOS::Ace::NG {
23 constexpr int NUM_0 = 0;
24 constexpr int NUM_1 = 1;
25 constexpr int NUM_2 = 2;
26 constexpr int NUM_3 = 3;
27 constexpr int NUM_4 = 4;
28 constexpr int PARAM_ARR_LENGTH_1 = 1;
29 const char* RADIO_BUILDER_NODEPTR_OF_UINODE = "nodePtr_";
JsRadioChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)30 panda::Local<panda::JSValueRef> JsRadioChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
31 {
32 auto vm = runtimeCallInfo->GetVM();
33 int32_t argc = static_cast<int32_t>(runtimeCallInfo->GetArgsNumber());
34 if (argc != NUM_1) {
35 return panda::JSValueRef::Undefined(vm);
36 }
37 auto firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
38 if (!firstArg->IsBoolean()) {
39 return panda::JSValueRef::Undefined(vm);
40 }
41 bool value = firstArg->ToBoolean(vm)->Value();
42 auto ref = runtimeCallInfo->GetThisRef();
43 auto obj = ref->ToObject(vm);
44 if (obj->GetNativePointerFieldCount(vm) < NUM_1) {
45 return panda::JSValueRef::Undefined(vm);
46 }
47 auto frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
48 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
49 RadioModelNG::SetChangeValue(frameNode, value);
50 return panda::JSValueRef::Undefined(vm);
51 }
52
SetRadioChecked(ArkUIRuntimeCallInfo * runtimeCallInfo)53 ArkUINativeModuleValue RadioBridge::SetRadioChecked(ArkUIRuntimeCallInfo* runtimeCallInfo)
54 {
55 EcmaVM* vm = runtimeCallInfo->GetVM();
56 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
57 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
58 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
59 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
60 bool isCheck = secondArg->ToBoolean(vm)->Value();
61 GetArkUINodeModifiers()->getRadioModifier()->setRadioChecked(nativeNode, isCheck);
62 return panda::JSValueRef::Undefined(vm);
63 }
64
ResetRadioChecked(ArkUIRuntimeCallInfo * runtimeCallInfo)65 ArkUINativeModuleValue RadioBridge::ResetRadioChecked(ArkUIRuntimeCallInfo* runtimeCallInfo)
66 {
67 EcmaVM* vm = runtimeCallInfo->GetVM();
68 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
69 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
70 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
71 GetArkUINodeModifiers()->getRadioModifier()->resetRadioChecked(nativeNode);
72 return panda::JSValueRef::Undefined(vm);
73 }
74
SetRadioStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)75 ArkUINativeModuleValue RadioBridge::SetRadioStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
76 {
77 EcmaVM* vm = runtimeCallInfo->GetVM();
78 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
79 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
80 Local<JSValueRef> checkedBackgroundColor = runtimeCallInfo->GetCallArgRef(NUM_1);
81 Local<JSValueRef> uncheckedBorderColor = runtimeCallInfo->GetCallArgRef(NUM_2);
82 Local<JSValueRef> indicatorColor = runtimeCallInfo->GetCallArgRef(NUM_3);
83 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
84
85 auto pipeline = PipelineBase::GetCurrentContext();
86 CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
87 auto radioTheme = pipeline->GetTheme<RadioTheme>();
88 CHECK_NULL_RETURN(radioTheme, panda::NativePointerRef::New(vm, nullptr));
89
90 Color checkedBackgroundColorVal;
91 RefPtr<ResourceObject> backgroundColorResObj;
92 RefPtr<ResourceObject> unBorderColorResObj;
93 RefPtr<ResourceObject> indicatorColorResObj;
94 ArkUIRadioColorStruct resObjStru;
95 bool jsBgColorSetByUser = false;
96 bool jsUnBorderColorSetByUser = false;
97 bool jsIndicatorColorSetByUser = false;
98 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
99
100 if (checkedBackgroundColor->IsNull() || checkedBackgroundColor->IsUndefined() ||
101 !ArkTSUtils::ParseJsColorAlpha(vm, checkedBackgroundColor, checkedBackgroundColorVal, backgroundColorResObj,
102 nodeInfo)) {
103 checkedBackgroundColorVal = radioTheme->GetActiveColor();
104 resObjStru.checkedBackgroundColor = nullptr;
105 } else {
106 jsBgColorSetByUser = true;
107 resObjStru.checkedBackgroundColor = AceType::RawPtr(backgroundColorResObj);
108 }
109 Color uncheckedBorderColorVal;
110 if (uncheckedBorderColor->IsNull() || uncheckedBorderColor->IsUndefined() ||
111 !ArkTSUtils::ParseJsColorAlpha(vm, uncheckedBorderColor, uncheckedBorderColorVal,
112 unBorderColorResObj, nodeInfo)) {
113 uncheckedBorderColorVal = radioTheme->GetInactiveColor();
114 resObjStru.uncheckedBorderColor = nullptr;
115 } else {
116 jsUnBorderColorSetByUser = true;
117 resObjStru.uncheckedBorderColor = AceType::RawPtr(unBorderColorResObj);
118 }
119 Color indicatorColorVal;
120 if (indicatorColor->IsNull() || indicatorColor->IsUndefined() ||
121 !ArkTSUtils::ParseJsColorAlpha(vm, indicatorColor, indicatorColorVal, indicatorColorResObj, nodeInfo)) {
122 indicatorColorVal = radioTheme->GetPointColor();
123 resObjStru.indicatorColor = nullptr;
124 } else {
125 jsIndicatorColorSetByUser = true;
126 resObjStru.indicatorColor = AceType::RawPtr(indicatorColorResObj);
127 }
128
129 GetArkUINodeModifiers()->getRadioModifier()->setRadioColorSetByUser(
130 nativeNode, jsBgColorSetByUser, jsUnBorderColorSetByUser, jsIndicatorColorSetByUser);
131 GetArkUINodeModifiers()->getRadioModifier()->setRadioStylePtr(nativeNode,
132 checkedBackgroundColorVal.GetValue(), uncheckedBorderColorVal.GetValue(),
133 indicatorColorVal.GetValue(), resObjStru);
134 return panda::JSValueRef::Undefined(vm);
135 }
136
ResetRadioStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)137 ArkUINativeModuleValue RadioBridge::ResetRadioStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
138 {
139 EcmaVM* vm = runtimeCallInfo->GetVM();
140 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
141 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
142 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
143 GetArkUINodeModifiers()->getRadioModifier()->resetRadioStyle(nativeNode);
144 return panda::JSValueRef::Undefined(vm);
145 }
146
SetRadioWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)147 ArkUINativeModuleValue RadioBridge::SetRadioWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
148 {
149 EcmaVM* vm = runtimeCallInfo->GetVM();
150 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
151 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
152 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);
153 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
154 CalcDimension width;
155 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
156 GetArkUINodeModifiers()->getRadioModifier()->resetRadioWidth(nativeNode);
157 return panda::JSValueRef::Undefined(vm);
158 }
159 if (LessNotEqual(width.Value(), 0.0)) {
160 width.SetValue(0.0);
161 }
162 std::string widthCalc = width.CalcValue();
163 GetArkUINodeModifiers()->getRadioModifier()->setRadioWidth(
164 nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
165 return panda::JSValueRef::Undefined(vm);
166 }
167
ResetRadioWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)168 ArkUINativeModuleValue RadioBridge::ResetRadioWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
169 {
170 EcmaVM* vm = runtimeCallInfo->GetVM();
171 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
172 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
173 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
174 GetArkUINodeModifiers()->getRadioModifier()->resetRadioWidth(nativeNode);
175 return panda::JSValueRef::Undefined(vm);
176 }
177
SetRadioHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)178 ArkUINativeModuleValue RadioBridge::SetRadioHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
179 {
180 EcmaVM* vm = runtimeCallInfo->GetVM();
181 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
182 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
183 Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(1);
184 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
185 CalcDimension height;
186 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
187 GetArkUINodeModifiers()->getRadioModifier()->resetRadioHeight(nativeNode);
188 return panda::JSValueRef::Undefined(vm);
189 }
190 if (LessNotEqual(height.Value(), 0.0)) {
191 height.SetValue(0.0);
192 }
193 std::string heightCalc = height.CalcValue();
194 GetArkUINodeModifiers()->getRadioModifier()->setRadioHeight(
195 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
196 return panda::JSValueRef::Undefined(vm);
197 }
198
ResetRadioHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)199 ArkUINativeModuleValue RadioBridge::ResetRadioHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
200 {
201 EcmaVM* vm = runtimeCallInfo->GetVM();
202 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
203 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
204 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
205 GetArkUINodeModifiers()->getRadioModifier()->resetRadioHeight(nativeNode);
206 return panda::JSValueRef::Undefined(vm);
207 }
208
SetRadioSize(ArkUIRuntimeCallInfo * runtimeCallInfo)209 ArkUINativeModuleValue RadioBridge::SetRadioSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
210 {
211 EcmaVM* vm = runtimeCallInfo->GetVM();
212 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
213 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
214 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1); //1 is width value
215 Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(2); //2 is height value
216 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
217
218 CalcDimension width;
219 CalcDimension height;
220 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
221 GetArkUINodeModifiers()->getRadioModifier()->resetRadioWidth(nativeNode);
222 } else {
223 std::string widthCalc = width.CalcValue();
224 if (LessNotEqual(width.Value(), 0.0)) {
225 width.SetValue(0.0);
226 }
227 GetArkUINodeModifiers()->getRadioModifier()->setRadioWidth(
228 nativeNode, width.Value(), static_cast<int>(width.Unit()), widthCalc.c_str());
229 }
230 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
231 GetArkUINodeModifiers()->getRadioModifier()->resetRadioHeight(nativeNode);
232 } else {
233 std::string heightCalc = height.CalcValue();
234 if (LessNotEqual(height.Value(), 0.0)) {
235 height.SetValue(0.0);
236 }
237 GetArkUINodeModifiers()->getRadioModifier()->setRadioHeight(
238 nativeNode, height.Value(), static_cast<int>(height.Unit()), heightCalc.c_str());
239 }
240 return panda::JSValueRef::Undefined(vm);
241 }
242
ResetRadioSize(ArkUIRuntimeCallInfo * runtimeCallInfo)243 ArkUINativeModuleValue RadioBridge::ResetRadioSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
244 {
245 EcmaVM* vm = runtimeCallInfo->GetVM();
246 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
247 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
248 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
249 GetArkUINodeModifiers()->getRadioModifier()->resetRadioSize(nativeNode);
250 return panda::JSValueRef::Undefined(vm);
251 }
252
SetRadioHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)253 ArkUINativeModuleValue RadioBridge::SetRadioHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
254 {
255 EcmaVM* vm = runtimeCallInfo->GetVM();
256 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
257 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
258 Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1); //1 is Jsvalue
259 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
260
261 if (valueArg->IsUndefined() || !valueArg->IsNumber()) {
262 GetArkUINodeModifiers()->getRadioModifier()->resetRadioHoverEffect(nativeNode);
263 return panda::JSValueRef::Undefined(vm);
264 }
265 int32_t intValue = valueArg->Int32Value(vm);
266 GetArkUINodeModifiers()->getRadioModifier()->setRadioHoverEffect(nativeNode, intValue);
267 return panda::JSValueRef::Undefined(vm);
268 }
269
ResetRadioHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)270 ArkUINativeModuleValue RadioBridge::ResetRadioHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
271 {
272 EcmaVM* vm = runtimeCallInfo->GetVM();
273 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
274 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
275 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
276 GetArkUINodeModifiers()->getRadioModifier()->resetRadioHoverEffect(nativeNode);
277 return panda::JSValueRef::Undefined(vm);
278 }
279
SetRadioPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)280 ArkUINativeModuleValue RadioBridge::SetRadioPadding(ArkUIRuntimeCallInfo *runtimeCallInfo)
281 {
282 EcmaVM *vm = runtimeCallInfo->GetVM();
283 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
284 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
285 Local<JSValueRef> topArg = runtimeCallInfo->GetCallArgRef(1); //1 is top arguments
286 Local<JSValueRef> rightArg = runtimeCallInfo->GetCallArgRef(2); //2 is right arguments
287 Local<JSValueRef> bottomArg = runtimeCallInfo->GetCallArgRef(3); //3 is bottom arguments
288 Local<JSValueRef> leftArg = runtimeCallInfo->GetCallArgRef(4); //4 is left arguments
289 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
290
291 struct ArkUISizeType top = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
292 struct ArkUISizeType right = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
293 struct ArkUISizeType bottom = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
294 struct ArkUISizeType left = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
295
296 CalcDimension topDimen(0, DimensionUnit::VP);
297 CalcDimension rightDimen(0, DimensionUnit::VP);
298 CalcDimension bottomDimen(0, DimensionUnit::VP);
299 CalcDimension leftDimen(0, DimensionUnit::VP);
300 ArkTSUtils::ParsePadding(vm, topArg, topDimen, top);
301 ArkTSUtils::ParsePadding(vm, rightArg, rightDimen, right);
302 ArkTSUtils::ParsePadding(vm, bottomArg, bottomDimen, bottom);
303 ArkTSUtils::ParsePadding(vm, leftArg, leftDimen, left);
304 GetArkUINodeModifiers()->getRadioModifier()->setRadioPadding(nativeNode, &top, &right, &bottom, &left);
305
306 return panda::JSValueRef::Undefined(vm);
307 }
308
ResetRadioPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)309 ArkUINativeModuleValue RadioBridge::ResetRadioPadding(ArkUIRuntimeCallInfo *runtimeCallInfo)
310 {
311 EcmaVM *vm = runtimeCallInfo->GetVM();
312 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
313 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
314 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
315 GetArkUINodeModifiers()->getRadioModifier()->resetRadioPadding(nativeNode);
316 return panda::JSValueRef::Undefined(vm);
317 }
318
SetRadioResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)319 ArkUINativeModuleValue RadioBridge::SetRadioResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
320 {
321 EcmaVM* vm = runtimeCallInfo->GetVM();
322 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
323 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
324 Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1); //1 is JsValue
325 Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(2); //2 is length arguments
326 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
327 uint32_t length = static_cast<uint32_t>(lengthArg->Int32Value(vm));
328 ArkUI_Float32 regionArray[length];
329 int32_t regionUnits[length];
330 if (!ArkTSUtils::ParseResponseRegion(vm, valueArg, regionArray, regionUnits, length)) {
331 GetArkUINodeModifiers()->getRadioModifier()->resetRadioResponseRegion(nativeNode);
332 return panda::JSValueRef::Undefined(vm);
333 }
334 GetArkUINodeModifiers()->getRadioModifier()->setRadioResponseRegion(
335 nativeNode, regionArray, regionUnits, length);
336 return panda::JSValueRef::Undefined(vm);
337 }
338
ResetRadioResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)339 ArkUINativeModuleValue RadioBridge::ResetRadioResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
340 {
341 EcmaVM* vm = runtimeCallInfo->GetVM();
342 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
343 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
344 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
345 GetArkUINodeModifiers()->getRadioModifier()->resetRadioResponseRegion(nativeNode);
346 return panda::JSValueRef::Undefined(vm);
347 }
348
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)349 ArkUINativeModuleValue RadioBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
350 {
351 EcmaVM* vm = runtimeCallInfo->GetVM();
352 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
353 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
354 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
355 auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
356 if (!secondArg->IsObject(vm)) {
357 RadioModelNG::SetBuilderFunc(frameNode, nullptr);
358 return panda::JSValueRef::Undefined(vm);
359 }
360 panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
361 RadioModelNG::SetBuilderFunc(frameNode,
362 [vm, frameNode, obj = std::move(obj), containerId = Container::CurrentId()](
363 RadioConfiguration config) -> RefPtr<FrameNode> {
364 ContainerScope scope(containerId);
365 auto context = ArkTSUtils::GetContext(vm);
366 CHECK_EQUAL_RETURN(context->IsUndefined(), true, nullptr);
367 const char* keysOfRadio[] = { "value", "checked", "enabled", "triggerChange"};
368 Local<JSValueRef> valuesOfRadio[] = { panda::StringRef::NewFromUtf8(vm, config.value_.c_str()),
369 panda::BooleanRef::New(vm, config.checked_), panda::BooleanRef::New(vm, config.enabled_),
370 panda::FunctionRef::New(vm, JsRadioChangeCallback)};
371 auto radio = panda::ObjectRef::NewWithNamedProperties(vm,
372 ArraySize(keysOfRadio), keysOfRadio, valuesOfRadio);
373 radio->SetNativePointerFieldCount(vm, 1);
374 radio->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
375 panda::Local<panda::JSValueRef> params[NUM_2] = { context, radio };
376 LocalScope pandaScope(vm);
377 panda::TryCatch trycatch(vm);
378 auto jsObject = obj.ToLocal();
379 auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
380 CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
381 panda::Local<panda::FunctionRef> func = makeFunc;
382 auto result = func->Call(vm, jsObject, params, NUM_2);
383 JSNApi::ExecutePendingJob(vm);
384 CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
385 auto resultObj = result->ToObject(vm);
386 panda::Local<panda::JSValueRef> nodeptr =
387 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, RADIO_BUILDER_NODEPTR_OF_UINODE));
388 CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
389 auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
390 CHECK_NULL_RETURN(frameNode, nullptr);
391 return AceType::Claim(frameNode);
392 });
393 return panda::JSValueRef::Undefined(vm);
394 }
395
SetRadioOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)396 ArkUINativeModuleValue RadioBridge::SetRadioOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
397 {
398 EcmaVM* vm = runtimeCallInfo->GetVM();
399 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
400 CHECK_EQUAL_RETURN(runtimeCallInfo->GetArgsNumber() != NUM_4, true, panda::JSValueRef::Undefined(vm));
401 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
402 Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
403 Local<JSValueRef> groupArg = runtimeCallInfo->GetCallArgRef(NUM_2);
404 Local<JSValueRef> indicatorTypeArg = runtimeCallInfo->GetCallArgRef(NUM_3);
405 std::string value;
406 std::string group;
407 auto indicatorType = RadioIndicatorType::TICK;
408
409 if (!valueArg.IsNull() && valueArg->IsString(vm)) {
410 value = valueArg->ToString(vm)->ToString(vm);
411 }
412 if (!groupArg.IsNull() && groupArg->IsString(vm)) {
413 group = groupArg->ToString(vm)->ToString(vm);
414 }
415 if (!indicatorTypeArg.IsNull() && indicatorTypeArg->IsNumber()) {
416 indicatorType = static_cast<RadioIndicatorType>(indicatorTypeArg->Int32Value(vm));
417 if (indicatorType == RadioIndicatorType::CUSTOM) {
418 indicatorType = RadioIndicatorType::TICK;
419 }
420 }
421 if (!firstArg.IsNull() && !firstArg->IsUndefined()) {
422 auto pointer = firstArg->ToNativePointer(vm);
423 CHECK_EQUAL_RETURN(pointer.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
424 auto nativeNode = nodePtr(pointer->Value());
425 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
426 GetArkUINodeModifiers()->getRadioModifier()->setRadioOptions(
427 nativeNode, value.c_str(), group.c_str(), static_cast<int32_t>(indicatorType));
428 }
429 return panda::JSValueRef::Undefined(vm);
430 }
431
ResetRadioOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)432 ArkUINativeModuleValue RadioBridge::ResetRadioOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
433 {
434 EcmaVM* vm = runtimeCallInfo->GetVM();
435 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
436 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
437 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
438 GetArkUINodeModifiers()->getRadioModifier()->resetRadioOnChange(nativeNode);
439 return panda::JSValueRef::Undefined(vm);
440 }
441
SetRadioOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)442 ArkUINativeModuleValue RadioBridge::SetRadioOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
443 {
444 EcmaVM* vm = runtimeCallInfo->GetVM();
445 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
446 uint32_t argsNumber = runtimeCallInfo->GetArgsNumber();
447 if (argsNumber != NUM_2) {
448 return panda::JSValueRef::Undefined(vm);
449 }
450 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
451 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
452 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
453 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
454 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
455 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
456 GetArkUINodeModifiers()->getRadioModifier()->resetRadioOnChange(nativeNode);
457 return panda::JSValueRef::Undefined(vm);
458 }
459 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
460 std::function<void(bool)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](bool isOnchange) {
461 panda::LocalScope pandaScope(vm);
462 panda::TryCatch trycatch(vm);
463 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
464 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { panda::BooleanRef::New(vm, isOnchange) };
465 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
466 };
467 GetArkUINodeModifiers()->getRadioModifier()->setRadioOnChange(nativeNode, reinterpret_cast<void*>(&callback));
468 return panda::JSValueRef::Undefined(vm);
469 }
470
SetMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)471 ArkUINativeModuleValue RadioBridge::SetMargin(ArkUIRuntimeCallInfo* runtimeCallInfo)
472 {
473 EcmaVM* vm = runtimeCallInfo->GetVM();
474 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
475 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
476 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
477 CommonBridge::SetMargin(runtimeCallInfo);
478 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
479 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
480 GetArkUINodeModifiers()->getRadioModifier()->setIsUserSetMargin(nativeNode);
481 return panda::JSValueRef::Undefined(vm);
482 }
483
ResetMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)484 ArkUINativeModuleValue RadioBridge::ResetMargin(ArkUIRuntimeCallInfo* runtimeCallInfo)
485 {
486 EcmaVM* vm = runtimeCallInfo->GetVM();
487 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
488 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
489 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
490 CommonBridge::ResetMargin(runtimeCallInfo);
491 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
492 GetArkUINodeModifiers()->getRadioModifier()->setIsUserSetMargin(nativeNode);
493 return panda::JSValueRef::Undefined(vm);
494 }
495 }
496