• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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_TITLE_BAR_PATTERN_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_TITLE_BAR_PATTERN_H
18 
19 #include "base/memory/referenced.h"
20 #include "core/components_ng/base/ui_node.h"
21 #include "core/components_ng/pattern/navigation/title_bar_accessibility_property.h"
22 #include "core/components_ng/pattern/navigation/title_bar_layout_algorithm.h"
23 #include "core/components_ng/pattern/navigation/title_bar_layout_property.h"
24 #include "core/components_ng/pattern/pattern.h"
25 
26 namespace OHOS::Ace::NG {
27 
28 class TitleBarPattern : public Pattern {
29     DECLARE_ACE_TYPE(TitleBarPattern, Pattern);
30 
31 public:
32     TitleBarPattern() = default;
33     ~TitleBarPattern() override = default;
34 
CreateLayoutProperty()35     RefPtr<LayoutProperty> CreateLayoutProperty() override
36     {
37         return MakeRefPtr<TitleBarLayoutProperty>();
38     }
39 
CreateAccessibilityProperty()40     RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override
41     {
42         return MakeRefPtr<TitleBarAccessibilityProperty>();
43     }
44 
CreateLayoutAlgorithm()45     RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override
46     {
47         auto titleBarLayoutAlgorithm = MakeRefPtr<TitleBarLayoutAlgorithm>();
48         titleBarLayoutAlgorithm->SetInitialTitleOffsetY(initialTitleOffsetY_);
49         titleBarLayoutAlgorithm->MarkIsInitialTitle(isInitialTitle_);
50         titleBarLayoutAlgorithm->SetInitialSubtitleOffsetY(initialSubtitleOffsetY_);
51         titleBarLayoutAlgorithm->MarkIsInitialSubtitle(isInitialSubtitle_);
52         titleBarLayoutAlgorithm->SetMinTitleHeight(minTitleHeight_);
53         return titleBarLayoutAlgorithm;
54     }
55 
IsAtomicNode()56     bool IsAtomicNode() const override
57     {
58         return false;
59     }
60 
61     void OnModifyDone() override;
62 
GetTempTitleBarHeight()63     float GetTempTitleBarHeight() const
64     {
65         return tempTitleBarHeight_;
66     }
67 
GetDefaultTitleBarHeight()68     float GetDefaultTitleBarHeight() const
69     {
70         return defaultTitleBarHeight_;
71     }
72 
GetTempTitleOffsetY()73     float GetTempTitleOffsetY() const
74     {
75         return tempTitleOffsetY_;
76     }
77 
GetTempSubTitleOffsetY()78     float GetTempSubTitleOffsetY() const
79     {
80         return tempSubTitleOffsetY_;
81     }
82 
GetMaxTitleBarHeight()83     float GetMaxTitleBarHeight() const
84     {
85         return maxTitleBarHeight_;
86     }
87 
88     bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override;
89 
IsInitialTitle()90     bool IsInitialTitle() const
91     {
92         return isInitialTitle_;
93     }
94 
MarkIsInitialTitle(bool isInitialTitle)95     void MarkIsInitialTitle(bool isInitialTitle)
96     {
97         isInitialTitle_ = isInitialTitle;
98     }
99 
IsInitialSubtitle()100     bool IsInitialSubtitle() const
101     {
102         return isInitialSubtitle_;
103     }
104 
MarkIsInitialSubtitle(bool isInitialSubtitle)105     void MarkIsInitialSubtitle(bool isInitialSubtitle)
106     {
107         isInitialSubtitle_ = isInitialSubtitle;
108     }
109 
110     void ProcessTittleDragStart(float offset);
111     void ProcessTittleDragUpdate(float offset);
112     void ProcessTittleDragEnd();
113 
GetCurrentOffset()114     float GetCurrentOffset()
115     {
116         return tempTitleBarHeight_ - defaultTitleBarHeight_;
117     }
118 
SetOverDragOffset(float overDragOffset)119     void SetOverDragOffset(float overDragOffset)
120     {
121         overDragOffset_ = overDragOffset;
122     }
123 
GetOverDragOffset()124     float GetOverDragOffset() const
125     {
126         return overDragOffset_;
127     }
128 
IsTitleDraggedDown()129     bool IsTitleDraggedDown() const
130     {
131         if (NearZero(tempTitleBarHeight_)) {
132             return true;
133         }
134         return GreatNotEqual(tempTitleBarHeight_, static_cast<float>(SINGLE_LINE_TITLEBAR_HEIGHT.ConvertToPx())) ?
135             true : false;
136     }
137 
IsTitleFullStatus()138     bool IsTitleFullStatus() const
139     {
140         if (NearZero(tempTitleBarHeight_)) {
141             return true;
142         }
143         GetMaxTitleBarHeight();
144         return GreatOrEqual(tempTitleBarHeight_, maxTitleBarHeight_) ? true : false;
145     }
146 
IsMinTitle()147     bool IsMinTitle() const
148     {
149         if (NearZero(tempTitleBarHeight_)) {
150             return true;
151         }
152         GetMaxTitleBarHeight();
153         return LessNotEqual(tempTitleBarHeight_, maxTitleBarHeight_);
154     }
155 
GetNavigationTitleMode()156     NavigationTitleMode GetNavigationTitleMode() const
157     {
158         return titleMode_;
159     }
160 
SetCanOverDrag(bool CanOverDrag)161     void SetCanOverDrag(bool CanOverDrag)
162     {
163         CanOverDrag_ = CanOverDrag;
164     }
165 
166 private:
167     void TransformScale(float overDragOffset, const RefPtr<FrameNode>& frameNode);
168 
169     void ClearDragState();
170     float GetSubtitleOpacity();
171     float GetFontSize(float offset);
172     float GetMappedOffset(float offset);
173     void SpringAnimation(float startPos, float endPos);
174     void UpdateScaleByDragOverDragOffset(float overDragOffset);
175     void AnimateTo(float offset);
176     void SetTitleStyleByOffset(float offset);
177 
178     void OnAttachToFrameNode() override;
179 
180     // Init pan recognizer to move items when drag update, play translate animation when drag end.
181     void InitPanEvent(const RefPtr<GestureEventHub>& gestureHub);
182     void HandleDragStart(const GestureEvent& info);
183     void HandleDragUpdate(const GestureEvent& info);
184     void HandleDragEnd(double dragVelocity);
185 
186     void SetMaxTitleBarHeight();
187     void SetTempTitleBarHeight(float offsetY);
188     void SetTempTitleOffsetY();
189     void SetTempSubTitleOffsetY();
190     void SetDefaultTitleFontSize();
191     void SetDefaultSubtitleOpacity();
192 
193     float GetTitleHeight();
194     float GetTitleOffsetY();
195     float GetSubTitleHeight();
196     float GetSubTitleOffsetY();
197     void UpdateTitleFontSize(const Dimension& tempTitleFontSize);
198     void UpdateSubTitleOpacity(const double &value);
199     void UpdateTitleModeChange();
200 
201     RefPtr<PanEvent> panEvent_;
202     RefPtr<SpringMotion> springMotion_;
203     RefPtr<Animator> springController_;
204     RefPtr<Animator> animator_;
205 
206     float overDragOffset_ = 0.0f;
207     float maxTitleBarHeight_ = 0.0f;
208     float defaultTitleBarHeight_ = 0.0f;
209     float tempTitleBarHeight_ = 0.0f;
210     float minTitleOffsetY_ = 0.0f;
211     float maxTitleOffsetY_ = 0.0f;
212     // ratio of titleOffsetY difference and titleBarHeight difference
213     float moveRatio_ = 0.0f;
214     float titleMoveDistance_ = 0.0f;
215     float defaultTitleOffsetY_ = 0.0f;
216     float defaultSubtitleOffsetY_ = 0.0f;
217     float tempTitleOffsetY_ = 0.0f;
218     float tempSubTitleOffsetY_ = 0.0f;
219 
220     Dimension defaultTitleFontSize_;
221     // ratio of fontSize difference and titleBarHeight difference
222     double fontSizeRatio_ = 0.0f;
223 
224     float defaultSubtitleOpacity_;
225     // ratio of opacity difference and titleBarHeight difference
226     double opacityRatio_ = 0.0f;
227 
228     float initialTitleOffsetY_ = 0.0f;
229     bool isInitialTitle_ = true;
230     float initialSubtitleOffsetY_ = 0.0f;
231     bool isInitialSubtitle_ = true;
232     float minTitleHeight_ = 0.0f;
233     bool CanOverDrag_ = true;
234 
235     NavigationTitleMode titleMode_ = NavigationTitleMode::FREE;
236 };
237 
238 } // namespace OHOS::Ace::NG
239 
240 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_TITLE_BAR_PATTERN_H
241