• 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_ = 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