1 #ifndef DALI_TOOLKIT_LAYOUTING_MEASURE_SPEC_H
2 #define DALI_TOOLKIT_LAYOUTING_MEASURE_SPEC_H
5 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali-toolkit/public-api/dali-toolkit-common.h>
23 #include <dali/public-api/common/dali-common.h>
26 #include <dali-toolkit/devel-api/layouting/layout-length.h>
27 #include <dali-toolkit/public-api/dali-toolkit-common.h>
35 * A MeasureSpec is used during the Measure pass by a LayoutGroup to inform it's children
36 * how to be measured. For instance, it may measure a child with an exact width and an unspecified
37 * height in order to determine height for width.
39 class DALI_TOOLKIT_API MeasureSpec
45 UNSPECIFIED, ///< This is used by a parent to determine the desired dimension of a child layout.
46 EXACTLY, /** This is used by a parent to impose an exact size on the child. The child must use
47 this size, and guarantee that all of its descendants will fit within this size */
48 AT_MOST /** This is used by the parent to impose a maximum size on the child. The child must guarantee
49 * that it and all of it's descendants will fit within this size. */
52 MeasureSpec( LayoutLength measureSpec, MeasureSpec::Mode mode )
53 : mSize( measureSpec ),
58 MeasureSpec( LayoutLength measureSpec )
59 : mSize( measureSpec ),
60 mMode( Mode::UNSPECIFIED )
64 ~MeasureSpec() = default;
66 MeasureSpec& operator=( const MeasureSpec& rhs )
70 this->mSize = rhs.mSize;
71 this->mMode = rhs.mMode;
76 bool operator==( MeasureSpec value )
78 return mSize == value.mSize;
81 bool operator!=( MeasureSpec value )
83 return mSize != value.mSize;
87 * @brief Set the mode of the measure spec.
89 * @param mode The mode to set
91 void SetMode( MeasureSpec::Mode mode )
97 * @brief Get the mode of the measure spec.
99 * @return The mode of the measure spec
101 MeasureSpec::Mode GetMode() const
107 * @brief Set the size of the measure spec
109 * @param size the size to set
111 void SetSize( LayoutLength size )
117 * @brief Get the size of the measure spec
119 * @return the size of the measure spec
121 LayoutLength GetSize() const
127 * @brief Adjust the measure size by the given delta.
129 * Used only for EXACT and AT_MOST modes.
130 * @param[in] measureSpec the measure spec to adjust
131 * @param[in] delta A positive or negative value to adjust the measure spec by.
133 * @note if the adjusted size is negative, it is zeroed.
134 * @return A new measure spec with the adjusted values.
136 static MeasureSpec Adjust( MeasureSpec measureSpec, int delta )
138 auto mode = measureSpec.GetMode();
139 auto size = measureSpec.GetSize();
141 if( mode == MeasureSpec::Mode::UNSPECIFIED )
143 return MeasureSpec( size, MeasureSpec::Mode::UNSPECIFIED );
146 if( delta < 0 && measureSpec.mSize < abs(delta) )
154 return MeasureSpec( size, mode );
159 LayoutLength mSize; ///< The specified size
160 Mode mMode; ///< The measure mode
164 inline std::ostream& operator<< (std::ostream& o, const MeasureSpec& measureSpec )
166 return o << ( (measureSpec.GetMode() == MeasureSpec::Mode::UNSPECIFIED ? "Unspecified"
167 : (measureSpec.GetMode() == MeasureSpec::Mode::EXACTLY ? "Exactly":"At most" ) ) )
168 << " " << measureSpec.GetSize();
171 } //namespace Toolkit
175 #endif // DALI_TOOLKIT_LAYOUTING_MEASURE_SPEC_H