• 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 
114     void OnColorConfigurationUpdate() override;
115 
GetCurrentOffset()116     float GetCurrentOffset()
117     {
118         return tempTitleBarHeight_ - defaultTitleBarHeight_;
119     }
120 
SetOverDragOffset(float overDragOffset)121     void SetOverDragOffset(float overDragOffset)
122     {
123         overDragOffset_ = overDragOffset;
124     }
125 
GetOverDragOffset()126     float GetOverDragOffset() const
127     {
128         return overDragOffset_;
129     }
130 
IsTitleDraggedDown()131     bool IsTitleDraggedDown() const
132     {
133         if (NearZero(tempTitleBarHeight_)) {
134             return true;
135         }
136         return GreatNotEqual(tempTitleBarHeight_, static_cast<float>(SINGLE_LINE_TITLEBAR_HEIGHT.ConvertToPx())) ?
137             true : false;
138     }
139 
IsTitleFullStatus()140     bool IsTitleFullStatus() const
141     {
142         if (NearZero(tempTitleBarHeight_)) {
143             return true;
144         }
145         GetMaxTitleBarHeight();
146         return GreatOrEqual(tempTitleBarHeight_, maxTitleBarHeight_) ? true : false;
147     }
148 
IsMinTitle()149     bool IsMinTitle() const
150     {
151         if (NearZero(tempTitleBarHeight_)) {
152             return true;
153         }
154         GetMaxTitleBarHeight();
155         return LessNotEqual(tempTitleBarHeight_, maxTitleBarHeight_);
156     }
157 
GetNavigationTitleMode()158     NavigationTitleMode GetNavigationTitleMode() const
159     {
160         return titleMode_;
161     }
162 
SetCanOverDrag(bool CanOverDrag)163     void SetCanOverDrag(bool CanOverDrag)
164     {
165         CanOverDrag_ = CanOverDrag;
166     }
167 
168 private:
169     void TransformScale(float overDragOffset, const RefPtr<FrameNode>& frameNode);
170 
171     void ClearDragState();
172     float GetSubtitleOpacity();
173     float GetFontSize(float offset);
174     float GetMappedOffset(float offset);
175     void SpringAnimation(float startPos, float endPos);
176     void UpdateScaleByDragOverDragOffset(float overDragOffset);
177     void AnimateTo(float offset);
178     void SetTitleStyleByOffset(float offset);
179 
180     void OnAttachToFrameNode() override;
181 
182     // Init pan recognizer to move items when drag update, play translate animation when drag end.
183     void InitPanEvent(const RefPtr<GestureEventHub>& gestureHub);
184     void HandleDragStart(const GestureEvent& info);
185     void HandleDragUpdate(const GestureEvent& info);
186     void HandleDragEnd(double dragVelocity);
187 
188     void SetMaxTitleBarHeight();
189     void SetTempTitleBarHeight(float offsetY);
190     void SetTempTitleOffsetY();
191     void SetTempSubTitleOffsetY();
192     void SetDefaultTitleFontSize();
193     void SetDefaultSubtitleOpacity();
194 
195     float GetTitleHeight();
196     float GetTitleOffsetY();
197     float GetSubTitleHeight();
198     float GetSubTitleOffsetY();
199     void UpdateTitleFontSize(const Dimension& tempTitleFontSize);
200     void UpdateSubTitleOpacity(const double &value);
201     void UpdateTitleModeChange();
202 
203     RefPtr<PanEvent> panEvent_;
204     RefPtr<SpringMotion> springMotion_;
205     RefPtr<Animator> springController_;
206     RefPtr<Animator> animator_;
207 
208     float overDragOffset_ = 0.0f;
209     float maxTitleBarHeight_ = 0.0f;
210     float defaultTitleBarHeight_ = 0.0f;
211     float tempTitleBarHeight_ = 0.0f;
212     float minTitleOffsetY_ = 0.0f;
213     float maxTitleOffsetY_ = 0.0f;
214     // ratio of titleOffsetY difference and titleBarHeight difference
215     float moveRatio_ = 0.0f;
216     float titleMoveDistance_ = 0.0f;
217     float defaultTitleOffsetY_ = 0.0f;
218     float defaultSubtitleOffsetY_ = 0.0f;
219     float tempTitleOffsetY_ = 0.0f;
220     float tempSubTitleOffsetY_ = 0.0f;
221 
222     Dimension defaultTitleFontSize_;
223     // ratio of fontSize difference and titleBarHeight difference
224     double fontSizeRatio_ = 0.0f;
225 
226     float defaultSubtitleOpacity_;
227     // ratio of opacity difference and titleBarHeight difference
228     double opacityRatio_ = 0.0f;
229 
230     float initialTitleOffsetY_ = 0.0f;
231     bool isInitialTitle_ = true;
232     float initialSubtitleOffsetY_ = 0.0f;
233     bool isInitialSubtitle_ = true;
234     float minTitleHeight_ = 0.0f;
235     bool CanOverDrag_ = true;
236 
237     NavigationTitleMode titleMode_ = NavigationTitleMode::FREE;
238 };
239 
240 } // namespace OHOS::Ace::NG
241 
242 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_TITLE_BAR_PATTERN_H
243