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*)(¶ms);
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