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 realSideBarWidth_ = realSideBarWidth.ConvertToPx(); 58 } 59 GetRealSideBarWidth()60 Dimension GetRealSideBarWidth() const 61 { 62 return realSideBarWidthDimension_; 63 } 64 SetRealDividerWidth(float realDividerWidth)65 void SetRealDividerWidth(float realDividerWidth) 66 { 67 realDividerWidth_ = realDividerWidth; 68 } 69 GetRealDividerWidth()70 float GetRealDividerWidth() const 71 { 72 return realDividerWidth_; 73 } 74 SetNeedInitRealSideBarWidth(bool needInitRealSideBarWidth)75 void SetNeedInitRealSideBarWidth(bool needInitRealSideBarWidth) 76 { 77 needInitRealSideBarWidth_ = needInitRealSideBarWidth; 78 } 79 SetRealSideBarHeight(float realSideBarHeight)80 void SetRealSideBarHeight(float realSideBarHeight) 81 { 82 realSideBarHeight_ = realSideBarHeight; 83 } 84 GetRealSideBarHeight()85 float GetRealSideBarHeight() const 86 { 87 return realSideBarHeight_; 88 } 89 GetSideBarOffset()90 OffsetF GetSideBarOffset() const 91 { 92 return sideBarOffset_; 93 } 94 GetSideBarContainerType()95 SideBarContainerType GetSideBarContainerType() const 96 { 97 return type_; 98 } 99 SetSideBarContainerType(SideBarContainerType type)100 void SetSideBarContainerType(SideBarContainerType type) 101 { 102 type_ = type; 103 } 104 SetControlButtonClick(bool value)105 void SetControlButtonClick(bool value) 106 { 107 isControlButtonClick_ = value; 108 } 109 GetAdjustMaxSideBarWidth()110 Dimension GetAdjustMaxSideBarWidth() const 111 { 112 return adjustMaxSideBarWidth_; 113 } 114 GetAdjustMinSideBarWidth()115 Dimension GetAdjustMinSideBarWidth() const 116 { 117 return adjustMinSideBarWidth_; 118 } 119 SetMinSideBarWidth(float minSideBarWidth)120 void SetMinSideBarWidth(float minSideBarWidth) 121 { 122 minSideBarWidth_ = minSideBarWidth; 123 } 124 SetMaxSideBarWidth(float maxSideBarWidth)125 void SetMaxSideBarWidth(float maxSideBarWidth) 126 { 127 maxSideBarWidth_ = maxSideBarWidth; 128 } 129 SetMinContentWidth(float minContentWidth)130 void SetMinContentWidth(float minContentWidth) 131 { 132 minContentWidth_ = minContentWidth; 133 } 134 SetTypeUpdateWidth(float typeUpdateWidth)135 void SetTypeUpdateWidth(float typeUpdateWidth) 136 { 137 typeUpdateWidth_ = typeUpdateWidth; 138 } 139 SetPattern(const WeakPtr<Pattern> & pattern)140 void SetPattern(const WeakPtr<Pattern>& pattern) 141 { 142 pattern_ = pattern; 143 } 144 SetControlImageWidth(const Dimension & width)145 void SetControlImageWidth(const Dimension& width) 146 { 147 controlImageWidth_ = width; 148 } 149 SetControlImageHeight(const Dimension & height)150 void SetControlImageHeight(const Dimension& height) 151 { 152 controlImageHeight_ = height; 153 } 154 SetPreSideBarWidth(Dimension value)155 void SetPreSideBarWidth(Dimension value) 156 { 157 preSideBarWidth_ = value; 158 } 159 GetPreSideBarWidth()160 Dimension GetPreSideBarWidth() const 161 { 162 return preSideBarWidth_; 163 } 164 GetAutoHide()165 bool GetAutoHide() const 166 { 167 return autoHide_; 168 } 169 170 private: 171 void MeasureControlButton(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, 172 const RefPtr<LayoutWrapper>& buttonLayoutWrapper, float parentWidth); 173 void MeasureSideBar(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, 174 const RefPtr<LayoutWrapper>& sideBarLayoutWrapper); 175 void MeasureSideBarContent(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, 176 const RefPtr<LayoutWrapper>& contentLayoutWrapper, float parentWidth); 177 void MeasureDivider(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, 178 const RefPtr<LayoutWrapper>& dividerLayoutWrapper, float parentWidth); 179 void LayoutControlButton(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& buttonLayoutWrapper); 180 void LayoutSideBar(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& sideBarLayoutWrapper); 181 void LayoutSideBarContent(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& contentLayoutWrapper); 182 void LayoutDivider(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& dividerLayoutWrapper); 183 void InitRealSideBarWidth(LayoutWrapper* layoutWrapper, float parentWidth); 184 void AutoMode(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, float parentWidth); 185 void AutoChangeSideBarWidth(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, float parentWidth); 186 void UpdateDefaultValueByVersion(LayoutWrapper* layoutWrapper); 187 SideBarPosition GetSideBarPositionWithRtl(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty); 188 void AdjustMinAndMaxSideBarWidth(LayoutWrapper* layoutWrapper); 189 RefPtr<LayoutWrapper> GetSideBarLayoutWrapper(LayoutWrapper* layoutWrapper) const; 190 void GetAllPropertyValue( 191 const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, LayoutWrapper* layoutWrapper, float parentWidth); 192 Dimension GetSideBarWidth( 193 const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, LayoutWrapper* layoutWrapper); 194 void InitSideBarWidth(float parentWidth); 195 void MeasureRealSideBarWidth(float parentWidth); 196 void MeasureTypeUpdateWidth(); 197 void MeasureRealPropertyValue(bool setMinSideBarWidth, bool setMaxSideBarWidth, bool setSideBarWidth, 198 bool setMinContentWidth, float paretWidth); 199 void AddChildToIgnoreLayoutSafeBundle(LayoutWrapper* layoutWrapper); 200 void AdjustChildOffset(const RefPtr<LayoutWrapper>& layoutWrapper, OffsetF& offset); 201 202 float currentOffset_ = 0.0f; 203 float realSideBarWidth_ = -1.0f; 204 float realSideBarHeight_ = 0.0f; 205 float realDividerWidth_ = 0.0f; 206 float minContentWidth_ = -1.0f; 207 float minSideBarWidth_ = -1.0f; 208 float maxSideBarWidth_ = -1.0f; 209 210 float defaultRealSideBarWidth_ = 0.0f; 211 float defaultMinSideBarWidth_ = 0.0f; 212 float defaultMaxSideBarWidth_ = 0.0f; 213 float defaultMinContentWidth_ = 0.0f; 214 float typeUpdateWidth_ = 0.0f; 215 WeakPtr<Pattern> pattern_; 216 SideBarStatus sideBarStatus_ = SideBarStatus::SHOW; 217 bool needInitRealSideBarWidth_ = true; 218 OffsetF sideBarOffset_; 219 SideBarContainerType type_ = SideBarContainerType::EMBED; 220 bool isControlButtonClick_ = false; 221 bool autoHide_ = false; 222 223 Dimension adjustMaxSideBarWidth_; 224 Dimension adjustMinSideBarWidth_; 225 Dimension controlImageWidth_; 226 Dimension controlImageHeight_; 227 Dimension realSideBarWidthDimension_; 228 Dimension preSideBarWidth_; 229 230 ACE_DISALLOW_COPY_AND_MOVE(SideBarContainerLayoutAlgorithm); 231 }; 232 233 } // namespace OHOS::Ace::NG 234 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SIDE_BAR_SIDE_BAR_CONTAINER_LAYOUT_ALGORITHM_H 235