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