1 /* 2 * Copyright (c) 2022-2023 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_PATTERN_SIDE_BAR_SIDE_BAR_CONTAINER_LAYOUT_ALGORITHM_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SIDE_BAR_SIDE_BAR_CONTAINER_LAYOUT_ALGORITHM_H 18 19 #include "base/memory/referenced.h" 20 #include "core/components/common/layout/constants.h" 21 #include "core/components_ng/layout/layout_algorithm.h" 22 #include "core/components_ng/layout/layout_wrapper.h" 23 #include "core/components_ng/pattern/pattern.h" 24 #include "core/components_ng/pattern/side_bar/side_bar_container_layout_property.h" 25 26 namespace OHOS::Ace::NG { 27 28 class ACE_EXPORT SideBarContainerLayoutAlgorithm : public LayoutAlgorithm { 29 DECLARE_ACE_TYPE(SideBarContainerLayoutAlgorithm, LayoutAlgorithm); 30 31 public: 32 SideBarContainerLayoutAlgorithm() = default; 33 ~SideBarContainerLayoutAlgorithm() override = default; 34 OnReset()35 void OnReset() override {} 36 void Measure(LayoutWrapper* layoutWrapper) override; 37 void Layout(LayoutWrapper* layoutWrapper) override; 38 SetCurrentOffset(float offset)39 void SetCurrentOffset(float offset) 40 { 41 currentOffset_ = offset; 42 } 43 SetSideBarStatus(SideBarStatus sideBarStatus)44 void SetSideBarStatus(SideBarStatus sideBarStatus) 45 { 46 sideBarStatus_ = sideBarStatus; 47 } 48 GetSideBarStatus()49 SideBarStatus GetSideBarStatus() const 50 { 51 return sideBarStatus_; 52 } 53 SetRealSideBarWidth(Dimension realSideBarWidth)54 void SetRealSideBarWidth(Dimension realSideBarWidth) 55 { 56 realSideBarWidthDimension_ = realSideBarWidth; 57 } 58 GetRealSideBarWidth()59 Dimension GetRealSideBarWidth() const 60 { 61 return realSideBarWidthDimension_; 62 } 63 SetRealDividerWidth(float realDividerWidth)64 void SetRealDividerWidth(float realDividerWidth) 65 { 66 realDividerWidth_ = realDividerWidth; 67 } 68 GetRealDividerWidth()69 float GetRealDividerWidth() const 70 { 71 return realDividerWidth_; 72 } 73 SetNeedInitRealSideBarWidth(bool needInitRealSideBarWidth)74 void SetNeedInitRealSideBarWidth(bool needInitRealSideBarWidth) 75 { 76 needInitRealSideBarWidth_ = needInitRealSideBarWidth; 77 } 78 SetRealSideBarHeight(float realSideBarHeight)79 void SetRealSideBarHeight(float realSideBarHeight) 80 { 81 realSideBarHeight_ = realSideBarHeight; 82 } 83 GetRealSideBarHeight()84 float GetRealSideBarHeight() const 85 { 86 return realSideBarHeight_; 87 } 88 GetSideBarOffset()89 OffsetF GetSideBarOffset() const 90 { 91 return sideBarOffset_; 92 } 93 GetSideBarContainerType()94 SideBarContainerType GetSideBarContainerType() const 95 { 96 return type_; 97 } 98 SetSideBarContainerType(SideBarContainerType type)99 void SetSideBarContainerType(SideBarContainerType type) 100 { 101 type_ = type; 102 } 103 SetControlButtonClick(bool value)104 void SetControlButtonClick(bool value) 105 { 106 isControlButtonClick_ = value; 107 } 108 GetAdjustMaxSideBarWidth()109 Dimension GetAdjustMaxSideBarWidth() const 110 { 111 return adjustMaxSideBarWidth_; 112 } 113 GetAdjustMinSideBarWidth()114 Dimension GetAdjustMinSideBarWidth() const 115 { 116 return adjustMinSideBarWidth_; 117 } 118 SetMinSideBarWidth(float minSideBarWidth)119 void SetMinSideBarWidth(float minSideBarWidth) 120 { 121 minSideBarWidth_ = minSideBarWidth; 122 } 123 SetMaxSideBarWidth(float maxSideBarWidth)124 void SetMaxSideBarWidth(float maxSideBarWidth) 125 { 126 maxSideBarWidth_ = maxSideBarWidth; 127 } 128 SetMinContentWidth(float minContentWidth)129 void SetMinContentWidth(float minContentWidth) 130 { 131 minContentWidth_ = minContentWidth; 132 } 133 SetTypeUpdateWidth(float typeUpdateWidth)134 void SetTypeUpdateWidth(float typeUpdateWidth) 135 { 136 typeUpdateWidth_ = typeUpdateWidth; 137 } 138 SetPattern(const WeakPtr<Pattern> & pattern)139 void SetPattern(const WeakPtr<Pattern>& pattern) 140 { 141 pattern_ = pattern; 142 } 143 SetControlImageWidth(const Dimension & width)144 void SetControlImageWidth(const Dimension& width) 145 { 146 controlImageWidth_ = width; 147 } 148 SetControlImageHeight(const Dimension & height)149 void SetControlImageHeight(const Dimension& height) 150 { 151 controlImageHeight_ = height; 152 } 153 SetPreSideBarWidth(Dimension value)154 void SetPreSideBarWidth(Dimension value) 155 { 156 preSideBarWidth_ = value; 157 } 158 GetPreSideBarWidth()159 Dimension GetPreSideBarWidth() const 160 { 161 return preSideBarWidth_; 162 } 163 GetAutoHide()164 bool GetAutoHide() const 165 { 166 return autoHide_; 167 } 168 169 private: 170 void MeasureControlButton(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, 171 const RefPtr<LayoutWrapper>& buttonLayoutWrapper, float parentWidth); 172 void MeasureSideBar(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, 173 const RefPtr<LayoutWrapper>& sideBarLayoutWrapper); 174 void MeasureSideBarContent(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, 175 const RefPtr<LayoutWrapper>& contentLayoutWrapper, float parentWidth); 176 void MeasureDivider(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, 177 const RefPtr<LayoutWrapper>& dividerLayoutWrapper, float parentWidth); 178 void LayoutControlButton(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& buttonLayoutWrapper); 179 void LayoutSideBar(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& sideBarLayoutWrapper); 180 void LayoutSideBarContent(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& contentLayoutWrapper); 181 void LayoutDivider(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& dividerLayoutWrapper); 182 void InitRealSideBarWidth(LayoutWrapper* layoutWrapper, float parentWidth); 183 void AutoMode(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, float parentWidth); 184 void AutoChangeSideBarWidth(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, float parentWidth); 185 void UpdateDefaultValueByVersion(); 186 SideBarPosition GetSideBarPositionWithRtl(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty); 187 void AdjustMinAndMaxSideBarWidth(LayoutWrapper* layoutWrapper); 188 RefPtr<LayoutWrapper> GetSideBarLayoutWrapper(LayoutWrapper* layoutWrapper) const; 189 void GetAllPropertyValue(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, float parentWidth); 190 void InitSideBarWidth(float parentWidth); 191 void MeasureRealSideBarWidth(float parentWidth); 192 void MeasureTypeUpdateWidth(); 193 void MeasureRealPropertyValue(bool setMinSideBarWidth, bool setMaxSideBarWidth, bool setSideBarWidth, 194 bool setMinContentWidth, float paretWidth); 195 196 float currentOffset_ = 0.0f; 197 float realSideBarWidth_ = -1.0f; 198 float realSideBarHeight_ = 0.0f; 199 float realDividerWidth_ = 0.0f; 200 float minContentWidth_ = -1.0f; 201 float minSideBarWidth_ = -1.0f; 202 float maxSideBarWidth_ = -1.0f; 203 204 float defaultRealSideBarWidth_ = 0.0f; 205 float defaultMinSideBarWidth_ = 0.0f; 206 float defaultMaxSideBarWidth_ = 0.0f; 207 float defaultMinContentWidth_ = 0.0f; 208 float typeUpdateWidth_ = 0.0f; 209 WeakPtr<Pattern> pattern_; 210 SideBarStatus sideBarStatus_ = SideBarStatus::SHOW; 211 bool needInitRealSideBarWidth_ = true; 212 OffsetF sideBarOffset_; 213 SideBarContainerType type_ = SideBarContainerType::EMBED; 214 bool isControlButtonClick_ = false; 215 bool autoHide_ = false; 216 217 Dimension adjustMaxSideBarWidth_; 218 Dimension adjustMinSideBarWidth_; 219 Dimension controlImageWidth_; 220 Dimension controlImageHeight_; 221 Dimension realSideBarWidthDimension_; 222 Dimension preSideBarWidth_; 223 224 ACE_DISALLOW_COPY_AND_MOVE(SideBarContainerLayoutAlgorithm); 225 }; 226 227 } // namespace OHOS::Ace::NG 228 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SIDE_BAR_SIDE_BAR_CONTAINER_LAYOUT_ALGORITHM_H 229