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/navrouter/navdestination_model_ng.h"
17 
18 #include "base/i18n/localization.h"
19 #include "base/log/ace_scoring_log.h"
20 #include "core/common/container.h"
21 #include "core/components_ng/base/view_abstract.h"
22 #include "core/components_ng/pattern/button/button_layout_property.h"
23 #include "core/components_ng/pattern/button/button_pattern.h"
24 #include "core/components_ng/pattern/image/image_layout_property.h"
25 #include "core/components_ng/pattern/image/image_pattern.h"
26 #include "core/components_ng/pattern/image/image_render_property.h"
27 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h"
28 #include "core/components_ng/pattern/navigation/navigation_title_util.h"
29 #include "core/components_ng/pattern/navigation/navigation_toolbar_util.h"
30 #include "core/components_ng/pattern/navigation/title_bar_node.h"
31 #include "core/components_ng/pattern/navigation/title_bar_pattern.h"
32 #include "core/components_ng/pattern/navigation/tool_bar_node.h"
33 #include "core/components_ng/pattern/navigation/tool_bar_pattern.h"
34 #include "core/components_ng/pattern/navrouter/navdestination_group_node.h"
35 #include "core/components_ng/pattern/navrouter/navdestination_layout_property.h"
36 #include "core/components_ng/pattern/navrouter/navdestination_pattern.h"
37 #include "core/components_ng/pattern/text/text_pattern.h"
38 
39 namespace OHOS::Ace::NG {
ParseCommonTitle(bool hasSubTitle,bool hasMainTitle,const std::string & subtitle,const std::string & title)40 bool NavDestinationModelNG::ParseCommonTitle(
41     bool hasSubTitle, bool hasMainTitle, const std::string& subtitle, const std::string& title)
42 {
43     if (!hasSubTitle && !hasMainTitle) {
44         return false;
45     }
46     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
47     auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
48     CHECK_NULL_RETURN(navDestinationNode, false);
49 
50     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestinationNode->GetTitleBarNode());
51     CHECK_NULL_RETURN(titleBarNode, false);
52     auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
53     CHECK_NULL_RETURN(titleBarPattern, false);
54     if (navDestinationNode->GetPrevTitleIsCustomValue(false)) {
55         // remove custom title if any.
56         titleBarNode->RemoveChild(titleBarNode->GetTitle());
57         titleBarNode->SetTitle(nullptr);
58         auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
59         CHECK_NULL_RETURN(titleBarLayoutProperty, false);
60         // reset custom title height if any.
61         if (titleBarLayoutProperty->HasTitleHeight()) {
62             titleBarLayoutProperty->ResetTitleHeight();
63         }
64     }
65     navDestinationNode->UpdatePrevTitleIsCustom(false);
66 
67     auto theme = NavigationGetTheme();
68     // create or update main title
69     auto mainTitle = AceType::DynamicCast<FrameNode>(titleBarNode->GetTitle());
70     if (hasMainTitle) {
71         if (mainTitle) {
72             // update main title
73             auto textLayoutProperty = mainTitle->GetLayoutProperty<TextLayoutProperty>();
74             textLayoutProperty->UpdateMaxLines(hasSubTitle ? 1 : TITLEBAR_MAX_LINES);
75             if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
76                 textLayoutProperty->UpdateHeightAdaptivePolicy(hasSubTitle ? TextHeightAdaptivePolicy::MAX_LINES_FIRST :
77                     TextHeightAdaptivePolicy::MIN_FONT_SIZE_FIRST);
78             }
79             textLayoutProperty->UpdateContent(title);
80             textLayoutProperty->UpdateMaxFontScale(STANDARD_FONT_SCALE);
81         } else {
82             // create and init main title
83             mainTitle = FrameNode::CreateFrameNode(
84                 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
85             auto textLayoutProperty = mainTitle->GetLayoutProperty<TextLayoutProperty>();
86             textLayoutProperty->UpdateContent(title);
87             titleBarPattern->SetNeedResetMainTitleProperty(true);
88             titleBarNode->SetTitle(mainTitle);
89             titleBarNode->AddChild(mainTitle);
90         }
91     } else {
92         // remove main title if any.
93         titleBarNode->RemoveChild(mainTitle);
94         titleBarNode->SetTitle(nullptr);
95     }
96 
97     // create or update subtitle
98     auto subTitle = AceType::DynamicCast<FrameNode>(titleBarNode->GetSubtitle());
99     if (!hasSubTitle) {
100         // remove subtitle if any.
101         titleBarNode->RemoveChild(subTitle);
102         titleBarNode->SetSubtitle(nullptr);
103         return true;
104     }
105     if (subTitle) {
106         // update subtitle
107         auto textLayoutProperty = subTitle->GetLayoutProperty<TextLayoutProperty>();
108         textLayoutProperty->UpdateContent(subtitle);
109         textLayoutProperty->UpdateMaxFontScale(STANDARD_FONT_SCALE);
110     } else {
111         // create and init subtitle
112         subTitle = FrameNode::CreateFrameNode(
113             V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
114         auto textLayoutProperty = subTitle->GetLayoutProperty<TextLayoutProperty>();
115         textLayoutProperty->UpdateContent(subtitle);
116         titleBarPattern->SetNeedResetSubTitleProperty(true);
117         titleBarNode->SetSubtitle(subTitle);
118         titleBarNode->AddChild(subTitle);
119     }
120     return true;
121 }
122 
CreateContentNode(const RefPtr<NavDestinationGroupNode> & navDestinationNode)123 void CreateContentNode(const RefPtr<NavDestinationGroupNode>& navDestinationNode)
124 {
125     if (navDestinationNode->GetContentNode()) {
126         return;
127     }
128     int32_t contentNodeId = ElementRegister::GetInstance()->MakeUniqueId();
129     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::NAVDESTINATION_CONTENT_ETS_TAG, contentNodeId);
130     auto contentNode = FrameNode::GetOrCreateFrameNode(V2::NAVDESTINATION_CONTENT_ETS_TAG, contentNodeId,
131         []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
132     navDestinationNode->AddChild(contentNode);
133     navDestinationNode->SetContentNode(contentNode);
134 
135     if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
136         SafeAreaExpandOpts opts = { .type = SAFE_AREA_TYPE_SYSTEM | SAFE_AREA_TYPE_CUTOUT,
137             .edges = SAFE_AREA_EDGE_ALL };
138         contentNode->GetLayoutProperty()->UpdateSafeAreaExpandOpts(opts);
139     }
140 }
141 
CreateToolBarNode(const RefPtr<NavDestinationGroupNode> & navDestinationNode)142 void CreateToolBarNode(const RefPtr<NavDestinationGroupNode>& navDestinationNode)
143 {
144     if (navDestinationNode->GetToolBarNode()) {
145         return;
146     }
147     int32_t toolBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
148     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TOOL_BAR_ETS_TAG, toolBarNodeId);
149     auto toolBarNode = NavToolbarNode::GetOrCreateToolbarNode(
150         V2::TOOL_BAR_ETS_TAG, toolBarNodeId, []() { return AceType::MakeRefPtr<NavToolbarPattern>(); });
151     toolBarNode->MarkModifyDone();
152     auto property = toolBarNode->GetLayoutProperty();
153     CHECK_NULL_VOID(property);
154     property->UpdateVisibility(VisibleType::GONE);
155     navDestinationNode->AddChild(toolBarNode);
156     navDestinationNode->SetToolBarNode(toolBarNode);
157     navDestinationNode->SetPreToolBarNode(toolBarNode);
158     navDestinationNode->UpdatePrevToolBarIsCustom(false);
159 }
160 
Create()161 void NavDestinationModelNG::Create()
162 {
163     auto* stack = ViewStackProcessor::GetInstance();
164     // navDestination node
165     int32_t nodeId = stack->ClaimNodeId();
166     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::NAVDESTINATION_VIEW_ETS_TAG, nodeId);
167     auto navDestinationNode = NavDestinationGroupNode::GetOrCreateGroupNode(
168         V2::NAVDESTINATION_VIEW_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
169     if (!navDestinationNode->GetTitleBarNode()) {
170         if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
171             CreateImageButton(navDestinationNode);
172         } else {
173             CreateBackButton(navDestinationNode);
174         }
175         auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestinationNode->GetTitleBarNode());
176         if (titleBarNode) {
177             auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
178             CHECK_NULL_VOID(titleBarLayoutProperty);
179             titleBarLayoutProperty->UpdateTitleBarParentType(TitleBarParentType::NAV_DESTINATION);
180         }
181     }
182     // content node
183     if (!navDestinationNode->GetContentNode()) {
184         int32_t contentNodeId = ElementRegister::GetInstance()->MakeUniqueId();
185         ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::NAVDESTINATION_CONTENT_ETS_TAG, contentNodeId);
186         auto contentNode = FrameNode::GetOrCreateFrameNode(V2::NAVDESTINATION_CONTENT_ETS_TAG, contentNodeId,
187             []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
188         navDestinationNode->AddChild(contentNode);
189         navDestinationNode->SetContentNode(contentNode);
190     }
191     CreateToolBarNode(navDestinationNode);
192     stack->Push(navDestinationNode);
193 }
194 
CreateImageButton(const RefPtr<NavDestinationGroupNode> & navDestinationNode)195 void NavDestinationModelNG::CreateImageButton(const RefPtr<NavDestinationGroupNode>& navDestinationNode)
196 {
197     int32_t titleBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
198     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TITLE_BAR_ETS_TAG, titleBarNodeId);
199     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
200         V2::TITLE_BAR_ETS_TAG, titleBarNodeId, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
201     navDestinationNode->AddChild(titleBarNode);
202     navDestinationNode->SetTitleBarNode(titleBarNode);
203 
204     int32_t backButtonNodeId = ElementRegister::GetInstance()->MakeUniqueId();
205     auto backButtonNode =
206         FrameNode::CreateFrameNode(V2::BACK_BUTTON_ETS_TAG, backButtonNodeId, AceType::MakeRefPtr<ImagePattern>());
207     auto focusHub = backButtonNode->GetOrCreateFocusHub();
208     CHECK_NULL_VOID(focusHub);
209     focusHub->SetFocusDependence(FocusDependence::SELF);
210     titleBarNode->AddChild(backButtonNode);
211     titleBarNode->SetBackButton(backButtonNode);
212 
213     auto theme = NavigationGetTheme();
214     CHECK_NULL_VOID(theme);
215     ImageSourceInfo imageSourceInfo;
216     imageSourceInfo.SetResourceId(theme->GetBackResourceId());
217     auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty<ImageLayoutProperty>();
218     CHECK_NULL_VOID(backButtonLayoutProperty);
219     backButtonLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
220     auto imageRenderProperty = backButtonNode->GetPaintProperty<ImageRenderProperty>();
221     CHECK_NULL_VOID(imageRenderProperty);
222     imageRenderProperty->UpdateMatchTextDirection(true);
223     backButtonNode->MarkModifyDone();
224 }
225 
CreateImageBackButton(RefPtr<FrameNode> & backButtonNode,RefPtr<TitleBarNode> & titleBarNode)226 void CreateImageBackButton(RefPtr<FrameNode>& backButtonNode, RefPtr<TitleBarNode>& titleBarNode)
227 {
228     auto backButtonImageNode = FrameNode::CreateFrameNode(V2::BACK_BUTTON_IMAGE_ETS_TAG,
229         ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
230     CHECK_NULL_VOID(backButtonImageNode);
231 
232     auto theme = NavigationGetTheme();
233     CHECK_NULL_VOID(theme);
234     ImageSourceInfo imageSourceInfo;
235     imageSourceInfo.SetResourceId(theme->GetBackResourceId());
236     auto backButtonImageLayoutProperty = backButtonImageNode->GetLayoutProperty<ImageLayoutProperty>();
237     CHECK_NULL_VOID(backButtonImageLayoutProperty);
238     backButtonImageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
239     backButtonImageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
240     auto imageRenderProperty = backButtonImageNode->GetPaintProperty<ImageRenderProperty>();
241     CHECK_NULL_VOID(imageRenderProperty);
242     imageRenderProperty->UpdateMatchTextDirection(true);
243     backButtonNode->AddChild(backButtonImageNode);
244     backButtonImageNode->MarkModifyDone();
245     backButtonNode->MarkModifyDone();
246 }
247 
CreateSymbolBackButton(RefPtr<FrameNode> & backButtonNode,RefPtr<TitleBarNode> & titleBarNode)248 void CreateSymbolBackButton(RefPtr<FrameNode>& backButtonNode, RefPtr<TitleBarNode>& titleBarNode)
249 {
250     auto symbolNode = FrameNode::GetOrCreateFrameNode(V2::SYMBOL_ETS_TAG,
251         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<TextPattern>(); });
252     CHECK_NULL_VOID(symbolNode);
253     auto symbolProperty = symbolNode->GetLayoutProperty<TextLayoutProperty>();
254     CHECK_NULL_VOID(symbolProperty);
255     auto theme = NavigationGetTheme();
256     CHECK_NULL_VOID(theme);
257     symbolProperty->UpdateSymbolSourceInfo(SymbolSourceInfo(theme->GetBackSymbolId()));
258     symbolNode->MountToParent(backButtonNode);
259     auto iconColor = theme->GetIconColor();
260     symbolProperty->UpdateSymbolColorList({ iconColor });
261     symbolNode->MarkDirtyNode();
262     backButtonNode->MarkModifyDone();
263 }
264 
CreateBackButton(const RefPtr<NavDestinationGroupNode> & navDestinationNode)265 void NavDestinationModelNG::CreateBackButton(const RefPtr<NavDestinationGroupNode>& navDestinationNode)
266 {
267     int32_t titleBarNodeId = ElementRegister::GetInstance()->MakeUniqueId();
268     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TITLE_BAR_ETS_TAG, titleBarNodeId);
269     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
270         V2::TITLE_BAR_ETS_TAG, titleBarNodeId, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
271     navDestinationNode->AddChild(titleBarNode);
272     navDestinationNode->SetTitleBarNode(titleBarNode);
273 
274     auto theme = NavigationGetTheme();
275     CHECK_NULL_VOID(theme);
276     int32_t backButtonNodeId = ElementRegister::GetInstance()->MakeUniqueId();
277     auto backButtonNode =
278         FrameNode::CreateFrameNode(V2::BACK_BUTTON_ETS_TAG, backButtonNodeId, AceType::MakeRefPtr<ButtonPattern>());
279     auto focusHub = backButtonNode->GetOrCreateFocusHub();
280     CHECK_NULL_VOID(focusHub);
281     focusHub->SetFocusDependence(FocusDependence::SELF);
282     auto buttonPattern = backButtonNode->GetPattern<ButtonPattern>();
283     CHECK_NULL_VOID(buttonPattern);
284     buttonPattern->SetSkipColorConfigurationUpdate();
285     buttonPattern->setComponentButtonType(ComponentButtonType::NAVIGATION);
286     if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
287         buttonPattern->SetBlendColor(theme->GetBackgroundPressedColor(), theme->GetBackgroundHoverColor());
288         buttonPattern->SetFocusBorderColor(theme->GetBackgroundFocusOutlineColor());
289         buttonPattern->SetFocusBorderWidth(theme->GetBackgroundFocusOutlineWeight());
290     }
291 
292     // read navdestination back button
293     std::string message = Localization::GetInstance()->GetEntryLetters("navigation.back");
294     NavigationTitleUtil::SetAccessibility(backButtonNode, message);
295 
296     titleBarNode->AddChild(backButtonNode);
297     titleBarNode->SetBackButton(backButtonNode);
298     auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty<ButtonLayoutProperty>();
299     CHECK_NULL_VOID(backButtonLayoutProperty);
300     auto renderContext = backButtonNode->GetRenderContext();
301     CHECK_NULL_VOID(renderContext);
302     backButtonLayoutProperty->UpdateType(ButtonType::NORMAL);
303     backButtonLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
304 
305     if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
306         backButtonLayoutProperty->UpdateUserDefinedIdealSize(
307             CalcSize(CalcLength(theme->GetIconBackgroundWidth()), CalcLength(theme->GetIconBackgroundHeight())));
308         backButtonLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(theme->GetCornerRadius()));
309         renderContext->UpdateBackgroundColor(theme->GetCompBackgroundColor());
310         PaddingProperty padding;
311         padding.SetEdges(CalcLength(MENU_BUTTON_PADDING));
312         backButtonLayoutProperty->UpdatePadding(padding);
313     } else {
314         backButtonLayoutProperty->UpdateUserDefinedIdealSize(
315             CalcSize(CalcLength(BACK_BUTTON_SIZE), CalcLength(BACK_BUTTON_SIZE)));
316         backButtonLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(BUTTON_RADIUS_SIZE));
317         renderContext->UpdateBackgroundColor(Color::TRANSPARENT);
318         PaddingProperty padding;
319         padding.SetEdges(CalcLength(BUTTON_PADDING));
320         backButtonLayoutProperty->UpdatePadding(padding);
321     }
322 
323     if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
324         CreateSymbolBackButton(backButtonNode, titleBarNode);
325     } else {
326         CreateImageBackButton(backButtonNode, titleBarNode);
327     }
328 }
329 
Create(std::function<void ()> && deepRenderFunc,RefPtr<NG::NavDestinationContext> context)330 void NavDestinationModelNG::Create(std::function<void()>&& deepRenderFunc, RefPtr<NG::NavDestinationContext> context)
331 {
332     auto* stack = ViewStackProcessor::GetInstance();
333     // navDestination node
334     auto nodeId = stack->ClaimNodeId();
335     auto deepRender = [nodeId, deepRenderFunc = std::move(deepRenderFunc)]() -> RefPtr<UINode> {
336         CHECK_NULL_RETURN(deepRenderFunc, nullptr);
337         auto parent = AceType::DynamicCast<UINode>(FrameNode::GetFrameNode(V2::NAVDESTINATION_VIEW_ETS_TAG, nodeId));
338         auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(parent);
339         if (navDestinationNode && navDestinationNode->GetContentNode()) {
340             parent = navDestinationNode->GetContentNode();
341         }
342         ScopedViewStackProcessor scopedViewStackProcessor;
343         ViewStackProcessor::GetInstance()->Push(parent);
344         deepRenderFunc();
345         ViewStackProcessor::GetInstance()->PopContainer();
346         ViewStackProcessor::GetInstance()->Finish();
347         return parent;
348     };
349     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::NAVDESTINATION_VIEW_ETS_TAG, nodeId);
350     auto navDestinationNode = NavDestinationGroupNode::GetOrCreateGroupNode(V2::NAVDESTINATION_VIEW_ETS_TAG, nodeId,
351         [shallowBuilder = AceType::MakeRefPtr<ShallowBuilder>(std::move(deepRender)), context]() {
352             auto pattern = AceType::MakeRefPtr<NavDestinationPattern>(shallowBuilder);
353             pattern->SetNavDestinationContext(context);
354             return pattern;
355         });
356     if (!navDestinationNode->GetTitleBarNode()) {
357         if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
358             CreateImageButton(navDestinationNode);
359         } else {
360             CreateBackButton(navDestinationNode);
361         }
362         auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestinationNode->GetTitleBarNode());
363         if (titleBarNode) {
364             auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
365             CHECK_NULL_VOID(titleBarLayoutProperty);
366             titleBarLayoutProperty->UpdateTitleBarParentType(TitleBarParentType::NAV_DESTINATION);
367         }
368     }
369     // content node
370     CreateContentNode(navDestinationNode);
371     // toolbar node
372     CreateToolBarNode(navDestinationNode);
373     stack->Push(navDestinationNode);
374 }
375 
SetHideTitleBar(bool hideTitleBar,bool animated)376 void NavDestinationModelNG::SetHideTitleBar(bool hideTitleBar, bool animated)
377 {
378     ACE_UPDATE_LAYOUT_PROPERTY(NavDestinationLayoutProperty, HideTitleBar, hideTitleBar);
379     ACE_UPDATE_LAYOUT_PROPERTY(NavDestinationLayoutProperty, IsAnimatedTitleBar, animated);
380 }
381 
SetTitle(const std::string & title,bool hasSubTitle)382 void NavDestinationModelNG::SetTitle(const std::string& title, bool hasSubTitle)
383 {
384     ParseCommonTitle(hasSubTitle, true, "", title);
385 }
386 
SetTitlebarOptions(NavigationTitlebarOptions && opt)387 void NavDestinationModelNG::SetTitlebarOptions(NavigationTitlebarOptions&& opt)
388 {
389     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
390     CHECK_NULL_VOID(frameNode);
391     auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
392     CHECK_NULL_VOID(navDestinationNode);
393     auto navDestinationPattern = navDestinationNode->GetPattern<NavDestinationPattern>();
394     CHECK_NULL_VOID(navDestinationPattern);
395     navDestinationPattern->SetTitleBarStyle(opt.brOptions.barStyle);
396     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestinationNode->GetTitleBarNode());
397     CHECK_NULL_VOID(titleBarNode);
398     auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
399     CHECK_NULL_VOID(titleBarPattern);
400     titleBarPattern->SetTitlebarOptions(std::move(opt));
401 }
402 
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)403 void NavDestinationModelNG::SetBackButtonIcon(const std::function<void(WeakPtr<NG::FrameNode>)>& symbolApply,
404     const std::string& src, const ImageOption& imageOption, RefPtr<PixelMap>& pixMap,
405     const std::vector<std::string>& nameList)
406 {
407     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
408     CHECK_NULL_VOID(frameNode);
409     auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
410     CHECK_NULL_VOID(navDestinationNode);
411 
412     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestinationNode->GetTitleBarNode());
413     CHECK_NULL_VOID(titleBarNode);
414     auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
415     CHECK_NULL_VOID(titleBarLayoutProperty);
416     ImageSourceInfo imageSourceInfo(src, nameList[0], nameList[1]);
417     titleBarLayoutProperty->UpdateImageSource(imageSourceInfo);
418     titleBarLayoutProperty->UpdateNoPixMap(imageOption.noPixMap);
419     titleBarLayoutProperty->UpdatePixelMap(pixMap);
420     titleBarLayoutProperty->SetBackIconSymbol(symbolApply);
421     titleBarLayoutProperty->UpdateIsValidImage(imageOption.isValidImage);
422     titleBarNode->MarkModifyDone();
423 }
424 
SetSubtitle(const std::string & subtitle)425 void NavDestinationModelNG::SetSubtitle(const std::string& subtitle)
426 {
427     ParseCommonTitle(true, false, subtitle, "");
428 }
429 
SetCustomTitle(const RefPtr<AceType> & customNode)430 void NavDestinationModelNG::SetCustomTitle(const RefPtr<AceType>& customNode)
431 {
432     auto customTitle = AceType::DynamicCast<NG::UINode>(customNode);
433     CHECK_NULL_VOID(customTitle);
434     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
435     CHECK_NULL_VOID(frameNode);
436     auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
437     CHECK_NULL_VOID(navDestinationNode);
438     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestinationNode->GetTitleBarNode());
439     CHECK_NULL_VOID(titleBarNode);
440     if (!navDestinationNode->GetPrevTitleIsCustomValue(false)) {
441         // remove main and subtitle if any.
442         titleBarNode->RemoveChild(titleBarNode->GetTitle());
443         titleBarNode->RemoveChild(titleBarNode->GetSubtitle());
444         titleBarNode->SetTitle(nullptr);
445         titleBarNode->SetSubtitle(nullptr);
446     }
447     navDestinationNode->UpdatePrevTitleIsCustom(true);
448     auto currentTitle = titleBarNode->GetTitle();
449     if (currentTitle && customTitle->GetId() == currentTitle->GetId()) {
450         // do nothing
451         return;
452     }
453     // update custom title
454     titleBarNode->RemoveChild(currentTitle);
455     titleBarNode->SetTitle(customTitle);
456     titleBarNode->AddChild(customTitle);
457     titleBarNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
458 }
459 
SetTitleHeight(const Dimension & titleHeight,bool isValid)460 void NavDestinationModelNG::SetTitleHeight(const Dimension& titleHeight, bool isValid)
461 {
462     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
463     CHECK_NULL_VOID(frameNode);
464     auto navDestinationGroupNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
465     CHECK_NULL_VOID(navDestinationGroupNode);
466 
467     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestinationGroupNode->GetTitleBarNode());
468     CHECK_NULL_VOID(titleBarNode);
469     auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
470     CHECK_NULL_VOID(titleBarLayoutProperty);
471     if (isValid) {
472         titleBarLayoutProperty->UpdateTitleHeight(titleHeight);
473     } else {
474         titleBarLayoutProperty->ResetTitleHeight();
475     }
476 }
477 
SetOnShown(std::function<void ()> && onShow)478 void NavDestinationModelNG::SetOnShown(std::function<void()>&& onShow)
479 {
480     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
481     CHECK_NULL_VOID(frameNode);
482     auto navDestinationEventHub = AceType::DynamicCast<NavDestinationEventHub>(frameNode->GetEventHub<EventHub>());
483     CHECK_NULL_VOID(navDestinationEventHub);
484     navDestinationEventHub->SetOnShown(onShow);
485 }
486 
SetOnHidden(std::function<void ()> && onHidden)487 void NavDestinationModelNG::SetOnHidden(std::function<void()>&& onHidden)
488 {
489     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
490     CHECK_NULL_VOID(frameNode);
491     auto navDestinationEventHub = AceType::DynamicCast<NavDestinationEventHub>(frameNode->GetEventHub<EventHub>());
492     CHECK_NULL_VOID(navDestinationEventHub);
493     navDestinationEventHub->SetOnHidden(onHidden);
494 }
495 
SetOnBackPressed(std::function<bool ()> && onBackPressed)496 void NavDestinationModelNG::SetOnBackPressed(std::function<bool()>&& onBackPressed)
497 {
498     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
499     CHECK_NULL_VOID(frameNode);
500     auto navDestinationEventHub = AceType::DynamicCast<NavDestinationEventHub>(frameNode->GetEventHub<EventHub>());
501     CHECK_NULL_VOID(navDestinationEventHub);
502     navDestinationEventHub->SetOnBackPressed(onBackPressed);
503 }
504 
SetOnReady(std::function<void (RefPtr<NavDestinationContext>)> && onReady)505 void NavDestinationModelNG::SetOnReady(std::function<void(RefPtr<NavDestinationContext>)>&& onReady)
506 {
507     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
508     CHECK_NULL_VOID(frameNode);
509     auto navDestinationEventHub = AceType::DynamicCast<NavDestinationEventHub>(frameNode->GetEventHub<EventHub>());
510     CHECK_NULL_VOID(navDestinationEventHub);
511     navDestinationEventHub->SetOnReady(onReady);
512 }
513 
CreateEmpty()514 RefPtr<AceType> NavDestinationModelNG::CreateEmpty()
515 {
516     ScopedViewStackProcessor processor;
517     Create();
518     auto uiNode = ViewStackProcessor::GetInstance()->Finish();
519     uiNode->SetRemoveSilently(true);
520     auto navigationNode = AceType::DynamicCast<NavDestinationGroupNode>(uiNode);
521     CHECK_NULL_RETURN(navigationNode, uiNode);
522     auto pattern = navigationNode->GetPattern<NavDestinationPattern>();
523     auto context = AceType::MakeRefPtr<NavDestinationContext>();
524     CHECK_NULL_RETURN(context, uiNode);
525     context->SetIsEmpty(true);
526     pattern->SetNavDestinationContext(context);
527     return uiNode;
528 }
529 
SetHideTitleBar(FrameNode * frameNode,bool hideTitleBar,bool animated)530 void NavDestinationModelNG::SetHideTitleBar(FrameNode* frameNode, bool hideTitleBar, bool animated)
531 {
532     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavDestinationLayoutProperty, HideTitleBar, hideTitleBar, frameNode);
533     ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavDestinationLayoutProperty, IsAnimatedTitleBar, animated, frameNode);
534 }
535 
SetBackButtonIcon(FrameNode * frameNode,const std::string & src,bool noPixMap,RefPtr<PixelMap> & pixMap)536 void NavDestinationModelNG::SetBackButtonIcon(
537     FrameNode* frameNode, const std::string& src, bool noPixMap, RefPtr<PixelMap>& pixMap)
538 {
539     auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
540     CHECK_NULL_VOID(navDestinationNode);
541 
542     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestinationNode->GetTitleBarNode());
543     CHECK_NULL_VOID(titleBarNode);
544     auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
545     CHECK_NULL_VOID(titleBarLayoutProperty);
546     ImageSourceInfo imageSourceInfo(src);
547     titleBarLayoutProperty->UpdateImageSource(imageSourceInfo);
548     titleBarLayoutProperty->UpdateNoPixMap(noPixMap);
549     titleBarLayoutProperty->UpdatePixelMap(pixMap);
550     titleBarNode->MarkModifyDone();
551 }
552 
SetNavDestinationMode(FrameNode * frameNode,NavDestinationMode mode)553 void NavDestinationModelNG::SetNavDestinationMode(FrameNode* frameNode, NavDestinationMode mode)
554 {
555     auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
556     CHECK_NULL_VOID(navDestinationNode);
557     navDestinationNode->SetNavDestinationMode(mode);
558 }
559 
SetNavDestinationMode(NavDestinationMode mode)560 void NavDestinationModelNG::SetNavDestinationMode(NavDestinationMode mode)
561 {
562     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
563     CHECK_NULL_VOID(frameNode);
564     auto navDestination = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
565     CHECK_NULL_VOID(navDestination);
566     navDestination->SetNavDestinationMode(mode);
567 }
568 
SetRecoverable(FrameNode * frameNode,bool recoverable)569 void NavDestinationModelNG::SetRecoverable(FrameNode* frameNode, bool recoverable)
570 {
571     auto navDestination = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
572     CHECK_NULL_VOID(navDestination);
573     navDestination->SetRecoverable(recoverable);
574 }
575 
SetRecoverable(bool recoverable)576 void NavDestinationModelNG::SetRecoverable(bool recoverable)
577 {
578     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
579     auto navDestination = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
580     CHECK_NULL_VOID(navDestination);
581     navDestination->SetRecoverable(recoverable);
582 }
583 
SetMenuItems(std::vector<NG::BarItem> && menuItems)584 void NavDestinationModelNG::SetMenuItems(std::vector<NG::BarItem>&& menuItems)
585 {
586     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
587     CHECK_NULL_VOID(frameNode);
588     auto navDestinationGroupNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
589     CHECK_NULL_VOID(navDestinationGroupNode);
590     // if previous menu is custom, just remove it and create new menu, otherwise update old menu
591     if (navDestinationGroupNode->GetPrevMenuIsCustom().value_or(false)) {
592         navDestinationGroupNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
593     } else {
594         if (navDestinationGroupNode->GetMenu()) {
595             navDestinationGroupNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
596         } else {
597             navDestinationGroupNode->UpdateMenuNodeOperation(ChildNodeOperation::ADD);
598         }
599     }
600     auto navDestinationPattern = navDestinationGroupNode->GetPattern<NavDestinationPattern>();
601     CHECK_NULL_VOID(navDestinationPattern);
602     navDestinationPattern->SetTitleBarMenuItems(menuItems);
603     navDestinationPattern->SetMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
604     navDestinationPattern->SetLandscapeMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
605     navDestinationGroupNode->UpdatePrevMenuIsCustom(false);
606 }
607 
SetCustomMenu(const RefPtr<AceType> & customNode)608 void NavDestinationModelNG::SetCustomMenu(const RefPtr<AceType>& customNode)
609 {
610     auto customMenu = AceType::DynamicCast<NG::UINode>(customNode);
611     CHECK_NULL_VOID(customMenu);
612     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
613     CHECK_NULL_VOID(frameNode);
614     auto navDestinationGroupNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
615     CHECK_NULL_VOID(navDestinationGroupNode);
616     // if previous menu exists, remove it if their ids are not the same
617     // if previous node is not custom, their ids must not be the same
618     if (navDestinationGroupNode->GetMenu()) {
619         if (customMenu->GetId() == navDestinationGroupNode->GetMenu()->GetId()) {
620             navDestinationGroupNode->UpdateMenuNodeOperation(ChildNodeOperation::NONE);
621             return;
622         }
623         navDestinationGroupNode->SetMenu(customMenu);
624         navDestinationGroupNode->UpdatePrevMenuIsCustom(true);
625         navDestinationGroupNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
626         return;
627     }
628     navDestinationGroupNode->SetMenu(customMenu);
629     navDestinationGroupNode->UpdatePrevMenuIsCustom(true);
630     navDestinationGroupNode->UpdateMenuNodeOperation(ChildNodeOperation::ADD);
631 }
632 
SetBackgroundColor(const Color & color,bool isVaild)633 void NavDestinationModelNG::SetBackgroundColor(const Color& color, bool isVaild)
634 {
635     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
636     CHECK_NULL_VOID(frameNode);
637     auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
638     CHECK_NULL_VOID(navDestinationNode);
639     auto navDestinationPattern = navDestinationNode->GetPattern<NavDestinationPattern>();
640     CHECK_NULL_VOID(navDestinationPattern);
641     if (!isVaild) {
642         navDestinationPattern->SetIsUserDefinedBgColor(false);
643         return;
644     }
645     ViewAbstract::SetBackgroundColor(color);
646     navDestinationPattern->SetIsUserDefinedBgColor(true);
647 }
648 
SetBackgroundColor(FrameNode * frameNode,const Color & color,bool isVaild)649 void NavDestinationModelNG::SetBackgroundColor(FrameNode* frameNode, const Color& color, bool isVaild)
650 {
651     auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
652     CHECK_NULL_VOID(navDestinationNode);
653     auto navDestinationPattern = navDestinationNode->GetPattern<NavDestinationPattern>();
654     CHECK_NULL_VOID(navDestinationPattern);
655     if (!isVaild) {
656         navDestinationPattern->SetIsUserDefinedBgColor(false);
657         return;
658     }
659     ViewAbstract::SetBackgroundColor(frameNode, color);
660     navDestinationPattern->SetIsUserDefinedBgColor(true);
661 }
662 
SetOnWillAppear(std::function<void ()> && willAppear)663 void NavDestinationModelNG::SetOnWillAppear(std::function<void()>&& willAppear)
664 {
665     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
666     CHECK_NULL_VOID(frameNode);
667     auto navDestinationEventHub = AceType::DynamicCast<NavDestinationEventHub>(frameNode->GetEventHub<EventHub>());
668     CHECK_NULL_VOID(navDestinationEventHub);
669     navDestinationEventHub->SetOnWillAppear(willAppear);
670 }
671 
SetOnWillHide(std::function<void ()> && willHide)672 void NavDestinationModelNG::SetOnWillHide(std::function<void()>&& willHide)
673 {
674     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
675     CHECK_NULL_VOID(frameNode);
676     auto navDestinationEventHub = AceType::DynamicCast<NavDestinationEventHub>(frameNode->GetEventHub<EventHub>());
677     CHECK_NULL_VOID(navDestinationEventHub);
678     navDestinationEventHub->SetOnWillHide(willHide);
679 }
680 
SetOnWillShow(std::function<void ()> && willShow)681 void NavDestinationModelNG::SetOnWillShow(std::function<void()>&& willShow)
682 {
683     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
684     CHECK_NULL_VOID(frameNode);
685     auto navDestinationEventHub = AceType::DynamicCast<NavDestinationEventHub>(frameNode->GetEventHub<EventHub>());
686     CHECK_NULL_VOID(navDestinationEventHub);
687     navDestinationEventHub->SetOnWillShow(willShow);
688 }
689 
SetOnWillDisAppear(std::function<void ()> && willDisAppear)690 void NavDestinationModelNG::SetOnWillDisAppear(std::function<void()>&& willDisAppear)
691 {
692     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
693     CHECK_NULL_VOID(frameNode);
694     auto navDestinationEventHub = AceType::DynamicCast<NavDestinationEventHub>(frameNode->GetEventHub<EventHub>());
695     CHECK_NULL_VOID(navDestinationEventHub);
696     navDestinationEventHub->SetOnWillDisAppear(willDisAppear);
697 }
698 
SetIgnoreLayoutSafeArea(const SafeAreaExpandOpts & opts)699 void NavDestinationModelNG::SetIgnoreLayoutSafeArea(const SafeAreaExpandOpts& opts)
700 {
701     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
702     CHECK_NULL_VOID(frameNode);
703     auto navDestination = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
704     CHECK_NULL_VOID(navDestination);
705     auto navdestinationLayoutProperty = navDestination->GetLayoutProperty<NavDestinationLayoutProperty>();
706     CHECK_NULL_VOID(navdestinationLayoutProperty);
707     navdestinationLayoutProperty->UpdateIgnoreLayoutSafeArea(opts);
708 }
709 
SetIgnoreLayoutSafeArea(FrameNode * frameNode,const SafeAreaExpandOpts & opts)710 void NavDestinationModelNG::SetIgnoreLayoutSafeArea(FrameNode* frameNode, const SafeAreaExpandOpts& opts)
711 {
712     auto navDestination = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
713     CHECK_NULL_VOID(navDestination);
714     auto navdestinationLayoutProperty = navDestination->GetLayoutProperty<NavDestinationLayoutProperty>();
715     CHECK_NULL_VOID(navdestinationLayoutProperty);
716     navdestinationLayoutProperty->UpdateIgnoreLayoutSafeArea(opts);
717 }
718 
SetNavDestinationPathInfo(const std::string & moduleName,const std::string & pagePath)719 void NavDestinationModelNG::SetNavDestinationPathInfo(const std::string& moduleName, const std::string& pagePath)
720 {
721     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
722     CHECK_NULL_VOID(frameNode);
723     auto navDestination = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
724     CHECK_NULL_VOID(navDestination);
725     navDestination->SetNavDestinationPathInfo(moduleName, pagePath);
726 }
727 
SetSystemBarStyle(const RefPtr<SystemBarStyle> & style)728 void NavDestinationModelNG::SetSystemBarStyle(const RefPtr<SystemBarStyle>& style)
729 {
730     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
731     CHECK_NULL_VOID(frameNode);
732     auto navDestination = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
733     CHECK_NULL_VOID(navDestination);
734     auto pattern = navDestination->GetPattern<NavDestinationPattern>();
735     CHECK_NULL_VOID(pattern);
736     pattern->SetSystemBarStyle(style);
737 }
738 
SetHideToolBar(bool hideToolBar,bool animated)739 void NavDestinationModelNG::SetHideToolBar(bool hideToolBar, bool animated)
740 {
741     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
742     auto navDestinationGroupNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
743     CHECK_NULL_VOID(navDestinationGroupNode);
744     auto navDestinationLayoutProperty = navDestinationGroupNode->GetLayoutPropertyPtr<NavDestinationLayoutProperty>();
745     CHECK_NULL_VOID(navDestinationLayoutProperty);
746     navDestinationLayoutProperty->UpdateHideToolBar(hideToolBar);
747     navDestinationLayoutProperty->UpdateIsAnimatedToolBar(animated);
748 }
749 
SetHideToolBar(FrameNode * frameNode,bool hideToolBar,bool animated)750 void NavDestinationModelNG::SetHideToolBar(FrameNode* frameNode, bool hideToolBar, bool animated)
751 {
752     CHECK_NULL_VOID(frameNode);
753     auto navDestinationGroupNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
754     CHECK_NULL_VOID(navDestinationGroupNode);
755     auto navDestinationLayoutProperty = navDestinationGroupNode->GetLayoutPropertyPtr<NavDestinationLayoutProperty>();
756     CHECK_NULL_VOID(navDestinationLayoutProperty);
757     navDestinationLayoutProperty->UpdateHideToolBar(hideToolBar);
758     navDestinationLayoutProperty->UpdateIsAnimatedToolBar(animated);
759 }
760 
SetToolbarConfiguration(std::vector<NG::BarItem> && toolBarItems)761 void NavDestinationModelNG::SetToolbarConfiguration(std::vector<NG::BarItem>&& toolBarItems)
762 {
763     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
764     auto navdestinationGroupNode =
765         AceType::DynamicCast<NavDestinationGroupNode>(Referenced::Claim<FrameNode>(frameNode));
766     CHECK_NULL_VOID(navdestinationGroupNode);
767     bool enabled = false;
768     auto hub = navdestinationGroupNode->GetEventHub<EventHub>();
769     if (hub) {
770         enabled = hub->IsEnabled();
771     }
772     FieldProperty fieldProperty;
773     fieldProperty.parentId = navdestinationGroupNode->GetInspectorId().value_or("");
774     fieldProperty.field = NG::DES_FIELD;
775     NavigationToolbarUtil::SetToolbarConfiguration(
776         navdestinationGroupNode, std::move(toolBarItems), enabled, fieldProperty);
777 }
778 
SetCustomToolBar(const RefPtr<AceType> & customNode)779 void NavDestinationModelNG::SetCustomToolBar(const RefPtr<AceType>& customNode)
780 {
781     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
782     auto navDestinationGroupNode =
783         AceType::DynamicCast<NavDestinationGroupNode>(Referenced::Claim<FrameNode>(frameNode));
784     NavigationToolbarUtil::SetCustomToolBar(navDestinationGroupNode, customNode);
785 }
786 
SetToolBarOptions(NavigationToolbarOptions && opt)787 void NavDestinationModelNG::SetToolBarOptions(NavigationToolbarOptions&& opt)
788 {
789     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
790     auto navDestinationGroupNode =
791         AceType::DynamicCast<NavDestinationGroupNode>(Referenced::Claim<FrameNode>(frameNode));
792     CHECK_NULL_VOID(navDestinationGroupNode);
793     NavigationToolbarUtil::SetToolbarOptions(navDestinationGroupNode, std::move(opt));
794 }
795 
ParseCommonTitle(FrameNode * frameNode,const NG::NavigationTitleInfo & titleInfo)796 void NavDestinationModelNG::ParseCommonTitle(FrameNode* frameNode, const NG::NavigationTitleInfo& titleInfo)
797 {
798     if (!titleInfo.hasSubTitle && !titleInfo.hasMainTitle) {
799         return;
800     }
801     auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
802     CHECK_NULL_VOID(navDestinationNode);
803 
804     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestinationNode->GetTitleBarNode());
805     CHECK_NULL_VOID(titleBarNode);
806     auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
807     CHECK_NULL_VOID(titleBarPattern);
808     if (navDestinationNode->GetPrevTitleIsCustomValue(false)) {
809         // remove custom title if any.
810         titleBarNode->RemoveChild(titleBarNode->GetTitle());
811         titleBarNode->SetTitle(nullptr);
812         auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
813         CHECK_NULL_VOID(titleBarLayoutProperty);
814         // reset custom title height if any.
815         if (titleBarLayoutProperty->HasTitleHeight()) {
816             titleBarLayoutProperty->ResetTitleHeight();
817         }
818     }
819     navDestinationNode->UpdatePrevTitleIsCustom(false);
820 
821     auto theme = NavigationGetTheme();
822     // create or update main title
823     NavigationTitleUtil::CreateOrUpdateDestinationMainTitle(titleBarNode, titleInfo);
824 
825     // create or update subtitle
826     NavigationTitleUtil::CreateOrUpdateDestinationSubtitle(titleBarNode, titleInfo);
827     return;
828 }
829 
SetTitlebarOptions(FrameNode * frameNode,NavigationTitlebarOptions && opt)830 void NavDestinationModelNG::SetTitlebarOptions(FrameNode* frameNode, NavigationTitlebarOptions&& opt)
831 {
832     auto navDestinationNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
833     CHECK_NULL_VOID(navDestinationNode);
834     auto navDestinationPattern = navDestinationNode->GetPattern<NavDestinationPattern>();
835     CHECK_NULL_VOID(navDestinationPattern);
836     navDestinationPattern->SetTitleBarStyle(opt.brOptions.barStyle);
837     auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestinationNode->GetTitleBarNode());
838     CHECK_NULL_VOID(titleBarNode);
839     auto titleBarPattern = titleBarNode->GetPattern<TitleBarPattern>();
840     CHECK_NULL_VOID(titleBarPattern);
841     titleBarPattern->SetTitlebarOptions(std::move(opt));
842 }
843 
SetMenuItems(FrameNode * frameNode,std::vector<NG::BarItem> && menuItems)844 void NavDestinationModelNG::SetMenuItems(FrameNode* frameNode, std::vector<NG::BarItem>&& menuItems)
845 {
846     auto navDestinationGroupNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
847     CHECK_NULL_VOID(navDestinationGroupNode);
848     // if previous menu is custom, just remove it and create new menu, otherwise update old menu
849     if (navDestinationGroupNode->GetPrevMenuIsCustom().value_or(false)) {
850         navDestinationGroupNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
851     } else {
852         if (navDestinationGroupNode->GetMenu()) {
853             navDestinationGroupNode->UpdateMenuNodeOperation(ChildNodeOperation::REPLACE);
854         } else {
855             navDestinationGroupNode->UpdateMenuNodeOperation(ChildNodeOperation::ADD);
856         }
857     }
858     auto navDestinationPattern = navDestinationGroupNode->GetPattern<NavDestinationPattern>();
859     CHECK_NULL_VOID(navDestinationPattern);
860     navDestinationPattern->SetTitleBarMenuItems(menuItems);
861     navDestinationPattern->SetMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
862     navDestinationPattern->SetLandscapeMenuNodeId(ElementRegister::GetInstance()->MakeUniqueId());
863     navDestinationGroupNode->UpdatePrevMenuIsCustom(false);
864 }
865 
SetMenuItemAction(FrameNode * frameNode,std::function<void ()> && action,uint32_t index)866 void NavDestinationModelNG::SetMenuItemAction(FrameNode* frameNode, std::function<void()>&& action, uint32_t index)
867 {
868     auto navDestinationGroupNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
869     CHECK_NULL_VOID(navDestinationGroupNode);
870     auto navDestinationPattern = navDestinationGroupNode->GetPattern<NavDestinationPattern>();
871     CHECK_NULL_VOID(navDestinationPattern);
872     auto menuItems = navDestinationPattern->GetTitleBarMenuItems();
873     if (menuItems.size() > index) {
874         menuItems.at(index).action = action;
875         navDestinationPattern->SetTitleBarMenuItems(menuItems);
876     }
877 }
878 
SetMenuItemSymbol(FrameNode * frameNode,std::function<void (WeakPtr<NG::FrameNode>)> && symbol,uint32_t index)879 void NavDestinationModelNG::SetMenuItemSymbol(FrameNode* frameNode,
880     std::function<void(WeakPtr<NG::FrameNode>)>&& symbol, uint32_t index)
881 {
882     auto navDestinationGroupNode = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
883     CHECK_NULL_VOID(navDestinationGroupNode);
884     auto navDestinationPattern = navDestinationGroupNode->GetPattern<NavDestinationPattern>();
885     CHECK_NULL_VOID(navDestinationPattern);
886     auto menuItems = navDestinationPattern->GetTitleBarMenuItems();
887     if (menuItems.size() > index) {
888         menuItems.at(index).iconSymbol = symbol;
889         navDestinationPattern->SetTitleBarMenuItems(menuItems);
890     }
891 }
892 
SetSystemTransitionType(NG::NavigationSystemTransitionType type)893 void NavDestinationModelNG::SetSystemTransitionType(NG::NavigationSystemTransitionType type)
894 {
895     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
896     CHECK_NULL_VOID(frameNode);
897     auto navDestination = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
898     CHECK_NULL_VOID(navDestination);
899     navDestination->SetSystemTransitionType(type);
900 }
901 
SetSystemTransitionType(FrameNode * frameNode,NG::NavigationSystemTransitionType type)902 void NavDestinationModelNG::SetSystemTransitionType(FrameNode* frameNode, NG::NavigationSystemTransitionType type)
903 {
904     auto navDestination = AceType::DynamicCast<NavDestinationGroupNode>(frameNode);
905     CHECK_NULL_VOID(navDestination);
906     navDestination->SetSystemTransitionType(type);
907 }
908 
SetScrollableProcessor(const std::function<RefPtr<NG::NavDestinationScrollableProcessor> ()> & creator)909 void NavDestinationModelNG::SetScrollableProcessor(
910     const std::function<RefPtr<NG::NavDestinationScrollableProcessor>()>& creator)
911 {
912     CHECK_NULL_VOID(creator);
913     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
914     CHECK_NULL_VOID(frameNode);
915     auto node = AceType::DynamicCast<NavDestinationGroupNode>(Referenced::Claim<FrameNode>(frameNode));
916     CHECK_NULL_VOID(node);
917     auto pattern = node->GetPattern<NavDestinationPattern>();
918     CHECK_NULL_VOID(pattern);
919     if (!pattern->GetScrollableProcessor()) {
920         auto processor = creator();
921         if (processor) {
922             processor->SetNodeId(node->GetId());
923             processor->SetNavDestinationPattern(WeakPtr(pattern));
924         }
925         pattern->SetScrollableProcessor(processor);
926     }
927 }
928 
UpdateBindingWithScrollable(std::function<void (const RefPtr<NG::NavDestinationScrollableProcessor> & processor)> && callback)929 void NavDestinationModelNG::UpdateBindingWithScrollable(
930     std::function<void(const RefPtr<NG::NavDestinationScrollableProcessor>& processor)>&& callback)
931 {
932     CHECK_NULL_VOID(callback);
933     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
934     CHECK_NULL_VOID(frameNode);
935     auto node = AceType::DynamicCast<NavDestinationGroupNode>(Referenced::Claim<FrameNode>(frameNode));
936     CHECK_NULL_VOID(node);
937     auto pattern = node->GetPattern<NavDestinationPattern>();
938     CHECK_NULL_VOID(pattern);
939     auto processor = pattern->GetScrollableProcessor();
940     callback(processor);
941 }
942 } // namespace OHOS::Ace::NG
943