• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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