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_PATTERN_BASE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_PATTERN_BASE_H 18 19 #include <vector> 20 #include <optional> 21 #include <unordered_map> 22 23 #include "base/memory/ace_type.h" 24 #include "base/memory/referenced.h" 25 #include "core/components_ng/manager/focus/focus_view.h" 26 #include "core/components_ng/pattern/navigation/nav_bar_layout_property.h" 27 #include "core/components_ng/pattern/navigation/nav_bar_node.h" 28 #include "core/components_ng/pattern/navigation/navdestination_layout_property_base.h" 29 #include "core/components_ng/pattern/navigation/navigation_declaration.h" 30 #include "core/components_ng/pattern/navigation/navigation_options.h" 31 #include "core/components_ng/pattern/navigation/tool_bar_node.h" 32 #include "core/components_ng/pattern/pattern.h" 33 #include "core/pipeline/base/element_register.h" 34 35 namespace OHOS::Ace::NG { 36 37 class NavDestinationPatternBase : public Pattern, public FocusView { 38 DECLARE_ACE_TYPE(NavDestinationPatternBase, Pattern, FocusView); 39 public: 40 NavDestinationPatternBase() = default; 41 ~NavDestinationPatternBase() override = default; 42 43 void SetTitleBarStyle(const std::optional<BarStyle>& barStyle); 44 GetTitleBarStyle()45 std::optional<BarStyle> GetTitleBarStyle() const 46 { 47 return titleBarStyle_; 48 } 49 50 void SetToolBarStyle(const std::optional<BarStyle>& barStyle); SetMenuOptions(NavigationMenuOptions & opt)51 void SetMenuOptions(NavigationMenuOptions& opt) 52 { 53 menuOptions_ = opt; 54 } 55 GetMenuOptions()56 NavigationMenuOptions GetMenuOptions() const 57 { 58 return menuOptions_; 59 } 60 SetToolBarMenuOptions(NavigationMenuOptions & opt)61 void SetToolBarMenuOptions(NavigationMenuOptions& opt) 62 { 63 menuOptions_ = opt; 64 } 65 GetToolBarMenuOptions()66 NavigationMenuOptions GetToolBarMenuOptions() const 67 { 68 return menuOptions_; 69 } 70 GetToolBarStyle()71 std::optional<BarStyle> GetToolBarStyle() const 72 { 73 return toolBarStyle_; 74 } 75 IsAtomicNode()76 bool IsAtomicNode() const override 77 { 78 return false; 79 } 80 CheckCustomAvoidKeyboard()81 bool CheckCustomAvoidKeyboard() const override 82 { 83 return !NearZero(avoidKeyboardOffset_); 84 } SetAvoidKeyboardOffset(float avoidKeyboardOffset)85 void SetAvoidKeyboardOffset(float avoidKeyboardOffset) 86 { 87 avoidKeyboardOffset_ = avoidKeyboardOffset; 88 } GetAvoidKeyboardOffset()89 float GetAvoidKeyboardOffset() 90 { 91 return avoidKeyboardOffset_; 92 } 93 GetFocusPattern()94 FocusPattern GetFocusPattern() const override 95 { 96 return { FocusType::SCOPE, true }; 97 } 98 GetRouteOfFirstScope()99 std::list<int32_t> GetRouteOfFirstScope() override 100 { 101 return {}; 102 } 103 IsEntryFocusView()104 bool IsEntryFocusView() override 105 { 106 return false; 107 } 108 SetTitleBarMenuItems(const std::vector<BarItem> & menuItems)109 void SetTitleBarMenuItems(const std::vector<BarItem>& menuItems) 110 { 111 titleBarMenuItems_ = menuItems; 112 } 113 GetTitleBarMenuItems()114 const std::vector<BarItem>& GetTitleBarMenuItems() const 115 { 116 return titleBarMenuItems_; 117 } 118 SetToolBarMenuItems(const std::vector<BarItem> & menuItems)119 void SetToolBarMenuItems(const std::vector<BarItem>& menuItems) 120 { 121 toolBarMenuItems_ = menuItems; 122 } 123 GetToolBarMenuItems()124 const std::vector<BarItem>& GetToolBarMenuItems() const 125 { 126 return toolBarMenuItems_; 127 } 128 GetMenuNodeId()129 int32_t GetMenuNodeId() const 130 { 131 return menuNodeId_.value(); 132 } 133 GetLandscapeMenuNodeId()134 int32_t GetLandscapeMenuNodeId() 135 { 136 if (!landscapeMenuNodeId_.has_value()) { 137 landscapeMenuNodeId_ = ElementRegister::GetInstance()->MakeUniqueId(); 138 } 139 return landscapeMenuNodeId_.value(); 140 } 141 SetMenuNodeId(const int32_t menuNodeId)142 void SetMenuNodeId(const int32_t menuNodeId) 143 { 144 menuNodeId_ = menuNodeId; 145 } 146 SetLandscapeMenuNodeId(const int32_t landscapeMenuNodeId)147 void SetLandscapeMenuNodeId(const int32_t landscapeMenuNodeId) 148 { 149 landscapeMenuNodeId_ = landscapeMenuNodeId; 150 } 151 HasMenuNodeId()152 bool HasMenuNodeId() const 153 { 154 return menuNodeId_.has_value(); 155 } 156 HasLandscapeMenuNodeId()157 bool HasLandscapeMenuNodeId() const 158 { 159 return landscapeMenuNodeId_.has_value(); 160 } 161 GetToolbarHideStatus()162 bool GetToolbarHideStatus() 163 { 164 return isHideToolbar_; 165 } 166 GetMaxMenuNum()167 int32_t GetMaxMenuNum() const 168 { 169 return maxMenuNums_; 170 } 171 SetMaxMenuNum(int32_t maxMenu)172 void SetMaxMenuNum(int32_t maxMenu) 173 { 174 maxMenuNums_ = maxMenu; 175 } 176 GetTitleBarHeight()177 float GetTitleBarHeight() const 178 { 179 return titleBarHeight_; 180 } SetTitleBarHeight(float height)181 void SetTitleBarHeight(float height) 182 { 183 titleBarHeight_ = height; 184 } 185 GetToolBarHeight()186 float GetToolBarHeight() const 187 { 188 return toolBarHeight_; 189 } SetToolBarHeight(float height)190 void SetToolBarHeight(float height) 191 { 192 toolBarHeight_ = height; 193 } 194 GetToolBarDividerHeight()195 float GetToolBarDividerHeight() const 196 { 197 return toolBarDividerHeight_; 198 } SetToolBarDividerHeight(float height)199 void SetToolBarDividerHeight(float height) 200 { 201 toolBarDividerHeight_ = height; 202 } 203 GetTitleBarAnimationCount()204 int32_t GetTitleBarAnimationCount() const 205 { 206 return titleBarAnimationCount_; 207 } OnTitleBarAnimationStart()208 void OnTitleBarAnimationStart() 209 { 210 titleBarAnimationCount_++; 211 } 212 GetToolBarAnimationCount()213 int32_t GetToolBarAnimationCount() const 214 { 215 return toolBarAnimationCount_; 216 } OnToolBarAnimationStart()217 void OnToolBarAnimationStart() 218 { 219 toolBarAnimationCount_++; 220 } 221 SetCurrHideToolBar(bool currHideToolBar)222 void SetCurrHideToolBar(bool currHideToolBar) 223 { 224 currHideToolBar_ = currHideToolBar; 225 } 226 GetCurrHideToolBar()227 std::optional<bool> GetCurrHideToolBar() 228 { 229 return currHideToolBar_; 230 } 231 232 void OnColorConfigurationUpdate() override; 233 234 void HideOrShowToolBarImmediately(const RefPtr<NavDestinationNodeBase>& hostNode, bool hide); 235 void OnToolBarAnimationFinish(); 236 void OnTitleBarAnimationFinish(); 237 void UpdateToolBarAndDividerProperty(const RefPtr<LayoutProperty>& navBarLayoutProperty, bool hide, 238 const RefPtr<NavDestinationNodeBase>& hostNode); 239 void UpdateToolBarAndDividerTranslateAndOpacity(bool hide, const RefPtr<NavToolbarNode>& toolBarNode, 240 float toolBarHeight, const RefPtr<FrameNode>& toolbarDividerNode, float toolBarDividerHeight); 241 void UpdateTitleBarProperty(const RefPtr<LayoutProperty>& navBarLayoutProperty, bool hide, 242 const RefPtr<NavDestinationNodeBase>& hostNode); 243 void UpdateTitleBarTranslateAndOpacity(bool hide, const RefPtr<TitleBarNode>& titleBarNode, float titleBarHeight); 244 void HideOrShowTitleBarImmediately(const RefPtr<NavDestinationNodeBase>& hostNode, bool hide); 245 void HandleTitleBarAndToolBarAnimation(const RefPtr<NavDestinationNodeBase>& navNodeBase, 246 bool needRunTitleBarAnimation, bool needRunToolBarAnimation); 247 void StartAnimation(bool needRunTitleBarAnimation, bool hideTitle, bool needRunToolBarAnimation, bool hideTool); 248 IsNeedHideToolBarForNavWidth()249 bool IsNeedHideToolBarForNavWidth() const 250 { 251 return needHideToolBarForNavWidth_; 252 } 253 SetIsNeedHideToolBarForNavWidth(bool hide)254 void SetIsNeedHideToolBarForNavWidth(bool hide) 255 { 256 needHideToolBarForNavWidth_ = hide; 257 } 258 UpdateSafeAreaPaddingChanged(bool changed)259 void UpdateSafeAreaPaddingChanged(bool changed) 260 { 261 safeAreaPaddingChanged_ = changed; 262 } 263 IsSafeAreaPaddingChanged()264 bool IsSafeAreaPaddingChanged() const 265 { 266 return safeAreaPaddingChanged_; 267 } 268 GetTitleBarOffsetY()269 float GetTitleBarOffsetY() const 270 { 271 return titleBarOffsetY_; 272 } 273 SetTitleBarOffsetY(float titleBarOffsetY)274 void SetTitleBarOffsetY(float titleBarOffsetY) 275 { 276 titleBarOffsetY_ = titleBarOffsetY; 277 } 278 279 void MarkSafeAreaPaddingChangedWithCheckTitleBar(float titleBarHeight); 280 OnCoordScrollStart()281 virtual void OnCoordScrollStart() {}; OnCoordScrollUpdate(float offset,float currentOffset)282 virtual float OnCoordScrollUpdate(float offset, float currentOffset) 283 { 284 return 0.0f; 285 } OnCoordScrollEnd()286 virtual void OnCoordScrollEnd() {}; NeedCoordWithScroll()287 virtual bool NeedCoordWithScroll() 288 { 289 return false; 290 } IsNeedHandleScroll()291 virtual bool IsNeedHandleScroll() const 292 { 293 return false; 294 } GetTitleBarHeightLessThanMaxBarHeight()295 virtual float GetTitleBarHeightLessThanMaxBarHeight() const 296 { 297 return 0.0f; 298 } CanCoordScrollUp(float offset)299 virtual bool CanCoordScrollUp(float offset) const 300 { 301 return false; 302 } 303 SetNavigationNode(const RefPtr<UINode> & navigationNode)304 void SetNavigationNode(const RefPtr<UINode>& navigationNode) 305 { 306 navigationNode_ = AceType::WeakClaim(RawPtr(navigationNode)); 307 } GetNavigationNode()308 RefPtr<UINode> GetNavigationNode() 309 { 310 return navigationNode_.Upgrade(); 311 } 312 protected: 313 void AbortBarAnimation(); 314 void UpdateHideBarProperty(); 315 void ExpandContentSafeAreaIfNeeded(); 316 void RemoveAnimation(int32_t id); 317 void BarAnimationPropertyCallback( 318 bool needRunTitleBarAnimation, bool hideTitle, bool needRunToolBarAnimation, bool hideTool); 319 void BarAnimationFinishCallback(bool needRunTitleBarAnimation, bool needRunToolBarAnimation, int32_t animationId); 320 void UpdateLayoutPropertyBeforeAnimation(const RefPtr<NavDestinationNodeBase>& navNodeBase, 321 bool needRunTitleBarAnimation, bool needRunToolBarAnimation, bool hideTitleBar, bool hideToolBar); 322 bool CustomizeExpandSafeArea() override; 323 void InitOnTouchEvent(const RefPtr<FrameNode>& host); 324 void RemoveOnTouchEvent(FrameNode* frameNode); 325 326 bool isHideToolbar_ = false; 327 bool isHideTitlebar_ = false; 328 std::optional<BarStyle> titleBarStyle_; 329 std::optional<BarStyle> toolBarStyle_; 330 bool safeAreaPaddingChanged_ = false; 331 float avoidKeyboardOffset_ = 0.0f; 332 std::vector<BarItem> titleBarMenuItems_; 333 std::vector<BarItem> toolBarMenuItems_; 334 std::optional<int32_t> menuNodeId_; 335 std::optional<int32_t> landscapeMenuNodeId_; 336 int32_t maxMenuNums_ = -1; 337 float titleBarHeight_ = 0.0f; 338 float titleBarOffsetY_ = 0.0f; 339 float toolBarHeight_ = 0.0f; 340 float toolBarDividerHeight_ = 0.0f; 341 int32_t titleBarAnimationCount_ = 0; 342 int32_t toolBarAnimationCount_ = 0; 343 std::optional<bool> currHideTitleBar_; 344 std::optional<bool> currHideToolBar_; 345 bool needHideToolBarForNavWidth_ = false; 346 int32_t nextBarAnimationId_ = 0; 347 std::unordered_map<int32_t, std::shared_ptr<AnimationUtils::Animation>> barAnimations_; 348 std::optional<int32_t> preWidth_; 349 NavigationMenuOptions menuOptions_; 350 351 WeakPtr<UINode> navigationNode_; 352 RefPtr<TouchEventImpl> touchListener_ = nullptr; 353 }; 354 } // namespace OHOS::Ace::NG 355 356 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_PATTERN_BASE_H