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         CreateSymbolBackIcon(backButtonNode, navigationGroupNode);
671     } else {
672         CreateImageBackIcon(backButtonNode, navigationGroupNode);
673     }
674 
675     //read navigation back button
676     std::string message = Localization::GetInstance()->GetEntryLetters("navigation.back");
677     NavigationTitleUtil::SetAccessibility(backButtonNode, message);
678 
679     backButtonNode->MarkModifyDone();
680     titleBarNode->SetBackButton(backButtonNode);
681     titleBarNode->AddChild(backButtonNode, 0);
682 }
683 
SetSubtitle(const std::string & subtitle)684 void NavigationModelNG::SetSubtitle(const std::string& subtitle)
685 {
686     ParseCommonTitle(true, false, subtitle, "", true);
687 }
688 
SetHideTitleBar(bool hideTitleBar,bool animated)689 void NavigationModelNG::SetHideTitleBar(bool hideTitleBar, bool animated)
690 {
691     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
692     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
693     CHECK_NULL_VOID(navigationGroupNode);
694     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
695     CHECK_NULL_VOID(navBarNode);
696     auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
697     CHECK_NULL_VOID(navBarLayoutProperty);
698     navBarLayoutProperty->UpdateHideTitleBar(hideTitleBar);
699     navBarLayoutProperty->UpdateIsAnimatedTitleBar(animated);
700 }
701 
SetHideNavBar(bool hideNavBar)702 void NavigationModelNG::SetHideNavBar(bool hideNavBar)
703 {
704     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
705     RefPtr<NavigationGroupNode> navigationGroupNode =
706         Referenced::Claim<NavigationGroupNode>(AceType::DynamicCast<NavigationGroupNode>(frameNode));
707     CHECK_NULL_VOID(navigationGroupNode);
708     SetHideNavBarInner(navigationGroupNode, hideNavBar);
709 }
710 
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)711 void NavigationModelNG::SetBackButtonIcon(const std::function<void(WeakPtr<NG::FrameNode>)>& symbolApply,
712     const std::string& src, const ImageOption& imageOption, RefPtr<PixelMap>& pixMap,
713     const std::vector<std::string>& nameList)
714 {
715     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
716     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
717     CHECK_NULL_VOID(navigationGroupNode);
718 
719     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
720     CHECK_NULL_VOID(navBarNode);
721     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
722     CHECK_NULL_VOID(titleBarNode);
723     auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
724     CHECK_NULL_VOID(titleBarLayoutProperty);
725     ImageSourceInfo imageSourceInfo(src, nameList[0], nameList[1]);
726     ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, NoPixMap, imageOption.noPixMap);
727     ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, ImageSource, imageSourceInfo);
728     ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, PixelMap, pixMap);
729     titleBarLayoutProperty->UpdateImageSource(imageSourceInfo);
730     titleBarLayoutProperty->UpdateNoPixMap(imageOption.noPixMap);
731     titleBarLayoutProperty->UpdatePixelMap(pixMap);
732     titleBarLayoutProperty->SetBackIconSymbol(symbolApply);
733     titleBarLayoutProperty->UpdateIsValidImage(imageOption.isValidImage);
734     titleBarNode->MarkModifyDone();
735 }
736 
SetHideBackButton(bool hideBackButton)737 void NavigationModelNG::SetHideBackButton(bool hideBackButton)
738 {
739     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
740     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
741     CHECK_NULL_VOID(navigationGroupNode);
742     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
743     CHECK_NULL_VOID(navBarNode);
744     auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
745     CHECK_NULL_VOID(navBarLayoutProperty);
746     if (!navBarLayoutProperty->HasHideBackButton() ||
747         (hideBackButton != navBarLayoutProperty->GetHideBackButtonValue())) {
748         SetNeedResetTitleProperty(AceType::DynamicCast<FrameNode>(navBarNode->GetTitleBarNode()));
749     }
750     navBarLayoutProperty->UpdateHideBackButton(hideBackButton);
751 }
752 
SetHideToolBar(bool hideToolBar,bool animated)753 void NavigationModelNG::SetHideToolBar(bool hideToolBar, bool animated)
754 {
755     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
756     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
757     CHECK_NULL_VOID(navigationGroupNode);
758     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
759     CHECK_NULL_VOID(navBarNode);
760     auto navBarLayoutProperty = navBarNode->GetLayoutPropertyPtr<NavBarLayoutProperty>();
761     CHECK_NULL_VOID(navBarLayoutProperty);
762     navBarLayoutProperty->UpdateHideToolBar(hideToolBar);
763     navBarLayoutProperty->UpdateIsAnimatedToolBar(animated);
764 }
765 
SetCustomToolBar(const RefPtr<AceType> & customNode)766 void NavigationModelNG::SetCustomToolBar(const RefPtr<AceType>& customNode)
767 {
768     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
769     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
770     CHECK_NULL_VOID(navigationGroupNode);
771     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
772     NavigationToolbarUtil::SetCustomToolBar(navBarNode, customNode);
773 }
774 
NeedSetItems()775 bool NavigationModelNG::NeedSetItems()
776 {
777     return true;
778 }
779 
SetToolBarItems(std::vector<NG::BarItem> && toolBarItems)780 void NavigationModelNG::SetToolBarItems(std::vector<NG::BarItem>&& toolBarItems)
781 {
782     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
783     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
784     CHECK_NULL_VOID(navigationGroupNode);
785     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
786     CHECK_NULL_VOID(navBarNode);
787     if (navBarNode->GetPrevToolBarIsCustom().value_or(false)) {
788         navBarNode->UpdateToolBarNodeOperation(ChildNodeOperation::REPLACE);
789     } else {
790         if (navBarNode->GetPreToolBarNode() &&
791             static_cast<int32_t>(navBarNode->GetPreToolBarNode()->GetChildren().size()) != 0) {
792             UpdateOldBarItems(navBarNode->GetPreToolBarNode(), toolBarItems);
793             navBarNode->SetToolBarNode(navBarNode->GetPreToolBarNode());
794             navBarNode->UpdateToolBarNodeOperation(ChildNodeOperation::NONE);
795             return;
796         }
797         navBarNode->UpdateToolBarNodeOperation(ChildNodeOperation::REPLACE);
798     }
799     auto toolBarNode = AceType::DynamicCast<NavToolbarNode>(navBarNode->GetPreToolBarNode());
800     CHECK_NULL_VOID(toolBarNode);
801     auto rowProperty = toolBarNode->GetLayoutProperty<LinearLayoutProperty>();
802     CHECK_NULL_VOID(rowProperty);
803     rowProperty->UpdateMainAxisAlign(FlexAlign::SPACE_EVENLY);
804     for (const auto& toolBarItem : toolBarItems) {
805         int32_t barItemNodeId = ElementRegister::GetInstance()->MakeUniqueId();
806         auto barItemNode = BarItemNode::GetOrCreateBarItemNode(
807             V2::BAR_ITEM_ETS_TAG, barItemNodeId, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
808         UpdateBarItemNodeWithItem(barItemNode, toolBarItem);
809         toolBarNode->AddChild(barItemNode);
810     }
811     bool hasValidContent = !toolBarNode->GetChildren().empty();
812     toolBarNode->SetHasValidContent(hasValidContent);
813     rowProperty->UpdateVisibility(hasValidContent ? VisibleType::VISIBLE : VisibleType::GONE);
814     navBarNode->SetToolBarNode(toolBarNode);
815     navBarNode->SetPreToolBarNode(toolBarNode);
816     navBarNode->UpdatePrevToolBarIsCustom(false);
817 }
818 
SetToolbarConfiguration(std::vector<NG::BarItem> && toolBarItems)819 void NavigationModelNG::SetToolbarConfiguration(std::vector<NG::BarItem>&& toolBarItems)
820 {
821     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
822     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
823     CHECK_NULL_VOID(navigationGroupNode);
824     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
825     bool enabled = false;
826     auto hub = navigationGroupNode->GetEventHub<EventHub>();
827     if (hub) {
828         enabled = hub->IsEnabled();
829     }
830     FieldProperty fieldProperty;
831     fieldProperty.parentId = navigationGroupNode->GetInspectorId().value_or("");
832     fieldProperty.field = NG::NAV_FIELD;
833     NavigationToolbarUtil::SetToolbarConfiguration(navBarNode, std::move(toolBarItems), enabled, fieldProperty);
834 }
835 
SetMenuItems(std::vector<NG::BarItem> && menuItems)836 void NavigationModelNG::SetMenuItems(std::vector<NG::BarItem>&& menuItems)
837 {
838     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
839     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
840     CHECK_NULL_VOID(navigationGroupNode);
841     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
842     CHECK_NULL_VOID(navBarNode);
843     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
844     CHECK_NULL_VOID(titleBarNode);
845     // if previous menu is custom, just remove it and create new menu, otherwise update old menu
846     if (navBarNode->GetPrevMenuIsCustom().value_or(false)) {
847         navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
848     } else {
849         if (navBarNode->GetMenu()) {
850             navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
851         } else {
852             navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::ADD);
853         }
854     }
855     auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
856     CHECK_NULL_VOID(navBarPattern);
857     navBarPattern->SetTitleBarMenuItems(menuItems);
858     navBarPattern->SetMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
859     navBarPattern->SetLandscapeMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
860     navBarNode->UpdatePrevMenuIsCustom(false);
861 }
862 
SetCustomMenu(const RefPtr<AceType> & customNode)863 void NavigationModelNG::SetCustomMenu(const RefPtr<AceType>& customNode)
864 {
865     auto customMenu = AceType::DynamicCast<NG::UINode>(customNode);
866     CHECK_NULL_VOID(customMenu);
867     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
868     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
869     CHECK_NULL_VOID(navigationGroupNode);
870     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
871     CHECK_NULL_VOID(navBarNode);
872     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
873     CHECK_NULL_VOID(titleBarNode);
874     // if previous menu exists, remove it if their ids are not the same
875     // if previous node is not custom, their ids must not be the same
876     if (navBarNode->GetMenu()) {
877         if (customMenu->GetId() == navBarNode->GetMenu()->GetId()) {
878             navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::NONE);
879             return;
880         }
881         navBarNode->SetMenu(customMenu);
882         navBarNode->UpdatePrevMenuIsCustom(true);
883         navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
884         return;
885     }
886     navBarNode->SetMenu(customMenu);
887     navBarNode->UpdatePrevMenuIsCustom(true);
888     navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::ADD);
889 }
890 
SetOnTitleModeChange(std::function<void (NG::NavigationTitleMode)> && onTitleModeChange,std::function<void (const BaseEventInfo * baseInfo)> && eventInfo)891 void NavigationModelNG::SetOnTitleModeChange(std::function<void(NG::NavigationTitleMode)>&& onTitleModeChange,
892     std::function<void(const BaseEventInfo* baseInfo)>&& eventInfo)
893 {
894     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
895     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
896     CHECK_NULL_VOID(navigationGroupNode);
897     auto eventHub = navigationGroupNode->GetEventHub<NavigationEventHub>();
898     CHECK_NULL_VOID(eventHub);
899     eventHub->SetOnTitleModeChange(std::move(eventInfo));
900 }
901 
SetUsrNavigationMode(NavigationMode mode)902 void NavigationModelNG::SetUsrNavigationMode(NavigationMode mode)
903 {
904     ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, UsrNavigationMode, mode);
905 }
906 
SetNavBarPosition(NG::NavBarPosition mode)907 void NavigationModelNG::SetNavBarPosition(NG::NavBarPosition mode)
908 {
909     ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavBarPosition, static_cast<NG::NavBarPosition>(mode));
910 }
911 
SetNavBarWidth(const Dimension & value)912 void NavigationModelNG::SetNavBarWidth(const Dimension& value)
913 {
914     ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavBarWidth, value);
915     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
916     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
917     CHECK_NULL_VOID(navigationGroupNode);
918     auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
919     CHECK_NULL_VOID(navigationPattern);
920     navigationPattern->SetUserSetNavBarWidthFlag(true);
921     if (navigationPattern->GetInitNavBarWidth() != value) {
922         navigationPattern->SetInitNavBarWidth(value);
923     }
924 }
925 
SetMinNavBarWidth(const Dimension & value)926 void NavigationModelNG::SetMinNavBarWidth(const Dimension& value)
927 {
928     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
929     CHECK_NULL_VOID(frameNode);
930     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
931     CHECK_NULL_VOID(navigationGroupNode);
932     auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
933     CHECK_NULL_VOID(navigationPattern);
934     navigationPattern->SetIfNeedInit(true);
935     ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinNavBarWidth, value);
936 }
937 
SetMaxNavBarWidth(const Dimension & value)938 void NavigationModelNG::SetMaxNavBarWidth(const Dimension& value)
939 {
940     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
941     CHECK_NULL_VOID(frameNode);
942     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
943     CHECK_NULL_VOID(navigationGroupNode);
944     auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
945     CHECK_NULL_VOID(navigationPattern);
946     navigationPattern->SetIfNeedInit(true);
947     ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, MaxNavBarWidth, value);
948 }
949 
SetMinContentWidth(const Dimension & value)950 void NavigationModelNG::SetMinContentWidth(const Dimension& value)
951 {
952     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
953     CHECK_NULL_VOID(frameNode);
954     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
955     CHECK_NULL_VOID(navigationGroupNode);
956     auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
957     CHECK_NULL_VOID(navigationPattern);
958     navigationPattern->SetIfNeedInit(true);
959     ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinContentWidth, value);
960 }
961 
SetOnNavBarStateChange(std::function<void (bool)> && onNavBarStateChange)962 void NavigationModelNG::SetOnNavBarStateChange(std::function<void(bool)>&& onNavBarStateChange)
963 {
964     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
965     CHECK_NULL_VOID(frameNode);
966     auto navigationEventHub = AceType::DynamicCast<NavigationEventHub>(frameNode->GetEventHub<EventHub>());
967     CHECK_NULL_VOID(navigationEventHub);
968     navigationEventHub->SetOnNavBarStateChange(std::move(onNavBarStateChange));
969 }
970 
SetOnNavigationModeChange(std::function<void (NavigationMode)> && modeChange)971 void NavigationModelNG::SetOnNavigationModeChange(std::function<void(NavigationMode)>&& modeChange)
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->SetOnNavigationModeChange(std::move(modeChange));
978 }
979 
SetNavigationMode(NavigationMode mode)980 void NavigationModelNG::SetNavigationMode(NavigationMode mode)
981 {
982     ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavigationMode, mode);
983 }
984 
SetNavigationStack(const RefPtr<NG::NavigationStack> & navigationStack)985 void NavigationModelNG::SetNavigationStack(const RefPtr<NG::NavigationStack>& navigationStack)
986 {
987     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
988     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
989     CHECK_NULL_VOID(navigationGroupNode);
990     auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
991     CHECK_NULL_VOID(pattern);
992     const auto& stack = pattern->GetNavigationStack();
993     if (stack) {
994         stack->UpdateStackInfo(navigationStack);
995     } else {
996         pattern->SetNavigationStack(navigationStack);
997     }
998 }
999 
SetNavigationStackWithCreatorAndUpdater(std::function<RefPtr<NG::NavigationStack> ()> creator,std::function<void (RefPtr<NG::NavigationStack>)> updater)1000 void NavigationModelNG::SetNavigationStackWithCreatorAndUpdater(
1001     std::function<RefPtr<NG::NavigationStack>()> creator, std::function<void(RefPtr<NG::NavigationStack>)> updater)
1002 {
1003     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1004     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1005     CHECK_NULL_VOID(navigationGroupNode);
1006     auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1007     CHECK_NULL_VOID(pattern);
1008     RefPtr<NavigationStack> stack = pattern->GetNavigationStack();
1009     if (!stack) {
1010         stack = creator();
1011         pattern->SetNavigationStack(stack);
1012     }
1013     updater(stack);
1014 }
1015 
SetNavigationStack()1016 void NavigationModelNG::SetNavigationStack()
1017 {
1018     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1019     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1020     CHECK_NULL_VOID(navigationGroupNode);
1021     auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1022     CHECK_NULL_VOID(pattern);
1023     auto navigationStack = pattern->GetNavigationStack();
1024     if (!navigationStack) {
1025         auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
1026         pattern->SetNavigationStack(navigationStack);
1027     }
1028 }
1029 
SetNavigationPathInfo(const std::string & moduleName,const std::string & pagePath)1030 void NavigationModelNG::SetNavigationPathInfo(const std::string& moduleName, const std::string& pagePath)
1031 {
1032     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1033     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1034     CHECK_NULL_VOID(navigationGroupNode);
1035     navigationGroupNode->SetNavigationPathInfo(moduleName, pagePath);
1036 }
1037 
SetNavigationStackProvided(bool provided)1038 void NavigationModelNG::SetNavigationStackProvided(bool provided)
1039 {
1040     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1041     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1042     CHECK_NULL_VOID(navigationGroupNode);
1043     auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1044     CHECK_NULL_VOID(pattern);
1045     pattern->SetNavigationStackProvided(provided);
1046 }
1047 
SetNavDestination(std::function<void (std::string)> && builder)1048 void NavigationModelNG::SetNavDestination(std::function<void(std::string)>&& builder)
1049 {
1050     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1051     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1052     CHECK_NULL_VOID(navigationGroupNode);
1053     auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1054     CHECK_NULL_VOID(pattern);
1055     pattern->SetNavDestination(std::move(builder));
1056 }
1057 
GetNavigationStack()1058 RefPtr<NG::NavigationStack> NavigationModelNG::GetNavigationStack()
1059 {
1060     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1061     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1062     CHECK_NULL_RETURN(navigationGroupNode, nullptr);
1063     auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1064     CHECK_NULL_RETURN(pattern, nullptr);
1065     return pattern->GetNavigationStack();
1066 }
1067 
SetMenuCount(int32_t menuCount)1068 void NavigationModelNG::SetMenuCount(int32_t menuCount)
1069 {
1070     return;
1071 }
1072 
SetHideToolBar(FrameNode * frameNode,bool hideToolBar,bool animated)1073 void NavigationModelNG::SetHideToolBar(FrameNode* frameNode, bool hideToolBar, bool animated)
1074 {
1075     CHECK_NULL_VOID(frameNode);
1076     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1077     CHECK_NULL_VOID(navigationGroupNode);
1078     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1079     CHECK_NULL_VOID(navBarNode);
1080     auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1081     CHECK_NULL_VOID(navBarLayoutProperty);
1082     navBarLayoutProperty->UpdateHideToolBar(hideToolBar);
1083     navBarLayoutProperty->UpdateIsAnimatedToolBar(animated);
1084 }
1085 
SetMinContentWidth(FrameNode * frameNode,const Dimension & value)1086 void NavigationModelNG::SetMinContentWidth(FrameNode* frameNode, const Dimension& value)
1087 {
1088     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1089     CHECK_NULL_VOID(navigationGroupNode);
1090     auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
1091     CHECK_NULL_VOID(navigationPattern);
1092     navigationPattern->SetIfNeedInit(true);
1093     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinContentWidth, value, frameNode);
1094 }
1095 
SetMinNavBarWidth(FrameNode * frameNode,const Dimension & value)1096 void NavigationModelNG::SetMinNavBarWidth(FrameNode* frameNode, const Dimension& value)
1097 {
1098     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1099     CHECK_NULL_VOID(navigationGroupNode);
1100     auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
1101     CHECK_NULL_VOID(navigationPattern);
1102     navigationPattern->SetIfNeedInit(true);
1103     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinNavBarWidth, value, frameNode);
1104 }
1105 
SetMaxNavBarWidth(FrameNode * frameNode,const Dimension & value)1106 void NavigationModelNG::SetMaxNavBarWidth(FrameNode* frameNode, const Dimension& value)
1107 {
1108     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1109     CHECK_NULL_VOID(navigationGroupNode);
1110     auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
1111     CHECK_NULL_VOID(navigationPattern);
1112     navigationPattern->SetIfNeedInit(true);
1113     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MaxNavBarWidth, value, frameNode);
1114 }
1115 
SetNavBarWidth(FrameNode * frameNode,const Dimension & value)1116 void NavigationModelNG::SetNavBarWidth(FrameNode* frameNode, const Dimension& value)
1117 {
1118     CHECK_NULL_VOID(frameNode);
1119     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavBarWidth, value, frameNode);
1120     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1121     CHECK_NULL_VOID(navigationGroupNode);
1122     auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
1123     CHECK_NULL_VOID(navigationPattern);
1124     navigationPattern->SetUserSetNavBarWidthFlag(true);
1125     if (navigationPattern->GetInitNavBarWidth() != value) {
1126         navigationPattern->SetInitNavBarWidth(value);
1127     }
1128 }
1129 
SetNavBarPosition(FrameNode * frameNode,NG::NavBarPosition mode)1130 void NavigationModelNG::SetNavBarPosition(FrameNode* frameNode, NG::NavBarPosition mode)
1131 {
1132     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
1133         NavigationLayoutProperty, NavBarPosition, static_cast<NG::NavBarPosition>(mode), frameNode);
1134 }
1135 
SetUsrNavigationMode(FrameNode * frameNode,NavigationMode mode)1136 void NavigationModelNG::SetUsrNavigationMode(FrameNode* frameNode, NavigationMode mode)
1137 {
1138     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, UsrNavigationMode, mode, frameNode);
1139 }
1140 
SetBackButtonIcon(FrameNode * frameNode,const std::function<void (WeakPtr<NG::FrameNode>)> & symbolApply,const std::string & src,const ImageOption & imageOption,RefPtr<PixelMap> & pixMap)1141 void NavigationModelNG::SetBackButtonIcon(FrameNode* frameNode,
1142     const std::function<void(WeakPtr<NG::FrameNode>)>& symbolApply, const std::string& src,
1143     const ImageOption& imageOption, RefPtr<PixelMap>& pixMap)
1144 {
1145     CHECK_NULL_VOID(frameNode);
1146     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1147     CHECK_NULL_VOID(navigationGroupNode);
1148 
1149     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1150     CHECK_NULL_VOID(navBarNode);
1151     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1152     CHECK_NULL_VOID(titleBarNode);
1153     auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
1154     CHECK_NULL_VOID(titleBarLayoutProperty);
1155     ImageSourceInfo imageSourceInfo(src);
1156     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, NoPixMap, imageOption.noPixMap, frameNode);
1157     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, ImageSource, imageSourceInfo, frameNode);
1158     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, PixelMap, pixMap, frameNode);
1159     titleBarLayoutProperty->UpdateImageSource(imageSourceInfo);
1160     titleBarLayoutProperty->UpdateNoPixMap(imageOption.noPixMap);
1161     titleBarLayoutProperty->UpdatePixelMap(pixMap);
1162     titleBarLayoutProperty->SetBackIconSymbol(symbolApply);
1163     titleBarLayoutProperty->UpdateIsValidImage(imageOption.isValidImage);
1164     titleBarNode->MarkModifyDone();
1165 }
1166 
SetHideNavBarInner(const RefPtr<NavigationGroupNode> & navigationGroupNode,bool hideNavBar)1167 void NavigationModelNG::SetHideNavBarInner(
1168     const RefPtr<NavigationGroupNode>& navigationGroupNode, bool hideNavBar)
1169 {
1170     auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1171     CHECK_NULL_VOID(pattern);
1172     auto navigationLayoutProperty = navigationGroupNode->GetLayoutProperty<NavigationLayoutProperty>();
1173     CHECK_NULL_VOID(navigationLayoutProperty);
1174 
1175     auto lastHideNavBarValue = navigationLayoutProperty->GetHideNavBar();
1176     if (lastHideNavBarValue.has_value()) {
1177         pattern->SetNavBarVisibilityChange(hideNavBar != lastHideNavBarValue.value());
1178     } else {
1179         pattern->SetNavBarVisibilityChange(true);
1180     }
1181     auto navBarNode = AceType::DynamicCast<FrameNode>(navigationGroupNode->GetNavBarNode());
1182     navBarNode->SetJSViewActive(!hideNavBar);
1183     if (pattern->GetNavBarVisibilityChange()) {
1184         navBarNode->MarkDirtyNode();
1185     }
1186     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, HideNavBar, hideNavBar, navigationGroupNode);
1187 }
1188 
SetHideNavBar(FrameNode * frameNode,bool hideNavBar)1189 void NavigationModelNG::SetHideNavBar(FrameNode* frameNode, bool hideNavBar)
1190 {
1191     auto navigationGroupNode =
1192         Referenced::Claim<NavigationGroupNode>(AceType::DynamicCast<NavigationGroupNode>(frameNode));
1193     CHECK_NULL_VOID(navigationGroupNode);
1194     SetHideNavBarInner(navigationGroupNode, hideNavBar);
1195 }
1196 
SetHideTitleBar(FrameNode * frameNode,bool hideTitleBar,bool animated)1197 void NavigationModelNG::SetHideTitleBar(FrameNode* frameNode, bool hideTitleBar, bool animated)
1198 {
1199     CHECK_NULL_VOID(frameNode);
1200     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1201     CHECK_NULL_VOID(navigationGroupNode);
1202     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1203     CHECK_NULL_VOID(navBarNode);
1204     auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1205     CHECK_NULL_VOID(navBarLayoutProperty);
1206     navBarLayoutProperty->UpdateHideTitleBar(hideTitleBar);
1207     navBarLayoutProperty->UpdateIsAnimatedTitleBar(animated);
1208 }
1209 
SetSubtitle(FrameNode * frameNode,const std::string & subtitle)1210 void NavigationModelNG::SetSubtitle(FrameNode* frameNode, const std::string& subtitle)
1211 {
1212     CHECK_NULL_VOID(frameNode);
1213     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1214     CHECK_NULL_VOID(navigationGroupNode);
1215     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1216     CHECK_NULL_VOID(navBarNode);
1217     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1218     CHECK_NULL_VOID(titleBarNode);
1219     auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
1220     CHECK_NULL_VOID(titleBarPattern);
1221     if (navBarNode->GetPrevTitleIsCustomValue(false)) {
1222         titleBarNode->RemoveChild(titleBarNode->GetTitle());
1223         titleBarNode->SetTitle(nullptr);
1224         auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
1225         CHECK_NULL_VOID(titleBarLayoutProperty);
1226         if (titleBarLayoutProperty->HasTitleHeight()) {
1227             titleBarLayoutProperty->ResetTitleHeight();
1228             navBarNode->GetLayoutProperty<NavBarLayoutProperty>()->ResetTitleMode();
1229         }
1230     }
1231     navBarNode->UpdatePrevTitleIsCustom(false);
1232     // create or update subtitle
1233     auto subTitle = AceType::DynamicCast<FrameNode>(titleBarNode->GetSubtitle());
1234     if (subTitle) {
1235         // update subtitle
1236         auto textLayoutProperty = subTitle->GetLayoutProperty<TextLayoutProperty>();
1237         textLayoutProperty->UpdateContent(subtitle);
1238         auto renderContext = subTitle->GetRenderContext();
1239         renderContext->UpdateOpacity(1.0);
1240     } else {
1241         // create and init subtitle
1242         subTitle = FrameNode::CreateFrameNode(
1243             V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
1244         auto textLayoutProperty = subTitle->GetLayoutProperty<TextLayoutProperty>();
1245         textLayoutProperty->UpdateContent(subtitle);
1246         titleBarPattern->SetNeedResetSubTitleProperty(true);
1247         titleBarNode->SetSubtitle(subTitle);
1248         titleBarNode->AddChild(subTitle);
1249     }
1250 }
1251 
SetHideBackButton(FrameNode * frameNode,bool hideBackButton)1252 void NavigationModelNG::SetHideBackButton(FrameNode* frameNode, bool hideBackButton)
1253 {
1254     CHECK_NULL_VOID(frameNode);
1255     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1256     CHECK_NULL_VOID(navigationGroupNode);
1257     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1258     CHECK_NULL_VOID(navBarNode);
1259     auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1260     CHECK_NULL_VOID(navBarLayoutProperty);
1261     if (!navBarLayoutProperty->HasHideBackButton() ||
1262         (hideBackButton != navBarLayoutProperty->GetHideBackButtonValue())) {
1263         SetNeedResetTitleProperty(AceType::DynamicCast<FrameNode>(navBarNode->GetTitleBarNode()));
1264     }
1265     navBarLayoutProperty->UpdateHideBackButton(hideBackButton);
1266 }
1267 
SetTitleMode(FrameNode * frameNode,NG::NavigationTitleMode mode)1268 void NavigationModelNG::SetTitleMode(FrameNode* frameNode, NG::NavigationTitleMode mode)
1269 {
1270     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1271     CHECK_NULL_VOID(navigationGroupNode);
1272     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1273     CHECK_NULL_VOID(navBarNode);
1274     auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1275     CHECK_NULL_VOID(navBarLayoutProperty);
1276     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1277     CHECK_NULL_VOID(titleBarNode);
1278     auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
1279     CHECK_NULL_VOID(titleBarLayoutProperty);
1280     const auto& titleHeightProperty = titleBarLayoutProperty->GetTitleHeight();
1281     if (titleHeightProperty.has_value()) {
1282         mode = NavigationTitleMode::MINI;
1283     }
1284     if (!navBarLayoutProperty->HasTitleMode() || navBarLayoutProperty->GetTitleModeValue() != mode) {
1285         SetNeedResetTitleProperty(titleBarNode);
1286     }
1287     navBarLayoutProperty->UpdateTitleMode(static_cast<NG::NavigationTitleMode>(mode));
1288     auto backButtonNode = AceType::DynamicCast<FrameNode>(titleBarNode->GetBackButton());
1289     if (mode != NavigationTitleMode::MINI) {
1290         // remove back button if any.
1291         titleBarNode->RemoveChild(backButtonNode);
1292         titleBarNode->SetBackButton(nullptr);
1293         return;
1294     }
1295 
1296     if (backButtonNode != nullptr) {
1297         return;
1298     }
1299     // create back button
1300     backButtonNode = FrameNode::CreateFrameNode(
1301         V2::BACK_BUTTON_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ButtonPattern>());
1302     auto focusHub = backButtonNode->GetOrCreateFocusHub();
1303     CHECK_NULL_VOID(focusHub);
1304     focusHub->SetFocusDependence(FocusDependence::SELF);
1305     auto gestureEventHub = backButtonNode->GetOrCreateGestureEventHub();
1306     CHECK_NULL_VOID(gestureEventHub);
1307     auto context = PipelineContext::GetCurrentContext();
1308     auto clickCallback = [weakContext = WeakPtr<PipelineContext>(context)](GestureEvent& /* info */) {
1309         auto context = weakContext.Upgrade();
1310         CHECK_NULL_VOID(context);
1311         bool result = context->OnBackPressed();
1312         if (!result) {
1313             auto delegate = EngineHelper::GetCurrentDelegate();
1314             CHECK_NULL_VOID(delegate);
1315             delegate->Back("");
1316         }
1317     };
1318     gestureEventHub->AddClickEvent(AceType::MakeRefPtr<ClickEvent>(clickCallback));
1319     auto buttonPattern = backButtonNode->GetPattern<ButtonPattern>();
1320     CHECK_NULL_VOID(buttonPattern);
1321     buttonPattern->SetSkipColorConfigurationUpdate();
1322     auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty<ButtonLayoutProperty>();
1323     CHECK_NULL_VOID(backButtonLayoutProperty);
1324     backButtonLayoutProperty->UpdateUserDefinedIdealSize(
1325         CalcSize(CalcLength(BACK_BUTTON_SIZE), CalcLength(BACK_BUTTON_SIZE)));
1326     backButtonLayoutProperty->UpdateType(ButtonType::NORMAL);
1327     backButtonLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(BUTTON_RADIUS_SIZE));
1328     backButtonLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
1329     auto renderContext = backButtonNode->GetRenderContext();
1330     CHECK_NULL_VOID(renderContext);
1331     renderContext->UpdateBackgroundColor(Color::TRANSPARENT);
1332 
1333     auto eventHub = backButtonNode->GetOrCreateInputEventHub();
1334     CHECK_NULL_VOID(eventHub);
1335 
1336     PaddingProperty padding;
1337     padding.left = CalcLength(BUTTON_PADDING);
1338     padding.right = CalcLength(BUTTON_PADDING);
1339     padding.top = CalcLength(BUTTON_PADDING);
1340     padding.bottom = CalcLength(BUTTON_PADDING);
1341     backButtonLayoutProperty->UpdatePadding(padding);
1342 
1343     auto backButtonImageNode = FrameNode::CreateFrameNode(V2::BACK_BUTTON_IMAGE_ETS_TAG,
1344         ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
1345     CHECK_NULL_VOID(backButtonImageNode);
1346     auto theme = NavigationGetTheme();
1347     CHECK_NULL_VOID(theme);
1348     ImageSourceInfo imageSourceInfo;
1349     imageSourceInfo.SetResourceId(theme->GetBackResourceId());
1350     auto backButtonImageLayoutProperty = backButtonImageNode->GetLayoutProperty<ImageLayoutProperty>();
1351     CHECK_NULL_VOID(backButtonImageLayoutProperty);
1352 
1353     auto navigationEventHub = navigationGroupNode->GetEventHub<EventHub>();
1354     CHECK_NULL_VOID(navigationEventHub);
1355     if (!navigationEventHub->IsEnabled()) {
1356         imageSourceInfo.SetFillColor(theme->GetBackButtonIconColor().BlendOpacity(theme->GetAlphaDisabled()));
1357     } else {
1358         imageSourceInfo.SetFillColor(theme->GetBackButtonIconColor());
1359     }
1360     backButtonImageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
1361     backButtonImageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
1362     auto imageRenderProperty = backButtonImageNode->GetPaintProperty<ImageRenderProperty>();
1363     CHECK_NULL_VOID(imageRenderProperty);
1364     imageRenderProperty->UpdateMatchTextDirection(true);
1365 
1366     //read navigation back button
1367     std::string message = Localization::GetInstance()->GetEntryLetters("navigation.back");
1368     NavigationTitleUtil::SetAccessibility(backButtonNode, message);
1369 
1370     backButtonImageNode->MountToParent(backButtonNode);
1371     backButtonImageNode->MarkModifyDone();
1372     backButtonNode->MarkModifyDone();
1373     titleBarNode->SetBackButton(backButtonNode);
1374     titleBarNode->AddChild(backButtonNode, 0);
1375 }
1376 
SetEnableDragBar(FrameNode * frameNode,bool enableDragBar)1377 void NavigationModelNG::SetEnableDragBar(FrameNode* frameNode, bool enableDragBar)
1378 {
1379     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1380     CHECK_NULL_VOID(navigationGroupNode);
1381     auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1382     CHECK_NULL_VOID(pattern);
1383     DeviceType deviceType = SystemProperties::GetDeviceType();
1384     if (deviceType == DeviceType::TWO_IN_ONE) {
1385         enableDragBar = false;
1386     }
1387     pattern->SetEnableDragBar(enableDragBar);
1388 }
1389 
SetEnableDragBar(bool enableDragBar)1390 void NavigationModelNG::SetEnableDragBar(bool enableDragBar)
1391 {
1392     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1393     CHECK_NULL_VOID(frameNode);
1394     auto pattern = frameNode->GetPattern<NavigationPattern>();
1395     CHECK_NULL_VOID(pattern);
1396     DeviceType deviceType = SystemProperties::GetDeviceType();
1397     if (deviceType == DeviceType::TWO_IN_ONE) {
1398         enableDragBar = false;
1399     }
1400     pattern->SetEnableDragBar(enableDragBar);
1401 }
1402 
SetRecoverable(FrameNode * frameNode,bool recoverable)1403 void NavigationModelNG::SetRecoverable(FrameNode* frameNode, bool recoverable)
1404 {
1405     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1406     CHECK_NULL_VOID(navigationGroupNode);
1407     navigationGroupNode->SetRecoverable(recoverable);
1408 }
1409 
SetRecoverable(bool recoverable)1410 void NavigationModelNG::SetRecoverable(bool recoverable)
1411 {
1412     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1413     CHECK_NULL_VOID(frameNode);
1414     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1415     navigationGroupNode->SetRecoverable(recoverable);
1416 }
1417 
SetIsCustomAnimation(bool isCustom)1418 void NavigationModelNG::SetIsCustomAnimation(bool isCustom)
1419 {
1420     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1421     CHECK_NULL_VOID(frameNode);
1422     auto pattern = frameNode->GetPattern<NavigationPattern>();
1423     CHECK_NULL_VOID(pattern);
1424     pattern->SetIsCustomAnimation(isCustom);
1425 }
1426 
SetCustomTransition(NavigationTransitionEvent && customTransition)1427 void NavigationModelNG::SetCustomTransition(NavigationTransitionEvent&& customTransition)
1428 {
1429     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1430     CHECK_NULL_VOID(frameNode);
1431     auto pattern = frameNode->GetPattern<NavigationPattern>();
1432     CHECK_NULL_VOID(pattern);
1433     pattern->SetNavigationTransition(std::move(customTransition));
1434 }
1435 
SetTitlebarOptions(NavigationTitlebarOptions && opt)1436 void NavigationModelNG::SetTitlebarOptions(NavigationTitlebarOptions&& opt)
1437 {
1438     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1439     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1440     CHECK_NULL_VOID(navigationGroupNode);
1441     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1442     CHECK_NULL_VOID(navBarNode);
1443     auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
1444     CHECK_NULL_VOID(navBarPattern);
1445     navBarPattern->SetTitleBarStyle(opt.brOptions.barStyle);
1446     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1447     CHECK_NULL_VOID(titleBarNode);
1448     auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
1449     CHECK_NULL_VOID(titleBarPattern);
1450     titleBarPattern->SetTitlebarOptions(std::move(opt));
1451 }
1452 
SetToolbarOptions(NavigationToolbarOptions && opt)1453 void NavigationModelNG::SetToolbarOptions(NavigationToolbarOptions&& opt)
1454 {
1455     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1456     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1457     CHECK_NULL_VOID(navigationGroupNode);
1458     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1459     NavigationToolbarUtil::SetToolbarOptions(navBarNode, std::move(opt));
1460 }
1461 
SetIgnoreLayoutSafeArea(const SafeAreaExpandOpts & opts)1462 void NavigationModelNG::SetIgnoreLayoutSafeArea(const SafeAreaExpandOpts& opts)
1463 {
1464     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1465     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1466     CHECK_NULL_VOID(navigationGroupNode);
1467     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1468     CHECK_NULL_VOID(navBarNode);
1469     auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1470     CHECK_NULL_VOID(navBarLayoutProperty);
1471     navBarLayoutProperty->UpdateIgnoreLayoutSafeArea(opts);
1472 }
1473 
SetIgnoreLayoutSafeArea(FrameNode * frameNode,const SafeAreaExpandOpts & opts)1474 void NavigationModelNG::SetIgnoreLayoutSafeArea(FrameNode* frameNode, const SafeAreaExpandOpts& opts)
1475 {
1476     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1477     CHECK_NULL_VOID(navigationGroupNode);
1478     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1479     CHECK_NULL_VOID(navBarNode);
1480     auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1481     CHECK_NULL_VOID(navBarLayoutProperty);
1482     navBarLayoutProperty->UpdateIgnoreLayoutSafeArea(opts);
1483 }
1484 
SetSystemBarStyle(const RefPtr<SystemBarStyle> & style)1485 void NavigationModelNG::SetSystemBarStyle(const RefPtr<SystemBarStyle>& style)
1486 {
1487     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1488     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1489     CHECK_NULL_VOID(navigationGroupNode);
1490     auto pattern = navigationGroupNode->GetPattern<NavigationPattern>();
1491     CHECK_NULL_VOID(pattern);
1492     pattern->SetSystemBarStyle(style);
1493 }
1494 
CreateFrameNode(int32_t nodeId)1495 RefPtr<FrameNode> NavigationModelNG::CreateFrameNode(int32_t nodeId)
1496 {
1497     auto navigationGroupNode = NavigationRegister::GetInstance()->GetOrCreateGroupNode(
1498         V2::NAVIGATION_VIEW_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
1499     // navBar node
1500     if (!navigationGroupNode->GetNavBarNode()) {
1501         int32_t navBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1502         auto navBarNode = NavBarNode::GetOrCreateNavBarNode(
1503             V2::NAVBAR_ETS_TAG, navBarNodeId, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
1504         auto navBarRenderContext = navBarNode->GetRenderContext();
1505         CHECK_NULL_RETURN(navBarRenderContext, nullptr);
1506         navBarRenderContext->UpdateClipEdge(true);
1507         navigationGroupNode->AddChild(navBarNode);
1508         navigationGroupNode->SetNavBarNode(navBarNode);
1509 
1510         // titleBar node
1511         if (!navBarNode->GetTitleBarNode()) {
1512             int32_t titleBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1513             auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
1514                 V2::TITLE_BAR_ETS_TAG, titleBarNodeId, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
1515             navBarNode->AddChild(titleBarNode);
1516             navBarNode->SetTitleBarNode(titleBarNode);
1517         }
1518 
1519         // navBar content node
1520         if (!navBarNode->GetContentNode()) {
1521             int32_t navBarContentNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1522             auto navBarContentNode = FrameNode::GetOrCreateFrameNode(V2::NAVBAR_CONTENT_ETS_TAG, navBarContentNodeId,
1523                 []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
1524             auto navBarContentRenderContext = navBarContentNode->GetRenderContext();
1525             CHECK_NULL_RETURN(navBarContentRenderContext, nullptr);
1526             navBarContentRenderContext->UpdateClipEdge(true);
1527             navBarNode->AddChild(navBarContentNode);
1528             navBarNode->SetContentNode(navBarContentNode);
1529         }
1530 
1531         // toolBar node
1532         if (!navBarNode->GetToolBarNode()) {
1533             int32_t toolBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1534             auto toolBarNode = NavToolbarNode::GetOrCreateToolbarNode(
1535                 V2::TOOL_BAR_ETS_TAG, toolBarNodeId, []() { return AceType::MakeRefPtr<NavToolbarPattern>(); });
1536             navBarNode->AddChild(toolBarNode);
1537             navBarNode->SetToolBarNode(toolBarNode);
1538             navBarNode->SetPreToolBarNode(toolBarNode);
1539             navBarNode->UpdatePrevToolBarIsCustom(false);
1540         }
1541         auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
1542         CHECK_NULL_RETURN(navBarLayoutProperty, nullptr);
1543         navBarLayoutProperty->UpdateTitleMode(NavigationTitleMode::FREE);
1544     }
1545 
1546     // content node
1547     if (!navigationGroupNode->GetContentNode()) {
1548         int32_t contentNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1549         auto contentNode = FrameNode::GetOrCreateFrameNode(V2::NAVIGATION_CONTENT_ETS_TAG, contentNodeId,
1550             []() { return AceType::MakeRefPtr<NavigationContentPattern>(); });
1551         contentNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT);
1552         contentNode->GetEventHub<EventHub>()->GetOrCreateGestureEventHub()->SetHitTestMode(
1553             HitTestMode::HTMTRANSPARENT_SELF);
1554         navigationGroupNode->AddChild(contentNode);
1555         navigationGroupNode->SetContentNode(contentNode);
1556     }
1557 
1558     // divider node
1559     if (!navigationGroupNode->GetDividerNode()) {
1560         int32_t dividerNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1561         auto dividerNode = FrameNode::GetOrCreateFrameNode(
1562             V2::DIVIDER_ETS_TAG, dividerNodeId, []() { return AceType::MakeRefPtr<DividerPattern>(); });
1563         navigationGroupNode->AddChild(dividerNode);
1564         navigationGroupNode->SetDividerNode(dividerNode);
1565 
1566         auto dividerLayoutProperty = dividerNode->GetLayoutProperty<DividerLayoutProperty>();
1567         CHECK_NULL_RETURN(dividerLayoutProperty, nullptr);
1568         dividerLayoutProperty->UpdateStrokeWidth(DIVIDER_WIDTH);
1569         dividerLayoutProperty->UpdateVertical(true);
1570         auto dividerRenderProperty = dividerNode->GetPaintProperty<DividerRenderProperty>();
1571         CHECK_NULL_RETURN(dividerRenderProperty, nullptr);
1572     }
1573     auto navigationLayoutProperty = navigationGroupNode->GetLayoutProperty<NavigationLayoutProperty>();
1574     if (!navigationLayoutProperty->HasNavigationMode()) {
1575         navigationLayoutProperty->UpdateNavigationMode(NavigationMode::AUTO);
1576     }
1577 
1578     auto navigationPattern = navigationGroupNode->GetPattern<NavigationPattern>();
1579     if (navigationPattern && !navigationPattern->GetUserSetNavBarWidthFlag()) {
1580         navigationLayoutProperty->UpdateNavBarWidth(DEFAULT_NAV_BAR_WIDTH);
1581     }
1582     SetNavigationStack(AceType::RawPtr(navigationGroupNode));
1583 
1584     return navigationGroupNode;
1585 }
1586 
SetNavigationStack(FrameNode * frameNode)1587 void NavigationModelNG::SetNavigationStack(FrameNode* frameNode)
1588 {
1589     CHECK_NULL_VOID(frameNode);
1590     auto pattern = frameNode->GetPattern<NavigationPattern>();
1591     CHECK_NULL_VOID(pattern);
1592     auto navigationStack = pattern->GetNavigationStack();
1593     if (!navigationStack) {
1594         auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
1595         pattern->SetNavigationStack(std::move(navigationStack));
1596     }
1597 }
1598 
ParseCommonTitle(FrameNode * frameNode,const NG::NavigationTitleInfo & titleInfo,bool ignoreMainTitle)1599 void NavigationModelNG::ParseCommonTitle(FrameNode* frameNode, const NG::NavigationTitleInfo& titleInfo,
1600     bool ignoreMainTitle)
1601 {
1602     if (!titleInfo.hasSubTitle && !titleInfo.hasMainTitle) {
1603         return;
1604     }
1605     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1606     CHECK_NULL_VOID(navigationGroupNode);
1607     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1608     CHECK_NULL_VOID(navBarNode);
1609     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1610     CHECK_NULL_VOID(titleBarNode);
1611     auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
1612     CHECK_NULL_VOID(titleBarPattern);
1613     titleBarPattern->SetIsTitleChanged(true);
1614     if (navBarNode->GetPrevTitleIsCustomValue(false)) {
1615         titleBarNode->RemoveChild(titleBarNode->GetTitle());
1616         titleBarNode->SetTitle(nullptr);
1617         auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
1618         CHECK_NULL_VOID(titleBarLayoutProperty);
1619         if (titleBarLayoutProperty->HasTitleHeight()) {
1620             titleBarLayoutProperty->ResetTitleHeight();
1621             navBarNode->GetLayoutProperty<NavBarLayoutProperty>()->ResetTitleMode();
1622         }
1623     }
1624     navBarNode->UpdatePrevTitleIsCustom(false);
1625 
1626     // create or update main title
1627     NavigationTitleUtil::CreateOrUpdateMainTitle(titleBarNode, titleInfo, ignoreMainTitle);
1628 
1629     // create or update subtitle
1630     NavigationTitleUtil::CreateOrUpdateSubtitle(titleBarNode, titleInfo);
1631     return;
1632 }
1633 
SetTitlebarOptions(FrameNode * frameNode,NavigationTitlebarOptions && opt)1634 void NavigationModelNG::SetTitlebarOptions(FrameNode* frameNode, NavigationTitlebarOptions&& opt)
1635 {
1636     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1637     CHECK_NULL_VOID(navigationGroupNode);
1638     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1639     CHECK_NULL_VOID(navBarNode);
1640     auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
1641     CHECK_NULL_VOID(navBarPattern);
1642     navBarPattern->SetTitleBarStyle(opt.brOptions.barStyle);
1643     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navBarNode->GetTitleBarNode());
1644     CHECK_NULL_VOID(titleBarNode);
1645     auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
1646     CHECK_NULL_VOID(titleBarPattern);
1647     titleBarPattern->SetTitlebarOptions(std::move(opt));
1648 }
1649 
SetMenuItems(FrameNode * frameNode,std::vector<NG::BarItem> && menuItems)1650 void NavigationModelNG::SetMenuItems(FrameNode* frameNode, std::vector<NG::BarItem>&& menuItems)
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     // if previous menu is custom, just remove it and create new menu, otherwise update old menu
1657     if (navBarNode->GetPrevMenuIsCustom().value_or(false)) {
1658         navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
1659     } else {
1660         if (navBarNode->GetMenu()) {
1661             navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
1662         } else {
1663             navBarNode->UpdateMenuNodeOperation(ChildNodeOperation::ADD);
1664         }
1665     }
1666     auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
1667     CHECK_NULL_VOID(navBarPattern);
1668     navBarPattern->SetTitleBarMenuItems(menuItems);
1669     navBarPattern->SetMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
1670     navBarPattern->SetLandscapeMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
1671     navBarNode->UpdatePrevMenuIsCustom(false);
1672 }
1673 
SetMenuItemAction(FrameNode * frameNode,std::function<void ()> && action,uint32_t index)1674 void NavigationModelNG::SetMenuItemAction(FrameNode* frameNode, std::function<void()>&& action, uint32_t index)
1675 {
1676     CHECK_NULL_VOID(action);
1677     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1678     CHECK_NULL_VOID(navigationGroupNode);
1679     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1680     CHECK_NULL_VOID(navBarNode);
1681     auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
1682     CHECK_NULL_VOID(navBarPattern);
1683     auto menuItems = navBarPattern->GetTitleBarMenuItems();
1684     if (menuItems.size() > index) {
1685         menuItems.at(index).action = action;
1686         navBarPattern->SetTitleBarMenuItems(menuItems);
1687     }
1688 }
1689 
SetMenuItemSymbol(FrameNode * frameNode,std::function<void (WeakPtr<NG::FrameNode>)> && symbol,uint32_t index)1690 void NavigationModelNG::SetMenuItemSymbol(FrameNode* frameNode,
1691     std::function<void(WeakPtr<NG::FrameNode>)>&& symbol, uint32_t index)
1692 {
1693     CHECK_NULL_VOID(symbol);
1694     auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1695     CHECK_NULL_VOID(navigationGroupNode);
1696     auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1697     CHECK_NULL_VOID(navBarNode);
1698     auto navBarPattern = navBarNode->GetPattern<NavBarPattern>();
1699     CHECK_NULL_VOID(navBarPattern);
1700     auto menuItems = navBarPattern->GetTitleBarMenuItems();
1701     if (menuItems.size() > index) {
1702         menuItems.at(index).iconSymbol = symbol;
1703         navBarPattern->SetTitleBarMenuItems(menuItems);
1704     }
1705 }
1706 } // namespace OHOS::Ace::NG
1707