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/navigation_modifier.h"
16
17 #include "base/geometry/calc_dimension.h"
18 #include "core/components/common/layout/constants.h"
19 #include "core/components_ng/base/frame_node.h"
20 #include "core/components_ng/base/view_abstract.h"
21 #include "core/components_ng/pattern/navigation/navigation_declaration.h"
22 #include "core/components_ng/pattern/navigation/navigation_model_ng.h"
23 #include "core/pipeline/base/element_register.h"
24
25 namespace OHOS::Ace::NG {
26 constexpr int32_t NAV_BAR_POSITION_RANGE_MODIFIER = 1;
27 constexpr int32_t NAVIGATION_MODE_RANGE_MODIFIER = 2;
28 constexpr int32_t DEFAULT_NAV_BAR_WIDTH_FOR_MODIFIER = 240;
29 constexpr int32_t DEFAULT_SAFE_AREA_TYPE = 0b1;
30 constexpr int32_t DEFAULT_SAFE_AREA_EDGE = 0b1111;
SetHideToolBar(ArkUINodeHandle node,ArkUI_Bool hide,ArkUI_Bool animated)31 void SetHideToolBar(ArkUINodeHandle node, ArkUI_Bool hide, ArkUI_Bool animated)
32 {
33 auto* frameNode = reinterpret_cast<FrameNode*>(node);
34 CHECK_NULL_VOID(frameNode);
35 NavigationModelNG::SetHideToolBar(frameNode, hide, animated);
36 }
37
ResetHideToolBar(ArkUINodeHandle node)38 void ResetHideToolBar(ArkUINodeHandle node)
39 {
40 auto* frameNode = reinterpret_cast<FrameNode*>(node);
41 CHECK_NULL_VOID(frameNode);
42 NavigationModelNG::SetHideToolBar(frameNode, false, false);
43 }
44
SetMinContentWidth(ArkUINodeHandle node,ArkUI_Float32 value,int unit)45 void SetMinContentWidth(ArkUINodeHandle node, ArkUI_Float32 value, int unit)
46 {
47 auto* frameNode = reinterpret_cast<FrameNode*>(node);
48 CHECK_NULL_VOID(frameNode);
49 CalcDimension width = Dimension(value, static_cast<OHOS::Ace::DimensionUnit>(unit));
50 NavigationModelNG::SetMinContentWidth(frameNode, width);
51 }
52
ResetMinContentWidth(ArkUINodeHandle node)53 void ResetMinContentWidth(ArkUINodeHandle node)
54 {
55 auto* frameNode = reinterpret_cast<FrameNode*>(node);
56 CHECK_NULL_VOID(frameNode);
57 NavigationModelNG::SetMinContentWidth(frameNode, DEFAULT_MIN_CONTENT_WIDTH);
58 }
59
SetMinNavBarWidth(ArkUINodeHandle node,ArkUI_Float32 minValue,int minUnit)60 void SetMinNavBarWidth(ArkUINodeHandle node, ArkUI_Float32 minValue, int minUnit)
61 {
62 auto* frameNode = reinterpret_cast<FrameNode*>(node);
63 CHECK_NULL_VOID(frameNode);
64 CalcDimension minNavBarWidth = Dimension(minValue, static_cast<OHOS::Ace::DimensionUnit>(minUnit));
65 if (LessNotEqual(minNavBarWidth.Value(), 0.0)) {
66 minNavBarWidth = DEFAULT_MIN_NAV_BAR_WIDTH;
67 }
68
69 NavigationModelNG::SetMinNavBarWidth(frameNode, minNavBarWidth);
70 }
71
ResetMinNavBarWidth(ArkUINodeHandle node)72 void ResetMinNavBarWidth(ArkUINodeHandle node)
73 {
74 auto* frameNode = reinterpret_cast<FrameNode*>(node);
75 CHECK_NULL_VOID(frameNode);
76 CalcDimension minNavBarWidth = DEFAULT_MIN_NAV_BAR_WIDTH;
77 NavigationModelNG::SetMinNavBarWidth(frameNode, minNavBarWidth);
78 }
79
SetMaxNavBarWidth(ArkUINodeHandle node,ArkUI_Float32 maxValue,int maxUnit)80 void SetMaxNavBarWidth(ArkUINodeHandle node, ArkUI_Float32 maxValue, int maxUnit)
81 {
82 auto* frameNode = reinterpret_cast<FrameNode*>(node);
83 CHECK_NULL_VOID(frameNode);
84 CalcDimension maxNavBarWidth = Dimension(maxValue, static_cast<OHOS::Ace::DimensionUnit>(maxUnit));
85 if (LessNotEqual(maxNavBarWidth.Value(), 0.0)) {
86 maxNavBarWidth = DEFAULT_MAX_NAV_BAR_WIDTH;
87 }
88
89 NavigationModelNG::SetMaxNavBarWidth(frameNode, maxNavBarWidth);
90 }
91
ResetMaxNavBarWidth(ArkUINodeHandle node)92 void ResetMaxNavBarWidth(ArkUINodeHandle node)
93 {
94 auto* frameNode = reinterpret_cast<FrameNode*>(node);
95 CHECK_NULL_VOID(frameNode);
96 CalcDimension maxNavBarWidth = DEFAULT_MAX_NAV_BAR_WIDTH;
97 NavigationModelNG::SetMaxNavBarWidth(frameNode, maxNavBarWidth);
98 }
99
SetNavBarWidth(ArkUINodeHandle node,ArkUI_Float32 value,int unit)100 void SetNavBarWidth(ArkUINodeHandle node, ArkUI_Float32 value, int unit)
101 {
102 auto* frameNode = reinterpret_cast<FrameNode*>(node);
103 CHECK_NULL_VOID(frameNode);
104 CalcDimension width = Dimension(value, static_cast<OHOS::Ace::DimensionUnit>(unit));
105 NavigationModelNG::SetNavBarWidth(frameNode, width);
106 }
107
ResetNavBarWidth(ArkUINodeHandle node)108 void ResetNavBarWidth(ArkUINodeHandle node)
109 {
110 auto* frameNode = reinterpret_cast<FrameNode*>(node);
111 CHECK_NULL_VOID(frameNode);
112 CalcDimension navBarWidth;
113 navBarWidth.SetValue(DEFAULT_NAV_BAR_WIDTH_FOR_MODIFIER);
114 NavigationModelNG::SetNavBarWidth(frameNode, navBarWidth);
115 }
116
SetNavBarPosition(ArkUINodeHandle node,int32_t value)117 void SetNavBarPosition(ArkUINodeHandle node, int32_t value)
118 {
119 auto* frameNode = reinterpret_cast<FrameNode*>(node);
120 CHECK_NULL_VOID(frameNode);
121 if (value >= 0 && value <= NAV_BAR_POSITION_RANGE_MODIFIER) {
122 NavigationModelNG::SetNavBarPosition(frameNode, static_cast<NG::NavBarPosition>(value));
123 } else {
124 NavigationModelNG::SetNavBarPosition(frameNode, NG::NavBarPosition::START);
125 }
126 }
127
ResetNavBarPosition(ArkUINodeHandle node)128 void ResetNavBarPosition(ArkUINodeHandle node)
129 {
130 auto* frameNode = reinterpret_cast<FrameNode*>(node);
131 CHECK_NULL_VOID(frameNode);
132 NavigationModelNG::SetNavBarPosition(frameNode, NG::NavBarPosition::START);
133 }
134
SetHideNavBar(ArkUINodeHandle node,ArkUI_Bool hideNavBar)135 void SetHideNavBar(ArkUINodeHandle node, ArkUI_Bool hideNavBar)
136 {
137 auto* frameNode = reinterpret_cast<FrameNode*>(node);
138 CHECK_NULL_VOID(frameNode);
139 NavigationModelNG::SetHideNavBar(frameNode, hideNavBar);
140 }
141
ResetHideNavBar(ArkUINodeHandle node)142 void ResetHideNavBar(ArkUINodeHandle node)
143 {
144 auto* frameNode = reinterpret_cast<FrameNode*>(node);
145 CHECK_NULL_VOID(frameNode);
146 NavigationModelNG::SetHideNavBar(frameNode, false);
147 }
148
SetSubtitle(ArkUINodeHandle node,const char * subtitle)149 void SetSubtitle(ArkUINodeHandle node, const char* subtitle)
150 {
151 auto* frameNode = reinterpret_cast<FrameNode*>(node);
152 CHECK_NULL_VOID(frameNode);
153 std::string value = subtitle;
154 NavigationModelNG::SetSubtitle(frameNode, value);
155 }
156
ResetSubtitle(ArkUINodeHandle node)157 void ResetSubtitle(ArkUINodeHandle node)
158 {
159 auto* frameNode = reinterpret_cast<FrameNode*>(node);
160 CHECK_NULL_VOID(frameNode);
161 NavigationModelNG::SetSubtitle(frameNode, "");
162 }
163
SetHideBackButton(ArkUINodeHandle node,ArkUI_Bool hideBackButton)164 void SetHideBackButton(ArkUINodeHandle node, ArkUI_Bool hideBackButton)
165 {
166 auto* frameNode = reinterpret_cast<FrameNode*>(node);
167 CHECK_NULL_VOID(frameNode);
168 NavigationModelNG::SetHideBackButton(frameNode, hideBackButton);
169 }
170
ResetHideBackButton(ArkUINodeHandle node)171 void ResetHideBackButton(ArkUINodeHandle node)
172 {
173 auto* frameNode = reinterpret_cast<FrameNode*>(node);
174 CHECK_NULL_VOID(frameNode);
175 NavigationModelNG::SetHideBackButton(frameNode, false);
176 }
177
SetTitleMode(ArkUINodeHandle node,int32_t value)178 void SetTitleMode(ArkUINodeHandle node, int32_t value)
179 {
180 auto* frameNode = reinterpret_cast<FrameNode*>(node);
181 CHECK_NULL_VOID(frameNode);
182 NavigationModelNG::SetTitleMode(frameNode, static_cast<NG::NavigationTitleMode>(value));
183 }
184
ResetTitleMode(ArkUINodeHandle node)185 void ResetTitleMode(ArkUINodeHandle node)
186 {
187 auto* frameNode = reinterpret_cast<FrameNode*>(node);
188 CHECK_NULL_VOID(frameNode);
189 NavigationModelNG::SetTitleMode(frameNode, NG::NavigationTitleMode::FREE);
190 }
191
SetUsrNavigationMode(ArkUINodeHandle node,int32_t value)192 void SetUsrNavigationMode(ArkUINodeHandle node, int32_t value)
193 {
194 auto* frameNode = reinterpret_cast<FrameNode*>(node);
195 CHECK_NULL_VOID(frameNode);
196 if (value >= 0 && value <= NAVIGATION_MODE_RANGE_MODIFIER) {
197 NavigationModelNG::SetUsrNavigationMode(frameNode, static_cast<NG::NavigationMode>(value));
198 } else {
199 NavigationModelNG::SetUsrNavigationMode(frameNode, NG::NavigationMode::AUTO);
200 }
201 }
ResetUsrNavigationMode(ArkUINodeHandle node)202 void ResetUsrNavigationMode(ArkUINodeHandle node)
203 {
204 auto* frameNode = reinterpret_cast<FrameNode*>(node);
205 CHECK_NULL_VOID(frameNode);
206 NavigationModelNG::SetUsrNavigationMode(frameNode, NG::NavigationMode::AUTO);
207 }
208
SetNavHideTitleBar(ArkUINodeHandle node,ArkUI_Bool hide,ArkUI_Bool animated)209 void SetNavHideTitleBar(ArkUINodeHandle node, ArkUI_Bool hide, ArkUI_Bool animated)
210 {
211 auto* frameNode = reinterpret_cast<FrameNode*>(node);
212 CHECK_NULL_VOID(frameNode);
213 NavigationModelNG::SetHideTitleBar(frameNode, hide, animated);
214 }
215
ResetNavHideTitleBar(ArkUINodeHandle node)216 void ResetNavHideTitleBar(ArkUINodeHandle node)
217 {
218 auto* frameNode = reinterpret_cast<FrameNode*>(node);
219 CHECK_NULL_VOID(frameNode);
220 NavigationModelNG::SetHideTitleBar(frameNode, false, false);
221 }
222
SetNavIgnoreLayoutSafeArea(ArkUINodeHandle node,const char * typeStr,const char * edgesStr)223 void SetNavIgnoreLayoutSafeArea(ArkUINodeHandle node, const char* typeStr, const char* edgesStr)
224 {
225 auto* frameNode = reinterpret_cast<FrameNode*>(node);
226 CHECK_NULL_VOID(frameNode);
227 NG::SafeAreaExpandOpts opts { .type = NG::SAFE_AREA_TYPE_SYSTEM, .edges = NG::SAFE_AREA_EDGE_ALL };
228 uint32_t safeAreaType = NG::SAFE_AREA_TYPE_NONE;
229 uint32_t safeAreaEdge = NG::SAFE_AREA_EDGE_NONE;
230 std::string safeAreaTypeStr = std::string(typeStr);
231 std::string safeAreaEdgeStr = std::string(edgesStr);
232 if (safeAreaTypeStr == "" || safeAreaEdgeStr == "") {
233 NG::SafeAreaExpandOpts opts { .type = NG::SAFE_AREA_TYPE_NONE, .edges = NG::SAFE_AREA_EDGE_NONE};
234 NavigationModelNG::SetIgnoreLayoutSafeArea(frameNode, opts);
235 return;
236 }
237 std::string delimiter = "|";
238 size_t pos = 0;
239 std::string type;
240 std::string edges;
241 while ((pos = safeAreaTypeStr.find(delimiter)) != std::string::npos) {
242 type = safeAreaTypeStr.substr(0, pos);
243 safeAreaType |= (1 << StringUtils::StringToUint(type));
244 safeAreaTypeStr.erase(0, pos + delimiter.length());
245 }
246 safeAreaType |= (1 << StringUtils::StringToUint(safeAreaTypeStr));
247 pos = 0;
248 while ((pos = safeAreaEdgeStr.find(delimiter)) != std::string::npos) {
249 edges = safeAreaEdgeStr.substr(0, pos);
250 safeAreaEdge |= (1 << StringUtils::StringToUint(edges));
251 safeAreaEdgeStr.erase(0, pos + delimiter.length());
252 }
253 safeAreaEdge |= (1 << StringUtils::StringToUint(safeAreaEdgeStr));
254 opts.type = safeAreaType;
255 opts.edges = safeAreaEdge;
256 NavigationModelNG::SetIgnoreLayoutSafeArea(frameNode, opts);
257 }
258
ResetNavIgnoreLayoutSafeArea(ArkUINodeHandle node)259 void ResetNavIgnoreLayoutSafeArea(ArkUINodeHandle node)
260 {
261 auto* frameNode = reinterpret_cast<FrameNode*>(node);
262 CHECK_NULL_VOID(frameNode);
263 NG::SafeAreaExpandOpts opts;
264 opts.type = DEFAULT_SAFE_AREA_TYPE;
265 opts.edges = DEFAULT_SAFE_AREA_EDGE;
266 NavigationModelNG::SetIgnoreLayoutSafeArea(frameNode, opts);
267 }
268
SetNavTitle(ArkUINodeHandle node,ArkUINavigationTitleInfo titleInfo,ArkUINavigationTitlebarOptions options)269 void SetNavTitle(ArkUINodeHandle node, ArkUINavigationTitleInfo titleInfo, ArkUINavigationTitlebarOptions options)
270 {
271 auto* frameNode = reinterpret_cast<FrameNode*>(node);
272 CHECK_NULL_VOID(frameNode);
273 NG::NavigationTitlebarOptions finalOptions;
274 if (options.enableHoverMode.isSet) {
275 finalOptions.enableHoverMode = options.enableHoverMode.value;
276 }
277 NavigationModelNG::SetTitlebarOptions(frameNode, std::move(finalOptions));
278 }
279
ResetNavTitle(ArkUINodeHandle node)280 void ResetNavTitle(ArkUINodeHandle node)
281 {
282 auto* frameNode = reinterpret_cast<FrameNode*>(node);
283 CHECK_NULL_VOID(frameNode);
284 NG::NavigationTitleInfo ngTitleInfo = { false, false, "", "" };
285 NavigationModelNG::ParseCommonTitle(frameNode, ngTitleInfo);
286 NavigationTitlebarOptions options;
287 NavigationModelNG::SetTitlebarOptions(frameNode, std::move(options));
288 }
289
290 namespace NodeModifier {
GetNavigationModifier()291 const ArkUINavigationModifier* GetNavigationModifier()
292 {
293 static const ArkUINavigationModifier modifier = {
294 SetHideToolBar,
295 ResetHideToolBar,
296 SetHideNavBar,
297 ResetHideNavBar,
298 SetTitleMode,
299 ResetTitleMode,
300 SetHideBackButton,
301 ResetHideBackButton,
302 SetSubtitle,
303 ResetSubtitle,
304 ResetUsrNavigationMode,
305 SetUsrNavigationMode,
306 SetNavHideTitleBar,
307 ResetNavHideTitleBar,
308 SetNavBarPosition,
309 ResetNavBarPosition,
310 SetMinContentWidth,
311 ResetMinContentWidth,
312 SetMaxNavBarWidth,
313 ResetMaxNavBarWidth,
314 SetMinNavBarWidth,
315 ResetMinNavBarWidth,
316 SetNavBarWidth,
317 ResetNavBarWidth,
318 SetNavIgnoreLayoutSafeArea,
319 ResetNavIgnoreLayoutSafeArea,
320 SetNavTitle,
321 ResetNavTitle
322 };
323
324 return &modifier;
325 }
326
GetCJUINavigationModifier()327 const CJUINavigationModifier* GetCJUINavigationModifier()
328 {
329 static const CJUINavigationModifier modifier = {
330 SetHideToolBar,
331 ResetHideToolBar,
332 SetHideNavBar,
333 ResetHideNavBar,
334 SetTitleMode,
335 ResetTitleMode,
336 SetHideBackButton,
337 ResetHideBackButton,
338 SetSubtitle,
339 ResetSubtitle,
340 ResetUsrNavigationMode,
341 SetUsrNavigationMode,
342 SetNavHideTitleBar,
343 ResetNavHideTitleBar,
344 SetNavBarPosition,
345 ResetNavBarPosition,
346 SetMinContentWidth,
347 ResetMinContentWidth,
348 SetMaxNavBarWidth,
349 ResetMaxNavBarWidth,
350 SetMinNavBarWidth,
351 ResetMinNavBarWidth,
352 SetNavBarWidth,
353 ResetNavBarWidth,
354 SetNavIgnoreLayoutSafeArea,
355 ResetNavIgnoreLayoutSafeArea
356 };
357
358 return &modifier;
359 }
360 }
361 } // namespace OHOS::Ace::NG