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