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 "core/interfaces/native/node/api.h"
19 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
20
21 namespace OHOS::Ace::NG {
22 namespace {
23 constexpr uint32_t INDEX_FRAME_NODE_0 = 0;
24 constexpr uint32_t INDEX_ARGUMENT_1 = 1;
25 constexpr uint32_t INDEX_ARGUMENT_2 = 2;
26 constexpr uint32_t INDEX_ARGUMENT_3 = 3;
27 constexpr uint32_t INDEX_ARGUMENT_4 = 4;
28
SetHeightInner(const EcmaVM * vm,const Local<JSValueRef> & nodeArg,const Local<JSValueRef> & heightArg)29 void SetHeightInner(const EcmaVM* vm, const Local<JSValueRef>& nodeArg, const Local<JSValueRef>& heightArg)
30 {
31 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
32 CalcDimension height;
33 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
34 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleHeight(nativeNode);
35 } else {
36 if (height.IsNegative()) {
37 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleHeight(nativeNode);
38 } else {
39 GetArkUIInternalNodeAPI()->GetToggleModifier().SetToggleHeight(
40 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
41 }
42 }
43 }
44
PushDimensionVector(const std::optional<Dimension> & valueDimen,std::vector<double> & dimensions)45 void PushDimensionVector(const std::optional<Dimension>& valueDimen, std::vector<double>& dimensions)
46 {
47 dimensions.push_back(static_cast<double>(valueDimen.has_value()));
48 if (valueDimen.has_value()) {
49 dimensions.push_back(static_cast<double>(valueDimen.value().Value()));
50 dimensions.push_back(static_cast<double>(valueDimen.value().Unit()));
51 } else {
52 dimensions.push_back(0);
53 dimensions.push_back(0);
54 }
55 }
56
PushToggleDimension(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,std::vector<double> & fontSizesVector,int32_t argIndex)57 void PushToggleDimension(
58 ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm, std::vector<double>& fontSizesVector, int32_t argIndex)
59 {
60 Local<JSValueRef> arg = runtimeCallInfo->GetCallArgRef(argIndex);
61 std::optional<CalcDimension> dimemstionOptinal = std::nullopt;
62 CalcDimension parsedDimension;
63 if (ArkTSUtils::ParseJsDimensionVp(vm, arg, parsedDimension)) {
64 dimemstionOptinal = parsedDimension;
65 }
66 PushDimensionVector(dimemstionOptinal, fontSizesVector);
67 }
68
PutToggleDimensionParameters(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,std::vector<double> & lengthVector)69 void PutToggleDimensionParameters(
70 ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm, std::vector<double>& lengthVector)
71 {
72 std::vector<int32_t> indexVector = { INDEX_ARGUMENT_1, INDEX_ARGUMENT_2, INDEX_ARGUMENT_3, INDEX_ARGUMENT_4 };
73 for (size_t index = 0; index < indexVector.size(); index++) {
74 PushToggleDimension(runtimeCallInfo, vm, lengthVector, indexVector[index]);
75 }
76 }
77 } // namespace
SetSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)78 ArkUINativeModuleValue ToggleBridge::SetSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
79 {
80 EcmaVM* vm = runtimeCallInfo->GetVM();
81 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
82 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
83 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
84 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
85
86 Color color;
87 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
88 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleSelectedColor(nativeNode);
89 } else {
90 GetArkUIInternalNodeAPI()->GetToggleModifier().SetToggleSelectedColor(nativeNode, color.GetValue());
91 }
92
93 return panda::JSValueRef::Undefined(vm);
94 }
95
ResetSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)96 ArkUINativeModuleValue ToggleBridge::ResetSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
97 {
98 EcmaVM* vm = runtimeCallInfo->GetVM();
99 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
100 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
101 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
102 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleSelectedColor(nativeNode);
103 return panda::JSValueRef::Undefined(vm);
104 }
105
SetSwitchPointColor(ArkUIRuntimeCallInfo * runtimeCallInfo)106 ArkUINativeModuleValue ToggleBridge::SetSwitchPointColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
107 {
108 EcmaVM* vm = runtimeCallInfo->GetVM();
109 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
110 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
111 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
112 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
113
114 Color color;
115 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
116 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleSwitchPointColor(nativeNode);
117 } else {
118 GetArkUIInternalNodeAPI()->GetToggleModifier().SetToggleSwitchPointColor(nativeNode, color.GetValue());
119 }
120 return panda::JSValueRef::Undefined(vm);
121 }
122
ResetSwitchPointColor(ArkUIRuntimeCallInfo * runtimeCallInfo)123 ArkUINativeModuleValue ToggleBridge::ResetSwitchPointColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
124 {
125 EcmaVM* vm = runtimeCallInfo->GetVM();
126 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
127 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
128 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
129 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleSwitchPointColor(nativeNode);
130 return panda::JSValueRef::Undefined(vm);
131 }
132
SetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)133 ArkUINativeModuleValue ToggleBridge::SetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
134 {
135 EcmaVM* vm = runtimeCallInfo->GetVM();
136 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
137 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
138 Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
139 SetHeightInner(vm, nodeArg, heightArg);
140 return panda::JSValueRef::Undefined(vm);
141 }
142
ResetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)143 ArkUINativeModuleValue ToggleBridge::ResetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
144 {
145 EcmaVM* vm = runtimeCallInfo->GetVM();
146 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
147 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
148 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
149 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleHeight(nativeNode);
150 return panda::JSValueRef::Undefined(vm);
151 }
152
SetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)153 ArkUINativeModuleValue ToggleBridge::SetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
154 {
155 EcmaVM* vm = runtimeCallInfo->GetVM();
156 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
157 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
158 Local<JSValueRef> regionArrayArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
159 Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_2);
160 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
161 uint32_t length = lengthArg->Uint32Value(vm);
162 double regionValueArray[length];
163 int32_t regionUnitsArray[length];
164 if (!ArkTSUtils::ParseResponseRegion(vm, regionArrayArg, regionValueArray, regionUnitsArray, length)) {
165 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleResponseRegion(nativeNode);
166 return panda::JSValueRef::Undefined(vm);
167 }
168 GetArkUIInternalNodeAPI()->GetToggleModifier().SetToggleResponseRegion(
169 nativeNode, regionValueArray, regionUnitsArray, length);
170 return panda::JSValueRef::Undefined(vm);
171 }
172
ResetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)173 ArkUINativeModuleValue ToggleBridge::ResetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
174 {
175 EcmaVM* vm = runtimeCallInfo->GetVM();
176 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
177 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
178 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
179 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleResponseRegion(nativeNode);
180 return panda::JSValueRef::Undefined(vm);
181 }
182
SetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)183 ArkUINativeModuleValue ToggleBridge::SetPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
184 {
185 EcmaVM* vm = runtimeCallInfo->GetVM();
186 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
187 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
188 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
189 std::vector<double> lengthVector;
190 PutToggleDimensionParameters(runtimeCallInfo, vm, lengthVector);
191 GetArkUIInternalNodeAPI()->GetToggleModifier().SetTogglePadding(
192 nativeNode, lengthVector.data(), lengthVector.size());
193 return panda::JSValueRef::Undefined(vm);
194 }
195
ResetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)196 ArkUINativeModuleValue ToggleBridge::ResetPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
197 {
198 EcmaVM* vm = runtimeCallInfo->GetVM();
199 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
200 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
201 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
202 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetTogglePadding(nativeNode);
203 return panda::JSValueRef::Undefined(vm);
204 }
205
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)206 ArkUINativeModuleValue ToggleBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
207 {
208 EcmaVM* vm = runtimeCallInfo->GetVM();
209 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
210 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
211 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
212 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
213 Color color;
214 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
215 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleBackgroundColor(nativeNode);
216 } else {
217 GetArkUIInternalNodeAPI()->GetToggleModifier().SetToggleBackgroundColor(nativeNode, color.GetValue());
218 }
219 return panda::JSValueRef::Undefined(vm);
220 }
221
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)222 ArkUINativeModuleValue ToggleBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
223 {
224 EcmaVM* vm = runtimeCallInfo->GetVM();
225 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
226 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
227 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
228 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleBackgroundColor(nativeNode);
229 return panda::JSValueRef::Undefined(vm);
230 }
231
SetHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)232 ArkUINativeModuleValue ToggleBridge::SetHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
233 {
234 EcmaVM* vm = runtimeCallInfo->GetVM();
235 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
236 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
237 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
238 Local<JSValueRef> hoverEffectArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
239
240 if (hoverEffectArg->IsUndefined() || !hoverEffectArg->IsNumber()) {
241 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleHoverEffect(nativeNode);
242 return panda::JSValueRef::Undefined(vm);
243 }
244 int32_t hoverEffectValue = hoverEffectArg->Int32Value(vm);
245 GetArkUIInternalNodeAPI()->GetToggleModifier().SetToggleHoverEffect(nativeNode, hoverEffectValue);
246 return panda::JSValueRef::Undefined(vm);
247 }
248
ResetHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)249 ArkUINativeModuleValue ToggleBridge::ResetHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
250 {
251 EcmaVM* vm = runtimeCallInfo->GetVM();
252 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
253 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
254 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
255 GetArkUIInternalNodeAPI()->GetToggleModifier().ResetToggleHoverEffect(nativeNode);
256 return panda::JSValueRef::Undefined(vm);
257 }
258 } // namespace OHOS::Ace::NG
259