1 /* 2 * Copyright (c) 2024 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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_NODE_BASE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_NODE_BASE_H 18 19 #include <cstdint> 20 #include <optional> 21 22 #include "core/animation/page_transition_common.h" 23 #include "core/common/display_info.h" 24 #include "core/common/page_viewport_config.h" 25 #include "core/components/common/layout/constants.h" 26 #include "core/components_ng/base/group_node.h" 27 #include "core/components_ng/pattern/navigation/navigation_declaration.h" 28 #include "core/components_ng/pattern/pattern.h" 29 #include "core/components_ng/property/property.h" 30 #include "interfaces/inner_api/ace/viewport_config.h" 31 32 namespace OHOS::Ace::NG { 33 class NavDestinationNodeBase : public GroupNode { 34 DECLARE_ACE_TYPE(NavDestinationNodeBase, GroupNode); 35 public: NavDestinationNodeBase(const std::string & tag,int32_t nodeId,const RefPtr<Pattern> & pattern)36 NavDestinationNodeBase(const std::string& tag, int32_t nodeId, const RefPtr<Pattern>& pattern) 37 : GroupNode(tag, nodeId, pattern) {} 38 ~NavDestinationNodeBase() override = default; 39 IsAtomicNode()40 bool IsAtomicNode() const override 41 { 42 return false; 43 } 44 SetMenu(const RefPtr<UINode> & menu)45 void SetMenu(const RefPtr<UINode>& menu) 46 { 47 menu_ = menu; 48 } 49 GetMenu()50 const RefPtr<UINode>& GetMenu() const 51 { 52 return menu_; 53 } 54 SetToolbarContainer(const RefPtr<UINode> & menu)55 void SetToolbarContainer(const RefPtr<UINode>& menu) 56 { 57 toolbarMenu_ = menu; 58 } 59 GetToolbarContainer()60 const RefPtr<UINode>& GetToolbarContainer() const 61 { 62 return toolbarMenu_; 63 } 64 SetMenuNode(const RefPtr<UINode> & menuNode)65 void SetMenuNode(const RefPtr<UINode>& menuNode) 66 { 67 moreMenuNode_ = menuNode; 68 } 69 SetToolbarMenuNode(const RefPtr<UINode> & menuNode)70 void SetToolbarMenuNode(const RefPtr<UINode>& menuNode) 71 { 72 toolbarMoreMenuNode_ = menuNode; 73 } 74 SetLandscapeMenuNode(const RefPtr<UINode> & moreLandscapeMenuNode)75 void SetLandscapeMenuNode(const RefPtr<UINode>& moreLandscapeMenuNode) 76 { 77 moreLandscapeMenuNode_ = moreLandscapeMenuNode; 78 } 79 SetLandscapeMenu(const RefPtr<UINode> & menu)80 void SetLandscapeMenu(const RefPtr<UINode>& menu) 81 { 82 landscapeMenu_ = menu; 83 } 84 GetLandscapeMenu()85 const RefPtr<UINode>& GetLandscapeMenu() const 86 { 87 return landscapeMenu_; 88 } 89 SetContentNode(const RefPtr<UINode> & contentNode)90 void SetContentNode(const RefPtr<UINode>& contentNode) 91 { 92 contentNode_ = contentNode; 93 } 94 GetContentNode()95 const RefPtr<UINode>& GetContentNode() const 96 { 97 return contentNode_; 98 } 99 SetTitleBarNode(const RefPtr<UINode> & title)100 void SetTitleBarNode(const RefPtr<UINode>& title) 101 { 102 titleBarNode_ = title; 103 } 104 GetTitleBarNode()105 const RefPtr<UINode>& GetTitleBarNode() const 106 { 107 return titleBarNode_; 108 } 109 SetToolBarNode(const RefPtr<UINode> & toolBarNode)110 void SetToolBarNode(const RefPtr<UINode>& toolBarNode) 111 { 112 toolBarNode_ = toolBarNode; 113 } 114 GetToolBarNode()115 const RefPtr<UINode>& GetToolBarNode() const 116 { 117 return toolBarNode_; 118 } 119 SetPreToolBarNode(const RefPtr<UINode> & preToolBarNode)120 void SetPreToolBarNode(const RefPtr<UINode>& preToolBarNode) 121 { 122 preToolBarNode_ = preToolBarNode; 123 } 124 GetPreToolBarNode()125 const RefPtr<UINode>& GetPreToolBarNode() const 126 { 127 return preToolBarNode_; 128 } 129 SetToolBarDividerNode(const RefPtr<UINode> & toolBarDividerNode)130 void SetToolBarDividerNode(const RefPtr<UINode>& toolBarDividerNode) 131 { 132 toolBarDividerNode_ = toolBarDividerNode; 133 } 134 GetToolBarDividerNode()135 const RefPtr<UINode>& GetToolBarDividerNode() const 136 { 137 return toolBarDividerNode_; 138 } 139 SetIsUseToolbarConfiguration(bool isNewToolbar)140 void SetIsUseToolbarConfiguration(bool isNewToolbar) 141 { 142 isNewToolbar_ = isNewToolbar; 143 } 144 145 bool IsToolBarVisible() const; 146 IsUseToolbarConfiguration()147 bool IsUseToolbarConfiguration() const 148 { 149 return isNewToolbar_; 150 } 151 152 std::string GetBarItemsString(bool isMenu) const; IsNodeInvisible(const RefPtr<FrameNode> & node)153 virtual bool IsNodeInvisible(const RefPtr<FrameNode>& node) { return false; } 154 155 // custom node checking 156 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(PrevTitleIsCustom, bool); OnPrevTitleIsCustomUpdate(bool value)157 void OnPrevTitleIsCustomUpdate(bool value) {} 158 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(PrevMenuIsCustom, bool); OnPrevMenuIsCustomUpdate(bool value)159 void OnPrevMenuIsCustomUpdate(bool value) {} 160 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(PrevToolBarIsCustom, bool); OnPrevToolBarIsCustomUpdate(bool value)161 void OnPrevToolBarIsCustomUpdate(bool value) {} 162 163 // node operation related 164 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(MenuNodeOperation, ChildNodeOperation); OnMenuNodeOperationUpdate(ChildNodeOperation value)165 void OnMenuNodeOperationUpdate(ChildNodeOperation value) {} 166 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(ToolBarNodeOperation, ChildNodeOperation); OnToolBarNodeOperationUpdate(ChildNodeOperation value)167 void OnToolBarNodeOperationUpdate(ChildNodeOperation value) {} 168 SetTransitionType(PageTransitionType type)169 void SetTransitionType(PageTransitionType type) 170 { 171 transitionType_ = type; 172 } 173 GetTransitionType()174 PageTransitionType GetTransitionType() const 175 { 176 return transitionType_; 177 } 178 GetLanguageDirection()179 float GetLanguageDirection() 180 { 181 return AceApplicationInfo::GetInstance().IsRightToLeft() ? -1.0f : 1.0f; 182 } 183 UpdateAnimationId(int32_t animationId)184 void UpdateAnimationId(int32_t animationId) 185 { 186 animationId_ = animationId; 187 } 188 GetAnimationId()189 int32_t GetAnimationId() const 190 { 191 return animationId_; 192 } 193 GetNavigationNode()194 virtual RefPtr<UINode> GetNavigationNode() 195 { 196 return nullptr; 197 } 198 199 bool CustomizeExpandSafeArea(); 200 void Measure(const std::optional<LayoutConstraintF>& parentConstraint) override; 201 void Layout() override; 202 SetOrientation(const std::optional<Orientation> & ori)203 void SetOrientation(const std::optional<Orientation>& ori) 204 { 205 orientation_ = ori; 206 } GetOrientation()207 const std::optional<Orientation>& GetOrientation() const 208 { 209 return orientation_; 210 } SetPreOrientation(const std::optional<Orientation> & ori)211 void SetPreOrientation(const std::optional<Orientation>& ori) 212 { 213 preOrientation_ = ori; 214 } GetPreOrientation()215 const std::optional<Orientation>& GetPreOrientation() const 216 { 217 return preOrientation_; 218 } 219 void SetPageViewportConfig(const RefPtr<PageViewportConfig>& config); GetPageViewportConfig()220 const RefPtr<PageViewportConfig>& GetPageViewportConfig() const 221 { 222 return viewportConfig_; 223 } SetPageRotateAngle(const std::optional<int32_t> & angle)224 void SetPageRotateAngle(const std::optional<int32_t>& angle) 225 { 226 rotateAngle_ = angle; 227 } GetPageRotateAngle()228 const std::optional<int32_t>& GetPageRotateAngle() const 229 { 230 return rotateAngle_; 231 } SetIsRotated(bool rotate)232 void SetIsRotated(bool rotate) 233 { 234 isRotated_ = rotate; 235 } IsRotated()236 bool IsRotated() const 237 { 238 return isRotated_; 239 } 240 241 LayoutConstraintF AdjustLayoutConstarintIfNeeded(const LayoutConstraintF& originConstraint); 242 243 void AdjustRenderContextIfNeeded(); 244 void RestoreRenderContext(); 245 SetOnStartTransitionAnimationCallback(std::function<void ()> && callback)246 void SetOnStartTransitionAnimationCallback(std::function<void()>&& callback) 247 { 248 onStartTransitionAnimationCb_ = std::move(callback); 249 } OnStartOneTransitionAnimation()250 void OnStartOneTransitionAnimation() 251 { 252 if (onStartTransitionAnimationCb_) { 253 onStartTransitionAnimationCb_(); 254 } 255 } SetOnFinishTransitionAnimationCallback(std::function<void ()> && callback)256 void SetOnFinishTransitionAnimationCallback(std::function<void()>&& callback) 257 { 258 onFinishTransitionAnimationCb_ = std::move(callback); 259 } OnFinishOneTransitionAnimation()260 void OnFinishOneTransitionAnimation() 261 { 262 if (onFinishTransitionAnimationCb_) { 263 onFinishTransitionAnimationCb_(); 264 } 265 } 266 SetStatusBarConfig(const std::optional<std::pair<bool,bool>> & status)267 void SetStatusBarConfig(const std::optional<std::pair<bool, bool>>& status) 268 { 269 statusBarConfig_ = status; 270 } GetStatusBarConfig()271 const std::optional<std::pair<bool, bool>>& GetStatusBarConfig() 272 { 273 return statusBarConfig_; 274 } SetPreStatusBarConfig(const std::optional<std::pair<bool,bool>> & status)275 void SetPreStatusBarConfig(const std::optional<std::pair<bool, bool>>& status) 276 { 277 preStatusBarConfig_ = status; 278 } GetPreStatusBarConfig()279 const std::optional<std::pair<bool, bool>>& GetPreStatusBarConfig() 280 { 281 return preStatusBarConfig_; 282 } 283 SetNavigationIndicatorConfig(const std::optional<bool> & navigationIndicator)284 void SetNavigationIndicatorConfig(const std::optional<bool>& navigationIndicator) 285 { 286 navigationIndicatorConfig_ = navigationIndicator; 287 } GetNavigationIndicatorConfig()288 const std::optional<bool>& GetNavigationIndicatorConfig() 289 { 290 return navigationIndicatorConfig_; 291 } SetPreNavigationIndicatorConfig(const std::optional<bool> & navigationIndicator)292 void SetPreNavigationIndicatorConfig(const std::optional<bool>& navigationIndicator) 293 { 294 preNavigationIndicatorConfig_ = navigationIndicator; 295 } GetPreNavigationIndicatorConfig()296 const std::optional<bool>& GetPreNavigationIndicatorConfig() 297 { 298 return preNavigationIndicatorConfig_; 299 } SetIsSizeMatchNavigation(bool match)300 void SetIsSizeMatchNavigation(bool match) 301 { 302 isSizeMatchNavigation_ = match; 303 } IsSizeMatchNavigation()304 bool IsSizeMatchNavigation() const 305 { 306 return isSizeMatchNavigation_; 307 } 308 SetNavDestinationType(NavDestinationType type)309 void SetNavDestinationType(NavDestinationType type) 310 { 311 destType_ = type; 312 } GetNavDestinationType()313 NavDestinationType GetNavDestinationType() const 314 { 315 return destType_; 316 } 317 SystemTransitionPushStart(bool transitionIn)318 virtual void SystemTransitionPushStart(bool transitionIn) {} SystemTransitionPushEnd(bool transitionIn)319 virtual void SystemTransitionPushEnd(bool transitionIn) {} 320 virtual void SystemTransitionPushFinish(bool transitionIn, int32_t animationId = -1) {} 321 SystemTransitionPopStart(bool transitionIn)322 virtual void SystemTransitionPopStart(bool transitionIn) {} SystemTransitionPopEnd(bool transitionIn)323 virtual void SystemTransitionPopEnd(bool transitionIn) {} 324 virtual bool SystemTransitionPopFinish(int32_t animationId = -1, bool isNeedCleanContent = true) 325 { 326 return true; 327 } SetIsHomeDestination(bool isHome)328 void SetIsHomeDestination(bool isHome) 329 { 330 isHomeDestination_ = isHome; 331 } IsHomeDestination()332 bool IsHomeDestination() const 333 { 334 return isHomeDestination_; 335 } 336 337 protected: 338 RectF CalcFullClipRectForTransition(const SizeF& frameSize); 339 RectF CalcHalfClipRectForTransition(const SizeF& frameSize); 340 // push 341 OffsetF CalcTranslateForTransitionPushStart(const SizeF& frameSize, bool transitionIn); 342 OffsetF CalcTranslateForTransitionPushEnd(const SizeF& frameSize, bool transitionIn); 343 // pop 344 OffsetF CalcTranslateForTransitionPopStart(const SizeF& frameSize, bool transitionIn); 345 OffsetF CalcTranslateForTransitionPopEnd(const SizeF& frameSize, bool transitionIn); 346 // Dialog 347 TranslateOptions CalcContentTranslateForDialog(const SizeF& frameSize); 348 // slide 349 OffsetF CalcTranslateForSlideTransition(const SizeF& paintRect, bool isRight, bool isEnter, bool isEnd); 350 351 OffsetF GetParentGlobalOffsetWithSafeArea(bool checkBoundary = false, bool checkPosition = false) const override; 352 353 bool isHomeDestination_ = false; 354 RefPtr<UINode> contentNode_; 355 RefPtr<UINode> menu_; 356 RefPtr<UINode> toolbarMenu_; 357 RefPtr<UINode> landscapeMenu_; 358 RefPtr<UINode> moreMenuNode_; 359 RefPtr<UINode> toolbarMoreMenuNode_; 360 RefPtr<UINode> moreLandscapeMenuNode_; 361 RefPtr<UINode> titleBarNode_; 362 RefPtr<UINode> toolBarNode_; 363 RefPtr<UINode> preToolBarNode_; 364 RefPtr<UINode> toolBarDividerNode_; 365 bool isNewToolbar_ = false; 366 int32_t animationId_ = -1; 367 PageTransitionType transitionType_ = PageTransitionType::NONE; 368 std::optional<Orientation> orientation_; 369 std::optional<Orientation> preOrientation_; 370 RefPtr<PageViewportConfig> viewportConfig_; 371 SafeAreaInsets safeAreaInsets_; 372 bool isRotated_ = false; 373 std::optional<int32_t> rotateAngle_; 374 bool isCustomExpandRunning_ = false; 375 std::function<void()> onStartTransitionAnimationCb_; 376 std::function<void()> onFinishTransitionAnimationCb_; 377 // pair.first -> enable, pair.second -> animated 378 std::optional<std::pair<bool, bool>> statusBarConfig_; 379 std::optional<std::pair<bool, bool>> preStatusBarConfig_; 380 std::optional<bool> navigationIndicatorConfig_; 381 std::optional<bool> preNavigationIndicatorConfig_; 382 bool isSizeMatchNavigation_ = true; 383 NavDestinationType destType_ = NavDestinationType::DETAIL; 384 }; 385 } // namespace OHOS::Ace::NG 386 387 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_NODE_BASE_H