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