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