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