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); 51 GetToolBarStyle()52 std::optional<BarStyle> GetToolBarStyle() const 53 { 54 return toolBarStyle_; 55 } 56 IsAtomicNode()57 bool IsAtomicNode() const override 58 { 59 return false; 60 } 61 CheckCustomAvoidKeyboard()62 bool CheckCustomAvoidKeyboard() const override 63 { 64 return !NearZero(avoidKeyboardOffset_); 65 } SetAvoidKeyboardOffset(float avoidKeyboardOffset)66 void SetAvoidKeyboardOffset(float avoidKeyboardOffset) 67 { 68 avoidKeyboardOffset_ = avoidKeyboardOffset; 69 } GetAvoidKeyboardOffset()70 float GetAvoidKeyboardOffset() 71 { 72 return avoidKeyboardOffset_; 73 } 74 GetFocusPattern()75 FocusPattern GetFocusPattern() const override 76 { 77 return { FocusType::SCOPE, true }; 78 } 79 GetRouteOfFirstScope()80 std::list<int32_t> GetRouteOfFirstScope() override 81 { 82 return {}; 83 } 84 IsEntryFocusView()85 bool IsEntryFocusView() override 86 { 87 return false; 88 } 89 SetTitleBarMenuItems(const std::vector<BarItem> & menuItems)90 void SetTitleBarMenuItems(const std::vector<BarItem>& menuItems) 91 { 92 titleBarMenuItems_ = menuItems; 93 } 94 GetTitleBarMenuItems()95 const std::vector<BarItem>& GetTitleBarMenuItems() const 96 { 97 return titleBarMenuItems_; 98 } 99 SetToolBarMenuItems(const std::vector<BarItem> & menuItems)100 void SetToolBarMenuItems(const std::vector<BarItem>& menuItems) 101 { 102 toolBarMenuItems_ = menuItems; 103 } 104 GetToolBarMenuItems()105 const std::vector<BarItem>& GetToolBarMenuItems() const 106 { 107 return toolBarMenuItems_; 108 } 109 GetMenuNodeId()110 int32_t GetMenuNodeId() const 111 { 112 return menuNodeId_.value(); 113 } 114 GetLandscapeMenuNodeId()115 int32_t GetLandscapeMenuNodeId() 116 { 117 if (!landscapeMenuNodeId_.has_value()) { 118 landscapeMenuNodeId_ = ElementRegister::GetInstance()->MakeUniqueId(); 119 } 120 return landscapeMenuNodeId_.value(); 121 } 122 SetMenuNodeId(const int32_t menuNodeId)123 void SetMenuNodeId(const int32_t menuNodeId) 124 { 125 menuNodeId_ = menuNodeId; 126 } 127 SetLandscapeMenuNodeId(const int32_t landscapeMenuNodeId)128 void SetLandscapeMenuNodeId(const int32_t landscapeMenuNodeId) 129 { 130 landscapeMenuNodeId_ = landscapeMenuNodeId; 131 } 132 HasMenuNodeId()133 bool HasMenuNodeId() const 134 { 135 return menuNodeId_.has_value(); 136 } 137 HasLandscapeMenuNodeId()138 bool HasLandscapeMenuNodeId() const 139 { 140 return landscapeMenuNodeId_.has_value(); 141 } 142 GetToolbarHideStatus()143 bool GetToolbarHideStatus() 144 { 145 return isHideToolbar_; 146 } 147 GetMaxMenuNum()148 int32_t GetMaxMenuNum() const 149 { 150 return maxMenuNums_; 151 } 152 SetMaxMenuNum(int32_t maxMenu)153 void SetMaxMenuNum(int32_t maxMenu) 154 { 155 maxMenuNums_ = maxMenu; 156 } 157 GetTitleBarHeight()158 float GetTitleBarHeight() const 159 { 160 return titleBarHeight_; 161 } SetTitleBarHeight(float height)162 void SetTitleBarHeight(float height) 163 { 164 titleBarHeight_ = height; 165 } 166 GetToolBarHeight()167 float GetToolBarHeight() const 168 { 169 return toolBarHeight_; 170 } SetToolBarHeight(float height)171 void SetToolBarHeight(float height) 172 { 173 toolBarHeight_ = height; 174 } 175 GetToolBarDividerHeight()176 float GetToolBarDividerHeight() const 177 { 178 return toolBarDividerHeight_; 179 } SetToolBarDividerHeight(float height)180 void SetToolBarDividerHeight(float height) 181 { 182 toolBarDividerHeight_ = height; 183 } 184 GetTitleBarAnimationCount()185 int32_t GetTitleBarAnimationCount() const 186 { 187 return titleBarAnimationCount_; 188 } OnTitleBarAnimationStart()189 void OnTitleBarAnimationStart() 190 { 191 titleBarAnimationCount_++; 192 } 193 GetToolBarAnimationCount()194 int32_t GetToolBarAnimationCount() const 195 { 196 return toolBarAnimationCount_; 197 } OnToolBarAnimationStart()198 void OnToolBarAnimationStart() 199 { 200 toolBarAnimationCount_++; 201 } 202 SetCurrHideToolBar(bool currHideToolBar)203 void SetCurrHideToolBar(bool currHideToolBar) 204 { 205 currHideToolBar_ = currHideToolBar; 206 } 207 GetCurrHideToolBar()208 std::optional<bool> GetCurrHideToolBar() 209 { 210 return currHideToolBar_; 211 } 212 void HideOrShowToolBarImmediately(const RefPtr<NavDestinationNodeBase>& hostNode, bool hide); 213 void OnToolBarAnimationFinish(); 214 void OnTitleBarAnimationFinish(); 215 void UpdateToolBarAndDividerProperty(const RefPtr<LayoutProperty>& navBarLayoutProperty, bool hide, 216 const RefPtr<NavDestinationNodeBase>& hostNode); 217 void UpdateToolBarAndDividerTranslateAndOpacity(bool hide, const RefPtr<NavToolbarNode>& toolBarNode, 218 float toolBarHeight, const RefPtr<FrameNode>& toolbarDividerNode, float toolBarDividerHeight); 219 void UpdateTitleBarProperty(const RefPtr<LayoutProperty>& navBarLayoutProperty, bool hide, 220 const RefPtr<NavDestinationNodeBase>& hostNode); 221 void UpdateTitleBarTranslateAndOpacity(bool hide, const RefPtr<TitleBarNode>& titleBarNode, float titleBarHeight); 222 void HideOrShowTitleBarImmediately(const RefPtr<NavDestinationNodeBase>& hostNode, bool hide); 223 void HandleTitleBarAndToolBarAnimation(const RefPtr<NavDestinationNodeBase>& navNodeBase, 224 bool needRunTitleBarAnimation, bool needRunToolBarAnimation); 225 void StartAnimation(bool needRunTitleBarAnimation, bool hideTitle, bool needRunToolBarAnimation, bool hideTool); 226 IsNeedHideToolBarForNavWidth()227 bool IsNeedHideToolBarForNavWidth() const 228 { 229 return needHideToolBarForNavWidth_; 230 } 231 SetIsNeedHideToolBarForNavWidth(bool hide)232 void SetIsNeedHideToolBarForNavWidth(bool hide) 233 { 234 needHideToolBarForNavWidth_ = hide; 235 } 236 UpdateSafeAreaPaddingChanged(bool changed)237 void UpdateSafeAreaPaddingChanged(bool changed) 238 { 239 safeAreaPaddingChanged_ = changed; 240 } 241 IsSafeAreaPaddingChanged()242 bool IsSafeAreaPaddingChanged() const 243 { 244 return safeAreaPaddingChanged_; 245 } 246 GetTitleBarOffsetY()247 float GetTitleBarOffsetY() const 248 { 249 return titleBarOffsetY_; 250 } 251 SetTitleBarOffsetY(float titleBarOffsetY)252 void SetTitleBarOffsetY(float titleBarOffsetY) 253 { 254 titleBarOffsetY_ = titleBarOffsetY; 255 } 256 257 void MarkSafeAreaPaddingChangedWithCheckTitleBar(float titleBarHeight); 258 protected: 259 void AbortBarAnimation(); 260 void UpdateHideBarProperty(); 261 void ExpandContentSafeAreaIfNeeded(); 262 void RemoveAnimation(int32_t id); 263 void BarAnimationPropertyCallback( 264 bool needRunTitleBarAnimation, bool hideTitle, bool needRunToolBarAnimation, bool hideTool); 265 void BarAnimationFinishCallback(bool needRunTitleBarAnimation, bool needRunToolBarAnimation, int32_t animationId); 266 void UpdateLayoutPropertyBeforeAnimation(const RefPtr<NavDestinationNodeBase>& navNodeBase, 267 bool needRunTitleBarAnimation, bool needRunToolBarAnimation, bool hideTitleBar, bool hideToolBar); 268 269 bool isHideToolbar_ = false; 270 bool isHideTitlebar_ = false; 271 std::optional<BarStyle> titleBarStyle_; 272 std::optional<BarStyle> toolBarStyle_; 273 bool safeAreaPaddingChanged_ = false; 274 float avoidKeyboardOffset_ = 0.0f; 275 std::vector<BarItem> titleBarMenuItems_; 276 std::vector<BarItem> toolBarMenuItems_; 277 std::optional<int32_t> menuNodeId_; 278 std::optional<int32_t> landscapeMenuNodeId_; 279 int32_t maxMenuNums_ = -1; 280 float titleBarHeight_ = 0.0f; 281 float titleBarOffsetY_ = 0.0f; 282 float toolBarHeight_ = 0.0f; 283 float toolBarDividerHeight_ = 0.0f; 284 int32_t titleBarAnimationCount_ = 0; 285 int32_t toolBarAnimationCount_ = 0; 286 std::optional<bool> currHideTitleBar_; 287 std::optional<bool> currHideToolBar_; 288 bool needHideToolBarForNavWidth_ = false; 289 int32_t nextBarAnimationId_ = 0; 290 std::unordered_map<int32_t, std::shared_ptr<AnimationUtils::Animation>> barAnimations_; 291 std::optional<int32_t> preWidth_; 292 }; 293 } // namespace OHOS::Ace::NG 294 295 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_PATTERN_BASE_H