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 "core/interfaces/native/node/side_bar_container_modifier.h"
16 #include "core/components/common/properties/alignment.h"
17 #include "core/components_ng/base/frame_node.h"
18 #include "core/components_ng/base/view_abstract.h"
19 #include "core/components_ng/pattern/side_bar/side_bar_container_model_ng.h"
20 #include "core/pipeline/base/element_register.h"
21 
22 namespace OHOS::Ace::NG {
23 constexpr int NUM_0 = 0;
24 constexpr int NUM_1 = 1;
25 constexpr int NUM_2 = 2;
26 constexpr int NUM_3 = 3;
27 const Dimension DEFAULT_SIDE_BAR_WIDTH = 200.0_vp;
28 const Dimension DEFAULT_SIDE_BAR_WIDTH_V10 = 240.0_vp;
29 const Dimension DEFAULT_MIN_SIDE_BAR_WIDTH = 200.0_vp;
30 const Dimension DEFAULT_MIN_SIDE_BAR_WIDTH_V10 = 240.0_vp;
31 const Dimension DEFAULT_CONTROL_BUTTON_WIDTH = 32.0_vp;
32 const Dimension DEFAULT_CONTROL_BUTTON_HEIGHT = 32.0_vp;
33 constexpr Dimension DEFAULT_CONTROL_BUTTON_TOP = 48.0_vp;
34 const Dimension DEFAULT_SIDE_BAR_CONTAINER_MAX_SIDE_BAR_WIDTH(280.0, DimensionUnit::VP);
35 constexpr Dimension DEFAULT_DIVIDER_STROKE_WIDTH = 1.0_vp;
36 const bool DEFAULT_SHOW_SIDE_BAR = true;
37 const bool DEFAULT_SHOW_CONTROL_BUTTON = true;
38 const bool DEFAULT_AUTO_HIDE = true;
39 constexpr SideBarPosition DEFAULT_SIDE_BAR_POSITION = SideBarPosition::START;
40 constexpr uint32_t DEFAULT_SIDE_BAR_DIVIDER_COLOR = 0x08000000;
41 const Dimension DEFAULT_START_MARGIN(0.0, DimensionUnit::VP);
42 const Dimension DEFAULT_END_MARGIN(0.0, DimensionUnit::VP);
SetSideBarWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)43 void SetSideBarWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
44 {
45     auto* frameNode = reinterpret_cast<FrameNode*>(node);
46     CHECK_NULL_VOID(frameNode);
47     Dimension sideBarWidthDimension(value, static_cast<DimensionUnit>(unit));
48     SideBarContainerModelNG::SetSideBarWidth(frameNode, sideBarWidthDimension);
49 }
50 
ResetSideBarWidth(ArkUINodeHandle node)51 void ResetSideBarWidth(ArkUINodeHandle node)
52 {
53     auto* frameNode = reinterpret_cast<FrameNode*>(node);
54     CHECK_NULL_VOID(frameNode);
55     if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
56         SideBarContainerModelNG::SetSideBarWidth(frameNode, DEFAULT_SIDE_BAR_WIDTH_V10);
57         return;
58     }
59     SideBarContainerModelNG::SetSideBarWidth(frameNode, DEFAULT_SIDE_BAR_WIDTH);
60 }
61 
SetMinSideBarWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)62 void SetMinSideBarWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
63 {
64     auto* frameNode = reinterpret_cast<FrameNode*>(node);
65     CHECK_NULL_VOID(frameNode);
66     Dimension minSideBarWidthDimension(value, static_cast<DimensionUnit>(unit));
67     SideBarContainerModelNG::SetMinSideBarWidth(frameNode, minSideBarWidthDimension);
68 }
69 
ResetMinSideBarWidth(ArkUINodeHandle node)70 void ResetMinSideBarWidth(ArkUINodeHandle node)
71 {
72     auto* frameNode = reinterpret_cast<FrameNode*>(node);
73     CHECK_NULL_VOID(frameNode);
74     if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
75         SideBarContainerModelNG::SetMinSideBarWidth(frameNode, DEFAULT_MIN_SIDE_BAR_WIDTH_V10);
76         return;
77     }
78     SideBarContainerModelNG::SetMinSideBarWidth(frameNode, DEFAULT_MIN_SIDE_BAR_WIDTH);
79 }
80 
SetControlButton(ArkUINodeHandle node,const ArkUI_Float32 * values,int32_t valueLength,const struct ArkUIIconsStruct * iconsStruct)81 void SetControlButton(ArkUINodeHandle node, const ArkUI_Float32* values, int32_t valueLength,
82     const struct ArkUIIconsStruct* iconsStruct)
83 {
84     auto* frameNode = reinterpret_cast<FrameNode*>(node);
85     CHECK_NULL_VOID(frameNode);
86     Dimension left = Dimension(values[0], DimensionUnit::VP);
87     Dimension top = Dimension(values[1], DimensionUnit::VP);
88     Dimension width = Dimension(values[2], DimensionUnit::VP);
89     Dimension height = Dimension(values[3], DimensionUnit::VP);
90     SideBarContainerModelNG::SetControlButtonLeft(frameNode, left);
91     SideBarContainerModelNG::SetControlButtonTop(frameNode, top);
92     SideBarContainerModelNG::SetControlButtonWidth(frameNode, width);
93     SideBarContainerModelNG::SetControlButtonHeight(frameNode, height);
94     CHECK_NULL_VOID(iconsStruct);
95     if (iconsStruct->HiddenIconInfo) {
96         SideBarContainerModelNG::SetControlButtonHiddenIconInfo(frameNode, iconsStruct->HiddenIconInfo, false, nullptr);
97     }
98     if (iconsStruct->ShowIconInfo) {
99         SideBarContainerModelNG::SetControlButtonShowIconInfo(frameNode, iconsStruct->ShowIconInfo, false, nullptr);
100     }
101     if (iconsStruct->SwitchingIconInfo) {
102         SideBarContainerModelNG::SetControlButtonSwitchingIconInfo(
103             frameNode, iconsStruct->SwitchingIconInfo, false, nullptr);
104     }
105 }
106 
ResetControlButton(ArkUINodeHandle node)107 void ResetControlButton(ArkUINodeHandle node)
108 {
109     auto* frameNode = reinterpret_cast<FrameNode*>(node);
110     CHECK_NULL_VOID(frameNode);
111     if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
112         SideBarContainerModelNG::SetControlButtonWidth(frameNode, DEFAULT_CONTROL_BUTTON_WIDTH);
113         SideBarContainerModelNG::SetControlButtonHeight(frameNode, DEFAULT_CONTROL_BUTTON_HEIGHT);
114         SideBarContainerModelNG::ResetControlButtonLeft(frameNode);
115         SideBarContainerModelNG::SetControlButtonTop(frameNode, DEFAULT_CONTROL_BUTTON_TOP);
116         SideBarContainerModelNG::ResetControlButtonIconInfo(frameNode);
117         return;
118     }
119     SideBarContainerModelNG::SetControlButtonWidth(frameNode, DEFAULT_CONTROL_BUTTON_WIDTH);
120     SideBarContainerModelNG::SetControlButtonHeight(frameNode, DEFAULT_CONTROL_BUTTON_HEIGHT);
121 }
122 
SetShowControlButton(ArkUINodeHandle node,ArkUI_Bool isShow)123 void SetShowControlButton(ArkUINodeHandle node, ArkUI_Bool isShow)
124 {
125     auto* frameNode = reinterpret_cast<FrameNode*>(node);
126     CHECK_NULL_VOID(frameNode);
127     SideBarContainerModelNG::SetShowControlButton(frameNode, isShow);
128 }
129 
ResetShowControlButton(ArkUINodeHandle node)130 void ResetShowControlButton(ArkUINodeHandle node)
131 {
132     auto* frameNode = reinterpret_cast<FrameNode*>(node);
133     CHECK_NULL_VOID(frameNode);
134     SideBarContainerModelNG::SetShowControlButton(frameNode, DEFAULT_SHOW_CONTROL_BUTTON);
135 }
136 
SetAutoHide(ArkUINodeHandle node,ArkUI_Uint32 value)137 void SetAutoHide(ArkUINodeHandle node, ArkUI_Uint32 value)
138 {
139     auto* frameNode = reinterpret_cast<FrameNode*>(node);
140     CHECK_NULL_VOID(frameNode);
141     SideBarContainerModelNG::SetAutoHide(frameNode, static_cast<bool>(value));
142 }
143 
ResetAutoHide(ArkUINodeHandle node)144 void ResetAutoHide(ArkUINodeHandle node)
145 {
146     auto* frameNode = reinterpret_cast<FrameNode*>(node);
147     CHECK_NULL_VOID(frameNode);
148     SideBarContainerModelNG::SetAutoHide(frameNode, DEFAULT_AUTO_HIDE);
149 }
150 
SetSideBarContainerMaxSideBarWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)151 void SetSideBarContainerMaxSideBarWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
152 {
153     auto* frameNode = reinterpret_cast<FrameNode*>(node);
154     CHECK_NULL_VOID(frameNode);
155     Dimension maxSideBarWidthDimension(value, static_cast<DimensionUnit>(unit));
156     SideBarContainerModelNG::SetMaxSideBarWidth(frameNode, maxSideBarWidthDimension);
157 }
158 
ResetSideBarContainerMaxSideBarWidth(ArkUINodeHandle node)159 void ResetSideBarContainerMaxSideBarWidth(ArkUINodeHandle node)
160 {
161     auto* frameNode = reinterpret_cast<FrameNode*>(node);
162     CHECK_NULL_VOID(frameNode);
163     SideBarContainerModelNG::SetMaxSideBarWidth(frameNode, DEFAULT_SIDE_BAR_CONTAINER_MAX_SIDE_BAR_WIDTH);
164 }
165 
SetSideBarContainerMinContentWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)166 void SetSideBarContainerMinContentWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
167 {
168     auto* frameNode = reinterpret_cast<FrameNode*>(node);
169     CHECK_NULL_VOID(frameNode);
170     Dimension maxSideBarWidthDimension(value, static_cast<DimensionUnit>(unit));
171     SideBarContainerModelNG::SetMinContentWidth(frameNode, maxSideBarWidthDimension);
172 }
173 
ResetSideBarContainerMinContentWidth(ArkUINodeHandle node)174 void ResetSideBarContainerMinContentWidth(ArkUINodeHandle node)
175 {
176     auto* frameNode = reinterpret_cast<FrameNode*>(node);
177     CHECK_NULL_VOID(frameNode);
178     SideBarContainerModelNG::SetMinContentWidth(frameNode, -1.0_vp);
179 }
180 
SetSideBarPosition(ArkUINodeHandle node,ArkUI_Int32 sideBarPosition)181 void SetSideBarPosition(ArkUINodeHandle node, ArkUI_Int32 sideBarPosition)
182 {
183     auto* frameNode = reinterpret_cast<FrameNode*>(node);
184     CHECK_NULL_VOID(frameNode);
185     SideBarContainerModelNG::SetSideBarPosition(frameNode, static_cast<SideBarPosition>(sideBarPosition));
186 }
187 
ResetSideBarPosition(ArkUINodeHandle node)188 void ResetSideBarPosition(ArkUINodeHandle node)
189 {
190     auto* frameNode = reinterpret_cast<FrameNode*>(node);
191     CHECK_NULL_VOID(frameNode);
192     SideBarContainerModelNG::SetSideBarPosition(frameNode, DEFAULT_SIDE_BAR_POSITION);
193 }
194 
SetShowSideBar(ArkUINodeHandle node,ArkUI_Bool isShow)195 void SetShowSideBar(ArkUINodeHandle node, ArkUI_Bool isShow)
196 {
197     auto* frameNode = reinterpret_cast<FrameNode*>(node);
198     CHECK_NULL_VOID(frameNode);
199     SideBarContainerModelNG::SetShowSideBar(frameNode, isShow);
200 }
201 
ResetShowSideBar(ArkUINodeHandle node)202 void ResetShowSideBar(ArkUINodeHandle node)
203 {
204     auto* frameNode = reinterpret_cast<FrameNode*>(node);
205     CHECK_NULL_VOID(frameNode);
206     SideBarContainerModelNG::SetShowSideBar(frameNode, DEFAULT_SHOW_SIDE_BAR);
207 }
208 
SetSideBarContainerDivider(ArkUINodeHandle node,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length,ArkUI_Uint32 color)209 void SetSideBarContainerDivider(ArkUINodeHandle node, const ArkUI_Float32* values, const ArkUI_Int32* units,
210     ArkUI_Int32 length, ArkUI_Uint32 color)
211 {
212     auto* frameNode = reinterpret_cast<FrameNode*>(node);
213     CHECK_NULL_VOID(frameNode);
214     CHECK_NULL_VOID(values);
215     CHECK_NULL_VOID(units);
216     if (length != NUM_3) {
217         return;
218     }
219     Dimension strokeWidth(values[NUM_0], static_cast<DimensionUnit>(units[NUM_0]));
220     Dimension startMargin(values[NUM_1], static_cast<DimensionUnit>(units[NUM_1]));
221     Dimension endMargin(values[NUM_2], static_cast<DimensionUnit>(units[NUM_2]));
222     SideBarContainerModelNG::SetDividerStrokeWidth(frameNode, strokeWidth);
223     SideBarContainerModelNG::SetDividerColor(frameNode, Color(color));
224     SideBarContainerModelNG::SetDividerStartMargin(frameNode, startMargin);
225     SideBarContainerModelNG::SetDividerEndMargin(frameNode, endMargin);
226 }
227 
ResetSideBarContainerDivider(ArkUINodeHandle node)228 void ResetSideBarContainerDivider(ArkUINodeHandle node)
229 {
230     auto* frameNode = reinterpret_cast<FrameNode*>(node);
231     CHECK_NULL_VOID(frameNode);
232     SideBarContainerModelNG::SetDividerStrokeWidth(frameNode, DEFAULT_DIVIDER_STROKE_WIDTH);
233     SideBarContainerModelNG::SetDividerColor(frameNode, Color(DEFAULT_SIDE_BAR_DIVIDER_COLOR));
234     SideBarContainerModelNG::SetDividerStartMargin(frameNode, DEFAULT_START_MARGIN);
235     SideBarContainerModelNG::SetDividerEndMargin(frameNode, DEFAULT_END_MARGIN);
236 }
237 
238 namespace NodeModifier {
GetSideBarContainerModifier()239 const ArkUISideBarContainerModifier* GetSideBarContainerModifier()
240 {
241     static const ArkUISideBarContainerModifier modifier = { SetSideBarWidth, ResetSideBarWidth, SetMinSideBarWidth,
242         ResetMinSideBarWidth, SetControlButton, ResetControlButton, SetShowControlButton, ResetShowControlButton,
243         SetAutoHide, ResetAutoHide, SetSideBarContainerMaxSideBarWidth, ResetSideBarContainerMaxSideBarWidth,
244         SetSideBarContainerMinContentWidth, ResetSideBarContainerMinContentWidth, SetSideBarPosition,
245         ResetSideBarPosition, SetShowSideBar, ResetShowSideBar, SetSideBarContainerDivider,
246         ResetSideBarContainerDivider };
247     return &modifier;
248 }
249 
GetCJUISideBarContainerModifier()250 const CJUISideBarContainerModifier* GetCJUISideBarContainerModifier()
251 {
252     static const CJUISideBarContainerModifier modifier = { SetSideBarWidth, ResetSideBarWidth, SetMinSideBarWidth,
253         ResetMinSideBarWidth, SetControlButton, ResetControlButton, SetShowControlButton, ResetShowControlButton,
254         SetAutoHide, ResetAutoHide, SetSideBarContainerMaxSideBarWidth, ResetSideBarContainerMaxSideBarWidth,
255         SetSideBarContainerMinContentWidth, ResetSideBarContainerMinContentWidth, SetSideBarPosition,
256         ResetSideBarPosition, SetShowSideBar, ResetShowSideBar, SetSideBarContainerDivider,
257         ResetSideBarContainerDivider };
258     return &modifier;
259 }
260 }
261 } // namespace OHOS::Ace::NG