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