• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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