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_ = std::move(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 void HideOrShowToolBarImmediately(const RefPtr<NavDestinationNodeBase>& hostNode, bool hide); 232 void OnToolBarAnimationFinish(); 233 void OnTitleBarAnimationFinish(); 234 void UpdateToolBarAndDividerProperty(const RefPtr<LayoutProperty>& navBarLayoutProperty, bool hide, 235 const RefPtr<NavDestinationNodeBase>& hostNode); 236 void UpdateToolBarAndDividerTranslateAndOpacity(bool hide, const RefPtr<NavToolbarNode>& toolBarNode, 237 float toolBarHeight, const RefPtr<FrameNode>& toolbarDividerNode, float toolBarDividerHeight); 238 void UpdateTitleBarProperty(const RefPtr<LayoutProperty>& navBarLayoutProperty, bool hide, 239 const RefPtr<NavDestinationNodeBase>& hostNode); 240 void UpdateTitleBarTranslateAndOpacity(bool hide, const RefPtr<TitleBarNode>& titleBarNode, float titleBarHeight); 241 void HideOrShowTitleBarImmediately(const RefPtr<NavDestinationNodeBase>& hostNode, bool hide); 242 void HandleTitleBarAndToolBarAnimation(const RefPtr<NavDestinationNodeBase>& navNodeBase, 243 bool needRunTitleBarAnimation, bool needRunToolBarAnimation); 244 void StartAnimation(bool needRunTitleBarAnimation, bool hideTitle, bool needRunToolBarAnimation, bool hideTool); 245 IsNeedHideToolBarForNavWidth()246 bool IsNeedHideToolBarForNavWidth() const 247 { 248 return needHideToolBarForNavWidth_; 249 } 250 SetIsNeedHideToolBarForNavWidth(bool hide)251 void SetIsNeedHideToolBarForNavWidth(bool hide) 252 { 253 needHideToolBarForNavWidth_ = hide; 254 } 255 UpdateSafeAreaPaddingChanged(bool changed)256 void UpdateSafeAreaPaddingChanged(bool changed) 257 { 258 safeAreaPaddingChanged_ = changed; 259 } 260 IsSafeAreaPaddingChanged()261 bool IsSafeAreaPaddingChanged() const 262 { 263 return safeAreaPaddingChanged_; 264 } 265 GetTitleBarOffsetY()266 float GetTitleBarOffsetY() const 267 { 268 return titleBarOffsetY_; 269 } 270 SetTitleBarOffsetY(float titleBarOffsetY)271 void SetTitleBarOffsetY(float titleBarOffsetY) 272 { 273 titleBarOffsetY_ = titleBarOffsetY; 274 } 275 276 void MarkSafeAreaPaddingChangedWithCheckTitleBar(float titleBarHeight); 277 OnCoordScrollStart()278 virtual void OnCoordScrollStart() {}; OnCoordScrollUpdate(float offset,float currentOffset)279 virtual float OnCoordScrollUpdate(float offset, float currentOffset) 280 { 281 return 0.0f; 282 } OnCoordScrollEnd()283 virtual void OnCoordScrollEnd() {}; NeedCoordWithScroll()284 virtual bool NeedCoordWithScroll() 285 { 286 return false; 287 } GetTitleBarHeightLessThanMaxBarHeight()288 virtual float GetTitleBarHeightLessThanMaxBarHeight() const 289 { 290 return 0.0f; 291 } CanCoordScrollUp(float offset)292 virtual bool CanCoordScrollUp(float offset) const 293 { 294 return false; 295 } 296 protected: 297 void AbortBarAnimation(); 298 void UpdateHideBarProperty(); 299 void ExpandContentSafeAreaIfNeeded(); 300 void RemoveAnimation(int32_t id); 301 void BarAnimationPropertyCallback( 302 bool needRunTitleBarAnimation, bool hideTitle, bool needRunToolBarAnimation, bool hideTool); 303 void BarAnimationFinishCallback(bool needRunTitleBarAnimation, bool needRunToolBarAnimation, int32_t animationId); 304 void UpdateLayoutPropertyBeforeAnimation(const RefPtr<NavDestinationNodeBase>& navNodeBase, 305 bool needRunTitleBarAnimation, bool needRunToolBarAnimation, bool hideTitleBar, bool hideToolBar); 306 307 bool isHideToolbar_ = false; 308 bool isHideTitlebar_ = false; 309 std::optional<BarStyle> titleBarStyle_; 310 std::optional<BarStyle> toolBarStyle_; 311 bool safeAreaPaddingChanged_ = false; 312 float avoidKeyboardOffset_ = 0.0f; 313 std::vector<BarItem> titleBarMenuItems_; 314 std::vector<BarItem> toolBarMenuItems_; 315 std::optional<int32_t> menuNodeId_; 316 std::optional<int32_t> landscapeMenuNodeId_; 317 int32_t maxMenuNums_ = -1; 318 float titleBarHeight_ = 0.0f; 319 float titleBarOffsetY_ = 0.0f; 320 float toolBarHeight_ = 0.0f; 321 float toolBarDividerHeight_ = 0.0f; 322 int32_t titleBarAnimationCount_ = 0; 323 int32_t toolBarAnimationCount_ = 0; 324 std::optional<bool> currHideTitleBar_; 325 std::optional<bool> currHideToolBar_; 326 bool needHideToolBarForNavWidth_ = false; 327 int32_t nextBarAnimationId_ = 0; 328 std::unordered_map<int32_t, std::shared_ptr<AnimationUtils::Animation>> barAnimations_; 329 std::optional<int32_t> preWidth_; 330 NavigationMenuOptions menuOptions_; 331 }; 332 } // namespace OHOS::Ace::NG 333 334 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_PATTERN_BASE_H