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_layout_algorithm.h" 22 #include "core/components_ng/pattern/navigation/title_bar_layout_property.h" 23 #include "core/components_ng/pattern/pattern.h" 24 25 namespace OHOS::Ace::NG { 26 27 class TitleBarPattern : public Pattern { 28 DECLARE_ACE_TYPE(TitleBarPattern, Pattern); 29 30 public: 31 TitleBarPattern() = default; 32 ~TitleBarPattern() override = default; 33 CreateLayoutProperty()34 RefPtr<LayoutProperty> CreateLayoutProperty() override 35 { 36 return MakeRefPtr<TitleBarLayoutProperty>(); 37 } 38 CreateLayoutAlgorithm()39 RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override 40 { 41 auto titleBarLayoutAlgorithm = MakeRefPtr<TitleBarLayoutAlgorithm>(); 42 titleBarLayoutAlgorithm->SetInitialTitleOffsetY(initialTitleOffsetY_); 43 titleBarLayoutAlgorithm->MarkIsInitialTitle(isInitialTitle_); 44 titleBarLayoutAlgorithm->SetInitialSubtitleOffsetY(initialSubtitleOffsetY_); 45 titleBarLayoutAlgorithm->MarkIsInitialSubtitle(isInitialSubtitle_); 46 titleBarLayoutAlgorithm->SetMinTitleHeight(minTitleHeight_); 47 return titleBarLayoutAlgorithm; 48 } 49 IsAtomicNode()50 bool IsAtomicNode() const override 51 { 52 return false; 53 } 54 55 void OnModifyDone() override; 56 GetTempTitleBarHeight()57 float GetTempTitleBarHeight() const 58 { 59 return tempTitleBarHeight_; 60 } 61 GetDefaultTitleBarHeight()62 float GetDefaultTitleBarHeight() const 63 { 64 return defaultTitleBarHeight_; 65 } 66 GetTempTitleOffsetY()67 float GetTempTitleOffsetY() const 68 { 69 return tempTitleOffsetY_; 70 } 71 GetTempSubTitleOffsetY()72 float GetTempSubTitleOffsetY() const 73 { 74 return tempSubTitleOffsetY_; 75 } 76 GetMaxTitleBarHeight()77 float GetMaxTitleBarHeight() const 78 { 79 return maxTitleBarHeight_; 80 } 81 82 bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override; 83 IsInitialTitle()84 bool IsInitialTitle() const 85 { 86 return isInitialTitle_; 87 } 88 MarkIsInitialTitle(bool isInitialTitle)89 void MarkIsInitialTitle(bool isInitialTitle) 90 { 91 isInitialTitle_ = isInitialTitle; 92 } 93 IsInitialSubtitle()94 bool IsInitialSubtitle() const 95 { 96 return isInitialSubtitle_; 97 } 98 MarkIsInitialSubtitle(bool isInitialSubtitle)99 void MarkIsInitialSubtitle(bool isInitialSubtitle) 100 { 101 isInitialSubtitle_ = isInitialSubtitle; 102 } 103 104 private: 105 void OnAttachToFrameNode() override; 106 107 // Init pan recognizer to move items when drag update, play translate animation when drag end. 108 void InitPanEvent(const RefPtr<GestureEventHub>& gestureHub); 109 void HandleDragStart(const GestureEvent& info); 110 void HandleDragUpdate(const GestureEvent& info); 111 void HandleDragEnd(double dragVelocity); 112 113 void SetMaxTitleBarHeight(); 114 void SetTempTitleBarHeight(float offsetY); 115 void SetTempTitleOffsetY(); 116 void SetTempSubTitleOffsetY(); 117 void SetDefaultTitleFontSize(); 118 void SetDefaultSubtitleOpacity(); 119 120 float GetTitleHeight(); 121 float GetTitleOffsetY(); 122 float GetSubTitleHeight(); 123 float GetSubTitleOffsetY(); 124 void UpdateTitleFontSize(const Dimension& tempTitleFontSize); 125 void UpdateSubTitleOpacity(const double &value); 126 127 RefPtr<PanEvent> panEvent_; 128 129 float maxTitleBarHeight_ = 0.0f; 130 float defaultTitleBarHeight_ = 0.0f; 131 float tempTitleBarHeight_ = 0.0f; 132 float minTitleOffsetY_ = 0.0f; 133 float maxTitleOffsetY_ = 0.0f; 134 // ratio of titleOffsetY difference and titleBarHeight difference 135 float moveRatio_ = 0.0f; 136 float titleMoveDistance_ = 0.0f; 137 float defaultTitleOffsetY_ = 0.0f; 138 float defaultSubtitleOffsetY_ = 0.0f; 139 float tempTitleOffsetY_ = 0.0f; 140 float tempSubTitleOffsetY_ = 0.0f; 141 142 Dimension defaultTitleFontSize_; 143 // ratio of fontSize difference and titleBarHeight difference 144 double fontSizeRatio_ = 0.0f; 145 146 float defaultSubtitleOpacity_; 147 // ratio of opacity difference and titleBarHeight difference 148 double opacityRatio_ = 0.0f; 149 150 float initialTitleOffsetY_ = 0.0f; 151 bool isInitialTitle_ = true; 152 float initialSubtitleOffsetY_ = 0.0f; 153 bool isInitialSubtitle_ = true; 154 float minTitleHeight_ = 0.0f; 155 }; 156 157 } // namespace OHOS::Ace::NG 158 159 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_TITLE_BAR_PATTERN_H 160