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