1 /*
2 * Copyright (c) 2024 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 "cj_side_bar_container_ffi.h"
17
18 #include "base/geometry/dimension.h"
19 #include "cj_lambda.h"
20 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
21 #include "core/components_ng/base/view_abstract.h"
22 #include "core/components_ng/base/view_stack_processor.h"
23 #include "core/components_ng/pattern/side_bar/side_bar_container_model.h"
24
25 using namespace OHOS::Ace;
26 using namespace OHOS::Ace::Framework;
27
28 namespace {
29 constexpr Dimension DEFAULT_CONTROL_BUTTON_WIDTH = 32.0_vp;
30 constexpr Dimension DEFAULT_CONTROL_BUTTON_HEIGHT = 32.0_vp;
31 constexpr Dimension DEFAULT_SIDE_BAR_WIDTH = 200.0_vp;
32 constexpr Dimension DEFAULT_MIN_SIDE_BAR_WIDTH = 200.0_vp;
33 constexpr Dimension DEFAULT_MAX_SIDE_BAR_WIDTH = 280.0_vp;
34
35 enum class CJWidthType : uint32_t {
36 SIDEBAR_WIDTH = 0,
37 MIN_SIDEBAR_WIDTH,
38 MAX_SIDEBAR_WIDTH,
39 };
40
41 const std::vector<SideBarContainerType> SIDE_BAR_TYPE = { SideBarContainerType::EMBED, SideBarContainerType::OVERLAY };
42 const std::vector<SideBarPosition> SIDE_BAR_POSITION = { SideBarPosition::START, SideBarPosition::END };
43
ParseAndSetWidth(Dimension dimension,CJWidthType widthType)44 void ParseAndSetWidth(Dimension dimension, CJWidthType widthType)
45 {
46 switch (widthType) {
47 case CJWidthType::SIDEBAR_WIDTH:
48 SideBarContainerModel::GetInstance()->SetSideBarWidth(
49 dimension.IsNonNegative() ? dimension : DEFAULT_SIDE_BAR_WIDTH);
50 break;
51 case CJWidthType::MIN_SIDEBAR_WIDTH:
52 SideBarContainerModel::GetInstance()->SetMinSideBarWidth(
53 dimension.IsNonNegative() ? dimension : DEFAULT_MIN_SIDE_BAR_WIDTH);
54 break;
55 case CJWidthType::MAX_SIDEBAR_WIDTH:
56 SideBarContainerModel::GetInstance()->SetMaxSideBarWidth(
57 dimension.IsNonNegative() ? dimension : DEFAULT_MAX_SIDE_BAR_WIDTH);
58 break;
59 default:
60 break;
61 }
62 }
63 } // namespace
64
65 extern "C" {
FfiOHOSAceFrameworkSideBarCreate(int32_t type)66 void FfiOHOSAceFrameworkSideBarCreate(int32_t type)
67 {
68 if (!Utils::CheckParamsValid(type, SIDE_BAR_TYPE.size())) {
69 LOGE("invalid value for sidebar type");
70 return;
71 }
72 SideBarContainerModel::GetInstance()->Create();
73 SideBarContainerType style = static_cast<SideBarContainerType>(type);
74 SideBarContainerModel::GetInstance()->SetSideBarContainerType(style);
75 }
FfiOHOSAceFrameworkSideBarShowSideBar(bool isShow)76 void FfiOHOSAceFrameworkSideBarShowSideBar(bool isShow)
77 {
78 SideBarContainerModel::GetInstance()->SetShowSideBar(isShow);
79 }
FfiOHOSAceFrameworkSideBarControlButton(CJSideBarButtonStyle style)80 void FfiOHOSAceFrameworkSideBarControlButton(CJSideBarButtonStyle style)
81 {
82 auto controlButtonWidth = Dimension(style.width, DimensionUnit::VP);
83 if (LessNotEqual(controlButtonWidth.Value(), 0.0)) {
84 controlButtonWidth = DEFAULT_CONTROL_BUTTON_WIDTH;
85 }
86 SideBarContainerModel::GetInstance()->SetControlButtonWidth(controlButtonWidth);
87
88 auto controlButtonHeight = Dimension(style.height, DimensionUnit::VP);
89 if (LessNotEqual(controlButtonHeight.Value(), 0.0)) {
90 controlButtonHeight = DEFAULT_CONTROL_BUTTON_HEIGHT;
91 }
92 SideBarContainerModel::GetInstance()->SetControlButtonHeight(controlButtonHeight);
93 SideBarContainerModel::GetInstance()->SetControlButtonLeft(Dimension(style.left, DimensionUnit::VP));
94 SideBarContainerModel::GetInstance()->SetControlButtonTop(Dimension(style.top, DimensionUnit::VP));
95
96 auto iconsInfo = style.icons;
97 if (iconsInfo.shown) {
98 SideBarContainerModel::GetInstance()->SetControlButtonShowIconInfo(iconsInfo.shown, false, nullptr);
99 }
100 if (iconsInfo.hidden) {
101 SideBarContainerModel::GetInstance()->SetControlButtonHiddenIconInfo(iconsInfo.hidden, false, nullptr);
102 }
103 if (iconsInfo.switching) {
104 SideBarContainerModel::GetInstance()->SetControlButtonSwitchingIconInfo(iconsInfo.switching, false, nullptr);
105 }
106 }
FfiOHOSAceFrameworkSideBarShowControlButton(bool isShow)107 void FfiOHOSAceFrameworkSideBarShowControlButton(bool isShow)
108 {
109 SideBarContainerModel::GetInstance()->SetShowControlButton(isShow);
110 }
FfiOHOSAceFrameworkSideBarOnChange(void (* callback)(bool isShow))111 void FfiOHOSAceFrameworkSideBarOnChange(void (*callback)(bool isShow))
112 {
113 auto onChange = [ffiCallback = CJLambda::Create(callback)](bool isShow) { ffiCallback(isShow); };
114 SideBarContainerModel::GetInstance()->SetOnChange(std::move(onChange));
115 }
116
FfiOHOSAceFrameworkSideBarSideBarWidth(double width,int32_t unit)117 void FfiOHOSAceFrameworkSideBarSideBarWidth(double width, int32_t unit)
118 {
119 ParseAndSetWidth(Dimension(width, static_cast<DimensionUnit>(unit)), CJWidthType::SIDEBAR_WIDTH);
120 }
121
FfiOHOSAceFrameworkSideBarMinSideBarWidth(double width,int32_t unit)122 void FfiOHOSAceFrameworkSideBarMinSideBarWidth(double width, int32_t unit)
123 {
124 ParseAndSetWidth(Dimension(width, static_cast<DimensionUnit>(unit)), CJWidthType::MIN_SIDEBAR_WIDTH);
125 }
FfiOHOSAceFrameworkSideBarMaxSideBarWidth(double width,int32_t unit)126 void FfiOHOSAceFrameworkSideBarMaxSideBarWidth(double width, int32_t unit)
127 {
128 ParseAndSetWidth(Dimension(width, static_cast<DimensionUnit>(unit)), CJWidthType::MAX_SIDEBAR_WIDTH);
129 }
FfiOHOSAceFrameworkSideBarAutoHide(bool autoHide)130 void FfiOHOSAceFrameworkSideBarAutoHide(bool autoHide)
131 {
132 SideBarContainerModel::GetInstance()->SetAutoHide(autoHide);
133 }
FfiOHOSAceFrameworkSideBarSideBarPosition(int32_t position)134 void FfiOHOSAceFrameworkSideBarSideBarPosition(int32_t position)
135 {
136 if (!Utils::CheckParamsValid(position, SIDE_BAR_POSITION.size())) {
137 LOGE("invalid value for sidebar position");
138 return;
139 }
140 SideBarPosition sideBarPosition = static_cast<SideBarPosition>(position);
141 SideBarContainerModel::GetInstance()->SetSideBarPosition(sideBarPosition);
142 }
FfiOHOSAceFrameworkSideBarPop()143 void FfiOHOSAceFrameworkSideBarPop()
144 {
145 NG::ViewStackProcessor::GetInstance()->PopContainer();
146 }
147 }
148