• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_PROPERTIES_LAYOUT_CONSTRAINT_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PROPERTIES_LAYOUT_CONSTRAINT_H
18 
19 #include <algorithm>
20 #include <optional>
21 #include <string>
22 
23 #include "base/geometry/ng/size_t.h"
24 #include "core/components_ng/property/calc_length.h"
25 #include "core/components_ng/property/measure_property.h"
26 
27 namespace OHOS::Ace::NG {
28 template<typename T>
29 struct LayoutConstraintT {
30     ScaleProperty scaleProperty = ScaleProperty::CreateScaleProperty();
31     SizeT<T> minSize { 0, 0 };
32     SizeT<T> maxSize { Infinity<T>(), Infinity<T>() };
33     SizeT<T> percentReference { 0, 0 };
34     OptionalSize<T> parentIdealSize;
35     OptionalSize<T> selfIdealSize;
36 
37     void ApplyAspectRatio(float ratio, const std::optional<CalcSize>& calcSize);
38 
39     void ApplyAspectRatioToParentIdealSize(bool useWidth, float ratio);
40 
41     void ApplyAspectRatioByMaxSize(float ratio, std::optional<bool> useDefinedWidth);
42 
43     void ApplyAspectRatioWithCalcSize(float ratio, bool useDefinedWidth);
44 
45     void ApplyAspectRatioWithoutCalcSize(float ratio);
46 
47     void Reset();
48 
49     void MinusPadding(const std::optional<T>& left, const std::optional<T>& right,
50         const std::optional<T>& top, const std::optional<T>& bottom);
51 
52     bool operator==(const LayoutConstraintT& layoutConstraint) const
53     {
54         return (scaleProperty == layoutConstraint.scaleProperty) && (minSize == layoutConstraint.minSize) &&
55                (maxSize == layoutConstraint.maxSize) && (percentReference == layoutConstraint.percentReference) &&
56                (parentIdealSize == layoutConstraint.parentIdealSize) &&
57                (selfIdealSize == layoutConstraint.selfIdealSize);
58     }
59 
60     bool operator!=(const LayoutConstraintT& layoutConstraint) const
61     {
62         return !(*this == layoutConstraint);
63     }
64 
EqualWithoutPercentWidthLayoutConstraintT65     bool EqualWithoutPercentWidth(const LayoutConstraintT& layoutConstraint) const
66     {
67         return (scaleProperty == layoutConstraint.scaleProperty) && (minSize == layoutConstraint.minSize) &&
68             (maxSize == layoutConstraint.maxSize) && (parentIdealSize == layoutConstraint.parentIdealSize) &&
69             (percentReference.Height() == layoutConstraint.percentReference.Height()) &&
70             (selfIdealSize == layoutConstraint.selfIdealSize);
71     }
72 
EqualWithoutPercentHeightLayoutConstraintT73     bool EqualWithoutPercentHeight(const LayoutConstraintT& layoutConstraint) const
74     {
75         return (scaleProperty == layoutConstraint.scaleProperty) && (minSize == layoutConstraint.minSize) &&
76             (maxSize == layoutConstraint.maxSize) && (parentIdealSize == layoutConstraint.parentIdealSize) &&
77             (percentReference.Width() == layoutConstraint.percentReference.Width()) &&
78             (selfIdealSize == layoutConstraint.selfIdealSize);
79     }
80 
UpdateSelfMarginSizeWithCheckLayoutConstraintT81     bool UpdateSelfMarginSizeWithCheck(const OptionalSize<T>& size)
82     {
83         if (selfIdealSize == size) {
84             return false;
85         }
86         return selfIdealSize.UpdateSizeWithCheck(size);
87     }
88 
UpdateIllegalSelfMarginSizeWithCheckLayoutConstraintT89     bool UpdateIllegalSelfMarginSizeWithCheck(const OptionalSize<T>& size)
90     {
91         if (selfIdealSize == size) {
92             return false;
93         }
94         return selfIdealSize.UpdateIllegalSizeWithCheck(size);
95     }
96 
UpdateIllegalSelfIdealSizeWithCheckLayoutConstraintT97     bool UpdateIllegalSelfIdealSizeWithCheck(const OptionalSize<T>& size)
98     {
99         if (selfIdealSize == size) {
100             return false;
101         }
102         return selfIdealSize.UpdateIllegalSizeWithCheck(size);
103     }
104 
UpdateParentIdealSizeWithCheckLayoutConstraintT105     bool UpdateParentIdealSizeWithCheck(const OptionalSize<T>&& size)
106     {
107         if (parentIdealSize == size) {
108             return false;
109         }
110         return parentIdealSize.UpdateSizeWithCheck(size);
111     }
112 
UpdateIllegalParentIdealSizeWithCheckLayoutConstraintT113     bool UpdateIllegalParentIdealSizeWithCheck(const OptionalSize<T>&& size)
114     {
115         if (parentIdealSize == size) {
116             return false;
117         }
118         return parentIdealSize.UpdateIllegalSizeWithCheck(size);
119     }
120 
UpdateMaxSizeWithCheckLayoutConstraintT121     bool UpdateMaxSizeWithCheck(const SizeT<T>& size)
122     {
123         if (maxSize == size) {
124             return false;
125         }
126         return maxSize.UpdateSizeWhenSmaller(size);
127     }
128 
UpdateMinSizeWithCheckLayoutConstraintT129     bool UpdateMinSizeWithCheck(const SizeT<T>& size)
130     {
131         if (minSize == size) {
132             return false;
133         }
134         return minSize.UpdateSizeWhenLarger(size);
135     }
136 
UpdatePercentReferenceLayoutConstraintT137     bool UpdatePercentReference(const SizeT<T>& size)
138     {
139         if (percentReference == size) {
140             return false;
141         }
142         percentReference.SetSizeT(size);
143         return true;
144     }
145 
146     std::string ToString() const;
147 
148     SizeF Constrain(const SizeF& size) const;
149 };
150 
151 using LayoutConstraintF = LayoutConstraintT<float>;
152 } // namespace OHOS::Ace::NG
153 
154 #include "layout_constraint.inl"
155 
156 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PROPERTIES_LAYOUT_CONSTRAINT_H
157