1 /*
2 * Copyright (c) 2022-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 "frameworks/bridge/declarative_frontend/jsview/js_side_bar.h"
17
18 #include "base/geometry/dimension.h"
19 #include "base/image/pixel_map.h"
20 #include "base/log/ace_scoring_log.h"
21 #include "base/log/log.h"
22 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
23 #include "bridge/declarative_frontend/engine/js_types.h"
24 #include "bridge/declarative_frontend/jsview/js_utils.h"
25 #include "core/components_ng/base/view_stack_processor.h"
26 #include "core/components_ng/pattern/side_bar/side_bar_container_model_ng.h"
27 #include "frameworks/bridge/declarative_frontend/jsview/js_view_common_def.h"
28 #include "frameworks/bridge/declarative_frontend/jsview/models/side_bar_container_model_impl.h"
29
30 namespace OHOS::Ace {
31 std::unique_ptr<SideBarContainerModel> SideBarContainerModel::instance_ = nullptr;
32 std::mutex SideBarContainerModel::mutex_;
33
GetInstance()34 SideBarContainerModel* SideBarContainerModel::GetInstance()
35 {
36 if (!instance_) {
37 std::lock_guard<std::mutex> lock(mutex_);
38 if (!instance_) {
39 #ifdef NG_BUILD
40 instance_.reset(new NG::SideBarContainerModelNG());
41 #else
42 if (Container::IsCurrentUseNewPipeline()) {
43 instance_.reset(new NG::SideBarContainerModelNG());
44 } else {
45 instance_.reset(new Framework::SideBarContainerModelImpl());
46 }
47 #endif
48 }
49 }
50 return instance_.get();
51 }
52 } // namespace OHOS::Ace
53
54 namespace OHOS::Ace::Framework {
55 namespace {
56 constexpr Dimension DEFAULT_CONTROL_BUTTON_WIDTH = 32.0_vp;
57 constexpr Dimension DEFAULT_CONTROL_BUTTON_HEIGHT = 32.0_vp;
58 constexpr Dimension DEFAULT_CONTROL_BUTTON_TOP = 48.0_vp;
59 constexpr Dimension DEFAULT_DIVIDER_STROKE_WIDTH = 1.0_vp;
60 constexpr Dimension DEFAULT_DIVIDER_START_MARGIN = 0.0_vp;
61 constexpr Dimension DEFAULT_DIVIDER_END_MARGIN = 0.0_vp;
62 static Dimension DEFAULT_SIDE_BAR_WIDTH = 200.0_vp;
63 static Dimension DEFAULT_MIN_SIDE_BAR_WIDTH = 200.0_vp;
64 constexpr Dimension DEFAULT_MAX_SIDE_BAR_WIDTH = 280.0_vp;
65 constexpr Color DEFAULT_DIVIDER_COLOR = Color(0x08000000);
66
ParseAndSetWidth(const JSCallbackInfo & info,WidthType widthType)67 void ParseAndSetWidth(const JSCallbackInfo& info, WidthType widthType)
68 {
69 if (info.Length() < 1) {
70 return;
71 }
72 switch (widthType) {
73 case WidthType::SIDEBAR_WIDTH:
74 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.sideBarWidth");
75 break;
76 case WidthType::MIN_SIDEBAR_WIDTH:
77 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.minSideBarWidth");
78 break;
79 case WidthType::MAX_SIDEBAR_WIDTH:
80 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.maxSideBarWidth");
81 break;
82 default:
83 break;
84 }
85
86 CalcDimension value;
87 if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
88 DEFAULT_SIDE_BAR_WIDTH = 240.0_vp;
89 DEFAULT_MIN_SIDE_BAR_WIDTH = 240.0_vp;
90 }
91
92 RefPtr<ResourceObject> valueResObj;
93 auto isValid = Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)
94 ? JSViewAbstract::ParseJsDimensionVpNG(info[0], value, valueResObj)
95 : JSViewAbstract::ParseJsDimensionVp(info[0], value, valueResObj);
96 if (!isValid) {
97 switch (widthType) {
98 case WidthType::SIDEBAR_WIDTH:
99 value = DEFAULT_SIDE_BAR_WIDTH;
100 break;
101 case WidthType::MIN_SIDEBAR_WIDTH:
102 value = DEFAULT_MIN_SIDE_BAR_WIDTH;
103 break;
104 case WidthType::MAX_SIDEBAR_WIDTH:
105 value = DEFAULT_MAX_SIDE_BAR_WIDTH;
106 break;
107 default:
108 break;
109 }
110 }
111 if (SystemProperties::ConfigChangePerform() && valueResObj) {
112 SideBarContainerModel::GetInstance()->ParseAndSetWidth(widthType, valueResObj);
113 return;
114 }
115 SideBarContainerModel::GetInstance()->ParseAndSetWidth(widthType, value);
116 }
117 } // namespace
118
Create(const JSCallbackInfo & info)119 void JSSideBar::Create(const JSCallbackInfo& info)
120 {
121 SideBarContainerModel::GetInstance()->Create();
122 SideBarContainerType style = SideBarContainerType::EMBED;
123 if (!info[0]->IsNull()) {
124 if (info[0]->IsBoolean()) {
125 style = static_cast<SideBarContainerType>(info[0]->ToBoolean());
126 } else if (info[0]->IsNumber()) {
127 style = static_cast<SideBarContainerType>(info[0]->ToNumber<int>());
128 } else {
129 return;
130 }
131 }
132 SideBarContainerModel::GetInstance()->SetSideBarContainerType(style);
133 }
134
SetShowControlButton(const JSCallbackInfo & info)135 void JSSideBar::SetShowControlButton(const JSCallbackInfo& info)
136 {
137 if (info.Length() < 1) {
138 return;
139 }
140 if (info[0]->IsNull() || info[0]->IsUndefined()) {
141 if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
142 // showControlButton set default true when input illegal value
143 SideBarContainerModel::GetInstance()->SetShowControlButton(true);
144 }
145 return;
146 }
147 if (info[0]->IsBoolean()) {
148 SideBarContainerModel::GetInstance()->SetShowControlButton(info[0]->ToBoolean());
149 }
150 }
151
JsSideBarPosition(const JSCallbackInfo & info)152 void JSSideBar::JsSideBarPosition(const JSCallbackInfo& info)
153 {
154 if (info.Length() < 1) {
155 return;
156 }
157 if (info[0]->IsNull() || info[0]->IsUndefined()) {
158 if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
159 // sideBarPosition set default START when input illegal value
160 SideBarContainerModel::GetInstance()->SetSideBarPosition(SideBarPosition::START);
161 }
162 return;
163 }
164 if (info[0]->IsNumber() && info[0]->ToNumber<int32_t>() >= 0 && info[0]->ToNumber<int32_t>() <= 1) {
165 SideBarContainerModel::GetInstance()->SetSideBarPosition(
166 static_cast<SideBarPosition>(info[0]->ToNumber<int32_t>()));
167 }
168 }
169
JSBind(BindingTarget globalObj)170 void JSSideBar::JSBind(BindingTarget globalObj)
171 {
172 JSClass<JSSideBar>::Declare("SideBarContainer");
173 MethodOptions opt = MethodOptions::NONE;
174 JSClass<JSSideBar>::StaticMethod("create", &JSSideBar::Create, opt);
175 JSClass<JSSideBar>::StaticMethod("showSideBar", &JSSideBar::JsShowSideBar);
176 JSClass<JSSideBar>::StaticMethod("controlButton", &JSSideBar::JsControlButton);
177 JSClass<JSSideBar>::StaticMethod("showControlButton", &JSSideBar::SetShowControlButton);
178 JSClass<JSSideBar>::StaticMethod("onChange", &JSSideBar::OnChange);
179 JSClass<JSSideBar>::StaticMethod("sideBarWidth", &JSSideBar::JsSideBarWidth);
180 JSClass<JSSideBar>::StaticMethod("minSideBarWidth", &JSSideBar::JsMinSideBarWidth);
181 JSClass<JSSideBar>::StaticMethod("maxSideBarWidth", &JSSideBar::JsMaxSideBarWidth);
182 JSClass<JSSideBar>::StaticMethod("autoHide", &JSSideBar::JsAutoHide);
183 JSClass<JSSideBar>::StaticMethod("sideBarPosition", &JSSideBar::JsSideBarPosition);
184 JSClass<JSSideBar>::StaticMethod("divider", &JSSideBar::JsDivider);
185 JSClass<JSSideBar>::StaticMethod("minContentWidth", &JSSideBar::JsMinContentWidth);
186 JSClass<JSSideBar>::StaticMethod("onTouch", &JSInteractableView::JsOnTouch);
187 JSClass<JSSideBar>::StaticMethod("width", SetWidth);
188 JSClass<JSSideBar>::StaticMethod("height", SetHeight);
189 JSClass<JSSideBar>::StaticMethod("size", SetSize);
190 JSClass<JSSideBar>::StaticMethod("width", &JSStack::SetWidth);
191 JSClass<JSSideBar>::StaticMethod("height", &JSStack::SetHeight);
192 JSClass<JSSideBar>::StaticMethod("size", &JSStack::SetSize);
193 JSClass<JSSideBar>::StaticMethod("onKeyEvent", &JSInteractableView::JsOnKey);
194 JSClass<JSSideBar>::StaticMethod("onDeleteEvent", &JSInteractableView::JsOnDelete);
195 JSClass<JSSideBar>::StaticMethod("onClick", &JSInteractableView::JsOnClick);
196 JSClass<JSSideBar>::StaticMethod("onAttach", &JSInteractableView::JsOnAttach);
197 JSClass<JSSideBar>::StaticMethod("onAppear", &JSInteractableView::JsOnAppear);
198 JSClass<JSSideBar>::StaticMethod("onDetach", &JSInteractableView::JsOnDetach);
199 JSClass<JSSideBar>::StaticMethod("onDisAppear", &JSInteractableView::JsOnDisAppear);
200 JSClass<JSSideBar>::InheritAndBind<JSContainerBase>(globalObj);
201 }
202
OnChange(const JSCallbackInfo & info)203 void JSSideBar::OnChange(const JSCallbackInfo& info)
204 {
205 if (info.Length() < 1 || !info[0]->IsFunction()) {
206 return;
207 }
208
209 auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
210 WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
211 auto onChange = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](bool isShow) {
212 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
213 ACE_SCORING_EVENT("SideBarContainer.onChange");
214 PipelineContext::SetCallBackNode(node);
215 auto newJSVal = JSRef<JSVal>::Make(ToJSValue(isShow));
216 func->ExecuteJS(1, &newJSVal);
217 };
218 SideBarContainerModel::GetInstance()->SetOnChange(std::move(onChange));
219 info.ReturnSelf();
220 }
221
ParseSideBarWidthObject(const JSCallbackInfo & info,JSRef<JSVal> arrowFunc,bool isNumber)222 void ParseSideBarWidthObject(const JSCallbackInfo& info, JSRef<JSVal> arrowFunc, bool isNumber)
223 {
224 auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(arrowFunc));
225 WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
226 auto onChangeEvent = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc),
227 node = targetNode, useNumber = isNumber](const Dimension& sideBarWidth) {
228 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
229 ACE_SCORING_EVENT("SideBarContainer.onSideBarWidthChangeEvent");
230 PipelineContext::SetCallBackNode(node);
231 auto newJSVal = useNumber ? JSRef<JSVal>::Make(ToJSValue(sideBarWidth.ConvertToVp())) :
232 JSRef<JSVal>::Make(ToJSValue(sideBarWidth.ToString()));
233 func->ExecuteJS(1, &newJSVal);
234 };
235 SideBarContainerModel::GetInstance()->SetOnSideBarWidthChangeEvent(std::move(onChangeEvent));
236 }
237
JsSideBarWidth(const JSCallbackInfo & info)238 void JSSideBar::JsSideBarWidth(const JSCallbackInfo& info)
239 {
240 if (info[0]->IsObject()) {
241 JSRef<JSObject> callbackObj = JSRef<JSObject>::Cast(info[0]);
242 CalcDimension value;
243 auto sideBarWidthValue = callbackObj->GetProperty("value");
244 auto sideBarWidthCallbackValue = callbackObj->GetProperty("$value");
245 auto isValid = JSViewAbstract::ParseJsDimensionVpNG(sideBarWidthValue, value);
246 bool isNumber = sideBarWidthValue->IsNumber();
247 if (isValid && sideBarWidthCallbackValue->IsFunction()) {
248 SideBarContainerModel::GetInstance()->ParseAndSetWidth(WidthType::SIDEBAR_WIDTH, value, true);
249 ParseSideBarWidthObject(info, sideBarWidthCallbackValue, isNumber);
250 return;
251 }
252 }
253 ParseAndSetWidth(info, WidthType::SIDEBAR_WIDTH);
254 }
255
JsMaxSideBarWidth(const JSCallbackInfo & info)256 void JSSideBar::JsMaxSideBarWidth(const JSCallbackInfo& info)
257 {
258 ParseAndSetWidth(info, WidthType::MAX_SIDEBAR_WIDTH);
259 }
260
JsMinSideBarWidth(const JSCallbackInfo & info)261 void JSSideBar::JsMinSideBarWidth(const JSCallbackInfo& info)
262 {
263 ParseAndSetWidth(info, WidthType::MIN_SIDEBAR_WIDTH);
264 }
265
ParseShowSideBarObject(const JSCallbackInfo & args,const JSRef<JSVal> & changeEventVal)266 void ParseShowSideBarObject(const JSCallbackInfo& args, const JSRef<JSVal>& changeEventVal)
267 {
268 CHECK_NULL_VOID(changeEventVal->IsFunction());
269
270 auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(changeEventVal));
271 WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
272 auto onChangeEvent = [execCtx = args.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
273 bool isShow) {
274 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
275 ACE_SCORING_EVENT("SideBarContainer.onChangeEvent");
276 PipelineContext::SetCallBackNode(node);
277 auto newJSVal = JSRef<JSVal>::Make(ToJSValue(isShow));
278 func->ExecuteJS(1, &newJSVal);
279 };
280 SideBarContainerModel::GetInstance()->SetOnChangeEvent(std::move(onChangeEvent));
281 }
282
JsShowSideBar(const JSCallbackInfo & info)283 void JSSideBar::JsShowSideBar(const JSCallbackInfo& info)
284 {
285 if (info.Length() < 1 || info.Length() > 2) {
286 return;
287 }
288
289 bool isShow = true;
290 if (info.Length() > 0 && info[0]->IsBoolean()) {
291 isShow = info[0]->ToBoolean();
292 }
293
294 SideBarContainerModel::GetInstance()->SetShowSideBar(isShow);
295 if (info.Length() > 1 && info[1]->IsFunction()) {
296 ParseShowSideBarObject(info, info[1]);
297 }
298 }
299
SetControlButtonIcon(SideBarControlButtonType iconType,JSRef<JSVal> icon)300 void JSSideBar::SetControlButtonIcon(SideBarControlButtonType iconType, JSRef<JSVal> icon)
301 {
302 if (icon->IsUndefined() || icon->IsNull()) {
303 return;
304 }
305 std::string iconPath;
306 RefPtr<ResourceObject> iconPathResObj;
307 auto isStrType = ParseJsMedia(icon, iconPath, iconPathResObj);
308 RefPtr<PixelMap> pixMap = nullptr;
309 #if defined(PIXEL_MAP_SUPPORTED)
310 if (!isStrType) {
311 pixMap = CreatePixelMapFromNapiValue(icon);
312 }
313 #endif
314 bool isNewframework = iconPathResObj && SystemProperties::ConfigChangePerform();
315 if (isStrType || pixMap != nullptr) {
316 switch (iconType) {
317 case SideBarControlButtonType::SHOWN:
318 if (isNewframework) {
319 SideBarContainerModel::GetInstance()->SetControlButtonShowIconInfo(
320 iconPathResObj, !isStrType, pixMap);
321 } else {
322 SideBarContainerModel::GetInstance()->SetControlButtonShowIconInfo(iconPath, !isStrType, pixMap);
323 }
324 break;
325 case SideBarControlButtonType::HIDDEN:
326 if (isNewframework) {
327 SideBarContainerModel::GetInstance()->SetControlButtonHiddenIconInfo(
328 iconPathResObj, !isStrType, pixMap);
329 } else {
330 SideBarContainerModel::GetInstance()->SetControlButtonHiddenIconInfo(iconPath, !isStrType, pixMap);
331 }
332 break;
333 case SideBarControlButtonType::SWITCHING:
334 if (isNewframework) {
335 SideBarContainerModel::GetInstance()->SetControlButtonSwitchingIconInfo(
336 iconPathResObj, !isStrType, pixMap);
337 } else {
338 SideBarContainerModel::GetInstance()->SetControlButtonSwitchingIconInfo(
339 iconPath, !isStrType, pixMap);
340 }
341 break;
342 default:
343 break;
344 }
345 }
346 }
347
JsControlButton(const JSCallbackInfo & info)348 void JSSideBar::JsControlButton(const JSCallbackInfo& info)
349 {
350 if (info.Length() < 1) {
351 return;
352 }
353 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.buttonIconOptions.shown");
354 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.buttonIconOptions.hidden");
355 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.buttonIconOptions.switching");
356 if (info[0]->IsNull() || info[0]->IsUndefined()) {
357 if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
358 // controlButton icon set default style and position when input illegal value
359 SideBarContainerModel::GetInstance()->ResetControlButton();
360 }
361 return;
362 }
363 if (info[0]->IsObject()) {
364 JSRef<JSObject> value = JSRef<JSObject>::Cast(info[0]);
365 if (!AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TEN)) {
366 ParseControlButtonOG(value);
367 } else {
368 ParseControlButtonNG(value);
369 }
370
371 JSRef<JSVal> icons = value->GetProperty("icons");
372 if (icons->IsNull() || icons->IsUndefined()) {
373 if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
374 // controlButton icon set default style when input illegal value
375 SideBarContainerModel::GetInstance()->ResetControlButtonIconInfo();
376 }
377 return;
378 }
379 if (icons->IsObject()) {
380 JSRef<JSObject> iconsVal = JSRef<JSObject>::Cast(icons);
381 JSRef<JSVal> showIcon = iconsVal->GetProperty("shown");
382 JSRef<JSVal> switchingIcon = iconsVal->GetProperty("switching");
383 JSRef<JSVal> hiddenIcon = iconsVal->GetProperty("hidden");
384 SetControlButtonIcon(SideBarControlButtonType::SHOWN, showIcon);
385 SetControlButtonIcon(SideBarControlButtonType::HIDDEN, hiddenIcon);
386 SetControlButtonIcon(SideBarControlButtonType::SWITCHING, switchingIcon);
387 }
388 }
389 }
390
ProcessDividerProperties(const JSRef<JSObject> & obj)391 void JSSideBar::ProcessDividerProperties(const JSRef<JSObject>& obj)
392 {
393 Dimension strokeWidth = DEFAULT_DIVIDER_STROKE_WIDTH;
394 RefPtr<ResourceObject> strokeWidthResObj;
395 if (!ConvertFromJSValueNG(obj->GetProperty("strokeWidth"), strokeWidth, strokeWidthResObj) ||
396 (strokeWidth.Value() < 0.0f)) {
397 strokeWidth = DEFAULT_DIVIDER_STROKE_WIDTH;
398 }
399 if (SystemProperties::ConfigChangePerform() && strokeWidthResObj) {
400 SideBarContainerModel::GetInstance()->SetDividerStrokeWidth(strokeWidthResObj);
401 } else {
402 SideBarContainerModel::GetInstance()->SetDividerStrokeWidth(strokeWidth);
403 }
404
405 Color color = DEFAULT_DIVIDER_COLOR;
406 RefPtr<ResourceObject> colorResObj;
407 if (!ConvertFromJSValue(obj->GetProperty("color"), color, colorResObj)) {
408 color = DEFAULT_DIVIDER_COLOR;
409 }
410 if (SystemProperties::ConfigChangePerform() && colorResObj) {
411 SideBarContainerModel::GetInstance()->SetDividerColor(colorResObj);
412 } else {
413 SideBarContainerModel::GetInstance()->SetDividerColor(color);
414 }
415
416 Dimension startMargin = DEFAULT_DIVIDER_START_MARGIN;
417 RefPtr<ResourceObject> startMarginResObj;
418 if (!ConvertFromJSValueNG(obj->GetProperty("startMargin"), startMargin, startMarginResObj) ||
419 (startMargin.Value() < 0.0f)) {
420 startMargin = DEFAULT_DIVIDER_START_MARGIN;
421 }
422 if (SystemProperties::ConfigChangePerform() && startMarginResObj) {
423 SideBarContainerModel::GetInstance()->SetDividerStartMargin(startMarginResObj);
424 } else {
425 SideBarContainerModel::GetInstance()->SetDividerStartMargin(startMargin);
426 }
427
428 Dimension endMargin = DEFAULT_DIVIDER_END_MARGIN;
429 RefPtr<ResourceObject> endMarginResObj;
430 if (!ConvertFromJSValueNG(obj->GetProperty("endMargin"), endMargin, endMarginResObj) ||
431 (endMargin.Value() < 0.0f)) {
432 endMargin = DEFAULT_DIVIDER_END_MARGIN;
433 }
434 if (SystemProperties::ConfigChangePerform() && endMarginResObj) {
435 SideBarContainerModel::GetInstance()->SetDividerEndMargin(endMarginResObj);
436 } else {
437 SideBarContainerModel::GetInstance()->SetDividerEndMargin(endMargin);
438 }
439 }
440
JsDivider(const JSCallbackInfo & info)441 void JSSideBar::JsDivider(const JSCallbackInfo& info)
442 {
443 if (info.Length() < 1) {
444 return;
445 }
446 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.strokeWidth");
447 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.color");
448 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.startMargin");
449 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.endMargin");
450 if (info[0]->IsNull() || info[0]->IsUndefined()) {
451 if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
452 // sideBar divider set default width when input illegal value
453 SideBarContainerModel::GetInstance()->SetDividerStrokeWidth(DEFAULT_DIVIDER_STROKE_WIDTH);
454 } else if (info[0]->IsNull()) {
455 SideBarContainerModel::GetInstance()->SetDividerStrokeWidth(0.0_vp);
456 }
457 return;
458 }
459 if (info[0]->IsObject()) {
460 JSRef<JSObject> obj = JSRef<JSObject>::Cast(info[0]);
461 ProcessDividerProperties(obj);
462 }
463 }
464
JsMinContentWidth(const JSCallbackInfo & info)465 void JSSideBar::JsMinContentWidth(const JSCallbackInfo& info)
466 {
467 if (info.Length() < 1) {
468 return;
469 }
470 SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.minContentWidth");
471 if (info[0]->IsNull()) {
472 SideBarContainerModel::GetInstance()->SetMinContentWidth(-1.0_vp);
473 return;
474 }
475 CalcDimension minContentWidth;
476 RefPtr<ResourceObject> valueResObj;
477 if (!JSViewAbstract::ParseJsDimensionVp(info[0], minContentWidth, valueResObj)) {
478 SideBarContainerModel::GetInstance()->SetMinContentWidth(-1.0_vp);
479 return;
480 }
481 if (SystemProperties::ConfigChangePerform() && valueResObj) {
482 SideBarContainerModel::GetInstance()->SetMinContentWidth(valueResObj);
483 return;
484 }
485 SideBarContainerModel::GetInstance()->SetMinContentWidth(minContentWidth);
486 }
487
JsAutoHide(bool autoHide)488 void JSSideBar::JsAutoHide(bool autoHide)
489 {
490 SideBarContainerModel::GetInstance()->SetAutoHide(autoHide);
491 }
492
ParseControlButtonOG(JSRef<JSObject> value)493 void JSSideBar::ParseControlButtonOG(JSRef<JSObject> value)
494 {
495 JSRef<JSVal> width = value->GetProperty("width");
496 JSRef<JSVal> height = value->GetProperty("height");
497 JSRef<JSVal> left = value->GetProperty("left");
498 JSRef<JSVal> top = value->GetProperty("top");
499
500 if (!width->IsNull() && width->IsNumber()) {
501 auto controlButtonWidth = CalcDimension(width->ToNumber<double>(), DimensionUnit::VP);
502 if (LessNotEqual(controlButtonWidth.Value(), 0.0)) {
503 controlButtonWidth = DEFAULT_CONTROL_BUTTON_WIDTH;
504 }
505 SideBarContainerModel::GetInstance()->SetControlButtonWidth(controlButtonWidth);
506 }
507
508 if (!height->IsNull() && height->IsNumber()) {
509 auto controlButtonHeight = CalcDimension(height->ToNumber<double>(), DimensionUnit::VP);
510 if (LessNotEqual(controlButtonHeight.Value(), 0.0)) {
511 controlButtonHeight = DEFAULT_CONTROL_BUTTON_HEIGHT;
512 }
513 SideBarContainerModel::GetInstance()->SetControlButtonHeight(controlButtonHeight);
514 }
515
516 if (!left->IsNull() && left->IsNumber()) {
517 SideBarContainerModel::GetInstance()->SetControlButtonLeft(
518 Dimension(left->ToNumber<double>(), DimensionUnit::VP));
519 }
520
521 if (!top->IsNull() && top->IsNumber()) {
522 SideBarContainerModel::GetInstance()->SetControlButtonTop(
523 Dimension(top->ToNumber<double>(), DimensionUnit::VP));
524 }
525 }
526
ParseControlButtonNG(JSRef<JSObject> value)527 void JSSideBar::ParseControlButtonNG(JSRef<JSObject> value)
528 {
529 JSRef<JSVal> width = value->GetProperty("width");
530 JSRef<JSVal> height = value->GetProperty("height");
531 JSRef<JSVal> left = value->GetProperty("left");
532 JSRef<JSVal> top = value->GetProperty("top");
533
534 auto controlButtonWidth = DEFAULT_CONTROL_BUTTON_WIDTH;
535 if (width->IsNumber() && GreatOrEqual(width->ToNumber<double>(), 0.0)) {
536 controlButtonWidth = CalcDimension(width->ToNumber<double>(), DimensionUnit::VP);
537 }
538 SideBarContainerModel::GetInstance()->SetControlButtonWidth(controlButtonWidth);
539
540 auto controlButtonHeight = DEFAULT_CONTROL_BUTTON_HEIGHT;
541 if (height->IsNumber() && GreatOrEqual(height->ToNumber<double>(), 0.0)) {
542 controlButtonHeight = CalcDimension(height->ToNumber<double>(), DimensionUnit::VP);
543 }
544 SideBarContainerModel::GetInstance()->SetControlButtonHeight(controlButtonHeight);
545
546 if (left->IsNumber() && GreatOrEqual(left->ToNumber<double>(), 0.0)) {
547 auto controlButtonLeft = CalcDimension(left->ToNumber<double>(), DimensionUnit::VP);
548 SideBarContainerModel::GetInstance()->SetControlButtonLeft(controlButtonLeft);
549 } else {
550 SideBarContainerModel::GetInstance()->ResetControlButtonLeft();
551 }
552
553 auto controlButtonTop = DEFAULT_CONTROL_BUTTON_TOP;
554 if (top->IsNumber() && GreatOrEqual(top->ToNumber<double>(), 0.0)) {
555 controlButtonTop = CalcDimension(top->ToNumber<double>(), DimensionUnit::VP);
556 }
557 SideBarContainerModel::GetInstance()->SetControlButtonTop(controlButtonTop);
558 }
559
560 } // namespace OHOS::Ace::Framework
561