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