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