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
16 #include "core/components_ng/pattern/navigation/navigation_model_ng.h"
17
18 #include "base/geometry/dimension.h"
19 #include "base/i18n/localization.h"
20 #include "base/memory/ace_type.h"
21 #include "base/memory/referenced.h"
22 #include "base/utils/utils.h"
23 #include "core/common/ace_application_info.h"
24 #include "core/components/common/properties/alignment.h"
25 #include "core/components/common/properties/color.h"
26 #include "core/components/common/properties/shadow.h"
27 #include "core/components/common/properties/shadow_config.h"
28 #include "core/components_ng/base/frame_node.h"
29 #include "core/components_ng/base/view_stack_processor.h"
30 #include "core/components_ng/pattern/button/button_layout_property.h"
31 #include "core/components_ng/pattern/button/button_pattern.h"
32 #include "core/components_ng/pattern/custom/custom_node.h"
33 #include "core/components_ng/pattern/divider/divider_layout_property.h"
34 #include "core/components_ng/pattern/divider/divider_pattern.h"
35 #include "core/components_ng/pattern/divider/divider_render_property.h"
36 #include "core/components_ng/pattern/image/image_layout_property.h"
37 #include "core/components_ng/pattern/image/image_pattern.h"
38 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h"
39 #include "core/components_ng/pattern/menu/menu_view.h"
40 #include "core/components_ng/pattern/navigation/bar_item_event_hub.h"
41 #include "core/components_ng/pattern/navigation/bar_item_node.h"
42 #include "core/components_ng/pattern/navigation/bar_item_pattern.h"
43 #include "core/components_ng/pattern/navigation/nav_bar_layout_property.h"
44 #include "core/components_ng/pattern/navigation/nav_bar_node.h"
45 #include "core/components_ng/pattern/navigation/nav_bar_pattern.h"
46 #include "core/components_ng/pattern/navigation/navigation_content_pattern.h"
47 #include "core/components_ng/pattern/navigation/navigation_declaration.h"
48 #include "core/components_ng/pattern/navigation/navigation_event_hub.h"
49 #include "core/components_ng/pattern/navigation/navigation_group_node.h"
50 #include "core/components_ng/pattern/navigation/navigation_layout_property.h"
51 #include "core/components_ng/pattern/navigation/navigation_title_util.h"
52 #include "core/components_ng/pattern/navigation/navigation_pattern.h"
53 #include "core/components_ng/pattern/navigation/title_bar_node.h"
54 #include "core/components_ng/pattern/navigation/title_bar_pattern.h"
55 #include "core/components_ng/pattern/navigation/navigation_toolbar_util.h"
56 #include "core/components_ng/pattern/navigation/tool_bar_node.h"
57 #include "core/components_ng/pattern/navigation/tool_bar_pattern.h"
58 #include "core/components_ng/pattern/navigator/navigator_event_hub.h"
59 #include "core/components_ng/pattern/navigator/navigator_pattern.h"
60 #include "core/components_ng/pattern/navrouter/navdestination_group_node.h"
61 #include "core/components_ng/pattern/navrouter/navdestination_layout_property.h"
62 #include "core/components_ng/pattern/navrouter/navrouter_group_node.h"
63 #include "core/components_ng/pattern/option/option_view.h"
64 #include "core/components_ng/pattern/select/select_model.h"
65 #include "core/components_ng/pattern/select/select_model_ng.h"
66 #include "core/components_ng/pattern/stack/stack_pattern.h"
67 #include "core/components_ng/pattern/text/text_layout_property.h"
68 #include "core/components_ng/pattern/text/text_pattern.h"
69 #include "core/components_v2/inspector/inspector_constants.h"
70 #include "core/pipeline/base/element_register.h"
71 #include "core/pipeline_ng/ui_task_scheduler.h"
72 #include "frameworks/bridge/common/utils/engine_helper.h"
73 #include "core/components_ng/pattern/navigation/navigation_drag_bar_pattern.h"
74
75 namespace OHOS::Ace::NG {
76 namespace {
CreateBarItemTextNode(const std::string & text)77 RefPtr<FrameNode> CreateBarItemTextNode(const std::string& text)
78 {
79 int32_t nodeId = ElementRegister::GetInstance()->MakeUniqueId();
80 auto textNode = FrameNode::CreateFrameNode(V2::TEXT_ETS_TAG, nodeId, AceType::MakeRefPtr<TextPattern>());
81 auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
82 CHECK_NULL_RETURN(textLayoutProperty, nullptr);
83 textLayoutProperty->UpdateContent(text);
84 textLayoutProperty->UpdateFontSize(TEXT_FONT_SIZE);
85 textLayoutProperty->UpdateTextColor(TEXT_COLOR);
86 textLayoutProperty->UpdateTextAlign(TextAlign::CENTER);
87 return textNode;
88 }
89
CreateBarItemIconNode(const std::string & src)90 RefPtr<FrameNode> CreateBarItemIconNode(const std::string& src)
91 {
92 int32_t nodeId = ElementRegister::GetInstance()->MakeUniqueId();
93 ImageSourceInfo info(src);
94 auto iconNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, nodeId, AceType::MakeRefPtr<ImagePattern>());
95 auto imageLayoutProperty = iconNode->GetLayoutProperty<ImageLayoutProperty>();
96 CHECK_NULL_RETURN(imageLayoutProperty, nullptr);
97 auto theme = NavigationGetTheme();
98 CHECK_NULL_RETURN(theme, nullptr);
99
100 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
101 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
102 CHECK_NULL_RETURN(navigationGroupNode, nullptr);
103 auto hub = navigationGroupNode->GetEventHub<EventHub>();
104 CHECK_NULL_RETURN(hub, nullptr);
105 if (!hub->IsEnabled()) {
106 info.SetFillColor(theme->GetMenuIconColor().BlendOpacity(theme->GetAlphaDisabled()));
107 } else {
108 info.SetFillColor(theme->GetMenuIconColor());
109 }
110 imageLayoutProperty->UpdateImageSourceInfo(info);
111
112 auto iconSize = theme->GetMenuIconSize();
113 imageLayoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(iconSize), CalcLength(iconSize)));
114 iconNode->MarkModifyDone();
115 return iconNode;
116 }
117
UpdateBarItemNodeWithItem(const RefPtr<BarItemNode> & barItemNode,const BarItem & barItem)118 void UpdateBarItemNodeWithItem(const RefPtr<BarItemNode>& barItemNode, const BarItem& barItem)
119 {
120 if (barItem.text.has_value() && !barItem.text.value().empty()) {
121 auto textNode = CreateBarItemTextNode(barItem.text.value());
122 barItemNode->SetTextNode(textNode);
123 barItemNode->AddChild(textNode);
124 }
125 if (barItem.icon.has_value() && !barItem.icon.value().empty()) {
126 auto iconNode = CreateBarItemIconNode(barItem.icon.value());
127 barItemNode->SetIconNode(iconNode);
128 barItemNode->AddChild(iconNode);
129 }
130 if (barItem.action) {
131 auto eventHub = barItemNode->GetEventHub<BarItemEventHub>();
132 CHECK_NULL_VOID(eventHub);
133 eventHub->SetItemAction(barItem.action);
134 }
135 auto barItemPattern = barItemNode->GetPattern<BarItemPattern>();
136 barItemNode->MarkModifyDone();
137 }
138
UpdateOldBarItems(const RefPtr<UINode> & oldBarContainer,const std::vector<BarItem> & newBarItems)139 void UpdateOldBarItems(const RefPtr<UINode>& oldBarContainer, const std::vector<BarItem>& newBarItems)
140 {
141 auto oldBarItems = oldBarContainer->GetChildren();
142 auto prevChildrenSize = static_cast<int32_t>(oldBarItems.size());
143 auto newChildrenSize = static_cast<int32_t>(newBarItems.size());
144 auto oldIter = oldBarItems.begin();
145 auto newIter = newBarItems.begin();
146 // if old container has m items and incoming array has n items
147 // we update first min(m, n) items in the old container
148 for (int32_t i = 0; i < std::min(prevChildrenSize, newChildrenSize); i++) {
149 do {
150 auto oldBarItem = AceType::DynamicCast<BarItemNode>(*oldIter);
151 BarItem newBarItem = *newIter;
152 if (!oldBarItem) {
153 break;
154 }
155 if (newBarItem.text.has_value()) {
156 oldBarItem->UpdateText(newBarItem.text.value());
157 if (oldBarItem->GetTextNode()) {
158 auto textNode = AceType::DynamicCast<FrameNode>(oldBarItem->GetTextNode());
159 CHECK_NULL_VOID(textNode);
160 auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
161 CHECK_NULL_VOID(textLayoutProperty);
162 textLayoutProperty->UpdateContent(newBarItem.text.value());
163 textNode->MarkModifyDone();
164 } else {
165 auto textNode = CreateBarItemTextNode(newBarItem.text.value());
166 oldBarItem->SetTextNode(textNode);
167 oldBarItem->AddChild(textNode);
168 oldBarItem->MarkModifyDone();
169 }
170 } else {
171 oldBarItem->ResetText();
172 if (oldBarItem->GetTextNode()) {
173 auto textNode = AceType::DynamicCast<FrameNode>(oldBarItem->GetTextNode());
174 CHECK_NULL_VOID(textNode);
175 oldBarItem->RemoveChild(textNode);
176 }
177 }
178 if (newBarItem.icon.has_value()) {
179 oldBarItem->UpdateIconSrc(newBarItem.icon.value());
180 if (oldBarItem->GetIconNode()) {
181 auto iconNode = AceType::DynamicCast<FrameNode>(oldBarItem->GetIconNode());
182 CHECK_NULL_VOID(iconNode);
183 auto imageLayoutProperty = iconNode->GetLayoutProperty<ImageLayoutProperty>();
184 CHECK_NULL_VOID(imageLayoutProperty);
185 imageLayoutProperty->UpdateImageSourceInfo(ImageSourceInfo(newBarItem.icon.value()));
186 iconNode->MarkModifyDone();
187 } else {
188 auto iconNode = CreateBarItemIconNode(newBarItem.icon.value());
189 oldBarItem->SetIconNode(iconNode);
190 oldBarItem->AddChild(iconNode);
191 oldBarItem->MarkModifyDone();
192 }
193 } else {
194 oldBarItem->ResetIconSrc();
195 if (oldBarItem->GetIconNode()) {
196 auto iconNode = AceType::DynamicCast<FrameNode>(oldBarItem->GetIconNode());
197 CHECK_NULL_VOID(iconNode);
198 oldBarItem->RemoveChild(iconNode);
199 }
200 }
201 } while (false);
202 oldIter++;
203 newIter++;
204 }
205 // if m > n, we remove (m - n) children from the back of old container
206 if (prevChildrenSize > newChildrenSize) {
207 for (int32_t i = 0; i < prevChildrenSize - newChildrenSize; i++) {
208 oldBarContainer->RemoveChild(oldBarItems.back());
209 oldBarItems.pop_back();
210 }
211 } else if (prevChildrenSize < newChildrenSize) {
212 // if m < n, we add (n - m) children created by info in new item list
213 for (int32_t i = 0; i < newChildrenSize - prevChildrenSize; i++) {
214 auto nodeId = ElementRegister::GetInstance()->MakeUniqueId();
215 auto barItemNode = BarItemNode::GetOrCreateBarItemNode(
216 V2::BAR_ITEM_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
217 UpdateBarItemNodeWithItem(barItemNode, *newIter);
218 oldBarContainer->AddChild(barItemNode);
219 newIter++;
220 }
221 }
222 auto container = AceType::DynamicCast<TitleBarNode>(oldBarContainer);
223 CHECK_NULL_VOID(container);
224 container->MarkModifyDone();
225 }
226
SetNeedResetTitleProperty(const RefPtr<FrameNode> & titleBarNode)227 void SetNeedResetTitleProperty(const RefPtr<FrameNode>& titleBarNode)
228 {
229 CHECK_NULL_VOID(titleBarNode);
230 auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
231 CHECK_NULL_VOID(titleBarPattern);
232 titleBarPattern->SetNeedResetMainTitleProperty(true);
233 titleBarPattern->SetNeedResetSubTitleProperty(true);
234 }
235 } // namespace
236
Create()237 void NavigationModelNG::Create()
238 {
239 auto* stack = ViewStackProcessor::GetInstance();
240 // navigation node
241 int32_t nodeId = stack->ClaimNodeId();
242 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::NAVIGATION_VIEW_ETS_TAG, nodeId);
243 auto navigationGroupNode = NavigationRegister::GetInstance()->GetOrCreateGroupNode(
244 V2::NAVIGATION_VIEW_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
245 if (!CreateNavBarNodeIfNeeded(navigationGroupNode) || // navBar node
246 !CreateContentNodeIfNeeded(navigationGroupNode) || // content node
247 !CreateDividerNodeIfNeeded(navigationGroupNode)) { // divider node
248 return;
249 }
250
251 stack->Push(navigationGroupNode);
252 auto navigationLayoutProperty = navigationGroupNode->GetLayoutProperty<NavigationLayoutProperty>();
253 if (!navigationLayoutProperty->HasNavigationMode()) {
254 navigationLayoutProperty->UpdateNavigationMode(NavigationMode::AUTO);
255 }
256
257 auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
258 if (navigationPattern && !navigationPattern->GetUserSetNavBarWidthFlag()) {
259 navigationLayoutProperty->UpdateNavBarWidth(DEFAULT_NAV_BAR_WIDTH);
260 }
261 }
262
CreateNavBarNodeIfNeeded(const RefPtr<NavigationGroupNode> & navigationGroupNode)263 bool NavigationModelNG::CreateNavBarNodeIfNeeded(const RefPtr<NavigationGroupNode>& navigationGroupNode)
264 {
265 if (!navigationGroupNode->GetNavBarNode()) {
266 int32_t navBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
267 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::NAVBAR_ETS_TAG, navBarNodeId);
268 auto navBarNode = NavBarNode::GetOrCreateNavBarNode(
269 V2::NAVBAR_ETS_TAG, navBarNodeId, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
270 navBarNode->SetJSViewActive(true);
271 auto navBarRenderContext = navBarNode->GetRenderContext();
272 CHECK_NULL_RETURN(navBarRenderContext, false);
273 navBarRenderContext->UpdateClipEdge(true);
274 navigationGroupNode->AddChild(navBarNode);
275 navigationGroupNode->SetNavBarNode(navBarNode);
276
277 if (!CreateNavBarNodeChildsIfNeeded(navBarNode)) {
278 return false;
279 }
280
281 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
282 CHECK_NULL_RETURN(navBarLayoutProperty, false);
283 navBarLayoutProperty->UpdateTitleMode(NavigationTitleMode::FREE);
284 }
285
286 return true;
287 }
288
CreateNavBarNodeChildsIfNeeded(const RefPtr<NavBarNode> & navBarNode)289 bool NavigationModelNG::CreateNavBarNodeChildsIfNeeded(const RefPtr<NavBarNode>& navBarNode)
290 {
291 // titleBar node
292 if (!navBarNode->GetTitleBarNode()) {
293 int32_t titleBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
294 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TITLE_BAR_ETS_TAG, titleBarNodeId);
295 auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
296 V2::TITLE_BAR_ETS_TAG, titleBarNodeId, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
297 navBarNode->AddChild(titleBarNode);
298 navBarNode->SetTitleBarNode(titleBarNode);
299 }
300
301 // navBar content node
302 if (!navBarNode->GetContentNode()) {
303 int32_t navBarContentNodeId = ElementRegister::GetInstance()->MakeUniqueId();
304 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::NAVBAR_CONTENT_ETS_TAG, navBarContentNodeId);
305 auto navBarContentNode = FrameNode::GetOrCreateFrameNode(V2::NAVBAR_CONTENT_ETS_TAG, navBarContentNodeId,
306 []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
307 auto navBarContentRenderContext = navBarContentNode->GetRenderContext();
308 CHECK_NULL_RETURN(navBarContentRenderContext, false);
309 navBarContentRenderContext->UpdateClipEdge(true);
310 navBarNode->AddChild(navBarContentNode);
311 navBarNode->SetContentNode(navBarContentNode);
312
313 if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
314 SafeAreaExpandOpts opts = { .type = SAFE_AREA_TYPE_SYSTEM | SAFE_AREA_TYPE_CUTOUT,
315 .edges = SAFE_AREA_EDGE_ALL };
316 navBarContentNode->GetLayoutProperty()->UpdateSafeAreaExpandOpts(opts);
317 }
318 }
319
320 // toolBar node
321 if (!navBarNode->GetToolBarNode()) {
322 int32_t toolBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
323 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TOOL_BAR_ETS_TAG, toolBarNodeId);
324 auto toolBarNode = NavToolbarNode::GetOrCreateToolbarNode(
325 V2::TOOL_BAR_ETS_TAG, toolBarNodeId, []() { return AceType::MakeRefPtr<NavToolbarPattern>(); });
326 toolBarNode->MarkModifyDone();
327 auto property = toolBarNode->GetLayoutProperty();
328 CHECK_NULL_RETURN(property, false);
329 property->UpdateVisibility(VisibleType::GONE);
330 navBarNode->AddChild(toolBarNode);
331 navBarNode->SetToolBarNode(toolBarNode);
332 navBarNode->SetPreToolBarNode(toolBarNode);
333 navBarNode->UpdatePrevToolBarIsCustom(false);
334 }
335
336 return true;
337 }
338
CreateContentNodeIfNeeded(const RefPtr<NavigationGroupNode> & navigationGroupNode)339 bool NavigationModelNG::CreateContentNodeIfNeeded(const RefPtr<NavigationGroupNode>& navigationGroupNode)
340 {
341 if (!navigationGroupNode->GetContentNode()) {
342 int32_t contentNodeId = ElementRegister::GetInstance()->MakeUniqueId();
343 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::NAVIGATION_CONTENT_ETS_TAG, contentNodeId);
344 auto contentNode = FrameNode::GetOrCreateFrameNode(V2::NAVIGATION_CONTENT_ETS_TAG, contentNodeId,
345 []() { return AceType::MakeRefPtr<NavigationContentPattern>(); });
346 contentNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT);
347 contentNode->GetEventHub<EventHub>()->GetOrCreateGestureEventHub()->SetHitTestMode(
348 HitTestMode::HTMTRANSPARENT_SELF);
349 navigationGroupNode->AddChild(contentNode);
350 navigationGroupNode->SetContentNode(contentNode);
351 }
352
353 return true;
354 }
355
CreateDividerNodeIfNeeded(const RefPtr<NavigationGroupNode> & navigationGroupNode)356 bool NavigationModelNG::CreateDividerNodeIfNeeded(const RefPtr<NavigationGroupNode>& navigationGroupNode)
357 {
358 if (!navigationGroupNode->GetDividerNode()) {
359 int32_t dividerNodeId = ElementRegister::GetInstance()->MakeUniqueId();
360 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::DIVIDER_ETS_TAG, dividerNodeId);
361 auto dividerNode = FrameNode::GetOrCreateFrameNode(
362 V2::DIVIDER_ETS_TAG, dividerNodeId, []() { return AceType::MakeRefPtr<DividerPattern>(); });
363 navigationGroupNode->AddChild(dividerNode);
364 navigationGroupNode->SetDividerNode(dividerNode);
365
366 if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
367 SafeAreaExpandOpts opts = { .type = SAFE_AREA_TYPE_SYSTEM | SAFE_AREA_TYPE_CUTOUT,
368 .edges = SAFE_AREA_EDGE_ALL };
369 dividerNode->GetLayoutProperty()->UpdateSafeAreaExpandOpts(opts);
370 }
371
372 auto dividerLayoutProperty = dividerNode->GetLayoutProperty<DividerLayoutProperty>();
373 CHECK_NULL_RETURN(dividerLayoutProperty, false);
374 dividerLayoutProperty->UpdateStrokeWidth(DIVIDER_WIDTH);
375 dividerLayoutProperty->UpdateVertical(true);
376 auto dividerRenderProperty = dividerNode->GetPaintProperty<DividerRenderProperty>();
377 CHECK_NULL_RETURN(dividerRenderProperty, false);
378 auto theme = NavigationGetTheme();
379 CHECK_NULL_RETURN(theme, false);
380 dividerRenderProperty->UpdateDividerColor(Color::TRANSPARENT);
381 dividerNode->GetRenderContext()->UpdateBackgroundColor(theme->GetNavigationDividerColor());
382 }
383
384 return true;
385 }
386
ParseCommonTitle(bool hasSubTitle,bool hasMainTitle,const std::string & subtitle,const std::string & title,bool ignoreMainTitle)387 bool NavigationModelNG::ParseCommonTitle(
388 bool hasSubTitle, bool hasMainTitle, const std::string& subtitle, const std::string& title, bool ignoreMainTitle)
389 {
390 if (!hasSubTitle && !hasMainTitle) {
391 return false;
392 }
393 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
394 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
395 CHECK_NULL_RETURN(navigationGroupNode, false);
396 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
397 CHECK_NULL_RETURN(navBarNode, false);
398 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
399 CHECK_NULL_RETURN(titleBarNode, false);
400 auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
401 CHECK_NULL_RETURN(titleBarPattern, false);
402 titleBarPattern->SetIsTitleChanged(true);
403 if (navBarNode->GetPrevTitleIsCustomValue(false)) {
404 titleBarNode->RemoveChild(titleBarNode->GetTitle());
405 titleBarNode->SetTitle(nullptr);
406 auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
407 CHECK_NULL_RETURN(titleBarLayoutProperty, false);
408 if (titleBarLayoutProperty->HasTitleHeight()) {
409 titleBarLayoutProperty->ResetTitleHeight();
410 navBarNode->GetLayoutProperty<NavBarLayoutProperty>()->ResetTitleMode();
411 }
412 }
413 navBarNode->UpdatePrevTitleIsCustom(false);
414
415 // create or update main title
416 do {
417 if (ignoreMainTitle) {
418 break;
419 }
420 auto mainTitle = AceType::DynamicCast<FrameNode>(titleBarNode->GetTitle());
421 if (!hasMainTitle) {
422 // remove main title if any.
423 titleBarNode->RemoveChild(mainTitle);
424 titleBarNode->SetTitle(nullptr);
425 break;
426 }
427
428 if (mainTitle) {
429 // update main title
430 auto textLayoutProperty = mainTitle->GetLayoutProperty<TextLayoutProperty>();
431 textLayoutProperty->UpdateMaxLines(hasSubTitle ? 1 : TITLEBAR_MAX_LINES);
432 textLayoutProperty->UpdateContent(title);
433 break;
434 }
435 // create and init main title
436 mainTitle = FrameNode::CreateFrameNode(
437 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
438 auto textLayoutProperty = mainTitle->GetLayoutProperty<TextLayoutProperty>();
439 textLayoutProperty->UpdateContent(title);
440 titleBarPattern->SetNeedResetMainTitleProperty(true);
441 titleBarNode->SetTitle(mainTitle);
442 titleBarNode->AddChild(mainTitle);
443 } while (false);
444
445 // create or update subtitle
446 auto subTitle = AceType::DynamicCast<FrameNode>(titleBarNode->GetSubtitle());
447 if (!hasSubTitle) {
448 // remove subtitle if any.
449 titleBarNode->RemoveChild(subTitle);
450 titleBarNode->SetSubtitle(nullptr);
451 return true;
452 }
453 if (subTitle) {
454 // update subtitle
455 auto textLayoutProperty = subTitle->GetLayoutProperty<TextLayoutProperty>();
456 textLayoutProperty->UpdateContent(subtitle);
457 } else {
458 // create and init subtitle
459 subTitle = FrameNode::CreateFrameNode(
460 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
461 auto textLayoutProperty = subTitle->GetLayoutProperty<TextLayoutProperty>();
462 textLayoutProperty->UpdateContent(subtitle);
463 titleBarPattern->SetNeedResetSubTitleProperty(true);
464 titleBarNode->SetSubtitle(subTitle);
465 titleBarNode->AddChild(subTitle);
466 }
467 return true;
468 }
469
SetTitle(const std::string & title,bool hasSubTitle)470 void NavigationModelNG::SetTitle(const std::string& title, bool hasSubTitle) {}
471
SetCustomTitle(const RefPtr<AceType> & customNode)472 void NavigationModelNG::SetCustomTitle(const RefPtr<AceType>& customNode)
473 {
474 auto customTitle = AceType::DynamicCast<NG::UINode>(customNode);
475 CHECK_NULL_VOID(customTitle);
476 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
477 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
478 CHECK_NULL_VOID(navigationGroupNode);
479 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
480 CHECK_NULL_VOID(navBarNode);
481 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
482 CHECK_NULL_VOID(titleBarNode);
483
484 if (!navBarNode->GetPrevTitleIsCustomValue(false)) {
485 titleBarNode->RemoveChild(titleBarNode->GetTitle());
486 titleBarNode->RemoveChild(titleBarNode->GetSubtitle());
487 titleBarNode->SetTitle(nullptr);
488 titleBarNode->SetSubtitle(nullptr);
489 }
490 navBarNode->UpdatePrevTitleIsCustom(true);
491
492 auto currentTitle = titleBarNode->GetTitle();
493 if (currentTitle && customTitle->GetId() == currentTitle->GetId()) {
494 // do nothing
495 return;
496 }
497 // update custom title
498 titleBarNode->RemoveChild(currentTitle);
499 titleBarNode->SetTitle(customTitle);
500 titleBarNode->AddChild(customTitle);
501 titleBarNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
502 }
503
SetTitleHeight(const Dimension & height,bool isValid)504 void NavigationModelNG::SetTitleHeight(const Dimension& height, bool isValid)
505 {
506 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
507 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
508 CHECK_NULL_VOID(navigationGroupNode);
509 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
510 CHECK_NULL_VOID(navBarNode);
511 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
512 CHECK_NULL_VOID(titleBarNode);
513 auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
514 CHECK_NULL_VOID(titleBarLayoutProperty);
515 if (!isValid) {
516 titleBarLayoutProperty->ResetTitleHeight();
517 return;
518 }
519 titleBarLayoutProperty->UpdateTitleHeight(height);
520 SetHideBackButton(true);
521 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
522 CHECK_NULL_VOID(navBarLayoutProperty);
523 navBarLayoutProperty->UpdateTitleMode(static_cast<NG::NavigationTitleMode>(NavigationTitleMode::MINI));
524 }
525
CreateSymbolBackIcon(const RefPtr<FrameNode> & backButtonNode,NavigationGroupNode * navigationGroupNode)526 void CreateSymbolBackIcon(const RefPtr<FrameNode>& backButtonNode, NavigationGroupNode* navigationGroupNode)
527 {
528 auto theme = NavigationGetTheme();
529 CHECK_NULL_VOID(theme);
530 auto symbolNode = FrameNode::GetOrCreateFrameNode(V2::SYMBOL_ETS_TAG,
531 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<TextPattern>(); });
532 CHECK_NULL_VOID(symbolNode);
533 auto symbolProperty = symbolNode->GetLayoutProperty<TextLayoutProperty>();
534 CHECK_NULL_VOID(symbolProperty);
535 symbolProperty->UpdateSymbolSourceInfo(SymbolSourceInfo(theme->GetBackSymbolId()));
536 auto navigationEventHub = navigationGroupNode->GetEventHub<EventHub>();
537 CHECK_NULL_VOID(navigationEventHub);
538 if (!navigationEventHub->IsEnabled()) {
539 symbolProperty->UpdateSymbolColorList(
540 { theme->GetBackButtonIconColor().BlendOpacity(theme->GetAlphaDisabled()) });
541 } else {
542 symbolProperty->UpdateSymbolColorList({ theme->GetBackButtonIconColor() });
543 }
544 symbolNode->MountToParent(backButtonNode);
545 symbolNode->MarkModifyDone();
546 }
547
CreateImageBackIcon(const RefPtr<FrameNode> & backButtonNode,NavigationGroupNode * navigationGroupNode)548 void CreateImageBackIcon(const RefPtr<FrameNode>& backButtonNode, NavigationGroupNode* navigationGroupNode)
549 {
550 auto theme = NavigationGetTheme();
551 CHECK_NULL_VOID(theme);
552 auto backButtonImageNode = FrameNode::CreateFrameNode(V2::BACK_BUTTON_IMAGE_ETS_TAG,
553 ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
554 CHECK_NULL_VOID(backButtonImageNode);
555
556 auto backButtonImageLayoutProperty = backButtonImageNode->GetLayoutProperty<ImageLayoutProperty>();
557 CHECK_NULL_VOID(backButtonImageLayoutProperty);
558
559 ImageSourceInfo imageSourceInfo;
560 auto iconColor = theme->GetBackButtonIconColor();
561 auto backReourceId = theme->GetBackResourceId();
562
563 imageSourceInfo.SetResourceId(backReourceId);
564 auto navigationEventHub = navigationGroupNode->GetEventHub<EventHub>();
565 CHECK_NULL_VOID(navigationEventHub);
566 if (!navigationEventHub->IsEnabled()) {
567 imageSourceInfo.SetFillColor(iconColor.BlendOpacity(theme->GetAlphaDisabled()));
568 } else {
569 imageSourceInfo.SetFillColor(iconColor);
570 }
571 backButtonImageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
572 backButtonImageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
573
574 backButtonImageNode->MountToParent(backButtonNode);
575 backButtonImageNode->MarkModifyDone();
576 }
577
SetTitleMode(NG::NavigationTitleMode mode)578 void NavigationModelNG::SetTitleMode(NG::NavigationTitleMode mode)
579 {
580 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
581 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
582 CHECK_NULL_VOID(navigationGroupNode);
583 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
584 CHECK_NULL_VOID(navBarNode);
585 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
586 CHECK_NULL_VOID(navBarLayoutProperty);
587 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
588 CHECK_NULL_VOID(titleBarNode);
589 auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
590 CHECK_NULL_VOID(titleBarLayoutProperty);
591 const auto& titleHeightProperty = titleBarLayoutProperty->GetTitleHeight();
592 if (titleHeightProperty.has_value()) {
593 mode = NavigationTitleMode::MINI;
594 }
595 if (!navBarLayoutProperty->HasTitleMode() || navBarLayoutProperty->GetTitleModeValue() != mode) {
596 SetNeedResetTitleProperty(titleBarNode);
597 }
598 navBarLayoutProperty->UpdateTitleMode(static_cast<NG::NavigationTitleMode>(mode));
599 auto backButtonNode = AceType::DynamicCast<FrameNode>(titleBarNode->GetBackButton());
600 if (mode != NavigationTitleMode::MINI) {
601 // remove back button if any.
602 titleBarNode->RemoveChild(backButtonNode);
603 titleBarNode->SetBackButton(nullptr);
604 return;
605 }
606
607 if (backButtonNode != nullptr) {
608 return;
609 }
610 // create back button
611 backButtonNode = FrameNode::CreateFrameNode(
612 V2::BACK_BUTTON_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ButtonPattern>());
613 auto focusHub = backButtonNode->GetOrCreateFocusHub();
614 CHECK_NULL_VOID(focusHub);
615 focusHub->SetFocusDependence(FocusDependence::SELF);
616 auto gestureEventHub = backButtonNode->GetOrCreateGestureEventHub();
617 CHECK_NULL_VOID(gestureEventHub);
618 auto context = PipelineContext::GetCurrentContext();
619 auto clickCallback = [weakContext = WeakPtr<PipelineContext>(context)](GestureEvent& /* info */) {
620 auto context = weakContext.Upgrade();
621 CHECK_NULL_VOID(context);
622 bool result = context->OnBackPressed();
623 if (!result) {
624 auto delegate = EngineHelper::GetCurrentDelegate();
625 CHECK_NULL_VOID(delegate);
626 delegate->Back("");
627 }
628 };
629 gestureEventHub->AddClickEvent(AceType::MakeRefPtr<ClickEvent>(clickCallback));
630 auto buttonPattern = backButtonNode->GetPattern<ButtonPattern>();
631 CHECK_NULL_VOID(buttonPattern);
632 auto theme = NavigationGetTheme();
633 buttonPattern->SetSkipColorConfigurationUpdate();
634 buttonPattern->setComponentButtonType(ComponentButtonType::NAVIGATION);
635 if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
636 buttonPattern->SetBlendColor(theme->GetBackgroundPressedColor(), theme->GetBackgroundHoverColor());
637 buttonPattern->SetFocusBorderColor(theme->GetBackgroundFocusOutlineColor());
638 buttonPattern->SetFocusBorderWidth(theme->GetBackgroundFocusOutlineWeight());
639 }
640 auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty<ButtonLayoutProperty>();
641 CHECK_NULL_VOID(backButtonLayoutProperty);
642 auto renderContext = backButtonNode->GetRenderContext();
643 CHECK_NULL_VOID(renderContext);
644 auto backButtonWidth = BACK_BUTTON_SIZE;
645 auto backButtonHeight = BACK_BUTTON_SIZE;
646 auto backButtonRadiusSize = BUTTON_RADIUS_SIZE;
647 auto backButtonPadding = BUTTON_PADDING;
648 auto backButtonColor = Color::TRANSPARENT;
649 if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
650 backButtonWidth = theme->GetIconBackgroundWidth();
651 backButtonHeight = theme->GetIconBackgroundHeight();
652 backButtonRadiusSize = theme->GetCornerRadius();
653 backButtonPadding = MENU_BUTTON_PADDING;
654 backButtonColor = theme->GetCompBackgroundColor();
655 }
656 backButtonLayoutProperty->UpdateUserDefinedIdealSize(
657 CalcSize(CalcLength(backButtonWidth), CalcLength(backButtonHeight)));
658 backButtonLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(backButtonRadiusSize));
659 renderContext->UpdateBackgroundColor(backButtonColor);
660 PaddingProperty padding;
661 padding.SetEdges(CalcLength(backButtonPadding));
662 backButtonLayoutProperty->UpdatePadding(padding);
663 backButtonLayoutProperty->UpdateType(ButtonType::NORMAL);
664 backButtonLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
665
666 auto eventHub = backButtonNode->GetOrCreateInputEventHub();
667 CHECK_NULL_VOID(eventHub);
668
669 if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE) &&
670 SystemProperties::IsNeedSymbol()) {
671 CreateSymbolBackIcon(backButtonNode, navigationGroupNode);
672 } else {
673 CreateImageBackIcon(backButtonNode, navigationGroupNode);
674 }
675
676 //read navigation back button
677 std::string message = Localization::GetInstance()->GetEntryLetters("navigation.back");
678 NavigationTitleUtil::SetAccessibility(backButtonNode, message);
679
680 backButtonNode->MarkModifyDone();
681 titleBarNode->SetBackButton(backButtonNode);
682 titleBarNode->AddChild(backButtonNode, 0);
683 }
684
SetSubtitle(const std::string & subtitle)685 void NavigationModelNG::SetSubtitle(const std::string& subtitle)
686 {
687 ParseCommonTitle(true, false, subtitle, "", true);
688 }
689
SetEnableModeChangeAnimation(bool isEnable)690 void NavigationModelNG::SetEnableModeChangeAnimation(bool isEnable)
691 {
692 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
693 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
694 CHECK_NULL_VOID(navigationGroupNode);
695 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, EnableModeChangeAnimation, isEnable, navigationGroupNode);
696 }
697
SetHideTitleBar(bool hideTitleBar,bool animated)698 void NavigationModelNG::SetHideTitleBar(bool hideTitleBar, bool animated)
699 {
700 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
701 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
702 CHECK_NULL_VOID(navigationGroupNode);
703 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
704 CHECK_NULL_VOID(navBarNode);
705 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
706 CHECK_NULL_VOID(navBarLayoutProperty);
707 navBarLayoutProperty->UpdateHideTitleBar(hideTitleBar);
708 navBarLayoutProperty->UpdateIsAnimatedTitleBar(animated);
709 }
710
SetHideNavBar(bool hideNavBar)711 void NavigationModelNG::SetHideNavBar(bool hideNavBar)
712 {
713 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
714 RefPtr<NavigationGroupNode> navigationGroupNode =
715 Referenced::Claim<NavigationGroupNode>(AceType::DynamicCast<NavigationGroupNode>(frameNode));
716 CHECK_NULL_VOID(navigationGroupNode);
717 SetHideNavBarInner(navigationGroupNode, hideNavBar);
718 }
719
SetBackButtonIcon(const std::function<void (WeakPtr<NG::FrameNode>)> & symbolApply,const std::string & src,const ImageOption & imageOption,RefPtr<PixelMap> & pixMap,const std::vector<std::string> & nameList)720 void NavigationModelNG::SetBackButtonIcon(const std::function<void(WeakPtr<NG::FrameNode>)>& symbolApply,
721 const std::string& src, const ImageOption& imageOption, RefPtr<PixelMap>& pixMap,
722 const std::vector<std::string>& nameList)
723 {
724 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
725 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
726 CHECK_NULL_VOID(navigationGroupNode);
727
728 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
729 CHECK_NULL_VOID(navBarNode);
730 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
731 CHECK_NULL_VOID(titleBarNode);
732 auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
733 CHECK_NULL_VOID(titleBarLayoutProperty);
734 ImageSourceInfo imageSourceInfo(src, nameList[0], nameList[1]);
735 ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, NoPixMap, imageOption.noPixMap);
736 ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, ImageSource, imageSourceInfo);
737 ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, PixelMap, pixMap);
738 titleBarLayoutProperty->UpdateImageSource(imageSourceInfo);
739 titleBarLayoutProperty->UpdateNoPixMap(imageOption.noPixMap);
740 titleBarLayoutProperty->UpdatePixelMap(pixMap);
741 titleBarLayoutProperty->SetBackIconSymbol(symbolApply);
742 titleBarLayoutProperty->UpdateIsValidImage(imageOption.isValidImage);
743 titleBarNode->MarkModifyDone();
744 }
745
SetHideBackButton(bool hideBackButton)746 void NavigationModelNG::SetHideBackButton(bool hideBackButton)
747 {
748 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
749 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
750 CHECK_NULL_VOID(navigationGroupNode);
751 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
752 CHECK_NULL_VOID(navBarNode);
753 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
754 CHECK_NULL_VOID(navBarLayoutProperty);
755 if (!navBarLayoutProperty->HasHideBackButton() ||
756 (hideBackButton != navBarLayoutProperty->GetHideBackButtonValue())) {
757 SetNeedResetTitleProperty(AceType::DynamicCast<FrameNode>(navBarNode->GetTitleBarNode()));
758 }
759 navBarLayoutProperty->UpdateHideBackButton(hideBackButton);
760 }
761
SetHideToolBar(bool hideToolBar,bool animated)762 void NavigationModelNG::SetHideToolBar(bool hideToolBar, bool animated)
763 {
764 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
765 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
766 CHECK_NULL_VOID(navigationGroupNode);
767 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
768 CHECK_NULL_VOID(navBarNode);
769 auto navBarLayoutProperty = navBarNode->GetLayoutPropertyPtr<NavBarLayoutProperty>();
770 CHECK_NULL_VOID(navBarLayoutProperty);
771 navBarLayoutProperty->UpdateHideToolBar(hideToolBar);
772 navBarLayoutProperty->UpdateIsAnimatedToolBar(animated);
773 }
774
SetCustomToolBar(const RefPtr<AceType> & customNode)775 void NavigationModelNG::SetCustomToolBar(const RefPtr<AceType>& customNode)
776 {
777 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
778 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
779 CHECK_NULL_VOID(navigationGroupNode);
780 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
781 NavigationToolbarUtil::SetCustomToolBar(navBarNode, customNode);
782 }
783
NeedSetItems()784 bool NavigationModelNG::NeedSetItems()
785 {
786 return true;
787 }
788
SetToolBarItems(std::vector<NG::BarItem> && toolBarItems)789 void NavigationModelNG::SetToolBarItems(std::vector<NG::BarItem>&& toolBarItems)
790 {
791 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
792 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
793 CHECK_NULL_VOID(navigationGroupNode);
794 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
795 CHECK_NULL_VOID(navBarNode);
796 if (navBarNode->GetPrevToolBarIsCustom().value_or(false)) {
797 navBarNode->UpdateToolBarNodeOperation(ChildNodeOperation::REPLACE);
798 } else {
799 if (navBarNode->GetPreToolBarNode() &&
800 static_cast<int32_t>(navBarNode->GetPreToolBarNode()->GetChildren().size()) != 0) {
801 UpdateOldBarItems(navBarNode->GetPreToolBarNode(), toolBarItems);
802 navBarNode->SetToolBarNode(navBarNode->GetPreToolBarNode());
803 navBarNode->UpdateToolBarNodeOperation(ChildNodeOperation::NONE);
804 return;
805 }
806 navBarNode->UpdateToolBarNodeOperation(ChildNodeOperation::REPLACE);
807 }
808 auto toolBarNode = AceType::DynamicCast<NavToolbarNode>(navBarNode->GetPreToolBarNode());
809 CHECK_NULL_VOID(toolBarNode);
810 auto rowProperty = toolBarNode->GetLayoutProperty<LinearLayoutProperty>();
811 CHECK_NULL_VOID(rowProperty);
812 rowProperty->UpdateMainAxisAlign(FlexAlign::SPACE_EVENLY);
813 for (const auto& toolBarItem : toolBarItems) {
814 int32_t barItemNodeId = ElementRegister::GetInstance()->MakeUniqueId();
815 auto barItemNode = BarItemNode::GetOrCreateBarItemNode(
816 V2::BAR_ITEM_ETS_TAG, barItemNodeId, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
817 UpdateBarItemNodeWithItem(barItemNode, toolBarItem);
818 toolBarNode->AddChild(barItemNode);
819 }
820 bool hasValidContent = !toolBarNode->GetChildren().empty();
821 toolBarNode->SetHasValidContent(hasValidContent);
822 rowProperty->UpdateVisibility(hasValidContent ? VisibleType::VISIBLE : VisibleType::GONE);
823 navBarNode->SetToolBarNode(toolBarNode);
824 navBarNode->SetPreToolBarNode(toolBarNode);
825 navBarNode->UpdatePrevToolBarIsCustom(false);
826 }
827
SetToolbarConfiguration(std::vector<NG::BarItem> && toolBarItems)828 void NavigationModelNG::SetToolbarConfiguration(std::vector<NG::BarItem>&& toolBarItems)
829 {
830 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
831 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
832 CHECK_NULL_VOID(navigationGroupNode);
833 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
834 bool enabled = false;
835 auto hub = navigationGroupNode->GetEventHub<EventHub>();
836 if (hub) {
837 enabled = hub->IsEnabled();
838 }
839 FieldProperty fieldProperty;
840 fieldProperty.parentId = navigationGroupNode->GetInspectorId().value_or("");
841 fieldProperty.field = NG::NAV_FIELD;
842 NavigationToolbarUtil::SetToolbarConfiguration(navBarNode, std::move(toolBarItems), enabled, fieldProperty);
843 }
844
SetMenuItems(std::vector<NG::BarItem> && menuItems)845 void NavigationModelNG::SetMenuItems(std::vector<NG::BarItem>&& menuItems)
846 {
847 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
848 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
849 CHECK_NULL_VOID(navigationGroupNode);
850 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
851 CHECK_NULL_VOID(navBarNode);
852 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
853 CHECK_NULL_VOID(titleBarNode);
854 // if previous menu is custom, just remove it and create new menu, otherwise update old menu
855 if (navBarNode->GetPrevMenuIsCustom().value_or(false)) {
856 navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
857 } else {
858 if (navBarNode->GetMenu()) {
859 navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
860 } else {
861 navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::ADD);
862 }
863 }
864 auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
865 CHECK_NULL_VOID(navBarPattern);
866 navBarPattern->SetTitleBarMenuItems(menuItems);
867 navBarPattern->SetMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
868 navBarPattern->SetLandscapeMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
869 navBarNode->UpdatePrevMenuIsCustom(false);
870 }
871
SetCustomMenu(const RefPtr<AceType> & customNode)872 void NavigationModelNG::SetCustomMenu(const RefPtr<AceType>& customNode)
873 {
874 auto customMenu = AceType::DynamicCast<NG::UINode>(customNode);
875 CHECK_NULL_VOID(customMenu);
876 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
877 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
878 CHECK_NULL_VOID(navigationGroupNode);
879 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
880 CHECK_NULL_VOID(navBarNode);
881 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
882 CHECK_NULL_VOID(titleBarNode);
883 // if previous menu exists, remove it if their ids are not the same
884 // if previous node is not custom, their ids must not be the same
885 if (navBarNode->GetMenu()) {
886 if (customMenu->GetId() == navBarNode->GetMenu()->GetId()) {
887 navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::NONE);
888 return;
889 }
890 navBarNode->SetMenu(customMenu);
891 navBarNode->UpdatePrevMenuIsCustom(true);
892 navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
893 return;
894 }
895 navBarNode->SetMenu(customMenu);
896 navBarNode->UpdatePrevMenuIsCustom(true);
897 navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::ADD);
898 }
899
SetOnTitleModeChange(std::function<void (NG::NavigationTitleMode)> && onTitleModeChange,std::function<void (const BaseEventInfo * baseInfo)> && eventInfo)900 void NavigationModelNG::SetOnTitleModeChange(std::function<void(NG::NavigationTitleMode)>&& onTitleModeChange,
901 std::function<void(const BaseEventInfo* baseInfo)>&& eventInfo)
902 {
903 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
904 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
905 CHECK_NULL_VOID(navigationGroupNode);
906 auto eventHub = navigationGroupNode->GetEventHub<NavigationEventHub>();
907 CHECK_NULL_VOID(eventHub);
908 eventHub->SetOnTitleModeChange(std::move(eventInfo));
909 }
910
SetUsrNavigationMode(NavigationMode mode)911 void NavigationModelNG::SetUsrNavigationMode(NavigationMode mode)
912 {
913 ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, UsrNavigationMode, mode);
914 }
915
SetNavBarPosition(NG::NavBarPosition mode)916 void NavigationModelNG::SetNavBarPosition(NG::NavBarPosition mode)
917 {
918 ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavBarPosition, static_cast<NG::NavBarPosition>(mode));
919 }
920
SetNavBarWidth(const Dimension & value)921 void NavigationModelNG::SetNavBarWidth(const Dimension& value)
922 {
923 ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavBarWidth, value);
924 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
925 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
926 CHECK_NULL_VOID(navigationGroupNode);
927 auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
928 CHECK_NULL_VOID(navigationPattern);
929 navigationPattern->SetUserSetNavBarWidthFlag(true);
930 if (navigationPattern->GetInitNavBarWidth() != value) {
931 navigationPattern->SetInitNavBarWidth(value);
932 }
933 }
934
SetMinNavBarWidth(const Dimension & value)935 void NavigationModelNG::SetMinNavBarWidth(const Dimension& value)
936 {
937 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
938 CHECK_NULL_VOID(frameNode);
939 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
940 CHECK_NULL_VOID(navigationGroupNode);
941 auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
942 CHECK_NULL_VOID(navigationPattern);
943 navigationPattern->SetIfNeedInit(true);
944 ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinNavBarWidth, value);
945 }
946
SetMaxNavBarWidth(const Dimension & value)947 void NavigationModelNG::SetMaxNavBarWidth(const Dimension& value)
948 {
949 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
950 CHECK_NULL_VOID(frameNode);
951 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
952 CHECK_NULL_VOID(navigationGroupNode);
953 auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
954 CHECK_NULL_VOID(navigationPattern);
955 navigationPattern->SetIfNeedInit(true);
956 ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, MaxNavBarWidth, value);
957 }
958
SetMinContentWidth(const Dimension & value)959 void NavigationModelNG::SetMinContentWidth(const Dimension& value)
960 {
961 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
962 CHECK_NULL_VOID(frameNode);
963 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
964 CHECK_NULL_VOID(navigationGroupNode);
965 auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
966 CHECK_NULL_VOID(navigationPattern);
967 navigationPattern->SetIfNeedInit(true);
968 ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinContentWidth, value);
969 }
970
SetOnNavBarStateChange(std::function<void (bool)> && onNavBarStateChange)971 void NavigationModelNG::SetOnNavBarStateChange(std::function<void(bool)>&& onNavBarStateChange)
972 {
973 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
974 CHECK_NULL_VOID(frameNode);
975 auto navigationEventHub = AceType::DynamicCast<NavigationEventHub>(frameNode->GetEventHub<EventHub>());
976 CHECK_NULL_VOID(navigationEventHub);
977 navigationEventHub->SetOnNavBarStateChange(std::move(onNavBarStateChange));
978 }
979
SetOnNavigationModeChange(std::function<void (NavigationMode)> && modeChange)980 void NavigationModelNG::SetOnNavigationModeChange(std::function<void(NavigationMode)>&& modeChange)
981 {
982 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
983 CHECK_NULL_VOID(frameNode);
984 auto navigationEventHub = AceType::DynamicCast<NavigationEventHub>(frameNode->GetEventHub<EventHub>());
985 CHECK_NULL_VOID(navigationEventHub);
986 navigationEventHub->SetOnNavigationModeChange(std::move(modeChange));
987 }
988
SetNavigationMode(NavigationMode mode)989 void NavigationModelNG::SetNavigationMode(NavigationMode mode)
990 {
991 ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavigationMode, mode);
992 }
993
SetNavigationStack(const RefPtr<NG::NavigationStack> & navigationStack)994 void NavigationModelNG::SetNavigationStack(const RefPtr<NG::NavigationStack>& navigationStack)
995 {
996 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
997 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
998 CHECK_NULL_VOID(navigationGroupNode);
999 auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1000 CHECK_NULL_VOID(pattern);
1001 const auto& stack = pattern->GetNavigationStack();
1002 if (stack) {
1003 stack->UpdateStackInfo(navigationStack);
1004 } else {
1005 pattern->SetNavigationStack(navigationStack);
1006 }
1007 }
1008
SetNavigationStackWithCreatorAndUpdater(std::function<RefPtr<NG::NavigationStack> ()> creator,std::function<void (RefPtr<NG::NavigationStack>)> updater)1009 void NavigationModelNG::SetNavigationStackWithCreatorAndUpdater(
1010 std::function<RefPtr<NG::NavigationStack>()> creator, std::function<void(RefPtr<NG::NavigationStack>)> updater)
1011 {
1012 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1013 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1014 CHECK_NULL_VOID(navigationGroupNode);
1015 auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1016 CHECK_NULL_VOID(pattern);
1017 RefPtr<NavigationStack> stack = pattern->GetNavigationStack();
1018 if (!stack) {
1019 stack = creator();
1020 pattern->SetNavigationStack(stack);
1021 }
1022 updater(stack);
1023 }
1024
SetNavigationStack()1025 void NavigationModelNG::SetNavigationStack()
1026 {
1027 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1028 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1029 CHECK_NULL_VOID(navigationGroupNode);
1030 auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1031 CHECK_NULL_VOID(pattern);
1032 auto navigationStack = pattern->GetNavigationStack();
1033 if (!navigationStack) {
1034 auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
1035 pattern->SetNavigationStack(navigationStack);
1036 }
1037 }
1038
SetNavigationPathInfo(const std::string & moduleName,const std::string & pagePath)1039 void NavigationModelNG::SetNavigationPathInfo(const std::string& moduleName, const std::string& pagePath)
1040 {
1041 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1042 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1043 CHECK_NULL_VOID(navigationGroupNode);
1044 navigationGroupNode->SetNavigationPathInfo(moduleName, pagePath);
1045 }
1046
SetNavigationStackProvided(bool provided)1047 void NavigationModelNG::SetNavigationStackProvided(bool provided)
1048 {
1049 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1050 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1051 CHECK_NULL_VOID(navigationGroupNode);
1052 auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1053 CHECK_NULL_VOID(pattern);
1054 pattern->SetNavigationStackProvided(provided);
1055 }
1056
SetNavDestination(std::function<void (std::string)> && builder)1057 void NavigationModelNG::SetNavDestination(std::function<void(std::string)>&& builder)
1058 {
1059 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1060 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1061 CHECK_NULL_VOID(navigationGroupNode);
1062 auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1063 CHECK_NULL_VOID(pattern);
1064 pattern->SetNavDestination(std::move(builder));
1065 }
1066
GetNavigationStack()1067 RefPtr<NG::NavigationStack> NavigationModelNG::GetNavigationStack()
1068 {
1069 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1070 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1071 CHECK_NULL_RETURN(navigationGroupNode, nullptr);
1072 auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1073 CHECK_NULL_RETURN(pattern, nullptr);
1074 return pattern->GetNavigationStack();
1075 }
1076
SetMenuCount(int32_t menuCount)1077 void NavigationModelNG::SetMenuCount(int32_t menuCount)
1078 {
1079 return;
1080 }
1081
SetHideToolBar(FrameNode * frameNode,bool hideToolBar,bool animated)1082 void NavigationModelNG::SetHideToolBar(FrameNode* frameNode, bool hideToolBar, bool animated)
1083 {
1084 CHECK_NULL_VOID(frameNode);
1085 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1086 CHECK_NULL_VOID(navigationGroupNode);
1087 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1088 CHECK_NULL_VOID(navBarNode);
1089 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1090 CHECK_NULL_VOID(navBarLayoutProperty);
1091 navBarLayoutProperty->UpdateHideToolBar(hideToolBar);
1092 navBarLayoutProperty->UpdateIsAnimatedToolBar(animated);
1093 }
1094
SetMinContentWidth(FrameNode * frameNode,const Dimension & value)1095 void NavigationModelNG::SetMinContentWidth(FrameNode* frameNode, const Dimension& value)
1096 {
1097 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1098 CHECK_NULL_VOID(navigationGroupNode);
1099 auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
1100 CHECK_NULL_VOID(navigationPattern);
1101 navigationPattern->SetIfNeedInit(true);
1102 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinContentWidth, value, frameNode);
1103 }
1104
SetMinNavBarWidth(FrameNode * frameNode,const Dimension & value)1105 void NavigationModelNG::SetMinNavBarWidth(FrameNode* frameNode, const Dimension& value)
1106 {
1107 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1108 CHECK_NULL_VOID(navigationGroupNode);
1109 auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
1110 CHECK_NULL_VOID(navigationPattern);
1111 navigationPattern->SetIfNeedInit(true);
1112 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinNavBarWidth, value, frameNode);
1113 }
1114
SetMaxNavBarWidth(FrameNode * frameNode,const Dimension & value)1115 void NavigationModelNG::SetMaxNavBarWidth(FrameNode* frameNode, const Dimension& value)
1116 {
1117 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1118 CHECK_NULL_VOID(navigationGroupNode);
1119 auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
1120 CHECK_NULL_VOID(navigationPattern);
1121 navigationPattern->SetIfNeedInit(true);
1122 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MaxNavBarWidth, value, frameNode);
1123 }
1124
SetNavBarWidth(FrameNode * frameNode,const Dimension & value)1125 void NavigationModelNG::SetNavBarWidth(FrameNode* frameNode, const Dimension& value)
1126 {
1127 CHECK_NULL_VOID(frameNode);
1128 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavBarWidth, value, frameNode);
1129 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1130 CHECK_NULL_VOID(navigationGroupNode);
1131 auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
1132 CHECK_NULL_VOID(navigationPattern);
1133 navigationPattern->SetUserSetNavBarWidthFlag(true);
1134 if (navigationPattern->GetInitNavBarWidth() != value) {
1135 navigationPattern->SetInitNavBarWidth(value);
1136 }
1137 }
1138
SetNavBarPosition(FrameNode * frameNode,NG::NavBarPosition mode)1139 void NavigationModelNG::SetNavBarPosition(FrameNode* frameNode, NG::NavBarPosition mode)
1140 {
1141 ACE_UPDATE_NODE_LAYOUT_PROPERTY(
1142 NavigationLayoutProperty, NavBarPosition, static_cast<NG::NavBarPosition>(mode), frameNode);
1143 }
1144
SetUsrNavigationMode(FrameNode * frameNode,NavigationMode mode)1145 void NavigationModelNG::SetUsrNavigationMode(FrameNode* frameNode, NavigationMode mode)
1146 {
1147 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, UsrNavigationMode, mode, frameNode);
1148 }
1149
SetBackButtonIcon(FrameNode * frameNode,const std::function<void (WeakPtr<NG::FrameNode>)> & symbolApply,const std::string & src,const ImageOption & imageOption,RefPtr<PixelMap> & pixMap)1150 void NavigationModelNG::SetBackButtonIcon(FrameNode* frameNode,
1151 const std::function<void(WeakPtr<NG::FrameNode>)>& symbolApply, const std::string& src,
1152 const ImageOption& imageOption, RefPtr<PixelMap>& pixMap)
1153 {
1154 CHECK_NULL_VOID(frameNode);
1155 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1156 CHECK_NULL_VOID(navigationGroupNode);
1157
1158 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1159 CHECK_NULL_VOID(navBarNode);
1160 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1161 CHECK_NULL_VOID(titleBarNode);
1162 auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
1163 CHECK_NULL_VOID(titleBarLayoutProperty);
1164 ImageSourceInfo imageSourceInfo(src);
1165 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, NoPixMap, imageOption.noPixMap, frameNode);
1166 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, ImageSource, imageSourceInfo, frameNode);
1167 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, PixelMap, pixMap, frameNode);
1168 titleBarLayoutProperty->UpdateImageSource(imageSourceInfo);
1169 titleBarLayoutProperty->UpdateNoPixMap(imageOption.noPixMap);
1170 titleBarLayoutProperty->UpdatePixelMap(pixMap);
1171 titleBarLayoutProperty->SetBackIconSymbol(symbolApply);
1172 titleBarLayoutProperty->UpdateIsValidImage(imageOption.isValidImage);
1173 titleBarNode->MarkModifyDone();
1174 }
1175
SetHideNavBarInner(const RefPtr<NavigationGroupNode> & navigationGroupNode,bool hideNavBar)1176 void NavigationModelNG::SetHideNavBarInner(
1177 const RefPtr<NavigationGroupNode>& navigationGroupNode, bool hideNavBar)
1178 {
1179 auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1180 CHECK_NULL_VOID(pattern);
1181 auto navigationLayoutProperty = navigationGroupNode->GetLayoutProperty<NavigationLayoutProperty>();
1182 CHECK_NULL_VOID(navigationLayoutProperty);
1183
1184 auto lastHideNavBarValue = navigationLayoutProperty->GetHideNavBar();
1185 if (lastHideNavBarValue.has_value()) {
1186 pattern->SetNavBarVisibilityChange(hideNavBar != lastHideNavBarValue.value());
1187 } else {
1188 pattern->SetNavBarVisibilityChange(true);
1189 }
1190 auto navBarNode = AceType::DynamicCast<FrameNode>(navigationGroupNode->GetNavBarNode());
1191 navBarNode->SetJSViewActive(!hideNavBar);
1192 if (pattern->GetNavBarVisibilityChange()) {
1193 navBarNode->MarkDirtyNode();
1194 }
1195 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, HideNavBar, hideNavBar, navigationGroupNode);
1196 }
1197
SetHideNavBar(FrameNode * frameNode,bool hideNavBar)1198 void NavigationModelNG::SetHideNavBar(FrameNode* frameNode, bool hideNavBar)
1199 {
1200 auto navigationGroupNode =
1201 Referenced::Claim<NavigationGroupNode>(AceType::DynamicCast<NavigationGroupNode>(frameNode));
1202 CHECK_NULL_VOID(navigationGroupNode);
1203 SetHideNavBarInner(navigationGroupNode, hideNavBar);
1204 }
1205
SetEnableModeChangeAnimation(FrameNode * frameNode,bool isEnable)1206 void NavigationModelNG::SetEnableModeChangeAnimation(FrameNode* frameNode, bool isEnable)
1207 {
1208 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1209 CHECK_NULL_VOID(navigationGroupNode);
1210 ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, EnableModeChangeAnimation, isEnable, navigationGroupNode);
1211 }
1212
SetHideTitleBar(FrameNode * frameNode,bool hideTitleBar,bool animated)1213 void NavigationModelNG::SetHideTitleBar(FrameNode* frameNode, bool hideTitleBar, bool animated)
1214 {
1215 CHECK_NULL_VOID(frameNode);
1216 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1217 CHECK_NULL_VOID(navigationGroupNode);
1218 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1219 CHECK_NULL_VOID(navBarNode);
1220 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1221 CHECK_NULL_VOID(navBarLayoutProperty);
1222 navBarLayoutProperty->UpdateHideTitleBar(hideTitleBar);
1223 navBarLayoutProperty->UpdateIsAnimatedTitleBar(animated);
1224 }
1225
SetSubtitle(FrameNode * frameNode,const std::string & subtitle)1226 void NavigationModelNG::SetSubtitle(FrameNode* frameNode, const std::string& subtitle)
1227 {
1228 CHECK_NULL_VOID(frameNode);
1229 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1230 CHECK_NULL_VOID(navigationGroupNode);
1231 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1232 CHECK_NULL_VOID(navBarNode);
1233 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1234 CHECK_NULL_VOID(titleBarNode);
1235 auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
1236 CHECK_NULL_VOID(titleBarPattern);
1237 if (navBarNode->GetPrevTitleIsCustomValue(false)) {
1238 titleBarNode->RemoveChild(titleBarNode->GetTitle());
1239 titleBarNode->SetTitle(nullptr);
1240 auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
1241 CHECK_NULL_VOID(titleBarLayoutProperty);
1242 if (titleBarLayoutProperty->HasTitleHeight()) {
1243 titleBarLayoutProperty->ResetTitleHeight();
1244 navBarNode->GetLayoutProperty<NavBarLayoutProperty>()->ResetTitleMode();
1245 }
1246 }
1247 navBarNode->UpdatePrevTitleIsCustom(false);
1248 // create or update subtitle
1249 auto subTitle = AceType::DynamicCast<FrameNode>(titleBarNode->GetSubtitle());
1250 if (subTitle) {
1251 // update subtitle
1252 auto textLayoutProperty = subTitle->GetLayoutProperty<TextLayoutProperty>();
1253 textLayoutProperty->UpdateContent(subtitle);
1254 auto renderContext = subTitle->GetRenderContext();
1255 renderContext->UpdateOpacity(1.0);
1256 } else {
1257 // create and init subtitle
1258 subTitle = FrameNode::CreateFrameNode(
1259 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
1260 auto textLayoutProperty = subTitle->GetLayoutProperty<TextLayoutProperty>();
1261 textLayoutProperty->UpdateContent(subtitle);
1262 titleBarPattern->SetNeedResetSubTitleProperty(true);
1263 titleBarNode->SetSubtitle(subTitle);
1264 titleBarNode->AddChild(subTitle);
1265 }
1266 }
1267
SetHideBackButton(FrameNode * frameNode,bool hideBackButton)1268 void NavigationModelNG::SetHideBackButton(FrameNode* frameNode, bool hideBackButton)
1269 {
1270 CHECK_NULL_VOID(frameNode);
1271 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1272 CHECK_NULL_VOID(navigationGroupNode);
1273 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1274 CHECK_NULL_VOID(navBarNode);
1275 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1276 CHECK_NULL_VOID(navBarLayoutProperty);
1277 if (!navBarLayoutProperty->HasHideBackButton() ||
1278 (hideBackButton != navBarLayoutProperty->GetHideBackButtonValue())) {
1279 SetNeedResetTitleProperty(AceType::DynamicCast<FrameNode>(navBarNode->GetTitleBarNode()));
1280 }
1281 navBarLayoutProperty->UpdateHideBackButton(hideBackButton);
1282 }
1283
SetTitleMode(FrameNode * frameNode,NG::NavigationTitleMode mode)1284 void NavigationModelNG::SetTitleMode(FrameNode* frameNode, NG::NavigationTitleMode mode)
1285 {
1286 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1287 CHECK_NULL_VOID(navigationGroupNode);
1288 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1289 CHECK_NULL_VOID(navBarNode);
1290 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1291 CHECK_NULL_VOID(navBarLayoutProperty);
1292 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1293 CHECK_NULL_VOID(titleBarNode);
1294 auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
1295 CHECK_NULL_VOID(titleBarLayoutProperty);
1296 const auto& titleHeightProperty = titleBarLayoutProperty->GetTitleHeight();
1297 if (titleHeightProperty.has_value()) {
1298 mode = NavigationTitleMode::MINI;
1299 }
1300 if (!navBarLayoutProperty->HasTitleMode() || navBarLayoutProperty->GetTitleModeValue() != mode) {
1301 SetNeedResetTitleProperty(titleBarNode);
1302 }
1303 navBarLayoutProperty->UpdateTitleMode(static_cast<NG::NavigationTitleMode>(mode));
1304 auto backButtonNode = AceType::DynamicCast<FrameNode>(titleBarNode->GetBackButton());
1305 if (mode != NavigationTitleMode::MINI) {
1306 // remove back button if any.
1307 titleBarNode->RemoveChild(backButtonNode);
1308 titleBarNode->SetBackButton(nullptr);
1309 return;
1310 }
1311
1312 if (backButtonNode != nullptr) {
1313 return;
1314 }
1315 // create back button
1316 backButtonNode = FrameNode::CreateFrameNode(
1317 V2::BACK_BUTTON_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ButtonPattern>());
1318 auto focusHub = backButtonNode->GetOrCreateFocusHub();
1319 CHECK_NULL_VOID(focusHub);
1320 focusHub->SetFocusDependence(FocusDependence::SELF);
1321 auto gestureEventHub = backButtonNode->GetOrCreateGestureEventHub();
1322 CHECK_NULL_VOID(gestureEventHub);
1323 auto context = PipelineContext::GetCurrentContext();
1324 auto clickCallback = [weakContext = WeakPtr<PipelineContext>(context)](GestureEvent& /* info */) {
1325 auto context = weakContext.Upgrade();
1326 CHECK_NULL_VOID(context);
1327 bool result = context->OnBackPressed();
1328 if (!result) {
1329 auto delegate = EngineHelper::GetCurrentDelegate();
1330 CHECK_NULL_VOID(delegate);
1331 delegate->Back("");
1332 }
1333 };
1334 gestureEventHub->AddClickEvent(AceType::MakeRefPtr<ClickEvent>(clickCallback));
1335 auto buttonPattern = backButtonNode->GetPattern<ButtonPattern>();
1336 CHECK_NULL_VOID(buttonPattern);
1337 buttonPattern->SetSkipColorConfigurationUpdate();
1338 auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty<ButtonLayoutProperty>();
1339 CHECK_NULL_VOID(backButtonLayoutProperty);
1340 backButtonLayoutProperty->UpdateUserDefinedIdealSize(
1341 CalcSize(CalcLength(BACK_BUTTON_SIZE), CalcLength(BACK_BUTTON_SIZE)));
1342 backButtonLayoutProperty->UpdateType(ButtonType::NORMAL);
1343 backButtonLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(BUTTON_RADIUS_SIZE));
1344 backButtonLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
1345 auto renderContext = backButtonNode->GetRenderContext();
1346 CHECK_NULL_VOID(renderContext);
1347 renderContext->UpdateBackgroundColor(Color::TRANSPARENT);
1348
1349 auto eventHub = backButtonNode->GetOrCreateInputEventHub();
1350 CHECK_NULL_VOID(eventHub);
1351
1352 PaddingProperty padding;
1353 padding.left = CalcLength(BUTTON_PADDING);
1354 padding.right = CalcLength(BUTTON_PADDING);
1355 padding.top = CalcLength(BUTTON_PADDING);
1356 padding.bottom = CalcLength(BUTTON_PADDING);
1357 backButtonLayoutProperty->UpdatePadding(padding);
1358
1359 auto backButtonImageNode = FrameNode::CreateFrameNode(V2::BACK_BUTTON_IMAGE_ETS_TAG,
1360 ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
1361 CHECK_NULL_VOID(backButtonImageNode);
1362 auto theme = NavigationGetTheme();
1363 CHECK_NULL_VOID(theme);
1364 ImageSourceInfo imageSourceInfo;
1365 imageSourceInfo.SetResourceId(theme->GetBackResourceId());
1366 auto backButtonImageLayoutProperty = backButtonImageNode->GetLayoutProperty<ImageLayoutProperty>();
1367 CHECK_NULL_VOID(backButtonImageLayoutProperty);
1368
1369 auto navigationEventHub = navigationGroupNode->GetEventHub<EventHub>();
1370 CHECK_NULL_VOID(navigationEventHub);
1371 if (!navigationEventHub->IsEnabled()) {
1372 imageSourceInfo.SetFillColor(theme->GetBackButtonIconColor().BlendOpacity(theme->GetAlphaDisabled()));
1373 } else {
1374 imageSourceInfo.SetFillColor(theme->GetBackButtonIconColor());
1375 }
1376 backButtonImageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
1377 backButtonImageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
1378 auto imageRenderProperty = backButtonImageNode->GetPaintProperty<ImageRenderProperty>();
1379 CHECK_NULL_VOID(imageRenderProperty);
1380 imageRenderProperty->UpdateMatchTextDirection(true);
1381
1382 //read navigation back button
1383 std::string message = Localization::GetInstance()->GetEntryLetters("navigation.back");
1384 NavigationTitleUtil::SetAccessibility(backButtonNode, message);
1385
1386 backButtonImageNode->MountToParent(backButtonNode);
1387 backButtonImageNode->MarkModifyDone();
1388 backButtonNode->MarkModifyDone();
1389 titleBarNode->SetBackButton(backButtonNode);
1390 titleBarNode->AddChild(backButtonNode, 0);
1391 }
1392
SetEnableDragBar(FrameNode * frameNode,bool enableDragBar)1393 void NavigationModelNG::SetEnableDragBar(FrameNode* frameNode, bool enableDragBar)
1394 {
1395 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1396 CHECK_NULL_VOID(navigationGroupNode);
1397 auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1398 CHECK_NULL_VOID(pattern);
1399 DeviceType deviceType = SystemProperties::GetDeviceType();
1400 if (deviceType == DeviceType::TWO_IN_ONE) {
1401 enableDragBar = false;
1402 }
1403 pattern->SetEnableDragBar(enableDragBar);
1404 }
1405
SetEnableDragBar(bool enableDragBar)1406 void NavigationModelNG::SetEnableDragBar(bool enableDragBar)
1407 {
1408 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1409 CHECK_NULL_VOID(frameNode);
1410 auto pattern = frameNode->GetPattern<NavigationPattern>();
1411 CHECK_NULL_VOID(pattern);
1412 DeviceType deviceType = SystemProperties::GetDeviceType();
1413 if (deviceType == DeviceType::TWO_IN_ONE) {
1414 enableDragBar = false;
1415 }
1416 pattern->SetEnableDragBar(enableDragBar);
1417 }
1418
SetRecoverable(FrameNode * frameNode,bool recoverable)1419 void NavigationModelNG::SetRecoverable(FrameNode* frameNode, bool recoverable)
1420 {
1421 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1422 CHECK_NULL_VOID(navigationGroupNode);
1423 navigationGroupNode->SetRecoverable(recoverable);
1424 }
1425
SetRecoverable(bool recoverable)1426 void NavigationModelNG::SetRecoverable(bool recoverable)
1427 {
1428 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1429 CHECK_NULL_VOID(frameNode);
1430 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1431 navigationGroupNode->SetRecoverable(recoverable);
1432 }
1433
SetIsCustomAnimation(bool isCustom)1434 void NavigationModelNG::SetIsCustomAnimation(bool isCustom)
1435 {
1436 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1437 CHECK_NULL_VOID(frameNode);
1438 auto pattern = frameNode->GetPattern<NavigationPattern>();
1439 CHECK_NULL_VOID(pattern);
1440 pattern->SetIsCustomAnimation(isCustom);
1441 }
1442
SetCustomTransition(NavigationTransitionEvent && customTransition)1443 void NavigationModelNG::SetCustomTransition(NavigationTransitionEvent&& customTransition)
1444 {
1445 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1446 CHECK_NULL_VOID(frameNode);
1447 auto pattern = frameNode->GetPattern<NavigationPattern>();
1448 CHECK_NULL_VOID(pattern);
1449 pattern->SetNavigationTransition(std::move(customTransition));
1450 }
1451
SetTitlebarOptions(NavigationTitlebarOptions && opt)1452 void NavigationModelNG::SetTitlebarOptions(NavigationTitlebarOptions&& opt)
1453 {
1454 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1455 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1456 CHECK_NULL_VOID(navigationGroupNode);
1457 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1458 CHECK_NULL_VOID(navBarNode);
1459 auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
1460 CHECK_NULL_VOID(navBarPattern);
1461 navBarPattern->SetTitleBarStyle(opt.brOptions.barStyle);
1462 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1463 CHECK_NULL_VOID(titleBarNode);
1464 auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
1465 CHECK_NULL_VOID(titleBarPattern);
1466 titleBarPattern->SetTitlebarOptions(std::move(opt));
1467 }
1468
SetToolbarOptions(NavigationToolbarOptions && opt)1469 void NavigationModelNG::SetToolbarOptions(NavigationToolbarOptions&& opt)
1470 {
1471 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1472 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1473 CHECK_NULL_VOID(navigationGroupNode);
1474 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1475 NavigationToolbarUtil::SetToolbarOptions(navBarNode, std::move(opt));
1476 }
1477
SetIgnoreLayoutSafeArea(const SafeAreaExpandOpts & opts)1478 void NavigationModelNG::SetIgnoreLayoutSafeArea(const SafeAreaExpandOpts& opts)
1479 {
1480 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1481 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1482 CHECK_NULL_VOID(navigationGroupNode);
1483 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1484 CHECK_NULL_VOID(navBarNode);
1485 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1486 CHECK_NULL_VOID(navBarLayoutProperty);
1487 navBarLayoutProperty->UpdateIgnoreLayoutSafeArea(opts);
1488 }
1489
SetIgnoreLayoutSafeArea(FrameNode * frameNode,const SafeAreaExpandOpts & opts)1490 void NavigationModelNG::SetIgnoreLayoutSafeArea(FrameNode* frameNode, const SafeAreaExpandOpts& opts)
1491 {
1492 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1493 CHECK_NULL_VOID(navigationGroupNode);
1494 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1495 CHECK_NULL_VOID(navBarNode);
1496 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1497 CHECK_NULL_VOID(navBarLayoutProperty);
1498 navBarLayoutProperty->UpdateIgnoreLayoutSafeArea(opts);
1499 }
1500
SetSystemBarStyle(const RefPtr<SystemBarStyle> & style)1501 void NavigationModelNG::SetSystemBarStyle(const RefPtr<SystemBarStyle>& style)
1502 {
1503 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1504 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1505 CHECK_NULL_VOID(navigationGroupNode);
1506 auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1507 CHECK_NULL_VOID(pattern);
1508 pattern->SetSystemBarStyle(style);
1509 }
1510
CreateFrameNode(int32_t nodeId)1511 RefPtr<FrameNode> NavigationModelNG::CreateFrameNode(int32_t nodeId)
1512 {
1513 auto navigationGroupNode = NavigationRegister::GetInstance()->GetOrCreateGroupNode(
1514 V2::NAVIGATION_VIEW_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
1515 // navBar node
1516 if (!navigationGroupNode->GetNavBarNode()) {
1517 int32_t navBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1518 auto navBarNode = NavBarNode::GetOrCreateNavBarNode(
1519 V2::NAVBAR_ETS_TAG, navBarNodeId, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
1520 auto navBarRenderContext = navBarNode->GetRenderContext();
1521 CHECK_NULL_RETURN(navBarRenderContext, nullptr);
1522 navBarRenderContext->UpdateClipEdge(true);
1523 navigationGroupNode->AddChild(navBarNode);
1524 navigationGroupNode->SetNavBarNode(navBarNode);
1525
1526 // titleBar node
1527 if (!navBarNode->GetTitleBarNode()) {
1528 int32_t titleBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1529 auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
1530 V2::TITLE_BAR_ETS_TAG, titleBarNodeId, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
1531 navBarNode->AddChild(titleBarNode);
1532 navBarNode->SetTitleBarNode(titleBarNode);
1533 }
1534
1535 // navBar content node
1536 if (!navBarNode->GetContentNode()) {
1537 int32_t navBarContentNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1538 auto navBarContentNode = FrameNode::GetOrCreateFrameNode(V2::NAVBAR_CONTENT_ETS_TAG, navBarContentNodeId,
1539 []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
1540 auto navBarContentRenderContext = navBarContentNode->GetRenderContext();
1541 CHECK_NULL_RETURN(navBarContentRenderContext, nullptr);
1542 navBarContentRenderContext->UpdateClipEdge(true);
1543 navBarNode->AddChild(navBarContentNode);
1544 navBarNode->SetContentNode(navBarContentNode);
1545 }
1546
1547 // toolBar node
1548 if (!navBarNode->GetToolBarNode()) {
1549 int32_t toolBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1550 auto toolBarNode = NavToolbarNode::GetOrCreateToolbarNode(
1551 V2::TOOL_BAR_ETS_TAG, toolBarNodeId, []() { return AceType::MakeRefPtr<NavToolbarPattern>(); });
1552 navBarNode->AddChild(toolBarNode);
1553 navBarNode->SetToolBarNode(toolBarNode);
1554 navBarNode->SetPreToolBarNode(toolBarNode);
1555 navBarNode->UpdatePrevToolBarIsCustom(false);
1556 }
1557 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1558 CHECK_NULL_RETURN(navBarLayoutProperty, nullptr);
1559 navBarLayoutProperty->UpdateTitleMode(NavigationTitleMode::FREE);
1560 }
1561
1562 // content node
1563 if (!navigationGroupNode->GetContentNode()) {
1564 int32_t contentNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1565 auto contentNode = FrameNode::GetOrCreateFrameNode(V2::NAVIGATION_CONTENT_ETS_TAG, contentNodeId,
1566 []() { return AceType::MakeRefPtr<NavigationContentPattern>(); });
1567 contentNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT);
1568 contentNode->GetEventHub<EventHub>()->GetOrCreateGestureEventHub()->SetHitTestMode(
1569 HitTestMode::HTMTRANSPARENT_SELF);
1570 navigationGroupNode->AddChild(contentNode);
1571 navigationGroupNode->SetContentNode(contentNode);
1572 }
1573
1574 // divider node
1575 if (!navigationGroupNode->GetDividerNode()) {
1576 int32_t dividerNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1577 auto dividerNode = FrameNode::GetOrCreateFrameNode(
1578 V2::DIVIDER_ETS_TAG, dividerNodeId, []() { return AceType::MakeRefPtr<DividerPattern>(); });
1579 navigationGroupNode->AddChild(dividerNode);
1580 navigationGroupNode->SetDividerNode(dividerNode);
1581
1582 auto dividerLayoutProperty = dividerNode->GetLayoutProperty<DividerLayoutProperty>();
1583 CHECK_NULL_RETURN(dividerLayoutProperty, nullptr);
1584 dividerLayoutProperty->UpdateStrokeWidth(DIVIDER_WIDTH);
1585 dividerLayoutProperty->UpdateVertical(true);
1586 auto dividerRenderProperty = dividerNode->GetPaintProperty<DividerRenderProperty>();
1587 CHECK_NULL_RETURN(dividerRenderProperty, nullptr);
1588 }
1589 auto navigationLayoutProperty = navigationGroupNode->GetLayoutProperty<NavigationLayoutProperty>();
1590 if (!navigationLayoutProperty->HasNavigationMode()) {
1591 navigationLayoutProperty->UpdateNavigationMode(NavigationMode::AUTO);
1592 }
1593
1594 auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
1595 if (navigationPattern && !navigationPattern->GetUserSetNavBarWidthFlag()) {
1596 navigationLayoutProperty->UpdateNavBarWidth(DEFAULT_NAV_BAR_WIDTH);
1597 }
1598 SetNavigationStack(AceType::RawPtr(navigationGroupNode));
1599
1600 return navigationGroupNode;
1601 }
1602
SetNavigationStack(FrameNode * frameNode)1603 void NavigationModelNG::SetNavigationStack(FrameNode* frameNode)
1604 {
1605 CHECK_NULL_VOID(frameNode);
1606 auto pattern = frameNode->GetPattern<NavigationPattern>();
1607 CHECK_NULL_VOID(pattern);
1608 auto navigationStack = pattern->GetNavigationStack();
1609 if (!navigationStack) {
1610 auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
1611 pattern->SetNavigationStack(std::move(navigationStack));
1612 }
1613 }
1614
ParseCommonTitle(FrameNode * frameNode,const NG::NavigationTitleInfo & titleInfo,bool ignoreMainTitle)1615 void NavigationModelNG::ParseCommonTitle(FrameNode* frameNode, const NG::NavigationTitleInfo& titleInfo,
1616 bool ignoreMainTitle)
1617 {
1618 if (!titleInfo.hasSubTitle && !titleInfo.hasMainTitle) {
1619 return;
1620 }
1621 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1622 CHECK_NULL_VOID(navigationGroupNode);
1623 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1624 CHECK_NULL_VOID(navBarNode);
1625 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1626 CHECK_NULL_VOID(titleBarNode);
1627 auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
1628 CHECK_NULL_VOID(titleBarPattern);
1629 titleBarPattern->SetIsTitleChanged(true);
1630 if (navBarNode->GetPrevTitleIsCustomValue(false)) {
1631 titleBarNode->RemoveChild(titleBarNode->GetTitle());
1632 titleBarNode->SetTitle(nullptr);
1633 auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
1634 CHECK_NULL_VOID(titleBarLayoutProperty);
1635 if (titleBarLayoutProperty->HasTitleHeight()) {
1636 titleBarLayoutProperty->ResetTitleHeight();
1637 navBarNode->GetLayoutProperty<NavBarLayoutProperty>()->ResetTitleMode();
1638 }
1639 }
1640 navBarNode->UpdatePrevTitleIsCustom(false);
1641
1642 // create or update main title
1643 NavigationTitleUtil::CreateOrUpdateMainTitle(titleBarNode, titleInfo, ignoreMainTitle);
1644
1645 // create or update subtitle
1646 NavigationTitleUtil::CreateOrUpdateSubtitle(titleBarNode, titleInfo);
1647 return;
1648 }
1649
SetTitlebarOptions(FrameNode * frameNode,NavigationTitlebarOptions && opt)1650 void NavigationModelNG::SetTitlebarOptions(FrameNode* frameNode, NavigationTitlebarOptions&& opt)
1651 {
1652 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1653 CHECK_NULL_VOID(navigationGroupNode);
1654 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1655 CHECK_NULL_VOID(navBarNode);
1656 auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
1657 CHECK_NULL_VOID(navBarPattern);
1658 navBarPattern->SetTitleBarStyle(opt.brOptions.barStyle);
1659 auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1660 CHECK_NULL_VOID(titleBarNode);
1661 auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
1662 CHECK_NULL_VOID(titleBarPattern);
1663 titleBarPattern->SetTitlebarOptions(std::move(opt));
1664 }
1665
SetMenuItems(FrameNode * frameNode,std::vector<NG::BarItem> && menuItems)1666 void NavigationModelNG::SetMenuItems(FrameNode* frameNode, std::vector<NG::BarItem>&& menuItems)
1667 {
1668 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1669 CHECK_NULL_VOID(navigationGroupNode);
1670 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1671 CHECK_NULL_VOID(navBarNode);
1672 // if previous menu is custom, just remove it and create new menu, otherwise update old menu
1673 if (navBarNode->GetPrevMenuIsCustom().value_or(false)) {
1674 navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
1675 } else {
1676 if (navBarNode->GetMenu()) {
1677 navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
1678 } else {
1679 navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::ADD);
1680 }
1681 }
1682 auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
1683 CHECK_NULL_VOID(navBarPattern);
1684 navBarPattern->SetTitleBarMenuItems(menuItems);
1685 navBarPattern->SetMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
1686 navBarPattern->SetLandscapeMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
1687 navBarNode->UpdatePrevMenuIsCustom(false);
1688 }
1689
SetMenuItemAction(FrameNode * frameNode,std::function<void ()> && action,uint32_t index)1690 void NavigationModelNG::SetMenuItemAction(FrameNode* frameNode, std::function<void()>&& action, uint32_t index)
1691 {
1692 CHECK_NULL_VOID(action);
1693 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1694 CHECK_NULL_VOID(navigationGroupNode);
1695 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1696 CHECK_NULL_VOID(navBarNode);
1697 auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
1698 CHECK_NULL_VOID(navBarPattern);
1699 auto menuItems = navBarPattern->GetTitleBarMenuItems();
1700 if (menuItems.size() > index) {
1701 menuItems.at(index).action = action;
1702 navBarPattern->SetTitleBarMenuItems(menuItems);
1703 }
1704 }
1705
SetMenuItemSymbol(FrameNode * frameNode,std::function<void (WeakPtr<NG::FrameNode>)> && symbol,uint32_t index)1706 void NavigationModelNG::SetMenuItemSymbol(FrameNode* frameNode,
1707 std::function<void(WeakPtr<NG::FrameNode>)>&& symbol, uint32_t index)
1708 {
1709 CHECK_NULL_VOID(symbol);
1710 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1711 CHECK_NULL_VOID(navigationGroupNode);
1712 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1713 CHECK_NULL_VOID(navBarNode);
1714 auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
1715 CHECK_NULL_VOID(navBarPattern);
1716 auto menuItems = navBarPattern->GetTitleBarMenuItems();
1717 if (menuItems.size() > index) {
1718 menuItems.at(index).iconSymbol = symbol;
1719 navBarPattern->SetTitleBarMenuItems(menuItems);
1720 }
1721 }
1722 } // namespace OHOS::Ace::NG
1723