• 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 "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