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