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
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_toggle_bridge.h"
17
18 #include "base/utils/utils.h"
19 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
20 #include "core/components_ng/base/frame_node.h"
21 #include "core/components_ng/pattern/toggle/toggle_model_ng.h"
22
23 namespace OHOS::Ace::NG {
24 namespace {
25 constexpr int PARAM_ARR_LENGTH_1 = 1;
26 constexpr uint32_t INDEX_FRAME_NODE_0 = 0;
27 constexpr uint32_t INDEX_ARGUMENT_1 = 1;
28 constexpr uint32_t INDEX_ARGUMENT_2 = 2;
29 constexpr uint32_t INDEX_ARGUMENT_3 = 3;
30 constexpr uint32_t INDEX_ARGUMENT_4 = 4;
31 const char* TOGGLE_NODEPTR_OF_UINODE = "nodePtr_";
JsToggleChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)32 panda::Local<panda::JSValueRef> JsToggleChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
33 {
34 auto vm = runtimeCallInfo->GetVM();
35 int32_t argc = static_cast<int32_t>(runtimeCallInfo->GetArgsNumber());
36 if (argc != 1) {
37 return panda::JSValueRef::Undefined(vm);
38 }
39 auto firstArg = runtimeCallInfo->GetCallArgRef(0);
40 if (!firstArg->IsBoolean()) {
41 return panda::JSValueRef::Undefined(vm);
42 }
43 bool value = firstArg->ToBoolean(vm)->Value();
44 auto ref = runtimeCallInfo->GetThisRef();
45 auto obj = ref->ToObject(vm);
46 if (obj->GetNativePointerFieldCount(vm) < 1) {
47 return panda::JSValueRef::Undefined(vm);
48 }
49 auto frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
50 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
51 ToggleModelNG::SetChangeValue(frameNode, value);
52 return panda::JSValueRef::Undefined(vm);
53 }
54
SetHeightInner(const EcmaVM * vm,const Local<JSValueRef> & nodeArg,const Local<JSValueRef> & heightArg)55 void SetHeightInner(const EcmaVM* vm, const Local<JSValueRef>& nodeArg, const Local<JSValueRef>& heightArg)
56 {
57 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
58 CalcDimension height;
59 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
60 GetArkUINodeModifiers()->getToggleModifier()->resetToggleHeight(nativeNode);
61 } else {
62 if (height.IsNegative()) {
63 GetArkUINodeModifiers()->getToggleModifier()->resetToggleHeight(nativeNode);
64 } else {
65 GetArkUINodeModifiers()->getToggleModifier()->setToggleHeight(
66 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
67 }
68 }
69 }
70
PushDimensionVector(const std::optional<Dimension> & valueDimen,std::vector<ArkUI_Float32> & dimensions)71 void PushDimensionVector(const std::optional<Dimension>& valueDimen, std::vector<ArkUI_Float32>& dimensions)
72 {
73 dimensions.push_back(static_cast<double>(valueDimen.has_value()));
74 if (valueDimen.has_value()) {
75 dimensions.push_back(static_cast<double>(valueDimen.value().Value()));
76 dimensions.push_back(static_cast<double>(valueDimen.value().Unit()));
77 } else {
78 dimensions.push_back(0);
79 dimensions.push_back(0);
80 }
81 }
82
PushToggleDimension(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,std::vector<ArkUI_Float32> & fontSizesVector,int32_t argIndex)83 void PushToggleDimension(
84 ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm, std::vector<ArkUI_Float32>& fontSizesVector, int32_t argIndex)
85 {
86 Local<JSValueRef> arg = runtimeCallInfo->GetCallArgRef(argIndex);
87 std::optional<CalcDimension> dimensionOptional = std::nullopt;
88 CalcDimension parsedDimension;
89 if (ArkTSUtils::ParseJsDimensionVp(vm, arg, parsedDimension)) {
90 dimensionOptional = parsedDimension;
91 }
92 PushDimensionVector(dimensionOptional, fontSizesVector);
93 }
94
PutToggleDimensionParameters(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,std::vector<ArkUI_Float32> & lengthVector)95 void PutToggleDimensionParameters(
96 ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm, std::vector<ArkUI_Float32>& lengthVector)
97 {
98 std::vector<int32_t> indexVector = { INDEX_ARGUMENT_1, INDEX_ARGUMENT_2, INDEX_ARGUMENT_3, INDEX_ARGUMENT_4 };
99 for (size_t index = 0; index < indexVector.size(); index++) {
100 PushToggleDimension(runtimeCallInfo, vm, lengthVector, indexVector[index]);
101 }
102 }
103 } // namespace
104
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)105 ArkUINativeModuleValue ToggleBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
106 {
107 EcmaVM* vm = runtimeCallInfo->GetVM();
108 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
109 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
110 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
111 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
112 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
113 if (!secondArg->IsObject(vm)) {
114 ToggleModelNG::SetBuilderFunc(frameNode, nullptr);
115 return panda::JSValueRef::Undefined(vm);
116 }
117 panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
118 auto containerId = Container::CurrentId();
119 ToggleModelNG::SetBuilderFunc(frameNode, [vm, frameNode, obj = std::move(obj), containerId](
120 ToggleConfiguration config) -> RefPtr<FrameNode> {
121 ContainerScope scope(containerId);
122 auto context = ArkTSUtils::GetContext(vm);
123 CHECK_EQUAL_RETURN(context->IsUndefined(), true, nullptr);
124 const char* keysOfToggle[] = { "isOn", "enabled", "triggerChange"};
125 Local<JSValueRef> valuesOfToggle[] = { panda::BooleanRef::New(vm, config.isOn_),
126 panda::BooleanRef::New(vm, config.enabled_),
127 panda::FunctionRef::New(vm, JsToggleChangeCallback)};
128 auto toggle = panda::ObjectRef::NewWithNamedProperties(vm,
129 ArraySize(keysOfToggle), keysOfToggle, valuesOfToggle);
130 toggle->SetNativePointerFieldCount(vm, 1);
131 toggle->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
132 panda::Local<panda::JSValueRef> params[INDEX_ARGUMENT_2] = { context, toggle };
133 LocalScope pandaScope(vm);
134 panda::TryCatch trycatch(vm);
135 auto jsObject = obj.ToLocal();
136 auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
137 CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
138 panda::Local<panda::FunctionRef> func = makeFunc;
139 auto result = func->Call(vm, jsObject, params, 2);
140 JSNApi::ExecutePendingJob(vm);
141 CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
142 auto resultObj = result->ToObject(vm);
143 panda::Local<panda::JSValueRef> nodeptr =
144 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, TOGGLE_NODEPTR_OF_UINODE));
145 CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
146 auto* node = nodeptr->ToNativePointer(vm)->Value();
147 auto* frameNode = reinterpret_cast<FrameNode*>(node);
148 CHECK_NULL_RETURN(frameNode, nullptr);
149 return AceType::Claim(frameNode);
150 });
151 return panda::JSValueRef::Undefined(vm);
152 }
153
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue ToggleBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
155 {
156 EcmaVM* vm = runtimeCallInfo->GetVM();
157 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
158 int32_t argsNumber = runtimeCallInfo->GetArgsNumber();
159 if (argsNumber != INDEX_ARGUMENT_2) {
160 return panda::JSValueRef::Undefined(vm);
161 }
162 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
163 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
164 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
165 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
166 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
167 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
168 GetArkUINodeModifiers()->getToggleModifier()->resetToggleOnChange(nativeNode);
169 return panda::JSValueRef::Undefined(vm);
170 }
171 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
172 std::function<void(bool)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](bool isOnchange) {
173 panda::LocalScope pandaScope(vm);
174 panda::TryCatch trycatch(vm);
175 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
176 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { panda::BooleanRef::New(vm, isOnchange) };
177 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
178 };
179 GetArkUINodeModifiers()->getToggleModifier()->setToggleOnChange(nativeNode, reinterpret_cast<void*>(&callback));
180 return panda::JSValueRef::Undefined(vm);
181 }
182
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)183 ArkUINativeModuleValue ToggleBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
184 {
185 EcmaVM* vm = runtimeCallInfo->GetVM();
186 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
187 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
188 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
189 GetArkUINodeModifiers()->getToggleModifier()->resetToggleOnChange(nativeNode);
190 return panda::JSValueRef::Undefined(vm);
191 }
192
SetSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)193 ArkUINativeModuleValue ToggleBridge::SetSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
194 {
195 EcmaVM* vm = runtimeCallInfo->GetVM();
196 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
197 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
198 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
199 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
200
201 Color color;
202 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
203 GetArkUINodeModifiers()->getToggleModifier()->resetToggleSelectedColor(nativeNode);
204 } else {
205 GetArkUINodeModifiers()->getToggleModifier()->setToggleSelectedColor(nativeNode, color.GetValue());
206 }
207
208 return panda::JSValueRef::Undefined(vm);
209 }
210
ResetSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)211 ArkUINativeModuleValue ToggleBridge::ResetSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
212 {
213 EcmaVM* vm = runtimeCallInfo->GetVM();
214 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
215 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
216 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
217 GetArkUINodeModifiers()->getToggleModifier()->resetToggleSelectedColor(nativeNode);
218 return panda::JSValueRef::Undefined(vm);
219 }
220
SetSwitchPointColor(ArkUIRuntimeCallInfo * runtimeCallInfo)221 ArkUINativeModuleValue ToggleBridge::SetSwitchPointColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
222 {
223 EcmaVM* vm = runtimeCallInfo->GetVM();
224 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
225 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
226 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
227 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
228
229 Color color;
230 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
231 GetArkUINodeModifiers()->getToggleModifier()->resetToggleSwitchPointColor(nativeNode);
232 } else {
233 GetArkUINodeModifiers()->getToggleModifier()->setToggleSwitchPointColor(nativeNode, color.GetValue());
234 }
235 return panda::JSValueRef::Undefined(vm);
236 }
237
ResetSwitchPointColor(ArkUIRuntimeCallInfo * runtimeCallInfo)238 ArkUINativeModuleValue ToggleBridge::ResetSwitchPointColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
239 {
240 EcmaVM* vm = runtimeCallInfo->GetVM();
241 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
242 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
243 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
244 GetArkUINodeModifiers()->getToggleModifier()->resetToggleSwitchPointColor(nativeNode);
245 return panda::JSValueRef::Undefined(vm);
246 }
247
SetSwitchStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)248 ArkUINativeModuleValue ToggleBridge::SetSwitchStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
249 {
250 EcmaVM* vm = runtimeCallInfo->GetVM();
251 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
252 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
253 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
254 Local<JSValueRef> pointRadiusArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
255 Local<JSValueRef> unselectedColorArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_2);
256 Local<JSValueRef> pointColorArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_3);
257 Local<JSValueRef> trackRadiusArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_4);
258 CalcDimension pointRadius;
259 if (!pointRadiusArg->IsUndefined() &&
260 ArkTSUtils::ParseJsDimensionNG(vm, pointRadiusArg, pointRadius, DimensionUnit::VP) &&
261 !pointRadius.IsNegative()) {
262 GetArkUINodeModifiers()->getToggleModifier()->setTogglePointRadius(
263 nativeNode, pointRadius.Value(), static_cast<int>(pointRadius.Unit()));
264 } else {
265 GetArkUINodeModifiers()->getToggleModifier()->resetTogglePointRadius(nativeNode);
266 }
267 Color unselectedColor;
268 if (unselectedColorArg->IsNull() || unselectedColorArg->IsUndefined() ||
269 !ArkTSUtils::ParseJsColorAlpha(vm, unselectedColorArg, unselectedColor)) {
270 GetArkUINodeModifiers()->getToggleModifier()->resetToggleUnselectedColor(nativeNode);
271 } else {
272 GetArkUINodeModifiers()->getToggleModifier()->setToggleUnselectedColor(nativeNode, unselectedColor.GetValue());
273 }
274 Color pointColor;
275 if (pointColorArg->IsNull() || pointColorArg->IsUndefined() ||
276 !ArkTSUtils::ParseJsColorAlpha(vm, pointColorArg, pointColor)) {
277 GetArkUINodeModifiers()->getToggleModifier()->resetToggleSwitchPointColor(nativeNode);
278 } else {
279 GetArkUINodeModifiers()->getToggleModifier()->setToggleSwitchPointColor(nativeNode, pointColor.GetValue());
280 }
281 CalcDimension trackRadius;
282 if (!trackRadiusArg->IsUndefined() &&
283 ArkTSUtils::ParseJsDimensionNG(vm, trackRadiusArg, trackRadius, DimensionUnit::VP) &&
284 !trackRadius.IsNegative()) {
285 GetArkUINodeModifiers()->getToggleModifier()->setToggleTrackBorderRadius(
286 nativeNode, trackRadius.Value(), static_cast<int>(trackRadius.Unit()));
287 } else {
288 GetArkUINodeModifiers()->getToggleModifier()->resetToggleTrackBorderRadius(nativeNode);
289 }
290 return panda::JSValueRef::Undefined(vm);
291 }
292
ResetSwitchStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)293 ArkUINativeModuleValue ToggleBridge::ResetSwitchStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
294 {
295 EcmaVM* vm = runtimeCallInfo->GetVM();
296 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
297 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
298 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
299 GetArkUINodeModifiers()->getToggleModifier()->resetTogglePointRadius(nativeNode);
300 GetArkUINodeModifiers()->getToggleModifier()->resetToggleUnselectedColor(nativeNode);
301 GetArkUINodeModifiers()->getToggleModifier()->resetToggleSwitchPointColor(nativeNode);
302 GetArkUINodeModifiers()->getToggleModifier()->resetToggleTrackBorderRadius(nativeNode);
303 return panda::JSValueRef::Undefined(vm);
304 }
305
SetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue ToggleBridge::SetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
307 {
308 EcmaVM* vm = runtimeCallInfo->GetVM();
309 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
310 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
311 Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
312 SetHeightInner(vm, nodeArg, heightArg);
313 return panda::JSValueRef::Undefined(vm);
314 }
315
ResetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)316 ArkUINativeModuleValue ToggleBridge::ResetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
317 {
318 EcmaVM* vm = runtimeCallInfo->GetVM();
319 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
320 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
321 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
322 GetArkUINodeModifiers()->getToggleModifier()->resetToggleHeight(nativeNode);
323 return panda::JSValueRef::Undefined(vm);
324 }
325
SetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)326 ArkUINativeModuleValue ToggleBridge::SetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
327 {
328 EcmaVM* vm = runtimeCallInfo->GetVM();
329 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
330 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
331 Local<JSValueRef> regionArrayArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
332 Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_2);
333 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
334 uint32_t length = lengthArg->Uint32Value(vm);
335 ArkUI_Float32 regionValueArray[length];
336 int32_t regionUnitsArray[length];
337 if (!ArkTSUtils::ParseResponseRegion(vm, regionArrayArg, regionValueArray, regionUnitsArray, length)) {
338 GetArkUINodeModifiers()->getToggleModifier()->resetToggleResponseRegion(nativeNode);
339 return panda::JSValueRef::Undefined(vm);
340 }
341 GetArkUINodeModifiers()->getToggleModifier()->setToggleResponseRegion(
342 nativeNode, regionValueArray, regionUnitsArray, length);
343 return panda::JSValueRef::Undefined(vm);
344 }
345
ResetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)346 ArkUINativeModuleValue ToggleBridge::ResetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
347 {
348 EcmaVM* vm = runtimeCallInfo->GetVM();
349 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
350 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
351 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
352 GetArkUINodeModifiers()->getToggleModifier()->resetToggleResponseRegion(nativeNode);
353 return panda::JSValueRef::Undefined(vm);
354 }
355
SetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)356 ArkUINativeModuleValue ToggleBridge::SetPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
357 {
358 EcmaVM* vm = runtimeCallInfo->GetVM();
359 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
360 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
361 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
362 std::vector<ArkUI_Float32> lengthVector;
363 PutToggleDimensionParameters(runtimeCallInfo, vm, lengthVector);
364 GetArkUINodeModifiers()->getToggleModifier()->setTogglePadding(
365 nativeNode, lengthVector.data(), lengthVector.size());
366 return panda::JSValueRef::Undefined(vm);
367 }
368
ResetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)369 ArkUINativeModuleValue ToggleBridge::ResetPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
370 {
371 EcmaVM* vm = runtimeCallInfo->GetVM();
372 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
373 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
374 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
375 GetArkUINodeModifiers()->getToggleModifier()->resetTogglePadding(nativeNode);
376 return panda::JSValueRef::Undefined(vm);
377 }
378
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)379 ArkUINativeModuleValue ToggleBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
380 {
381 EcmaVM* vm = runtimeCallInfo->GetVM();
382 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
383 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
384 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
385 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
386 Color color;
387 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
388 GetArkUINodeModifiers()->getToggleModifier()->resetToggleBackgroundColor(nativeNode);
389 } else {
390 GetArkUINodeModifiers()->getToggleModifier()->setToggleBackgroundColor(nativeNode, color.GetValue());
391 }
392 return panda::JSValueRef::Undefined(vm);
393 }
394
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)395 ArkUINativeModuleValue ToggleBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
396 {
397 EcmaVM* vm = runtimeCallInfo->GetVM();
398 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
399 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
400 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
401 GetArkUINodeModifiers()->getToggleModifier()->resetToggleBackgroundColor(nativeNode);
402 return panda::JSValueRef::Undefined(vm);
403 }
404
SetHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)405 ArkUINativeModuleValue ToggleBridge::SetHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
406 {
407 EcmaVM* vm = runtimeCallInfo->GetVM();
408 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
409 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
410 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
411 Local<JSValueRef> hoverEffectArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
412
413 if (hoverEffectArg->IsUndefined() || !hoverEffectArg->IsNumber()) {
414 GetArkUINodeModifiers()->getToggleModifier()->resetToggleHoverEffect(nativeNode);
415 return panda::JSValueRef::Undefined(vm);
416 }
417 int32_t hoverEffectValue = hoverEffectArg->Int32Value(vm);
418 GetArkUINodeModifiers()->getToggleModifier()->setToggleHoverEffect(nativeNode, hoverEffectValue);
419 return panda::JSValueRef::Undefined(vm);
420 }
421
ResetHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)422 ArkUINativeModuleValue ToggleBridge::ResetHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
423 {
424 EcmaVM* vm = runtimeCallInfo->GetVM();
425 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
426 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
427 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
428 GetArkUINodeModifiers()->getToggleModifier()->resetToggleHoverEffect(nativeNode);
429 return panda::JSValueRef::Undefined(vm);
430 }
431
SetToggleOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)432 ArkUINativeModuleValue ToggleBridge::SetToggleOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
433 {
434 EcmaVM* vm = runtimeCallInfo->GetVM();
435 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
436 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
437 CHECK_EQUAL_RETURN(nodeArg.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
438 auto pointer = nodeArg->ToNativePointer(vm);
439 CHECK_EQUAL_RETURN(pointer.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
440 auto nativeNode = nodePtr(pointer->Value());
441 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
442 Local<JSValueRef> isOnArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
443 CHECK_EQUAL_RETURN(isOnArg.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
444 bool isOn = false;
445 if (!isOnArg->IsUndefined() && isOnArg->IsBoolean()) {
446 isOn = isOnArg->ToBoolean(vm)->Value();
447 }
448 GetArkUINodeModifiers()->getToggleModifier()->setToggleState(nativeNode, isOn);
449 return panda::JSValueRef::Undefined(vm);
450 }
451
ParseParams(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Params & params)452 ArkUINativeModuleValue ToggleBridge::ParseParams(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Params& params)
453 {
454 EcmaVM* vm = runtimeCallInfo->GetVM();
455 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
456 CHECK_EQUAL_RETURN(params.nodeType != ARKUI_TOGGLE, true, panda::JSValueRef::Undefined(vm));
457 ArkUI_Toggle_Params* toggleParams = (ArkUI_Toggle_Params*)(¶ms);
458 toggleParams->toggleType = ToggleType::SWITCH;
459 toggleParams->isOn = false;
460 CHECK_EQUAL_RETURN(runtimeCallInfo->GetArgsNumber() != INDEX_ARGUMENT_3, true, panda::JSValueRef::Undefined(vm));
461 Local<JSValueRef> paramsArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_2);
462 if (!paramsArg->IsNull() && paramsArg->IsObject(vm)) {
463 auto obj = Local<panda::ObjectRef>(paramsArg);
464 auto typeStr = panda::StringRef::NewFromUtf8(vm, "type");
465 auto isOnStr = panda::StringRef::NewFromUtf8(vm, "isOn");
466 auto typeArg = obj->Get(vm, typeStr);
467 auto isOnArg = obj->Get(vm, isOnStr);
468 CHECK_EQUAL_RETURN(typeArg.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
469 CHECK_EQUAL_RETURN(isOnArg.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
470 if (!typeArg->IsNull() && !typeArg->IsUndefined() && typeArg->IsNumber()) {
471 toggleParams->toggleType = static_cast<ToggleType>(typeArg->Int32Value(vm));
472 }
473 if (!isOnArg->IsNull() && !isOnArg->IsUndefined() && isOnArg->IsBoolean()) {
474 toggleParams->isOn = isOnArg->ToBoolean(vm)->Value();
475 }
476 }
477 return panda::JSValueRef::Undefined(vm);
478 }
479 } // namespace OHOS::Ace::NG
480