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