• 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_NODE_BASE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_NODE_BASE_H
18 
19 #include <cstdint>
20 #include <optional>
21 
22 #include "core/animation/page_transition_common.h"
23 #include "core/common/display_info.h"
24 #include "core/common/page_viewport_config.h"
25 #include "core/components/common/layout/constants.h"
26 #include "core/components_ng/base/group_node.h"
27 #include "core/components_ng/pattern/navigation/navigation_declaration.h"
28 #include "core/components_ng/pattern/pattern.h"
29 #include "core/components_ng/property/property.h"
30 #include "interfaces/inner_api/ace/viewport_config.h"
31 
32 namespace OHOS::Ace::NG {
33 class NavDestinationNodeBase : public GroupNode {
34     DECLARE_ACE_TYPE(NavDestinationNodeBase, GroupNode);
35 public:
NavDestinationNodeBase(const std::string & tag,int32_t nodeId,const RefPtr<Pattern> & pattern)36     NavDestinationNodeBase(const std::string& tag, int32_t nodeId, const RefPtr<Pattern>& pattern)
37         : GroupNode(tag, nodeId, pattern) {}
38     ~NavDestinationNodeBase() override = default;
39 
IsAtomicNode()40     bool IsAtomicNode() const override
41     {
42         return false;
43     }
44 
SetMenu(const RefPtr<UINode> & menu)45     void SetMenu(const RefPtr<UINode>& menu)
46     {
47         menu_ = menu;
48     }
49 
GetMenu()50     const RefPtr<UINode>& GetMenu() const
51     {
52         return menu_;
53     }
54 
SetToolbarContainer(const RefPtr<UINode> & menu)55     void SetToolbarContainer(const RefPtr<UINode>& menu)
56     {
57         toolbarMenu_ = menu;
58     }
59 
GetToolbarContainer()60     const RefPtr<UINode>& GetToolbarContainer() const
61     {
62         return toolbarMenu_;
63     }
64 
SetMenuNode(const RefPtr<UINode> & menuNode)65     void SetMenuNode(const RefPtr<UINode>& menuNode)
66     {
67         moreMenuNode_ = menuNode;
68     }
69 
SetToolbarMenuNode(const RefPtr<UINode> & menuNode)70     void SetToolbarMenuNode(const RefPtr<UINode>& menuNode)
71     {
72         toolbarMoreMenuNode_ = menuNode;
73     }
74 
SetLandscapeMenuNode(const RefPtr<UINode> & moreLandscapeMenuNode)75     void SetLandscapeMenuNode(const RefPtr<UINode>& moreLandscapeMenuNode)
76     {
77         moreLandscapeMenuNode_ = moreLandscapeMenuNode;
78     }
79 
SetLandscapeMenu(const RefPtr<UINode> & menu)80     void SetLandscapeMenu(const RefPtr<UINode>& menu)
81     {
82         landscapeMenu_ = menu;
83     }
84 
GetLandscapeMenu()85     const RefPtr<UINode>& GetLandscapeMenu() const
86     {
87         return landscapeMenu_;
88     }
89 
SetContentNode(const RefPtr<UINode> & contentNode)90     void SetContentNode(const RefPtr<UINode>& contentNode)
91     {
92         contentNode_ = contentNode;
93     }
94 
GetContentNode()95     const RefPtr<UINode>& GetContentNode() const
96     {
97         return contentNode_;
98     }
99 
SetTitleBarNode(const RefPtr<UINode> & title)100     void SetTitleBarNode(const RefPtr<UINode>& title)
101     {
102         titleBarNode_ = title;
103     }
104 
GetTitleBarNode()105     const RefPtr<UINode>& GetTitleBarNode() const
106     {
107         return titleBarNode_;
108     }
109 
SetToolBarNode(const RefPtr<UINode> & toolBarNode)110     void SetToolBarNode(const RefPtr<UINode>& toolBarNode)
111     {
112         toolBarNode_ = toolBarNode;
113     }
114 
GetToolBarNode()115     const RefPtr<UINode>& GetToolBarNode() const
116     {
117         return toolBarNode_;
118     }
119 
SetPreToolBarNode(const RefPtr<UINode> & preToolBarNode)120     void SetPreToolBarNode(const RefPtr<UINode>& preToolBarNode)
121     {
122         preToolBarNode_ = preToolBarNode;
123     }
124 
GetPreToolBarNode()125     const RefPtr<UINode>& GetPreToolBarNode() const
126     {
127         return preToolBarNode_;
128     }
129 
SetToolBarDividerNode(const RefPtr<UINode> & toolBarDividerNode)130     void SetToolBarDividerNode(const RefPtr<UINode>& toolBarDividerNode)
131     {
132         toolBarDividerNode_ = toolBarDividerNode;
133     }
134 
GetToolBarDividerNode()135     const RefPtr<UINode>& GetToolBarDividerNode() const
136     {
137         return toolBarDividerNode_;
138     }
139 
SetIsUseToolbarConfiguration(bool isNewToolbar)140     void SetIsUseToolbarConfiguration(bool isNewToolbar)
141     {
142         isNewToolbar_ = isNewToolbar;
143     }
144 
145     bool IsToolBarVisible() const;
146 
IsUseToolbarConfiguration()147     bool IsUseToolbarConfiguration() const
148     {
149         return isNewToolbar_;
150     }
151 
152     std::string GetBarItemsString(bool isMenu) const;
IsNodeInvisible(const RefPtr<FrameNode> & node)153     virtual bool IsNodeInvisible(const RefPtr<FrameNode>& node) { return false; }
154 
155     // custom node checking
156     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(PrevTitleIsCustom, bool);
OnPrevTitleIsCustomUpdate(bool value)157     void OnPrevTitleIsCustomUpdate(bool value) {}
158     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(PrevMenuIsCustom, bool);
OnPrevMenuIsCustomUpdate(bool value)159     void OnPrevMenuIsCustomUpdate(bool value) {}
160     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(PrevToolBarIsCustom, bool);
OnPrevToolBarIsCustomUpdate(bool value)161     void OnPrevToolBarIsCustomUpdate(bool value) {}
162 
163     // node operation related
164     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(MenuNodeOperation, ChildNodeOperation);
OnMenuNodeOperationUpdate(ChildNodeOperation value)165     void OnMenuNodeOperationUpdate(ChildNodeOperation value) {}
166     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(ToolBarNodeOperation, ChildNodeOperation);
OnToolBarNodeOperationUpdate(ChildNodeOperation value)167     void OnToolBarNodeOperationUpdate(ChildNodeOperation value) {}
168 
SetTransitionType(PageTransitionType type)169     void SetTransitionType(PageTransitionType type)
170     {
171         transitionType_ = type;
172     }
173 
GetTransitionType()174     PageTransitionType GetTransitionType() const
175     {
176         return transitionType_;
177     }
178 
GetLanguageDirection()179     float GetLanguageDirection()
180     {
181         return AceApplicationInfo::GetInstance().IsRightToLeft() ? -1.0f : 1.0f;
182     }
183 
UpdateAnimationId(int32_t animationId)184     void UpdateAnimationId(int32_t animationId)
185     {
186         animationId_ = animationId;
187     }
188 
GetAnimationId()189     int32_t GetAnimationId() const
190     {
191         return animationId_;
192     }
193 
GetNavigationNode()194     virtual RefPtr<UINode> GetNavigationNode()
195     {
196         return nullptr;
197     }
198 
199     bool CustomizeExpandSafeArea();
200     void Measure(const std::optional<LayoutConstraintF>& parentConstraint) override;
201     void Layout() override;
202 
SetOrientation(const std::optional<Orientation> & ori)203     void SetOrientation(const std::optional<Orientation>& ori)
204     {
205         orientation_ = ori;
206     }
GetOrientation()207     const std::optional<Orientation>& GetOrientation() const
208     {
209         return orientation_;
210     }
SetPreOrientation(const std::optional<Orientation> & ori)211     void SetPreOrientation(const std::optional<Orientation>& ori)
212     {
213         preOrientation_ = ori;
214     }
GetPreOrientation()215     const std::optional<Orientation>& GetPreOrientation() const
216     {
217         return preOrientation_;
218     }
219     void SetPageViewportConfig(const RefPtr<PageViewportConfig>& config);
GetPageViewportConfig()220     const RefPtr<PageViewportConfig>& GetPageViewportConfig() const
221     {
222         return viewportConfig_;
223     }
SetPageRotateAngle(const std::optional<int32_t> & angle)224     void SetPageRotateAngle(const std::optional<int32_t>& angle)
225     {
226         rotateAngle_ = angle;
227     }
GetPageRotateAngle()228     const std::optional<int32_t>& GetPageRotateAngle() const
229     {
230         return rotateAngle_;
231     }
SetIsRotated(bool rotate)232     void SetIsRotated(bool rotate)
233     {
234         isRotated_ = rotate;
235     }
IsRotated()236     bool IsRotated() const
237     {
238         return isRotated_;
239     }
240 
241     LayoutConstraintF AdjustLayoutConstarintIfNeeded(const LayoutConstraintF& originConstraint);
242 
243     void AdjustRenderContextIfNeeded();
244     void RestoreRenderContext();
245 
SetOnStartTransitionAnimationCallback(std::function<void ()> && callback)246     void SetOnStartTransitionAnimationCallback(std::function<void()>&& callback)
247     {
248         onStartTransitionAnimationCb_ = std::move(callback);
249     }
OnStartOneTransitionAnimation()250     void OnStartOneTransitionAnimation()
251     {
252         if (onStartTransitionAnimationCb_) {
253             onStartTransitionAnimationCb_();
254         }
255     }
SetOnFinishTransitionAnimationCallback(std::function<void ()> && callback)256     void SetOnFinishTransitionAnimationCallback(std::function<void()>&& callback)
257     {
258         onFinishTransitionAnimationCb_ = std::move(callback);
259     }
OnFinishOneTransitionAnimation()260     void OnFinishOneTransitionAnimation()
261     {
262         if (onFinishTransitionAnimationCb_) {
263             onFinishTransitionAnimationCb_();
264         }
265     }
266 
SetStatusBarConfig(const std::optional<std::pair<bool,bool>> & status)267     void SetStatusBarConfig(const std::optional<std::pair<bool, bool>>& status)
268     {
269         statusBarConfig_ = status;
270     }
GetStatusBarConfig()271     const std::optional<std::pair<bool, bool>>& GetStatusBarConfig()
272     {
273         return statusBarConfig_;
274     }
SetPreStatusBarConfig(const std::optional<std::pair<bool,bool>> & status)275     void SetPreStatusBarConfig(const std::optional<std::pair<bool, bool>>& status)
276     {
277         preStatusBarConfig_ = status;
278     }
GetPreStatusBarConfig()279     const std::optional<std::pair<bool, bool>>& GetPreStatusBarConfig()
280     {
281         return preStatusBarConfig_;
282     }
283 
SetNavigationIndicatorConfig(const std::optional<bool> & navigationIndicator)284     void SetNavigationIndicatorConfig(const std::optional<bool>& navigationIndicator)
285     {
286         navigationIndicatorConfig_ = navigationIndicator;
287     }
GetNavigationIndicatorConfig()288     const std::optional<bool>& GetNavigationIndicatorConfig()
289     {
290         return navigationIndicatorConfig_;
291     }
SetPreNavigationIndicatorConfig(const std::optional<bool> & navigationIndicator)292     void SetPreNavigationIndicatorConfig(const std::optional<bool>& navigationIndicator)
293     {
294         preNavigationIndicatorConfig_ = navigationIndicator;
295     }
GetPreNavigationIndicatorConfig()296     const std::optional<bool>& GetPreNavigationIndicatorConfig()
297     {
298         return preNavigationIndicatorConfig_;
299     }
SetIsSizeMatchNavigation(bool match)300     void SetIsSizeMatchNavigation(bool match)
301     {
302         isSizeMatchNavigation_ = match;
303     }
IsSizeMatchNavigation()304     bool IsSizeMatchNavigation() const
305     {
306         return isSizeMatchNavigation_;
307     }
308 
SetNavDestinationType(NavDestinationType type)309     void SetNavDestinationType(NavDestinationType type)
310     {
311         destType_ = type;
312     }
GetNavDestinationType()313     NavDestinationType GetNavDestinationType() const
314     {
315         return destType_;
316     }
317 
SystemTransitionPushStart(bool transitionIn)318     virtual void SystemTransitionPushStart(bool transitionIn) {}
SystemTransitionPushEnd(bool transitionIn)319     virtual void SystemTransitionPushEnd(bool transitionIn) {}
320     virtual void SystemTransitionPushFinish(bool transitionIn, int32_t animationId = -1) {}
321 
SystemTransitionPopStart(bool transitionIn)322     virtual void SystemTransitionPopStart(bool transitionIn) {}
SystemTransitionPopEnd(bool transitionIn)323     virtual void SystemTransitionPopEnd(bool transitionIn) {}
324     virtual bool SystemTransitionPopFinish(int32_t animationId = -1, bool isNeedCleanContent = true)
325     {
326         return true;
327     }
SetIsHomeDestination(bool isHome)328     void SetIsHomeDestination(bool isHome)
329     {
330         isHomeDestination_ = isHome;
331     }
IsHomeDestination()332     bool IsHomeDestination() const
333     {
334         return isHomeDestination_;
335     }
336 
337 protected:
338     RectF CalcFullClipRectForTransition(const SizeF& frameSize);
339     RectF CalcHalfClipRectForTransition(const SizeF& frameSize);
340     // push
341     OffsetF CalcTranslateForTransitionPushStart(const SizeF& frameSize, bool transitionIn);
342     OffsetF CalcTranslateForTransitionPushEnd(const SizeF& frameSize, bool transitionIn);
343     // pop
344     OffsetF CalcTranslateForTransitionPopStart(const SizeF& frameSize, bool transitionIn);
345     OffsetF CalcTranslateForTransitionPopEnd(const SizeF& frameSize, bool transitionIn);
346     // Dialog
347     TranslateOptions CalcContentTranslateForDialog(const SizeF& frameSize);
348     // slide
349     OffsetF CalcTranslateForSlideTransition(const SizeF& paintRect, bool isRight, bool isEnter, bool isEnd);
350 
351     OffsetF GetParentGlobalOffsetWithSafeArea(bool checkBoundary = false, bool checkPosition = false) const override;
352 
353     bool isHomeDestination_ = false;
354     RefPtr<UINode> contentNode_;
355     RefPtr<UINode> menu_;
356     RefPtr<UINode> toolbarMenu_;
357     RefPtr<UINode> landscapeMenu_;
358     RefPtr<UINode> moreMenuNode_;
359     RefPtr<UINode> toolbarMoreMenuNode_;
360     RefPtr<UINode> moreLandscapeMenuNode_;
361     RefPtr<UINode> titleBarNode_;
362     RefPtr<UINode> toolBarNode_;
363     RefPtr<UINode> preToolBarNode_;
364     RefPtr<UINode> toolBarDividerNode_;
365     bool isNewToolbar_ = false;
366     int32_t animationId_ = -1;
367     PageTransitionType transitionType_ = PageTransitionType::NONE;
368     std::optional<Orientation> orientation_;
369     std::optional<Orientation> preOrientation_;
370     RefPtr<PageViewportConfig> viewportConfig_;
371     SafeAreaInsets safeAreaInsets_;
372     bool isRotated_ = false;
373     std::optional<int32_t> rotateAngle_;
374     bool isCustomExpandRunning_ = false;
375     std::function<void()> onStartTransitionAnimationCb_;
376     std::function<void()> onFinishTransitionAnimationCb_;
377     // pair.first -> enable, pair.second -> animated
378     std::optional<std::pair<bool, bool>> statusBarConfig_;
379     std::optional<std::pair<bool, bool>> preStatusBarConfig_;
380     std::optional<bool> navigationIndicatorConfig_;
381     std::optional<bool> preNavigationIndicatorConfig_;
382     bool isSizeMatchNavigation_ = true;
383     NavDestinationType destType_ = NavDestinationType::DETAIL;
384 };
385 } // namespace OHOS::Ace::NG
386 
387 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_NODE_BASE_H