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