[dali_1.3.28] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / layouting / layout-group.h
1 #ifndef DALI_TOOLKIT_LAYOUTING_LAYOUT_GROUP_H
2 #define DALI_TOOLKIT_LAYOUTING_LAYOUT_GROUP_H
3 /*
4  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19 #include <memory>
20 #include <dali/public-api/common/dali-common.h>
21 #include <dali/public-api/actors/actor-enumerations.h>
22 #include <dali-toolkit/devel-api/toolkit-property-index-ranges.h>
23 #include <dali-toolkit/devel-api/layouting/layout-item.h>
24 #include <dali-toolkit/devel-api/layouting/measure-spec.h>
25
26 namespace Dali
27 {
28 namespace Toolkit
29 {
30
31 namespace Internal
32 {
33 class LayoutGroup;
34 }
35
36
37 /**
38  * A layout that has layout children. Implements LayoutItem.
39  * It can both layout it's children, and be laid out by a parent container.
40  *
41  * A layout group automatically handles adding a Control container's children to itself,
42  * both on startup and on child add/remove. If this functionality is not desired, this needs
43  * splitting into two classes; one that manages just the layout part, and the other which
44  * handles Actor hierarchy. (@todo Consider doing this anyway...)
45  *
46  * This handle class allows the application to set up layout properties for the layout group;
47  * it doesn't access measure/layout directly.
48  *
49  * To write a new layout, inherit from both LayoutGroup handle and Internal::LayoutGroup body.
50  *
51  */
52 class DALI_IMPORT_API LayoutGroup : public LayoutItem
53 {
54 public:
55   using LayoutId = unsigned int;
56   static const unsigned int UNKNOWN_ID = 0;
57
58   struct ChildProperty
59   {
60     enum
61     {
62       MARGIN_SPECIFICATION = LAYOUT_GROUP_CHILD_PROPERTY_START_INDEX,
63     };
64   };
65
66
67   /**
68    * @brief Creates an uninitialized LayoutGroup handle.
69    *
70    * LayoutGroup is intended as a base class, and as such, does not have a New method.
71    *
72    * Calling member functions with an uninitialized handle is not allowed.
73    */
74   LayoutGroup();
75
76   /**
77    * @brief Default Destructor.
78    *
79    * This is non-virtual since derived Handle types must not contain data or virtual methods.
80    */
81   ~LayoutGroup() = default;
82
83   /**
84    * @brief Copy constructor
85    */
86   LayoutGroup(const LayoutGroup& copy) = default;
87
88   /**
89    * @brief Assigment operator
90    */
91   LayoutGroup& operator=(const LayoutGroup& rhs) = default;
92
93   /**
94    * @brief Downcasts a handle to a LayoutGroup handle.
95    *
96    * If handle points to a LayoutGroup, the downcast produces a valid handle.
97    * If not, the returned handle is left uninitialized.
98
99    * @param[in] handle to an object
100    * @return Handle to a LayoutGroup or an uninitialized handle
101    */
102   static LayoutGroup DownCast( BaseHandle handle );
103
104   /**
105    * @brief Add a child layout to the layout group
106    *
107    * @param[in] childLayout The layout to add.
108    * @return an Id of the child.
109    */
110   LayoutId Add( LayoutItem& childLayout );
111
112   /**
113    * @brief Add a child layout to the layout group
114    *
115    * @param[in] childId the id of the child to remove
116    */
117   void Remove( LayoutId childId );
118
119   /**
120    * @brief Remove a child layout from the layout group
121    *
122    * @param[in] childLayout The layout to remove.
123    */
124   void Remove( LayoutItem& childLayout );
125
126   /**
127    * @brief Get the child at the given index.
128    *
129    * @param[in] index The index of the child.
130    */
131   LayoutItem GetChildAt( unsigned int index ) const;
132
133   /**
134    * @brief Get the count of the children of the layout
135    *
136    * @return the count of the children of the layout
137    */
138   unsigned int GetChildCount() const ;
139
140   /**
141    * @brief Get the child referenced by childId.
142    *
143    * @param[in] childId The id of the child to get
144    * @return A handle to the child layout, or empty if not found
145    */
146   LayoutItem GetChild( LayoutId childId ) const ;
147
148   /**
149    * Delete template method to remove implicit casting to integer types.
150    */
151   template <typename T>
152     LayoutItem GetChild( T childId ) = delete;
153
154 public:
155   /// @cond internal
156   /**
157    * @brief This constructor is used by LayoutGroup::New() methods.
158    *
159    * @param[in] actor A pointer to a newly allocated Dali resource
160    */
161   explicit LayoutGroup( Internal::LayoutGroup* layoutGroup );
162   /// @endcond
163 };
164
165
166 } // namespace Toolkit
167 } // namespace Dali
168
169 #endif // DALI_TOOLKIT_LAYOUTING_LAYOUT_GROUP_H