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/nav_destination_modifier.h"
16 
17 #include "core/components/common/layout/constants.h"
18 #include "core/components_ng/base/frame_node.h"
19 #include "core/components_ng/pattern/navigation/navigation_declaration.h"
20 #include "core/components_ng/pattern/navrouter/navdestination_model_ng.h"
21 #include "core/pipeline/base/element_register.h"
22 
23 namespace OHOS::Ace::NG {
24 constexpr int32_t DEFAULT_SAFE_AREA_TYPE = 0b1;
25 constexpr int32_t DEFAULT_SAFE_AREA_EDGE = 0b1111;
SetHideTitleBar(ArkUINodeHandle node,ArkUI_Bool hideTitle,ArkUI_Bool animated)26 void SetHideTitleBar(ArkUINodeHandle node, ArkUI_Bool hideTitle, ArkUI_Bool animated)
27 {
28     auto* frameNode = reinterpret_cast<FrameNode*>(node);
29     CHECK_NULL_VOID(frameNode);
30     NavDestinationModelNG::SetHideTitleBar(frameNode, hideTitle, animated);
31 }
32 
ResetHideTitleBar(ArkUINodeHandle node)33 void ResetHideTitleBar(ArkUINodeHandle node)
34 {
35     auto* frameNode = reinterpret_cast<FrameNode*>(node);
36     CHECK_NULL_VOID(frameNode);
37     NavDestinationModelNG::SetHideTitleBar(frameNode, false, false);
38 }
39 
SetNavDestinationHideToolBar(ArkUINodeHandle node,ArkUI_Bool hide,ArkUI_Bool animated)40 void SetNavDestinationHideToolBar(ArkUINodeHandle node, ArkUI_Bool hide, ArkUI_Bool animated)
41 {
42     auto* frameNode = reinterpret_cast<FrameNode*>(node);
43     CHECK_NULL_VOID(frameNode);
44     NavDestinationModelNG::SetHideToolBar(frameNode, hide, animated);
45 }
46 
ResetNavDestinationHideToolBar(ArkUINodeHandle node)47 void ResetNavDestinationHideToolBar(ArkUINodeHandle node)
48 {
49     auto* frameNode = reinterpret_cast<FrameNode*>(node);
50     CHECK_NULL_VOID(frameNode);
51     NavDestinationModelNG::SetHideToolBar(frameNode, false, false);
52 }
53 
SetNavDestinationMode(ArkUINodeHandle node,int32_t value)54 void SetNavDestinationMode(ArkUINodeHandle node, int32_t value)
55 {
56     auto* frameNode = reinterpret_cast<FrameNode*>(node);
57     CHECK_NULL_VOID(frameNode);
58     NavDestinationModelNG::SetNavDestinationMode(frameNode, static_cast<NG::NavDestinationMode>(value));
59 }
60 
ResetNavDestinationMode(ArkUINodeHandle node)61 void ResetNavDestinationMode(ArkUINodeHandle node)
62 {
63     auto* frameNode = reinterpret_cast<FrameNode*>(node);
64     CHECK_NULL_VOID(frameNode);
65     NavDestinationModelNG::SetNavDestinationMode(frameNode, NG::NavDestinationMode::STANDARD);
66 }
67 
SetNavDestinationSystemTransition(ArkUINodeHandle node,int32_t value)68 void SetNavDestinationSystemTransition(ArkUINodeHandle node, int32_t value)
69 {
70     auto* frameNode = reinterpret_cast<FrameNode*>(node);
71     CHECK_NULL_VOID(frameNode);
72     NavDestinationModelNG::SetSystemTransitionType(frameNode, static_cast<NG::NavigationSystemTransitionType>(value));
73 }
74 
ResetNavDestinationSystemTransition(ArkUINodeHandle node)75 void ResetNavDestinationSystemTransition(ArkUINodeHandle node)
76 {
77     auto* frameNode = reinterpret_cast<FrameNode*>(node);
78     CHECK_NULL_VOID(frameNode);
79     NavDestinationModelNG::SetSystemTransitionType(frameNode, NG::NavigationSystemTransitionType::DEFAULT);
80 }
81 
SetIgnoreLayoutSafeArea(ArkUINodeHandle node,const char * typeStr,const char * edgesStr)82 void SetIgnoreLayoutSafeArea(ArkUINodeHandle node, const char* typeStr, const char* edgesStr)
83 {
84     auto* frameNode = reinterpret_cast<FrameNode*>(node);
85     CHECK_NULL_VOID(frameNode);
86     NG::SafeAreaExpandOpts opts { .type = NG::SAFE_AREA_TYPE_SYSTEM, .edges = NG::SAFE_AREA_EDGE_ALL };
87     uint32_t safeAreaType = NG::SAFE_AREA_TYPE_NONE;
88     uint32_t safeAreaEdge = NG::SAFE_AREA_EDGE_NONE;
89     std::string safeAreaTypeStr = std::string(typeStr);
90     std::string safeAreaEdgeStr = std::string(edgesStr);
91     if (safeAreaTypeStr == "" || safeAreaEdgeStr == "") {
92         NG::SafeAreaExpandOpts opts { .type = NG::SAFE_AREA_TYPE_NONE, .edges = NG::SAFE_AREA_EDGE_NONE};
93         NavDestinationModelNG::SetIgnoreLayoutSafeArea(frameNode, opts);
94         return;
95     }
96     std::string delimiter = "|";
97     size_t pos = 0;
98     std::string type;
99     std::string edges;
100     while ((pos = safeAreaTypeStr.find(delimiter)) != std::string::npos) {
101         type = safeAreaTypeStr.substr(0, pos);
102         safeAreaType |= (1 << StringUtils::StringToUint(type));
103         safeAreaTypeStr.erase(0, pos + delimiter.length());
104     }
105     safeAreaType |= (1 << StringUtils::StringToUint(safeAreaTypeStr));
106     pos = 0;
107     while ((pos = safeAreaEdgeStr.find(delimiter)) != std::string::npos) {
108         edges = safeAreaEdgeStr.substr(0, pos);
109         safeAreaEdge |= (1 << StringUtils::StringToUint(edges));
110         safeAreaEdgeStr.erase(0, pos + delimiter.length());
111     }
112     safeAreaEdge |= (1 << StringUtils::StringToUint(safeAreaEdgeStr));
113     opts.type = safeAreaType;
114     opts.edges = safeAreaEdge;
115     NavDestinationModelNG::SetIgnoreLayoutSafeArea(frameNode, opts);
116 }
117 
ResetIgnoreLayoutSafeArea(ArkUINodeHandle node)118 void ResetIgnoreLayoutSafeArea(ArkUINodeHandle node)
119 {
120     auto* frameNode = reinterpret_cast<FrameNode*>(node);
121     CHECK_NULL_VOID(frameNode);
122     NG::SafeAreaExpandOpts opts;
123     opts.type = DEFAULT_SAFE_AREA_TYPE;
124     opts.edges = DEFAULT_SAFE_AREA_EDGE;
125     NavDestinationModelNG::SetIgnoreLayoutSafeArea(frameNode, opts);
126 }
127 
SetTitle(ArkUINodeHandle node,ArkUINavigationTitleInfo titleInfo,ArkUINavigationTitlebarOptions options)128 void SetTitle(ArkUINodeHandle node, ArkUINavigationTitleInfo titleInfo, ArkUINavigationTitlebarOptions options)
129 {
130     auto* frameNode = reinterpret_cast<FrameNode*>(node);
131     CHECK_NULL_VOID(frameNode);
132     std::string mainTitleString = std::string(titleInfo.mainTitle);
133     std::string subTitleString = std::string(titleInfo.subTitle);
134     NG::NavigationTitleInfo ngTitleInfo = { titleInfo.hasSubTitle, titleInfo.hasMainTitle,
135         subTitleString, mainTitleString };
136     NavDestinationModelNG::ParseCommonTitle(frameNode, ngTitleInfo);
137     NG::NavigationTitlebarOptions finalOptions;
138     if (options.colorValue.isSet) {
139         finalOptions.bgOptions.color = Color(options.colorValue.value);
140     }
141     if (options.blurStyle.isSet) {
142         finalOptions.bgOptions.blurStyle = static_cast<BlurStyle>(options.blurStyle.value);
143     }
144     if (options.barStyle.isSet) {
145         finalOptions.brOptions.barStyle = static_cast<NG::BarStyle>(options.barStyle.value);
146     }
147     if (options.paddingStart.isSet) {
148         finalOptions.brOptions.paddingStart = CalcDimension(static_cast<double>(options.paddingStart.dimension.value),
149             static_cast<DimensionUnit>(options.paddingStart.dimension.units));
150     }
151     if (options.paddingEnd.isSet) {
152         finalOptions.brOptions.paddingEnd = CalcDimension(static_cast<double>(options.paddingEnd.dimension.value),
153             static_cast<DimensionUnit>(options.paddingEnd.dimension.units));
154     }
155     if (options.enableHoverMode.isSet) {
156         finalOptions.enableHoverMode = options.enableHoverMode.value;
157     }
158     NavDestinationModelNG::SetTitlebarOptions(frameNode, std::move(finalOptions));
159 }
160 
ResetTitle(ArkUINodeHandle node)161 void ResetTitle(ArkUINodeHandle node)
162 {
163     auto* frameNode = reinterpret_cast<FrameNode*>(node);
164     CHECK_NULL_VOID(frameNode);
165     NG::NavigationTitleInfo ngTitleInfo = { false, false, "", "" };
166     NavDestinationModelNG::ParseCommonTitle(frameNode, ngTitleInfo);
167     NavigationTitlebarOptions options;
168     NavDestinationModelNG::SetTitlebarOptions(frameNode, std::move(options));
169 }
170 
SetMenus(ArkUINodeHandle node,ArkUIBarItem * items,ArkUI_Uint32 length)171 void SetMenus(ArkUINodeHandle node, ArkUIBarItem* items, ArkUI_Uint32 length)
172 {
173     auto* frameNode = reinterpret_cast<FrameNode*>(node);
174     CHECK_NULL_VOID(frameNode);
175     CHECK_NULL_VOID(items);
176     std::vector<NG::BarItem> menuItems;
177     for (uint32_t i = 0; i < length; i++) {
178         NG::BarItem menuItem;
179         if (items[i].text.isSet) {
180             menuItem.text = items[i].text.value;
181         }
182         if (items[i].icon.isSet) {
183             menuItem.icon = items[i].icon.value;
184         }
185         if (items[i].isEnable.isSet) {
186             menuItem.isEnabled = items[i].isEnable.value;
187         }
188         if (items[i].text.value) {
189             delete[] items[i].text.value;
190             items[i].text.value = nullptr;
191         }
192         if (items[i].icon.value) {
193             delete[] items[i].icon.value;
194             items[i].icon.value = nullptr;
195         }
196         menuItems.push_back(menuItem);
197     }
198     NavDestinationModelNG::SetMenuItems(frameNode, std::move(menuItems));
199 }
200 
ResetMenus(ArkUINodeHandle node)201 void ResetMenus(ArkUINodeHandle node)
202 {
203     auto* frameNode = reinterpret_cast<FrameNode*>(node);
204     CHECK_NULL_VOID(frameNode);
205     std::vector<NG::BarItem> menuItems;
206     NavDestinationModelNG::SetMenuItems(frameNode, std::move(menuItems));
207 }
208 
SetMenuItemAction(ArkUINodeHandle node,void * action,ArkUI_Uint32 index)209 void SetMenuItemAction(ArkUINodeHandle node, void* action, ArkUI_Uint32 index)
210 {
211     auto* frameNode = reinterpret_cast<FrameNode*>(node);
212     CHECK_NULL_VOID(frameNode);
213     auto actionFunc = reinterpret_cast<std::function<void()>*>(action);
214     NavDestinationModelNG::SetMenuItemAction(frameNode, std::move(*actionFunc), index);
215 }
216 
SetMenuItemSymbol(ArkUINodeHandle node,void * symbol,ArkUI_Uint32 index)217 void SetMenuItemSymbol(ArkUINodeHandle node, void* symbol, ArkUI_Uint32 index)
218 {
219     auto* frameNode = reinterpret_cast<FrameNode*>(node);
220     CHECK_NULL_VOID(frameNode);
221     auto iconFunc = reinterpret_cast<std::function<void(WeakPtr<NG::FrameNode>)>*>(symbol);
222     NavDestinationModelNG::SetMenuItemSymbol(frameNode, std::move(*iconFunc), index);
223 }
224 
SetNavDestinationRecoverable(ArkUINodeHandle node,ArkUI_Bool recoverable)225 void SetNavDestinationRecoverable(ArkUINodeHandle node, ArkUI_Bool recoverable)
226 {
227     auto* frameNode = reinterpret_cast<FrameNode*>(node);
228     CHECK_NULL_VOID(frameNode);
229     NavDestinationModelNG::SetRecoverable(frameNode, recoverable);
230 }
231 
ResetNavDestinationRecoverable(ArkUINodeHandle node)232 void ResetNavDestinationRecoverable(ArkUINodeHandle node)
233 {
234     auto* frameNode = reinterpret_cast<FrameNode*>(node);
235     CHECK_NULL_VOID(frameNode);
236     // default value of navdestination's recoverable is true
237     NavDestinationModelNG::SetRecoverable(frameNode, true);
238 }
239 
240 namespace NodeModifier {
GetNavDestinationModifier()241 const ArkUINavDestinationModifier* GetNavDestinationModifier()
242 {
243     static const ArkUINavDestinationModifier modifier = {
244         SetHideTitleBar,
245         ResetHideTitleBar,
246         SetNavDestinationHideToolBar,
247         ResetNavDestinationHideToolBar,
248         SetNavDestinationMode,
249         ResetNavDestinationMode,
250         SetIgnoreLayoutSafeArea,
251         ResetIgnoreLayoutSafeArea,
252         SetTitle,
253         ResetTitle,
254         SetMenus,
255         ResetMenus,
256         SetMenuItemAction,
257         SetMenuItemSymbol,
258         SetNavDestinationSystemTransition,
259         ResetNavDestinationSystemTransition,
260         SetNavDestinationRecoverable,
261         ResetNavDestinationRecoverable,
262     };
263 
264     return &modifier;
265 }
266 
GetCJUINavDestinationModifier()267 const CJUINavDestinationModifier* GetCJUINavDestinationModifier()
268 {
269     static const CJUINavDestinationModifier modifier = {
270         SetHideTitleBar,
271         ResetHideTitleBar,
272         SetNavDestinationHideToolBar,
273         ResetNavDestinationHideToolBar,
274         SetNavDestinationMode,
275         ResetNavDestinationMode,
276         SetIgnoreLayoutSafeArea,
277         ResetIgnoreLayoutSafeArea,
278         SetNavDestinationSystemTransition,
279         ResetNavDestinationSystemTransition
280     };
281 
282     return &modifier;
283 }
284 }
285 } // namespace OHOS::Ace::NG
286