Layout changes for NUI support.
[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/layouting/layout-base.h>
23 #include <dali-toolkit/devel-api/layouting/measure-spec.h>
24
25 namespace Dali
26 {
27 namespace Toolkit
28 {
29
30 namespace Internal
31 {
32 class LayoutGroup;
33 }
34
35
36 /**
37  * A layout that has layout children. Implements LayoutBase.
38  * It can both layout it's children, and be laid out by a parent container.
39  *
40  * A layout group automatically handles adding a Control container's children to itself,
41  * both on startup and on child add/remove. If this functionality is not desired, this needs
42  * splitting into two classes; one that manages just the layout part, and the other which
43  * handles Actor hierarchy. (@todo Consider doing this anyway...)
44  *
45  * This handle class allows the application to set up layout properties for the layout group;
46  * it doesn't access measure/layout directly.
47  *
48  * To write a new layout, inherit from both LayoutGroup handle and Internal::LayoutGroup body.
49  *
50  */
51 class DALI_IMPORT_API LayoutGroup : public LayoutBase
52 {
53 public:
54   using LayoutId = unsigned int;
55   static const unsigned int UNKNOWN_ID = 0;
56
57   enum PropertyRange
58   {
59     CHILD_PROPERTY_START_INDEX = CHILD_PROPERTY_REGISTRATION_START_INDEX+100,
60     CHILD_PROPERTY_END_INDEX   = CHILD_PROPERTY_START_INDEX+1000
61   };
62
63   struct ChildProperty
64   {
65     enum
66     {
67       MARGIN_SPECIFICATION = CHILD_PROPERTY_START_INDEX,
68     };
69   };
70
71
72   /**
73    * @brief Creates an uninitialized LayoutGroup handle.
74    *
75    * LayoutGroup is intended as a base class, and as such, does not have a New method.
76    *
77    * Calling member functions with an uninitialized handle is not allowed.
78    */
79   LayoutGroup();
80
81   /**
82    * @brief Default Destructor.
83    *
84    * This is non-virtual since derived Handle types must not contain data or virtual methods.
85    */
86   ~LayoutGroup() = default;
87
88   /**
89    * @brief Copy constructor
90    */
91   LayoutGroup(const LayoutGroup& copy) = default;
92
93   /**
94    * @brief Assigment operator
95    */
96   LayoutGroup& operator=(const LayoutGroup& rhs) = default;
97
98   /**
99    * @brief Downcasts a handle to a LayoutGroup handle.
100    *
101    * If handle points to a LayoutGroup, the downcast produces a valid handle.
102    * If not, the returned handle is left uninitialized.
103
104    * @param[in] handle to an object
105    * @return Handle to a LayoutGroup or an uninitialized handle
106    */
107   static LayoutGroup DownCast( BaseHandle handle );
108
109   /**
110    * @brief Add a child layout to the layout group
111    *
112    * @param[in] childLayout The layout to add.
113    * @return an Id of the child.
114    */
115   LayoutId Add( LayoutBase& childLayout );
116
117   /**
118    * @brief Add a child layout to the layout group
119    *
120    * @param[in] childId the id of the child to remove
121    */
122   void Remove( LayoutId childId );
123
124   /**
125    * @brief Remove a child layout from the layout group
126    *
127    * @param[in] childLayout The layout to remove.
128    */
129   void Remove( LayoutBase& childLayout );
130
131   /**
132    * @brief Get the child at the given index.
133    *
134    * @param[in] index The index of the child.
135    */
136   LayoutBase GetChildAt( unsigned int index ) const;
137
138   /**
139    * @brief Get the count of the children of the layout
140    *
141    * @return the count of the children of the layout
142    */
143   unsigned int GetChildCount() const ;
144
145   /**
146    * @brief Get the child referenced by childId.
147    *
148    * @param[in] childId The id of the child to get
149    * @return A handle to the child layout, or empty if not found
150    */
151   LayoutBase GetChild( LayoutId childId ) const ;
152
153   /**
154    * Delete template method to remove implicit casting to integer types.
155    */
156   template <typename T>
157     LayoutBase GetChild( T childId ) = delete;
158
159 public:
160   /// @cond internal
161   /**
162    * @brief This constructor is used by LayoutGroup::New() methods.
163    *
164    * @param[in] actor A pointer to a newly allocated Dali resource
165    */
166   explicit LayoutGroup( Internal::LayoutGroup* layoutGroup );
167   /// @endcond
168 };
169
170
171 } // namespace Toolkit
172 } // namespace Dali
173
174 #endif // DALI_TOOLKIT_LAYOUTING_LAYOUT_GROUP_H