• 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 "core/common/container.h"
20 #include "base/memory/referenced.h"
21 #include "core/components_ng/base/ui_node.h"
22 #include "core/components_ng/pattern/navigation/navigation_options.h"
23 #include "core/components_ng/pattern/navigation/title_bar_accessibility_property.h"
24 #include "core/components_ng/pattern/navigation/title_bar_layout_algorithm.h"
25 #include "core/components_ng/pattern/navigation/title_bar_layout_property.h"
26 #include "core/components_ng/pattern/pattern.h"
27 
28 namespace OHOS::Ace::NG {
29 
30 class TitleBarPattern : public Pattern {
31     DECLARE_ACE_TYPE(TitleBarPattern, Pattern);
32 
33 public:
34     TitleBarPattern() = default;
35     ~TitleBarPattern() override = default;
36 
CreateLayoutProperty()37     RefPtr<LayoutProperty> CreateLayoutProperty() override
38     {
39         return MakeRefPtr<TitleBarLayoutProperty>();
40     }
41 
CreateAccessibilityProperty()42     RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override
43     {
44         return MakeRefPtr<TitleBarAccessibilityProperty>();
45     }
46 
CreateLayoutAlgorithm()47     RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override
48     {
49         auto titleBarLayoutAlgorithm = MakeRefPtr<TitleBarLayoutAlgorithm>();
50         titleBarLayoutAlgorithm->SetInitialTitleOffsetY(initialTitleOffsetY_);
51         titleBarLayoutAlgorithm->MarkIsInitialTitle(isInitialTitle_);
52         titleBarLayoutAlgorithm->SetInitialSubtitleOffsetY(initialSubtitleOffsetY_);
53         titleBarLayoutAlgorithm->MarkIsInitialSubtitle(isInitialSubtitle_);
54         titleBarLayoutAlgorithm->SetMinTitleHeight(minTitleHeight_);
55         return titleBarLayoutAlgorithm;
56     }
57 
IsAtomicNode()58     bool IsAtomicNode() const override
59     {
60         return false;
61     }
62 
63     void OnModifyDone() override;
64 
GetTempTitleBarHeight()65     float GetTempTitleBarHeight() const
66     {
67         return tempTitleBarHeight_;
68     }
69 
GetDefaultTitleBarHeight()70     float GetDefaultTitleBarHeight() const
71     {
72         return defaultTitleBarHeight_;
73     }
74 
GetTempTitleOffsetY()75     float GetTempTitleOffsetY() const
76     {
77         return tempTitleOffsetY_;
78     }
79 
GetTempSubTitleOffsetY()80     float GetTempSubTitleOffsetY() const
81     {
82         return tempSubTitleOffsetY_;
83     }
84 
GetMaxTitleBarHeight()85     float GetMaxTitleBarHeight() const
86     {
87         return maxTitleBarHeight_;
88     }
89 
90     bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override;
91 
92     void InitTitleParam();
93 
94     bool IsHidden();
95 
IsInitialTitle()96     bool IsInitialTitle() const
97     {
98         return isInitialTitle_;
99     }
100 
MarkIsInitialTitle(bool isInitialTitle)101     void MarkIsInitialTitle(bool isInitialTitle)
102     {
103         isInitialTitle_ = isInitialTitle;
104     }
105 
IsInitialSubtitle()106     bool IsInitialSubtitle() const
107     {
108         return isInitialSubtitle_;
109     }
110 
MarkIsInitialSubtitle(bool isInitialSubtitle)111     void MarkIsInitialSubtitle(bool isInitialSubtitle)
112     {
113         isInitialSubtitle_ = isInitialSubtitle;
114     }
115     void ProcessTitleDragStart(float offset);
116     void ProcessTitleDragUpdate(float offset);
117 
118     void ProcessTitleDragEnd();
119 
120     void OnColorConfigurationUpdate() override;
121 
GetCurrentOffset()122     float GetCurrentOffset()
123     {
124         return tempTitleBarHeight_ - defaultTitleBarHeight_;
125     }
126 
SetOverDragOffset(float overDragOffset)127     void SetOverDragOffset(float overDragOffset)
128     {
129         overDragOffset_ = overDragOffset;
130     }
131 
GetOverDragOffset()132     float GetOverDragOffset() const
133     {
134         return overDragOffset_;
135     }
136 
IsTitleDraggedDown()137     bool IsTitleDraggedDown() const
138     {
139         if (NearZero(tempTitleBarHeight_)) {
140             return true;
141         }
142         return GreatNotEqual(tempTitleBarHeight_, static_cast<float>(SINGLE_LINE_TITLEBAR_HEIGHT.ConvertToPx()));
143     }
144 
IsTitleFullStatus()145     bool IsTitleFullStatus() const
146     {
147         if (NearZero(tempTitleBarHeight_)) {
148             return true;
149         }
150         GetMaxTitleBarHeight();
151         return GreatOrEqual(tempTitleBarHeight_, maxTitleBarHeight_);
152     }
153 
IsMinTitle()154     bool IsMinTitle() const
155     {
156         if (NearZero(tempTitleBarHeight_)) {
157             return true;
158         }
159         GetMaxTitleBarHeight();
160         return LessOrEqual(tempTitleBarHeight_, maxTitleBarHeight_);
161     }
162 
IsCurrentMinTitle()163     bool IsCurrentMinTitle() const
164     {
165         if (NearZero(tempTitleBarHeight_)) {
166             return true;
167         }
168         return LessOrEqual(tempTitleBarHeight_, static_cast<float>(SINGLE_LINE_TITLEBAR_HEIGHT.ConvertToPx()));
169     }
170 
IsCurrentMaxTitle()171     bool IsCurrentMaxTitle() const
172     {
173         if (NearZero(tempTitleBarHeight_)) {
174             return false;
175         }
176         GetMaxTitleBarHeight();
177         return GreatOrEqual(tempTitleBarHeight_, maxTitleBarHeight_);
178     }
179 
IsFreeTitleUpdated()180     bool IsFreeTitleUpdated() const
181     {
182         return isFreeTitleUpdated_;
183     }
184 
GetNavigationTitleMode()185     NavigationTitleMode GetNavigationTitleMode() const
186     {
187         return titleMode_;
188     }
189 
SetCanOverDrag(bool CanOverDrag)190     void SetCanOverDrag(bool CanOverDrag)
191     {
192         CanOverDrag_ = CanOverDrag;
193     }
194 
SetTitleScaleChange(bool isTitleScaleChange)195     void SetTitleScaleChange(bool isTitleScaleChange)
196     {
197         isTitleScaleChange_ = isTitleScaleChange;
198     }
199 
SetCurrentTitleOffsetY(float currentTitleOffsetY)200     void SetCurrentTitleOffsetY(float currentTitleOffsetY)
201     {
202         currentTitleOffsetY_ = currentTitleOffsetY;
203     }
204 
SetCurrentTitleBarHeight(float currentTitleBarHeight)205     void SetCurrentTitleBarHeight(float currentTitleBarHeight)
206     {
207         currentTitleBarHeight_ = currentTitleBarHeight;
208     }
209 
210     void OnCoordScrollStart();
211     float OnCoordScrollUpdate(float offset);
212     void OnCoordScrollEnd();
213 
214     void SetTitlebarOptions(NavigationTitlebarOptions&& opt);
215 
216 private:
217     void TransformScale(float overDragOffset, const RefPtr<FrameNode>& frameNode);
218 
219     void ClearDragState();
220     float GetSubtitleOpacity();
221     float GetFontSize(float offset);
222     float GetMappedOffset(float offset);
223     void SpringAnimation(float startPos, float endPos);
224     void UpdateScaleByDragOverDragOffset(float overDragOffset);
225     void AnimateTo(float offset);
226 
227     void OnAttachToFrameNode() override;
228 
229     void HandleDragStart(const GestureEvent& info);
230     void HandleDragUpdate(const GestureEvent& info);
231     void HandleDragEnd(double dragVelocity);
232 
233     void SetMaxTitleBarHeight();
234     void SetTempTitleBarHeight(float offsetY);
235     void SetTempTitleOffsetY();
236     void SetTempSubTitleOffsetY();
237     void SetDefaultTitleFontSize();
238     void SetDefaultSubtitleOpacity();
239 
240     float GetTitleHeight();
241     float GetSubTitleOffsetY();
242     void UpdateTitleFontSize(const Dimension& tempTitleFontSize);
243     void UpdateSubTitleOpacity(const double &value);
244     void UpdateTitleModeChange();
245     void MountTitle(const RefPtr<TitleBarNode>& hostNode);
246 
247     void UpdateTitleBarByCoordScroll(float offset);
248     void SetTitleStyleByCoordScrollOffset(float offset);
249     float CalculateHandledOffsetMinTitle(float offset, float lastCordScrollOffset);
250     float CalculateHandledOffsetMaxTitle(float offset, float lastCordScrollOffset);
251     float CalculateHandledOffsetBetweenMinAndMaxTitle(float offset, float lastCordScrollOffset);
252 
253     RefPtr<PanEvent> panEvent_;
254     RefPtr<SpringMotion> springMotion_;
255     RefPtr<Animator> springController_;
256     RefPtr<Animator> animator_;
257     std::optional<float> fontSize_;
258     std::optional<float> opacity_;
259 
260     float overDragOffset_ = 0.0f;
261     float maxTitleBarHeight_ = 0.0f;
262     float defaultTitleBarHeight_ = 0.0f;
263     float tempTitleBarHeight_ = 0.0f;
264     float minTitleOffsetY_ = 0.0f;
265     float maxTitleOffsetY_ = 0.0f;
266     // ratio of titleOffsetY difference and titleBarHeight difference
267     float moveRatio_ = 0.0f;
268     float titleMoveDistance_ = 0.0f;
269     float defaultTitleOffsetY_ = 0.0f;
270     float defaultSubtitleOffsetY_ = 0.0f;
271     float tempTitleOffsetY_ = 0.0f;
272     float tempSubTitleOffsetY_ = 0.0f;
273 
274     Dimension defaultTitleFontSize_;
275     // ratio of fontSize difference and titleBarHeight difference
276     double fontSizeRatio_ = 0.0f;
277 
278     float defaultSubtitleOpacity_;
279     // ratio of opacity difference and titleBarHeight difference
280     double opacityRatio_ = 0.0f;
281 
282     float initialTitleOffsetY_ = 0.0f;
283     bool isInitialTitle_ = true;
284     float initialSubtitleOffsetY_ = 0.0f;
285     bool isInitialSubtitle_ = true;
286     float minTitleHeight_ = 0.0f;
287     bool CanOverDrag_ = true;
288     bool isTitleScaleChange_ = true;
289     NavigationTitleMode titleMode_ = NavigationTitleMode::FREE;
290 
291     bool isFreeTitleUpdated_ = false;
292 
293     float coordScrollOffset_ = 0.0f;
294     float coordScrollFinalOffset_ = 0.0f;
295 
296     // the value before title bar expand safe area
297     float currentTitleOffsetY_ = 0.0f;
298     float currentTitleBarHeight_ = 0.0f;
299 
300     NavigationTitlebarOptions options_;
301 };
302 
303 } // namespace OHOS::Ace::NG
304 
305 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_TITLE_BAR_PATTERN_H
306