• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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