1 #ifndef DALI_TOOLKIT_LAYOUTING_FLEX_NODE_H
2 #define DALI_TOOLKIT_LAYOUTING_FLEX_NODE_H
5 * Copyright (c) 2020 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.
21 #include <dali/public-api/actors/actor.h>
22 #include <dali/public-api/common/dali-common.h>
26 #include <dali-toolkit/public-api/dali-toolkit-common.h>
37 * @brief Enumeration for the direction of the main axis in the flex container. This determines
38 * the direction that flex items are laid out in the flex container.
40 enum class FlexDirection
42 COLUMN, ///< The flexible items are displayed vertically as a column
43 COLUMN_REVERSE, ///< The flexible items are displayed vertically as a column, but in reverse order
44 ROW, ///< The flexible items are displayed horizontally as a row
45 ROW_REVERSE ///< The flexible items are displayed horizontally as a row, but in reverse order
49 * @brief Enumeration for the alignment of the flex items when the items do not use all available
50 * space on the main-axis.
52 enum class Justification
54 FLEX_START, ///< Items are positioned at the beginning of the container
55 CENTER, ///< Items are positioned at the center of the container
56 FLEX_END, ///< Items are positioned at the end of the container
57 SPACE_BETWEEN, ///< Items are positioned with equal space between the items
58 SPACE_AROUND, ///< Items are positioned with equal space before, and after the items
59 SPACE_EVENLY ///< Items are positioned with equal space before, between, and after the items
63 * @brief Enumeration for the wrap type of the flex container when there is not enough room for
64 * all the items on one flex line.
68 NO_WRAP, ///< Flex items laid out in single line (shrunk to fit the flex container along the main axis)
69 WRAP ///< Flex items laid out in multiple lines if needed
73 * @brief Enumeration for the alignment of the flex items or lines when the items or lines do not
74 * use all the available space on the cross-axis.
78 AUTO, ///< Currently unsupported, placeholder for inheritance of parent alignment.
80 FLEX_START, ///< At the beginning of the container
81 CENTER, ///< At the center of the container
82 FLEX_END, ///< At the end of the container
83 STRETCH ///< Stretch to fit the container
87 * @brief Enumeration for the position type of the flex item how it is positioned within its parent.
89 enum class PositionType
91 RELATIVE, ///< Flex items laid out relatively
92 ABSOLUTE ///< Flex items laid out absolutely
96 * Struct used for MeasureCallback
100 SizeTuple(float x, float y)
111 * @brief Callback signature for child Actor measure callback.
112 * @note Actor, child Actor to measure
113 * @note float, available width for child
114 * @note int, width measure specifcation mode
115 * @note float, available height for child
116 * @note int, height measure specification mode
117 * @note SizeTuple, return value
119 using MeasureCallback = void (*)(Dali::Actor, float , int , float , int, SizeTuple *);
122 * This class provides the API for calling into the Flex layout implementation.
124 class DALI_TOOLKIT_API Node
128 * @brief Constructor.
137 Node& operator=(Node&&) = default;
138 Node(Node&&) = default;
139 Node(const Node&) = delete;
140 Node& operator=(const Node&) = delete;
143 * @brief Insert child into the FlexLayout at the given index.
144 * @param[in] child Actor to insert.
145 * @param[in] margin of child Actor.
146 * @param[in] measureFunction for the child.
147 * @param[in] index to insert at.
148 * @return child node pointer
150 Node* AddChild(Actor child, Extents margin, MeasureCallback measureFunction, int index);
153 * @brief Remove child from the FlexLayout at the given index.
154 * @param[in] child child to be removed.
156 void RemoveChild(Actor child);
159 * @brief Return the dimensions of the node.
160 * @param[in] width width specification
161 * @param[in] widthMode width specification mode
162 * @param[in] height height specification
163 * @param[in] heightMode height specification mode
164 * @return Size tuple representing the width and height of the node
166 SizeTuple MeasureNode(float width, int widthMode, float height, int heightMode);
169 * @brief Perform the layout measure calculations.
170 * @param[in] availableWidth Amount of space available for layout, width.
171 * @param[in] availableHeight Amount of space available for layout, height.
172 * @param[in] isRTL Is the direction of the layout right to left.
174 void CalculateLayout(float availableWidth, float availableHeight, bool isRTL);
177 * @brief Get the calculated width of the given node.
178 * @return the width of the node
180 float GetFlexWidth() const;
183 * @brief Get the calculated height of the given node.
184 * @return the height of the node
186 float GetFlexHeight() const;
189 * @brief Get frame coordinates of the node at the given index.
190 * @param[in] index of the child
191 * @return Frame structure left x, top y, right z, bottom w
193 Vector4 GetNodeFrame(int index) const;
196 * @brief Set the flex direction in the layout.
197 * The direction of the main-axis which determines the direction that flex items are laid out.
198 * @param[in] flexDirection The flex direction.
200 void SetFlexDirection(FlexDirection flexDirection);
203 * @brief Get the flex direction in the layout.
204 * @return The flex direction.
206 FlexDirection GetFlexDirection() const;
209 * @brief Set the justification in the layout.
210 * @param[in] flexJustification The flex justification.
212 void SetFlexJustification(Justification flexJustification);
215 * @brief Get the flex justification in the layout.
216 * @return The flex justification.
218 Justification GetFlexJustification() const;
221 * @brief Set the wrap in the layout.
222 * @param[in] flexWrap The flex wrap.
224 void SetFlexWrap(WrapType flexWrap);
227 * @brief Get the flex wrap in the layout.
228 * @return The flex wrap.
230 WrapType GetFlexWrap() const;
233 * @brief Set the alignment of the layout content.
234 * @param[in] flexAlignment The alignment of the content.
236 void SetFlexAlignment(Alignment flexAlignment);
239 * @brief Get the alignment of the layout content.
240 * @return The flex content alignment.
242 Alignment GetFlexAlignment() const;
245 * @brief Set the alignment of the layout items.
246 * @param[in] flexAlignment The alignment of the items.
248 void SetFlexItemsAlignment(Alignment flexAlignment);
251 * @brief Get the alignment of the layout items.
252 * @return The flex items alignment.
254 Alignment GetFlexItemsAlignment() const;
257 * @brief Set the alignment self of the layout items.
258 * @param[in] flexAlignmentSelf The alignment self of the items.
260 void SetFlexAlignmentSelf(Alignment flexAlignmentSelf);
263 * @brief Get the alignment self of the layout items.
264 * @return The flex items alignment self.
266 Alignment GetFlexAlignmentSelf() const;
269 * @brief Set the position type of the layout items.
270 * @param[in] flexPositionType The position type of the items.
272 void SetFlexPositionType(PositionType flexPositionType);
275 * @brief Get the position type of the layout items.
276 * @return The flex position type.
278 PositionType GetFlexPositionType() const;
281 * @brief Set the aspect ratio of the layout items.
282 * @param[in] flexAspectRatio The aspect ratio of the items.
284 void SetFlexAspectRatio(float flexAspectRatio);
287 * @brief Get the aspect ratio of the layout items.
288 * @return The flex aspect ratio.
290 float GetFlexAspectRatio() const;
293 * @brief Set the basis of the layout items.
294 * @param[in] flexBasis The basis of the items.
296 void SetFlexBasis(float flexBasis);
299 * @brief Get the basis of the layout items.
300 * @return The flex basis.
302 float GetFlexBasis() const;
305 * @brief Set the shrink of the layout items.
306 * @param[in] flexShrink The shrink of the items.
308 void SetFlexShrink(float flexShrink);
311 * @brief Get the shrink of the layout items.
312 * @return The flex shrink.
314 float GetFlexShrink() const;
317 * @brief Set the grow of the layout items.
318 * @param[in] flexGrow The grow of the items.
320 void SetFlexGrow(float flexGrow);
323 * @brief Get the grow of the layout items.
324 * @return The flex grow.
326 float GetFlexGrow() const;
329 * @brief Set the margin.
330 * @param[in] margin The margin value.
332 void SetMargin(Extents margin);
335 * @brief Set the padding.
336 * @param[in] padding The padding value.
338 void SetPadding(Extents padding);
342 std::unique_ptr<Impl> mImpl;
347 } // namespace Toolkit
350 #endif // DALI_TOOLKIT_LAYOUTING_FLEX_NODE_H