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 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_side_bar_container_bridge.h"
16
17 #include "base/geometry/calc_dimension.h"
18 #include "base/geometry/dimension.h"
19 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
20
21 namespace OHOS::Ace::NG {
22 constexpr int NUM_0 = 0;
23 constexpr int NUM_1 = 1;
24 constexpr int NUM_2 = 2;
25 constexpr int NUM_3 = 3;
26 constexpr int NUM_4 = 4;
27 constexpr int NUM_5 = 5;
28 constexpr int NUM_6 = 6;
29 constexpr int NUM_7 = 7;
30 constexpr uint32_t DEFAULT_SIDE_BAR_DIVIDER_COLOR = 0x08000000;
31 const CalcDimension DEFAULT_MAX_SIDE_BAR_WIDTH(280.0, DimensionUnit::VP);
32 const CalcDimension DEFAULT_SIDE_BAR_MIN_CONTENT_WIDTH(360.0, DimensionUnit::VP);
33 const Dimension DEFAULT_CONTROL_BUTTON_WIDTH = 32.0_vp;
34 const Dimension DEFAULT_CONTROL_BUTTON_WIDTH_V10 = 24.0_vp;
35 const Dimension DEFAULT_CONTROL_BUTTON_HEIGHT = 32.0_vp;
36 const Dimension DEFAULT_CONTROL_BUTTON_HEIGHT_V10 = 24.0_vp;
37 constexpr Dimension DEFAULT_CONTROL_BUTTON_LEFT = 16.0_vp;
38 constexpr Dimension DEFAULT_CONTROL_BUTTON_TOP = 48.0_vp;
SetSideBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)39 ArkUINativeModuleValue SideBarContainerBridge::SetSideBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
40 {
41 EcmaVM* vm = runtimeCallInfo->GetVM();
42 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
43 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
44 Local<JSValueRef> sideBarWidthArg = runtimeCallInfo->GetCallArgRef(NUM_1);
45 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
46 CalcDimension sideBarWidth;
47 RefPtr<ResourceObject> sideBarWidthResObj;
48 if (ArkTSUtils::ParseJsDimensionNG(
49 vm, sideBarWidthArg, sideBarWidth, DimensionUnit::VP, sideBarWidthResObj, true) &&
50 sideBarWidth.Value() >= 0) {
51 auto widthRawPtr = AceType::RawPtr(sideBarWidthResObj);
52 GetArkUINodeModifiers()->getSideBarContainerModifier()->setSideBarWidth(
53 nativeNode, sideBarWidth.Value(), static_cast<int32_t>(sideBarWidth.Unit()), widthRawPtr);
54 } else {
55 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetSideBarWidth(nativeNode);
56 }
57 return panda::JSValueRef::Undefined(vm);
58 }
59
ResetSideBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)60 ArkUINativeModuleValue SideBarContainerBridge::ResetSideBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
61 {
62 EcmaVM* vm = runtimeCallInfo->GetVM();
63 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
64 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
65 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
66 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetSideBarWidth(nativeNode);
67 return panda::JSValueRef::Undefined(vm);
68 }
69
SetMinSideBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)70 ArkUINativeModuleValue SideBarContainerBridge::SetMinSideBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
71 {
72 EcmaVM* vm = runtimeCallInfo->GetVM();
73 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
74 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
75 Local<JSValueRef> minSideBarWidthArg = runtimeCallInfo->GetCallArgRef(NUM_1);
76 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
77 CalcDimension minSideBarWidth;
78 RefPtr<ResourceObject> minSideBarWidthObj;
79 if (ArkTSUtils::ParseJsDimensionNG(
80 vm, minSideBarWidthArg, minSideBarWidth, DimensionUnit::VP, minSideBarWidthObj, true) &&
81 minSideBarWidth.Value() >= 0) {
82 auto minWidthRawPtr = AceType::RawPtr(minSideBarWidthObj);
83 GetArkUINodeModifiers()->getSideBarContainerModifier()->setMinSideBarWidth(
84 nativeNode, minSideBarWidth.Value(), static_cast<int32_t>(minSideBarWidth.Unit()), minWidthRawPtr);
85 } else {
86 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetMinSideBarWidth(nativeNode);
87 }
88 return panda::JSValueRef::Undefined(vm);
89 }
90
ResetMinSideBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)91 ArkUINativeModuleValue SideBarContainerBridge::ResetMinSideBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
92 {
93 EcmaVM* vm = runtimeCallInfo->GetVM();
94 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
95 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
96 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
97 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetMinSideBarWidth(nativeNode);
98 return panda::JSValueRef::Undefined(vm);
99 }
100
SetControlButton(ArkUIRuntimeCallInfo * runtimeCallInfo)101 ArkUINativeModuleValue SideBarContainerBridge::SetControlButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
102 {
103 EcmaVM* vm = runtimeCallInfo->GetVM();
104 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
105 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
106 Local<JSValueRef> leftArg = runtimeCallInfo->GetCallArgRef(NUM_1);
107 Local<JSValueRef> topArg = runtimeCallInfo->GetCallArgRef(NUM_2);
108 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
109 Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(NUM_4);
110 Local<JSValueRef> iconsShownArg = runtimeCallInfo->GetCallArgRef(NUM_5);
111 Local<JSValueRef> iconsHiddenArg = runtimeCallInfo->GetCallArgRef(NUM_6);
112 Local<JSValueRef> iconsSwitchingArg = runtimeCallInfo->GetCallArgRef(NUM_7);
113 ArkUI_Float32 values[NUM_4];
114 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
115 if (leftArg->IsNumber() && leftArg->ToNumber(vm)->Value() >= 0) {
116 values[NUM_0] = leftArg->ToNumber(vm)->Value();
117 } else {
118 values[NUM_0] = DEFAULT_CONTROL_BUTTON_LEFT.Value();
119 }
120 if (topArg->IsNumber() && topArg->ToNumber(vm)->Value() >= 0) {
121 values[NUM_1] = topArg->ToNumber(vm)->Value();
122 } else {
123 values[NUM_1] = DEFAULT_CONTROL_BUTTON_TOP.Value();
124 }
125 if (widthArg->IsNumber() && widthArg->ToNumber(vm)->Value() >= 0) {
126 values[NUM_2] = widthArg->ToNumber(vm)->Value();
127 } else {
128 if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
129 values[NUM_2] = DEFAULT_CONTROL_BUTTON_WIDTH_V10.Value();
130 } else {
131 values[NUM_2] = DEFAULT_CONTROL_BUTTON_WIDTH.Value();
132 }
133 }
134 if (heightArg->IsNumber() && heightArg->ToNumber(vm)->Value() >= 0) {
135 values[NUM_3] = heightArg->ToNumber(vm)->Value();
136 } else {
137 if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
138 values[NUM_3] = DEFAULT_CONTROL_BUTTON_HEIGHT_V10.Value();
139 } else {
140 values[NUM_3] = DEFAULT_CONTROL_BUTTON_HEIGHT.Value();
141 }
142 }
143 std::string iconsShown;
144 std::string iconsHidden;
145 std::string iconsSwitching;
146 RefPtr<ResourceObject> iconsShownObj;
147 RefPtr<ResourceObject> iconsHiddenObj;
148 RefPtr<ResourceObject> iconsSwitchingObj;
149 struct ArkUIIconsStruct iconsStruct {
150 nullptr, nullptr, nullptr
151 };
152 if (ArkTSUtils::ParseJsMedia(vm, iconsShownArg, iconsShown, iconsShownObj)) {
153 iconsStruct.ShowIconInfo = iconsShown.c_str();
154 }
155 if (ArkTSUtils::ParseJsMedia(vm, iconsHiddenArg, iconsHidden, iconsHiddenObj)) {
156 iconsStruct.HiddenIconInfo = iconsHidden.c_str();
157 }
158 if (ArkTSUtils::ParseJsMedia(vm, iconsSwitchingArg, iconsSwitching, iconsSwitchingObj)) {
159 iconsStruct.SwitchingIconInfo = iconsSwitching.c_str();
160 }
161 auto iconsShownPtr = AceType::RawPtr(iconsShownObj);
162 auto iconsHiddenPtr = AceType::RawPtr(iconsHiddenObj);
163 auto iconsSwitchingPtr = AceType::RawPtr(iconsSwitchingObj);
164 GetArkUINodeModifiers()->getSideBarContainerModifier()->setControlButton(nativeNode, values, NUM_4, &iconsStruct,
165 iconsShownPtr, iconsHiddenPtr, iconsSwitchingPtr);
166 return panda::JSValueRef::Undefined(vm);
167 }
168
ResetControlButton(ArkUIRuntimeCallInfo * runtimeCallInfo)169 ArkUINativeModuleValue SideBarContainerBridge::ResetControlButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
170 {
171 EcmaVM* vm = runtimeCallInfo->GetVM();
172 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
173 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
174 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
175 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetControlButton(nativeNode);
176 return panda::JSValueRef::Undefined(vm);
177 }
178
SetShowControlButton(ArkUIRuntimeCallInfo * runtimeCallInfo)179 ArkUINativeModuleValue SideBarContainerBridge::SetShowControlButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
180 {
181 EcmaVM* vm = runtimeCallInfo->GetVM();
182 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
183 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
184 Local<JSValueRef> showControlButtonArg = runtimeCallInfo->GetCallArgRef(NUM_1);
185 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
186 bool isShow = true;
187 if (showControlButtonArg->IsBoolean()) {
188 isShow = showControlButtonArg->ToBoolean(vm)->Value();
189 GetArkUINodeModifiers()->getSideBarContainerModifier()->setShowControlButton(nativeNode, isShow);
190 } else {
191 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetShowControlButton(nativeNode);
192 }
193 return panda::JSValueRef::Undefined(vm);
194 }
195
ResetShowControlButton(ArkUIRuntimeCallInfo * runtimeCallInfo)196 ArkUINativeModuleValue SideBarContainerBridge::ResetShowControlButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
197 {
198 EcmaVM* vm = runtimeCallInfo->GetVM();
199 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
200 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
201 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
202 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetShowControlButton(nativeNode);
203 return panda::JSValueRef::Undefined(vm);
204 }
205
SetAutoHide(ArkUIRuntimeCallInfo * runtimeCallInfo)206 ArkUINativeModuleValue SideBarContainerBridge::SetAutoHide(ArkUIRuntimeCallInfo* runtimeCallInfo)
207 {
208 EcmaVM* vm = runtimeCallInfo->GetVM();
209 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
210 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
211 Local<JSValueRef> autoHideArg = runtimeCallInfo->GetCallArgRef(NUM_1);
212 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
213 if (autoHideArg->IsBoolean()) {
214 uint32_t value = static_cast<uint32_t>(autoHideArg->ToBoolean(vm)->Value());
215 GetArkUINodeModifiers()->getSideBarContainerModifier()->setAutoHide(nativeNode, value);
216 } else {
217 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetAutoHide(nativeNode);
218 }
219 return panda::JSValueRef::Undefined(vm);
220 }
221
ResetAutoHide(ArkUIRuntimeCallInfo * runtimeCallInfo)222 ArkUINativeModuleValue SideBarContainerBridge::ResetAutoHide(ArkUIRuntimeCallInfo* runtimeCallInfo)
223 {
224 EcmaVM* vm = runtimeCallInfo->GetVM();
225 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
226 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
227 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
228 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetAutoHide(nativeNode);
229 return panda::JSValueRef::Undefined(vm);
230 }
231
SetMaxSideBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)232 ArkUINativeModuleValue SideBarContainerBridge::SetMaxSideBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
233 {
234 EcmaVM* vm = runtimeCallInfo->GetVM();
235 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
236 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
237 Local<JSValueRef> maxSideBarWidthArg = runtimeCallInfo->GetCallArgRef(NUM_1);
238 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
239 CalcDimension maxSideBarWidth(DEFAULT_MAX_SIDE_BAR_WIDTH);
240 RefPtr<ResourceObject> maxSideBarWidthObj;
241 if (ArkTSUtils::ParseJsDimensionNG(
242 vm, maxSideBarWidthArg, maxSideBarWidth, DimensionUnit::VP, maxSideBarWidthObj, true) &&
243 maxSideBarWidth.Value() >= 0) {
244 auto maxSideBarWidthPtr = AceType::RawPtr(maxSideBarWidthObj);
245 GetArkUINodeModifiers()->getSideBarContainerModifier()->setSideBarContainerMaxSideBarWidth(
246 nativeNode, maxSideBarWidth.Value(), static_cast<int32_t>(maxSideBarWidth.Unit()), maxSideBarWidthPtr);
247 } else {
248 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetSideBarContainerMaxSideBarWidth(nativeNode);
249 }
250 return panda::JSValueRef::Undefined(vm);
251 }
252
ResetMaxSideBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)253 ArkUINativeModuleValue SideBarContainerBridge::ResetMaxSideBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
254 {
255 EcmaVM* vm = runtimeCallInfo->GetVM();
256 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
257 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
258 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
259 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetSideBarContainerMaxSideBarWidth(nativeNode);
260 return panda::JSValueRef::Undefined(vm);
261 }
262
SetMinContentWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)263 ArkUINativeModuleValue SideBarContainerBridge::SetMinContentWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
264 {
265 EcmaVM* vm = runtimeCallInfo->GetVM();
266 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
267 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
268 Local<JSValueRef> minContentWidthArg = runtimeCallInfo->GetCallArgRef(NUM_1);
269 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
270 CalcDimension minContentWidth(DEFAULT_SIDE_BAR_MIN_CONTENT_WIDTH);
271 RefPtr<ResourceObject> minContentWidthObj;
272 if (ArkTSUtils::ParseJsDimensionNG(
273 vm, minContentWidthArg, minContentWidth, DimensionUnit::VP, minContentWidthObj, true) &&
274 minContentWidth.Value() >= 0) {
275 auto minContentWidthPtr = AceType::RawPtr(minContentWidthObj);
276 GetArkUINodeModifiers()->getSideBarContainerModifier()->setSideBarContainerMinContentWidth(
277 nativeNode, minContentWidth.Value(), static_cast<int32_t>(minContentWidth.Unit()), minContentWidthPtr);
278 } else {
279 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetSideBarContainerMinContentWidth(nativeNode);
280 }
281 return panda::JSValueRef::Undefined(vm);
282 }
283
ResetMinContentWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)284 ArkUINativeModuleValue SideBarContainerBridge::ResetMinContentWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
285 {
286 EcmaVM* vm = runtimeCallInfo->GetVM();
287 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
288 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
289 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
290 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetSideBarContainerMinContentWidth(nativeNode);
291 return panda::JSValueRef::Undefined(vm);
292 }
293
SetSideBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)294 ArkUINativeModuleValue SideBarContainerBridge::SetSideBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
295 {
296 EcmaVM* vm = runtimeCallInfo->GetVM();
297 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
298 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
299 Local<JSValueRef> sideBarPositionArg = runtimeCallInfo->GetCallArgRef(NUM_1);
300 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
301 int32_t sideBarPosition = static_cast<int32_t>(SideBarPosition::START);
302 if (sideBarPositionArg->IsInt()) {
303 sideBarPosition = sideBarPositionArg->Int32Value(vm);
304 }
305 if (sideBarPosition < static_cast<int32_t>(SideBarPosition::START) ||
306 sideBarPosition > static_cast<int32_t>(SideBarPosition::END)) {
307 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetSideBarPosition(nativeNode);
308 } else {
309 GetArkUINodeModifiers()->getSideBarContainerModifier()->setSideBarPosition(nativeNode, sideBarPosition);
310 }
311 return panda::JSValueRef::Undefined(vm);
312 }
313
ResetSideBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)314 ArkUINativeModuleValue SideBarContainerBridge::ResetSideBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
315 {
316 EcmaVM* vm = runtimeCallInfo->GetVM();
317 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
318 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
319 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
320 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetSideBarPosition(nativeNode);
321 return panda::JSValueRef::Undefined(vm);
322 }
323
SetShowSideBar(ArkUIRuntimeCallInfo * runtimeCallInfo)324 ArkUINativeModuleValue SideBarContainerBridge::SetShowSideBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
325 {
326 EcmaVM* vm = runtimeCallInfo->GetVM();
327 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
328 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
329 Local<JSValueRef> showSideBarArg = runtimeCallInfo->GetCallArgRef(NUM_1);
330 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
331 if (showSideBarArg->IsBoolean()) {
332 bool isShow = showSideBarArg->ToBoolean(vm)->Value();
333 GetArkUINodeModifiers()->getSideBarContainerModifier()->setShowSideBar(nativeNode, isShow);
334 } else {
335 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetShowSideBar(nativeNode);
336 }
337 return panda::JSValueRef::Undefined(vm);
338 }
339
ResetShowSideBar(ArkUIRuntimeCallInfo * runtimeCallInfo)340 ArkUINativeModuleValue SideBarContainerBridge::ResetShowSideBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
341 {
342 EcmaVM* vm = runtimeCallInfo->GetVM();
343 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
344 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
345 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
346 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetShowSideBar(nativeNode);
347 return panda::JSValueRef::Undefined(vm);
348 }
349
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)350 ArkUINativeModuleValue SideBarContainerBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
351 {
352 EcmaVM* vm = runtimeCallInfo->GetVM();
353 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
354 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
355 Local<JSValueRef> strokeWidthArg = runtimeCallInfo->GetCallArgRef(NUM_1);
356 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_2);
357 Local<JSValueRef> startMarginArg = runtimeCallInfo->GetCallArgRef(NUM_3);
358 Local<JSValueRef> endMarginArg = runtimeCallInfo->GetCallArgRef(NUM_4);
359 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
360 CalcDimension strokeWidth;
361 CalcDimension startMargin;
362 CalcDimension endMargin;
363 RefPtr<ResourceObject> strokeWidthObj;
364 RefPtr<ResourceObject> startMarginObj;
365 RefPtr<ResourceObject> endMarginObj;
366 RefPtr<ResourceObject> colorObj;
367 ArkUI_Float32 values[NUM_3] = { 1.0, 0.0, 0.0 };
368 int32_t units[NUM_3] = { static_cast<int32_t>(DimensionUnit::VP) };
369 if (ArkTSUtils::ParseJsDimensionNG(vm, strokeWidthArg, strokeWidth, DimensionUnit::VP, strokeWidthObj, true) &&
370 strokeWidth.Value() >= 0) {
371 values[NUM_0] = strokeWidth.Value();
372 units[NUM_0] = static_cast<int32_t>(strokeWidth.Unit());
373 } else {
374 strokeWidth.SetValue(1.0);
375 strokeWidth.SetUnit(DimensionUnit::VP);
376 }
377 if (ArkTSUtils::ParseJsDimensionNG(vm, startMarginArg, startMargin, DimensionUnit::VP, startMarginObj, true) &&
378 startMargin.Value() >= 0) {
379 values[NUM_1] = startMargin.Value();
380 units[NUM_1] = static_cast<int32_t>(startMargin.Unit());
381 } else {
382 startMargin.SetValue(0.0);
383 startMargin.SetUnit(DimensionUnit::VP);
384 }
385 if (ArkTSUtils::ParseJsDimensionNG(vm, endMarginArg, endMargin, DimensionUnit::VP, endMarginObj, true) &&
386 endMargin.Value() >= 0) {
387 values[NUM_2] = endMargin.Value();
388 units[NUM_2] = static_cast<int32_t>(endMargin.Unit());
389 } else {
390 endMargin.SetValue(0.0);
391 endMargin.SetUnit(DimensionUnit::VP);
392 }
393
394 Color color(DEFAULT_SIDE_BAR_DIVIDER_COLOR);
395 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
396 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color, colorObj, nodeInfo)) {
397 color.SetValue(DEFAULT_SIDE_BAR_DIVIDER_COLOR);
398 }
399 auto strokeWidthPtr = AceType::RawPtr(strokeWidthObj);
400 auto startMarginPtr = AceType::RawPtr(startMarginObj);
401 auto endMarginPtr = AceType::RawPtr(endMarginObj);
402 auto colorPtr = AceType::RawPtr(colorObj);
403 GetArkUINodeModifiers()->getSideBarContainerModifier()->setSideBarContainerDivider(
404 nativeNode, values, units, NUM_3, color.GetValue(), strokeWidthPtr, startMarginPtr, endMarginPtr, colorPtr);
405 return panda::JSValueRef::Undefined(vm);
406 }
407
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)408 ArkUINativeModuleValue SideBarContainerBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
409 {
410 EcmaVM* vm = runtimeCallInfo->GetVM();
411 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
412 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
413 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
414 GetArkUINodeModifiers()->getSideBarContainerModifier()->resetSideBarContainerDivider(nativeNode);
415 return panda::JSValueRef::Undefined(vm);
416 }
417
SetSideBarOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)418 ArkUINativeModuleValue SideBarContainerBridge::SetSideBarOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
419 {
420 EcmaVM* vm = runtimeCallInfo->GetVM();
421 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
422 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
423 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
424 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
425 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
426 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
427 auto nodeModifiers = GetArkUINodeModifiers();
428 CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
429 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
430 nodeModifiers->getSideBarContainerModifier()->resetSideBarOnChange(nativeNode);
431 return panda::JSValueRef::Undefined(vm);
432 }
433 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
434 std::function<void(bool)> callback = [vm, frameNode,
435 func = panda::CopyableGlobal(vm, func)](bool isOnChange) {
436 panda::LocalScope pandaScope(vm);
437 panda::TryCatch trycatch(vm);
438 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
439 panda::Local<panda::JSValueRef> params[1] = {
440 panda::BooleanRef::New(vm, isOnChange) };
441 func->Call(vm, func.ToLocal(), params, 1);
442 };
443 nodeModifiers->getSideBarContainerModifier()->setSideBarOnChange(
444 nativeNode, reinterpret_cast<void*>(&callback));
445 return panda::JSValueRef::Undefined(vm);
446 }
447
ResetSideBarOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)448 ArkUINativeModuleValue SideBarContainerBridge::ResetSideBarOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
449 {
450 EcmaVM* vm = runtimeCallInfo->GetVM();
451 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
452 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
453 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
454 auto nodeModifiers = GetArkUINodeModifiers();
455 CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
456 nodeModifiers->getSideBarContainerModifier()->resetSideBarOnChange(nativeNode);
457 return panda::JSValueRef::Undefined(vm);
458 }
459 } // namespace OHOS::Ace::NG
460