Merge "Clean up the code to build successfully on macOS" into devel/master
[platform/core/uifw/dali-core.git] / dali / devel-api / actors / actor-devel.h
1 #ifndef DALI_ACTOR_DEVEL_H
2 #define DALI_ACTOR_DEVEL_H
3
4 /*
5  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/actors/actor.h>
23 #include <dali/public-api/math/rect.h>
24
25 namespace Dali
26 {
27 namespace DevelActor
28 {
29 namespace Property
30 {
31 enum Type
32 {
33   PARENT_ORIGIN              = Dali::Actor::Property::PARENT_ORIGIN,
34   PARENT_ORIGIN_X            = Dali::Actor::Property::PARENT_ORIGIN_X,
35   PARENT_ORIGIN_Y            = Dali::Actor::Property::PARENT_ORIGIN_Y,
36   PARENT_ORIGIN_Z            = Dali::Actor::Property::PARENT_ORIGIN_Z,
37   ANCHOR_POINT               = Dali::Actor::Property::ANCHOR_POINT,
38   ANCHOR_POINT_X             = Dali::Actor::Property::ANCHOR_POINT_X,
39   ANCHOR_POINT_Y             = Dali::Actor::Property::ANCHOR_POINT_Y,
40   ANCHOR_POINT_Z             = Dali::Actor::Property::ANCHOR_POINT_Z,
41   SIZE                       = Dali::Actor::Property::SIZE,
42   SIZE_WIDTH                 = Dali::Actor::Property::SIZE_WIDTH,
43   SIZE_HEIGHT                = Dali::Actor::Property::SIZE_HEIGHT,
44   SIZE_DEPTH                 = Dali::Actor::Property::SIZE_DEPTH,
45   POSITION                   = Dali::Actor::Property::POSITION,
46   POSITION_X                 = Dali::Actor::Property::POSITION_X,
47   POSITION_Y                 = Dali::Actor::Property::POSITION_Y,
48   POSITION_Z                 = Dali::Actor::Property::POSITION_Z,
49   WORLD_POSITION             = Dali::Actor::Property::WORLD_POSITION,
50   WORLD_POSITION_X           = Dali::Actor::Property::WORLD_POSITION_X,
51   WORLD_POSITION_Y           = Dali::Actor::Property::WORLD_POSITION_Y,
52   WORLD_POSITION_Z           = Dali::Actor::Property::WORLD_POSITION_Z,
53   ORIENTATION                = Dali::Actor::Property::ORIENTATION,
54   WORLD_ORIENTATION          = Dali::Actor::Property::WORLD_ORIENTATION,
55   SCALE                      = Dali::Actor::Property::SCALE,
56   SCALE_X                    = Dali::Actor::Property::SCALE_X,
57   SCALE_Y                    = Dali::Actor::Property::SCALE_Y,
58   SCALE_Z                    = Dali::Actor::Property::SCALE_Z,
59   WORLD_SCALE                = Dali::Actor::Property::WORLD_SCALE,
60   VISIBLE                    = Dali::Actor::Property::VISIBLE,
61   COLOR                      = Dali::Actor::Property::COLOR,
62   COLOR_RED                  = Dali::Actor::Property::COLOR_RED,
63   COLOR_GREEN                = Dali::Actor::Property::COLOR_GREEN,
64   COLOR_BLUE                 = Dali::Actor::Property::COLOR_BLUE,
65   COLOR_ALPHA                = Dali::Actor::Property::COLOR_ALPHA,
66   WORLD_COLOR                = Dali::Actor::Property::WORLD_COLOR,
67   WORLD_MATRIX               = Dali::Actor::Property::WORLD_MATRIX,
68   NAME                       = Dali::Actor::Property::NAME,
69   SENSITIVE                  = Dali::Actor::Property::SENSITIVE,
70   LEAVE_REQUIRED             = Dali::Actor::Property::LEAVE_REQUIRED,
71   INHERIT_ORIENTATION        = Dali::Actor::Property::INHERIT_ORIENTATION,
72   INHERIT_SCALE              = Dali::Actor::Property::INHERIT_SCALE,
73   COLOR_MODE                 = Dali::Actor::Property::COLOR_MODE,
74   DRAW_MODE                  = Dali::Actor::Property::DRAW_MODE,
75   SIZE_MODE_FACTOR           = Dali::Actor::Property::SIZE_MODE_FACTOR,
76   WIDTH_RESIZE_POLICY        = Dali::Actor::Property::WIDTH_RESIZE_POLICY,
77   HEIGHT_RESIZE_POLICY       = Dali::Actor::Property::HEIGHT_RESIZE_POLICY,
78   SIZE_SCALE_POLICY          = Dali::Actor::Property::SIZE_SCALE_POLICY,
79   WIDTH_FOR_HEIGHT           = Dali::Actor::Property::WIDTH_FOR_HEIGHT,
80   HEIGHT_FOR_WIDTH           = Dali::Actor::Property::HEIGHT_FOR_WIDTH,
81   PADDING                    = Dali::Actor::Property::PADDING,
82   MINIMUM_SIZE               = Dali::Actor::Property::MINIMUM_SIZE,
83   MAXIMUM_SIZE               = Dali::Actor::Property::MAXIMUM_SIZE,
84   INHERIT_POSITION           = Dali::Actor::Property::INHERIT_POSITION,
85   CLIPPING_MODE              = Dali::Actor::Property::CLIPPING_MODE,
86   LAYOUT_DIRECTION           = Dali::Actor::Property::LAYOUT_DIRECTION,
87   INHERIT_LAYOUT_DIRECTION   = Dali::Actor::Property::INHERIT_LAYOUT_DIRECTION,
88   OPACITY                    = Dali::Actor::Property::OPACITY,
89   SCREEN_POSITION            = Dali::Actor::Property::SCREEN_POSITION,
90   POSITION_USES_ANCHOR_POINT = Dali::Actor::Property::POSITION_USES_ANCHOR_POINT,
91   CULLED                     = Dali::Actor::Property::CULLED,
92   ID                         = Dali::Actor::Property::ID,
93   HIERARCHY_DEPTH            = Dali::Actor::Property::HIERARCHY_DEPTH,
94   IS_ROOT                    = Dali::Actor::Property::IS_ROOT,
95   IS_LAYER                   = Dali::Actor::Property::IS_LAYER,
96   CONNECTED_TO_SCENE         = Dali::Actor::Property::CONNECTED_TO_SCENE,
97   KEYBOARD_FOCUSABLE         = Dali::Actor::Property::KEYBOARD_FOCUSABLE,
98
99   /**
100    * @brief Sets the sibling order of the actor so depth position can be defined within the same parent.
101    * @details Name "siblingOrder", type Property::INTEGER.
102    * @note The initial value is 0.
103    * @note Raise, Lower, RaiseToTop, LowerToBottom, RaiseAbove and LowerBelow will override the
104    * sibling order. The values set by this Property will likely change.
105    */
106   SIBLING_ORDER,
107
108   /**
109    * @brief Sets the update size hint of the actor.
110    * @details Name "updateSizeHint", type Property::VECTOR2.
111    * @note Overrides the size used for the actor damaged area calculation. Affected by the actor model view matrix.
112    */
113   UPDATE_SIZE_HINT,
114
115   /**
116     * @brief If this actor receives a touch-start event, then all following touch events are sent to this actor until a touch-end.
117     * @details Name "captureAllTouchAfterStart", type Property::BOOLEAN
118     * @note Default is false, i.e. actor under touch event will receive the touch even if touch started on this actor
119     */
120   CAPTURE_ALL_TOUCH_AFTER_START,
121
122   /**
123     * @brief If you set the TOUCH_AREA on an actor, when you touch the actor, the touch area is used rather than the size of the actor
124     * @details Name "touchArea", type Property::Vector2
125     * @note Default is Vector2::ZERO.
126     * @note for example
127     *  Actor actor = Actor::New();
128     *  actor.SetProperty(Actor::Property::SIZE, Vector2(10.0f, 10.0f));
129     *  actor.SetProperty(DevelActor::Property::TOUCH_AREA, Vector2(200.0f, 200.0f));
130     *  actor.TouchedSignal().Connect(OnTouchCallback);
131     *
132     *  If you want to reset the touch area to an area different with the size of the actor, you can set this TOUCH_AREA property.
133     */
134   TOUCH_AREA,
135
136   /**
137    * @brief Determines which blend equation will be used to render renderers of this actor.
138    * @pre To use Advanced Blend Equation(DevelBlendEquation::MULTIPLY ~ DevelBlendEquation::LUMINOSITY), the color to be rendered should be pre-multipled alpha.
139    * @details Name "blendEquation", type Property::INTEGER.
140    * @note Color of each renderer will be blended with rendering framebuffer.
141    * @note To check the blend equation is supported in the system, use Dali::Capabilities::IsBlendEquationSupported
142    */
143   BLEND_EQUATION
144 };
145
146 } // namespace Property
147
148 namespace VisibilityChange
149 {
150 enum Type
151 {
152   SELF,  ///< The visibility of the actor itself has changed.
153   PARENT ///< The visibility of a parent has changed.
154 };
155
156 } // namespace VisibilityChange
157
158 using VisibilityChangedSignalType = Signal<void(Actor, bool, VisibilityChange::Type)>; ///< Signal type of VisibilityChangedSignalType
159
160 /**
161  * @brief This signal is emitted when the visible property of this or a parent actor is changed.
162  *
163  * A callback of the following type may be connected:
164  * @code
165  *   void YourCallbackName( Actor actor, bool visible, VisibilityChange::Type& type );
166  * @endcode
167  * actor: The actor, or child of actor, whose visibility has changed
168  * visible: Whether the actor is now visible or not
169  * type: Whether the actor's visible property has changed or a parent's.
170  * @return The signal to connect to
171  * @pre The Actor has been initialized.
172  * @note This signal is NOT emitted if the actor becomes transparent (or the reverse), it's only linked with Actor::Property::VISIBLE.
173  */
174 DALI_CORE_API VisibilityChangedSignalType& VisibilityChangedSignal(Actor actor);
175
176 /**
177  * Calculates screen position and size.
178  *
179  * @return pair of two values, position of top-left corner on screen and size respectively.
180  */
181 DALI_CORE_API Rect<> CalculateScreenExtents(Actor actor);
182
183 using ChildChangedSignalType = Signal<void(Actor)>; ///< Called when the actor has a child added or removed
184
185 /**
186  * @brief This signal is emitted when a child is added to this actor.
187  *
188  * A callback of the following type may be connected:
189  * @code
190  *   void MyCallbackName( Actor child );
191  * @endcode
192  * child: The child that has been added.
193  *
194  * @note Use this signal with caution. Changing the parent of the actor
195  * within this callback is possible, but DALi will prevent further signals
196  * being sent.
197  *
198  * @return The signal to connect to
199  * @pre The Actor has been initialized
200  */
201 DALI_CORE_API ChildChangedSignalType& ChildAddedSignal(Actor actor);
202
203 /**
204  * @brief This signal is emitted when a child is removed from this actor.
205  *
206  * A callback of the following type may be connected:
207  * @code
208  *   void MyCallbackName( Actor child );
209  * @endcode
210  * child: The child that has been removed.
211  *
212  * @note Use this signal with caution. Changing the parent of the actor
213  * within this callback is possible, but DALi will prevent further signals
214  * being sent.
215  *
216  * @note If the child actor is moved from one actor to another, then
217  * this signal will be emitted followed immediately by an
218  * ChildAddedSignal() on the new parent.
219  *
220  * @return The signal to connect to
221  * @pre The Actor has been initialized
222  */
223 DALI_CORE_API ChildChangedSignalType& ChildRemovedSignal(Actor actor);
224
225 using ChildOrderChangedSignalType = Signal<void(Actor)>; ///< Used when the actor's children have changed order
226
227 /**
228  * @brief This signal is emitted when an actor's children change their sibling order
229  *
230  * A callback of the following type may be connected:
231  * @code
232  *   void MyCallbackName( Actor parent );
233  * @endcode
234  * parent The parent actor of the moved children
235  *
236  * @return The signal to connect to
237  * @pre The Actor has been initialized
238  */
239 DALI_CORE_API ChildOrderChangedSignalType& ChildOrderChangedSignal(Actor actor);
240
241 /**
242  * @brief This signal is emitted when intercepting the actor's touch event.
243  *
244  * A callback of the following type may be connected:
245  * @code
246  *   void MyCallbackName( Actor actor );
247  * @endcode
248  * actor The actor to intercept
249  *
250  * @note TouchEvent callbacks are called from the last child in the order of the parent's actor.
251  * The InterceptTouchEvent callback is to intercept the touch event in the parent.
252  * So, if the parent interepts the touch event, the child cannot receive the touch event.
253  *
254  * @note example
255  *   Actor parent = Actor::New();
256  *   Actor child = Actor::New();
257  *   parent.Add(child);
258  *   child.TouchedSignal().Connect(&application, childFunctor);
259  *   parent.TouchedSignal().Connect(&application, parentFunctor);
260  * The touch event callbacks are called in the order childFunctor -> parentFunctor.
261  *
262  * If you connect interceptTouchSignal to parentActor.
263  *   Dali::DevelActor::InterceptTouchedSignal(parent).Connect(&application, interceptFunctor);
264  *
265  * When interceptFunctor returns false, the touch event callbacks are called in the same order childFunctor -> parentFunctor.
266  * If interceptFunctor returns true, it means that the TouchEvent was intercepted.
267  * So the child actor will not be able to receive touch events.
268  * Only the parentFunctor is called.
269  *
270  * @return The signal to connect to
271  * @pre The Actor has been initialized
272  */
273 DALI_CORE_API Actor::TouchEventSignalType& InterceptTouchedSignal(Actor actor);
274
275 } // namespace DevelActor
276
277 } // namespace Dali
278
279 #endif // DALI_ACTOR_DEVEL_H