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