[dali_1.1.19] Merge branch 'devel/master'
[platform/core/uifw/dali-core.git] / dali / public-api / actors / actor.h
1 #ifndef __DALI_ACTOR_H__
2 #define __DALI_ACTOR_H__
3
4 /*
5  * Copyright (c) 2015 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 // EXTERNAL INCLUDES
22 #include <string>
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/actors/actor-enumerations.h>
26 #include <dali/public-api/actors/draw-mode.h>
27 #include <dali/public-api/math/radian.h>
28 #include <dali/public-api/object/handle.h>
29 #include <dali/public-api/object/property-index-ranges.h>
30 #include <dali/public-api/signals/dali-signal.h>
31 namespace Dali
32 {
33 /**
34  * @addtogroup dali_core_actors
35  * @{
36  */
37
38 namespace Internal DALI_INTERNAL
39 {
40 class Actor;
41 }
42
43 class Actor;
44 class Renderer;
45 struct Degree;
46 class Quaternion;
47 class Layer;
48 struct KeyEvent;
49 struct TouchEvent;
50 struct HoverEvent;
51 struct WheelEvent;
52 struct Vector2;
53 struct Vector3;
54 struct Vector4;
55
56 typedef Rect<float> Padding;      ///< Padding definition @SINCE_1_0.0
57
58 /**
59  * @brief Actor is the primary object with which Dali applications interact.
60  *
61  * UI controls can be built by combining multiple actors.
62  *
63  * <h3>Multi-Touch Events:</h3>
64  *
65  * Touch or hover events are received via signals; see Actor::TouchedSignal() and Actor::HoveredSignal() for more details.
66  *
67  * <i>Hit Testing Rules Summary:</i>
68  *
69  * - An actor is only hittable if the actor's touch or hover signal has a connection.
70  * - An actor is only hittable when it is between the camera's near and far planes.
71  * - If an actor is made insensitive, then the actor and its children are not hittable; see IsSensitive()
72  * - If an actor's visibility flag is unset, then none of its children are hittable either; see IsVisible()
73  * - To be hittable, an actor must have a non-zero size.
74  * - If an actor's world color is fully transparent, then it is not hittable; see GetCurrentWorldColor()
75  *
76  * <i>Hit Test Algorithm:</i>
77  *
78  * - Stage
79  *   - Gets the first down and the last up touch events to the screen, regardless of actor touch event consumption.
80  *   - Stage's root layer can be used to catch unconsumed touch events.
81  *
82  * - RenderTasks
83  *   - Hit testing is dependent on the camera used, which is specific to each RenderTask.
84  *
85  * - Layers
86  *   - For each RenderTask, hit testing starts from the top-most layer and we go through all the
87  *     layers until we have a hit or there are none left.
88  *   - Before we perform a hit test within a layer, we check if all the layer's parents are visible
89  *     and sensitive.
90  *   - If they are not, we skip hit testing the actors in that layer altogether.
91  *   - If a layer is set to consume all touch, then we do not check any layers behind this layer.
92  *
93  * - Actors
94  *   - The final part of hit testing is performed by walking through the actor tree within a layer.
95  *   - The following pseudocode shows the algorithm used:
96  *     @code
97  *     HIT-TEST-WITHIN-LAYER( ACTOR )
98  *     {
99  *       // Only hit-test the actor and its children if it is sensitive and visible
100  *       IF ( ACTOR-IS-SENSITIVE &&
101  *            ACTOR-IS-VISIBLE )
102  *       {
103  *         // Depth-first traversal within current layer, visiting parent first
104  *
105  *         // Check whether current actor should be hit-tested
106  *         IF ( ( TOUCH-SIGNAL-NOT-EMPTY || HOVER-SIGNAL-NOT-EMPTY ) &&
107  *              ACTOR-HAS-NON-ZERO-SIZE &&
108  *              ACTOR-WORLD-COLOR-IS-NOT-TRANSPARENT )
109  *         {
110  *           // Hit-test current actor
111  *           IF ( ACTOR-HIT )
112  *           {
113  *             IF ( ACTOR-IS-OVERLAY || ( DISTANCE-TO-ACTOR < DISTANCE-TO-LAST-HIT-ACTOR ) )
114  *             {
115  *               // The current actor is the closest actor that was underneath the touch
116  *               LAST-HIT-ACTOR = CURRENT-ACTOR
117  *             }
118  *           }
119  *         }
120  *
121  *         // Keep checking children, in case we hit something closer
122  *         FOR-EACH CHILD (in order)
123  *         {
124  *           IF ( CHILD-IS-NOT-A-LAYER )
125  *           {
126  *             // Continue traversal for this child's sub-tree
127  *             HIT-TEST-WITHIN-LAYER ( CHILD )
128  *           }
129  *           // else we skip hit-testing the child's sub-tree altogether
130  *         }
131  *       }
132  *     }
133  *     @endcode
134  *   - Overlays always take priority (i.e. they're considered closer) regardless of distance.
135  *     The overlay children take priority over their parents, and overlay siblings take priority
136  *     over their previous siblings (i.e. reverse of rendering order):
137  *     @code
138  *           1
139  *          / \
140  *         /   \
141  *        2     5
142  *       / \     \
143  *      /   \     \
144  *     3     4     6
145  *
146  *     Hit Priority of above Actor tree (all overlays): 1 - Lowest. 6 - Highest.
147  *     @endcode
148  *   - Stencil Actors can be used to influence the result of hits on renderable actors within a layer.
149  *     If a Stencil Actor exists on a layer and that Actor is marked visible then a successful
150  *     hit on a renderable actor can only take place in the area that the stencil Actor marks as visible.
151  *     The hit can be in any Stencil Actor in that layer, but must be in the region of one of them.
152  *     Stencil Actor inheritance behaves as with rendering in that any child of a Stencil Actor will
153  *     also be considered a Stencil Actor.
154  *     Non-renderable actors can be hit regardless of whether a stencil actor is hit or not.
155  *
156  * <i>Touch or hover Event Delivery:</i>
157  *
158  * - Delivery
159  *   - The hit actor's touch or hover signal is emitted first; if it is not consumed by any of the listeners,
160  *     the parent's touch or hover signal is emitted, and so on.
161  *   - The following pseudocode shows the delivery mechanism:
162  *     @code
163  *     EMIT-TOUCH-SIGNAL( ACTOR )
164  *     {
165  *       IF ( TOUCH-SIGNAL-NOT-EMPTY )
166  *       {
167  *         // Only do the emission if touch signal of actor has connections.
168  *         CONSUMED = TOUCHED-SIGNAL( TOUCH-EVENT )
169  *       }
170  *
171  *       IF ( NOT-CONSUMED )
172  *       {
173  *         // If event is not consumed then deliver it to the parent unless we reach the root actor
174  *         IF ( ACTOR-PARENT )
175  *         {
176  *           EMIT-TOUCH-SIGNAL( ACTOR-PARENT )
177  *         }
178  *       }
179  *     }
180  *
181  *     EMIT-HOVER-SIGNAL( ACTOR )
182  *     {
183  *       IF ( HOVER-SIGNAL-NOT-EMPTY )
184  *       {
185  *         // Only do the emission if hover signal of actor has connections.
186  *         CONSUMED = HOVERED-SIGNAL( HOVER-EVENT )
187  *       }
188  *
189  *       IF ( NOT-CONSUMED )
190  *       {
191  *         // If event is not consumed then deliver it to the parent unless we reach the root actor
192  *         IF ( ACTOR-PARENT )
193  *         {
194  *           EMIT-HOVER-SIGNAL( ACTOR-PARENT )
195  *         }
196  *       }
197  *     }
198  *     @endcode
199  *   - If there are several touch points, then the delivery is only to the first touch point's hit
200  *     actor (and its parents).  There will be NO touch or hover signal delivery for the hit actors of the
201  *     other touch points.
202  *   - The local coordinates are from the top-left (0.0f, 0.0f, 0.5f) of the hit actor.
203  *
204  * - Leave State
205  *   - A "Leave" state is set when the first point exits the bounds of the previous first point's
206  *     hit actor (primary hit actor).
207  *   - When this happens, the last primary hit actor's touch or hover signal is emitted with a "Leave" state
208  *     (only if it requires leave signals); see SetLeaveRequired().
209  *
210  * - Interrupted State
211  *   - If a system event occurs which interrupts the touch or hover processing, then the last primary hit
212  *     actor's touch or hover signals are emitted with an "Interrupted" state.
213  *   - If the last primary hit actor, or one of its parents, is no longer touchable or hoverable, then its
214  *     touch or hover signals are also emitted with an "Interrupted" state.
215  *   - If the consumed actor on touch-down is not the same as the consumed actor on touch-up, then
216  *     touch signals are also emitted from the touch-down actor with an "Interrupted" state.
217  *   - If the consumed actor on hover-start is not the same as the consumed actor on hover-finished, then
218  *     hover signals are also emitted from the hover-started actor with an "Interrupted" state.
219  * <h3>Key Events:</h3>
220  *
221  * Key events are received by an actor once set to grab key events, only one actor can be set as focused.
222  *
223  * @nosubgrouping
224  *
225  * Signals
226  * | %Signal Name      | Method                       |
227  * |-------------------|------------------------------|
228  * | touched           | @ref TouchedSignal()         |
229  * | hovered           | @ref HoveredSignal()         |
230  * | wheelEvent        | @ref WheelEventSignal()      |
231  * | onStage           | @ref OnStageSignal()         |
232  * | offStage          | @ref OffStageSignal()        |
233  * | onRelayout        | @ref OnRelayoutSignal()      |
234  *
235  * Actions
236  * | %Action Name      | %Actor method called         |
237  * |-------------------|------------------------------|
238  * | show              | %SetVisible( true )          |
239  * | hide              | %SetVisible( false )         |
240  * @SINCE_1_0.0
241  */
242
243 class DALI_IMPORT_API Actor : public Handle
244 {
245 public:
246
247   /**
248    * @brief An enumeration of properties belonging to the Actor class.
249    * @SINCE_1_0.0
250    */
251   struct Property
252   {
253     enum
254     {
255       PARENT_ORIGIN = DEFAULT_ACTOR_PROPERTY_START_INDEX, ///< name "parentOrigin",          type Vector3 @SINCE_1_0.0
256       PARENT_ORIGIN_X,                                    ///< name "parentOriginX",         type float @SINCE_1_0.0
257       PARENT_ORIGIN_Y,                                    ///< name "parentOriginY",         type float @SINCE_1_0.0
258       PARENT_ORIGIN_Z,                                    ///< name "parentOriginZ",         type float @SINCE_1_0.0
259       ANCHOR_POINT,                                       ///< name "anchorPoint",           type Vector3 @SINCE_1_0.0
260       ANCHOR_POINT_X,                                     ///< name "anchorPointX",          type float @SINCE_1_0.0
261       ANCHOR_POINT_Y,                                     ///< name "anchorPointY",          type float @SINCE_1_0.0
262       ANCHOR_POINT_Z,                                     ///< name "anchorPointZ",          type float @SINCE_1_0.0
263       SIZE,                                               ///< name "size",                  type Vector3 @SINCE_1_0.0
264       SIZE_WIDTH,                                         ///< name "sizeWidth",             type float @SINCE_1_0.0
265       SIZE_HEIGHT,                                        ///< name "sizeHeight",            type float @SINCE_1_0.0
266       SIZE_DEPTH,                                         ///< name "sizeDepth",             type float @SINCE_1_0.0
267       POSITION,                                           ///< name "position",              type Vector3 @SINCE_1_0.0
268       POSITION_X,                                         ///< name "positionX",             type float @SINCE_1_0.0
269       POSITION_Y,                                         ///< name "positionY",             type float @SINCE_1_0.0
270       POSITION_Z,                                         ///< name "positionZ",             type float @SINCE_1_0.0
271       WORLD_POSITION,                                     ///< name "worldPosition",         type Vector3    (read-only) @SINCE_1_0.0
272       WORLD_POSITION_X,                                   ///< name "worldPositionX",        type float      (read-only) @SINCE_1_0.0
273       WORLD_POSITION_Y,                                   ///< name "worldPositionY",        type float      (read-only) @SINCE_1_0.0
274       WORLD_POSITION_Z,                                   ///< name "worldPositionZ",        type float      (read-only) @SINCE_1_0.0
275       ORIENTATION,                                        ///< name "orientation",           type Quaternion @SINCE_1_0.0
276       WORLD_ORIENTATION,                                  ///< name "worldOrientation",      type Quaternion (read-only) @SINCE_1_0.0
277       SCALE,                                              ///< name "scale",                 type Vector3 @SINCE_1_0.0
278       SCALE_X,                                            ///< name "scaleX",                type float @SINCE_1_0.0
279       SCALE_Y,                                            ///< name "scaleY",                type float @SINCE_1_0.0
280       SCALE_Z,                                            ///< name "scaleZ",                type float @SINCE_1_0.0
281       WORLD_SCALE,                                        ///< name "worldScale",            type Vector3    (read-only) @SINCE_1_0.0
282       VISIBLE,                                            ///< name "visible",               type bool @SINCE_1_0.0
283       COLOR,                                              ///< name "color",                 type Vector4 @SINCE_1_0.0
284       COLOR_RED,                                          ///< name "colorRed",              type float @SINCE_1_0.0
285       COLOR_GREEN,                                        ///< name "colorGreen",            type float @SINCE_1_0.0
286       COLOR_BLUE,                                         ///< name "colorBlue",             type float @SINCE_1_0.0
287       COLOR_ALPHA,                                        ///< name "colorAlpha",            type float @SINCE_1_0.0
288       WORLD_COLOR,                                        ///< name "worldColor",            type Vector4    (read-only) @SINCE_1_0.0
289       WORLD_MATRIX,                                       ///< name "worldMatrix",           type Matrix     (read-only) @SINCE_1_0.0
290       NAME,                                               ///< name "name",                  type std::string @SINCE_1_0.0
291       SENSITIVE,                                          ///< name "sensitive",             type bool @SINCE_1_0.0
292       LEAVE_REQUIRED,                                     ///< name "leaveRequired",         type bool @SINCE_1_0.0
293       INHERIT_ORIENTATION,                                ///< name "inheritOrientation",    type bool @SINCE_1_0.0
294       INHERIT_SCALE,                                      ///< name "inheritScale",          type bool @SINCE_1_0.0
295       COLOR_MODE,                                         ///< name "colorMode",             type std::string @SINCE_1_0.0
296       POSITION_INHERITANCE,                               ///< name "positionInheritance",   type std::string @SINCE_1_0.0
297       DRAW_MODE,                                          ///< name "drawMode",              type std::string @SINCE_1_0.0
298       SIZE_MODE_FACTOR,                                   ///< name "sizeModeFactor",        type Vector3 @SINCE_1_0.0
299       WIDTH_RESIZE_POLICY,                                ///< name "widthResizePolicy",     type String @SINCE_1_0.0
300       HEIGHT_RESIZE_POLICY,                               ///< name "heightResizePolicy",    type String @SINCE_1_0.0
301       SIZE_SCALE_POLICY,                                  ///< name "sizeScalePolicy",       type String @SINCE_1_0.0
302       WIDTH_FOR_HEIGHT,                                   ///< name "widthForHeight",        type Boolean @SINCE_1_0.0
303       HEIGHT_FOR_WIDTH,                                   ///< name "heightForWidth",        type Boolean @SINCE_1_0.0
304       PADDING,                                            ///< name "padding",               type Vector4 @SINCE_1_0.0
305       MINIMUM_SIZE,                                       ///< name "minimumSize",           type Vector2 @SINCE_1_0.0
306       MAXIMUM_SIZE,                                       ///< name "maximumSize",           type Vector2 @SINCE_1_0.0
307     };
308   };
309
310   // Typedefs
311
312   typedef Signal< bool (Actor, const TouchEvent&)> TouchSignalType;                 ///< Touch signal type @SINCE_1_0.0
313   typedef Signal< bool (Actor, const HoverEvent&)> HoverSignalType;                 ///< Hover signal type @SINCE_1_0.0
314   typedef Signal< bool (Actor, const WheelEvent&) > WheelEventSignalType;           ///< Wheel signal type @SINCE_1_0.0
315   typedef Signal< void (Actor) > OnStageSignalType;  ///< Stage connection signal type @SINCE_1_0.0
316   typedef Signal< void (Actor) > OffStageSignalType; ///< Stage disconnection signal type @SINCE_1_0.0
317   typedef Signal< void (Actor) > OnRelayoutSignalType; ///< Called when the actor is relaid out @SINCE_1_0.0
318
319   // Creation
320
321   /**
322    * @brief Create an uninitialized Actor; this can be initialized with Actor::New().
323    *
324    * Calling member functions with an uninitialized Dali::Object is not allowed.
325    * @SINCE_1_0.0
326    */
327   Actor();
328
329   /**
330    * @brief Create an initialized Actor.
331    *
332    * @SINCE_1_0.0
333    * @return A handle to a newly allocated Dali resource.
334    */
335   static Actor New();
336
337   /**
338    * @brief Downcast an Object handle to Actor handle.
339    *
340    * If handle points to a Actor object the downcast produces valid
341    * handle. If not the returned handle is left uninitialized.
342    *
343    * @SINCE_1_0.0
344    * @param[in] handle to An object
345    * @return handle to a Actor object or an uninitialized handle
346    */
347   static Actor DownCast( BaseHandle handle );
348
349   /**
350    * @brief Dali::Actor is intended as a base class
351    *
352    * This is non-virtual since derived Handle types must not contain data or virtual methods.
353    * @SINCE_1_0.0
354    */
355   ~Actor();
356
357   /**
358    * @brief Copy constructor
359    *
360    * @SINCE_1_0.0
361    * @param [in] copy The actor to copy.
362    */
363   Actor(const Actor& copy);
364
365   /**
366    * @brief Assignment operator
367    *
368    * @SINCE_1_0.0
369    * @param [in] rhs The actor to copy.
370    */
371   Actor& operator=(const Actor& rhs);
372
373   /**
374    * @brief Retrieve the Actor's name.
375    *
376    * @SINCE_1_0.0
377    * @return The Actor's name.
378    * @pre The Actor has been initialized.
379    */
380   const std::string& GetName() const;
381
382   /**
383    * @brief Sets the Actor's name.
384    *
385    * @SINCE_1_0.0
386    * @param [in] name The new name.
387    * @pre The Actor has been initialized.
388    */
389   void SetName(const std::string& name);
390
391   /**
392    * @brief Retrieve the unique ID of the actor.
393    *
394    * @SINCE_1_0.0
395    * @return The ID.
396    * @pre The Actor has been initialized.
397    */
398   unsigned int GetId() const;
399
400   // Containment
401
402   /**
403    * @brief Query whether an actor is the root actor, which is owned by the Stage.
404    *
405    * @SINCE_1_0.0
406    * @return True if the actor is the root actor.
407    * @pre The Actor has been initialized.
408    */
409   bool IsRoot() const;
410
411   /**
412    * @brief Query whether the actor is connected to the Stage.
413    *
414    * When an actor is connected, it will be directly or indirectly parented to the root Actor.
415    * @SINCE_1_0.0
416    * @return True if the actor is connected to the Stage.
417    * @pre The Actor has been initialized.
418    * @note The root Actor is provided automatically by Dali::Stage, and is always considered to be connected.
419    */
420   bool OnStage() const;
421
422   /**
423    * @brief Query whether the actor is of class Dali::Layer.
424    *
425    * @SINCE_1_0.0
426    * @return True if the actor is a layer.
427    * @pre The Actor has been initialized.
428    */
429   bool IsLayer() const;
430
431   /**
432    * @brief Gets the layer in which the actor is present.
433    *
434    * @SINCE_1_0.0
435    * @return The layer, which will be uninitialized if the actor is off-stage.
436    * @pre The Actor has been initialized.
437    */
438   Layer GetLayer();
439
440   /**
441    * @brief Adds a child Actor to this Actor.
442    *
443    * NOTE! if the child already has a parent, it will be removed from old parent
444    * and reparented to this actor. This may change childs position, color,
445    * scale etc as it now inherits them from this actor
446    * @SINCE_1_0.0
447    * @param [in] child The child.
448    * @pre This Actor (the parent) has been initialized.
449    * @pre The child actor has been initialized.
450    * @pre The child actor is not the same as the parent actor.
451    * @pre The actor is not the Root actor
452    * @post The child will be referenced by its parent. This means that the child will be kept alive,
453    * even if the handle passed into this method is reset or destroyed.
454    */
455   void Add(Actor child);
456
457   /**
458    * @brief Removes a child Actor from this Actor.
459    *
460    * If the actor was not a child of this actor, this is a no-op.
461    * @SINCE_1_0.0
462    * @param [in] child The child.
463    * @pre This Actor (the parent) has been initialized.
464    * @pre The child actor is not the same as the parent actor.
465    */
466   void Remove(Actor child);
467
468   /**
469    * @brief Removes an actor from its parent.
470    *
471    * If the actor has no parent, this method does nothing.
472    * @SINCE_1_0.0
473    * @pre The (child) actor has been initialized.
474    */
475   void Unparent();
476
477   /**
478    * @brief Retrieve the number of children held by the actor.
479    *
480    * @SINCE_1_0.0
481    * @return The number of children
482    * @pre The Actor has been initialized.
483    */
484   unsigned int GetChildCount() const;
485
486   /**
487    * @brief Retrieve and child actor by index.
488    *
489    * @SINCE_1_0.0
490    * @param[in] index The index of the child to retrieve
491    * @return The actor for the given index or empty handle if children not initialised
492    * @pre The Actor has been initialized.
493    */
494   Actor GetChildAt(unsigned int index) const;
495
496   /**
497    * @brief Search through this actor's hierarchy for an actor with the given name.
498    *
499    * The actor itself is also considered in the search
500    * @SINCE_1_0.0
501    * @param[in] actorName the name of the actor to find
502    * @return A handle to the actor if found, or an empty handle if not.
503    * @pre The Actor has been initialized.
504    */
505   Actor FindChildByName(const std::string& actorName);
506
507   /**
508    * @brief Search through this actor's hierarchy for an actor with the given unique ID.
509    *
510    * The actor itself is also considered in the search
511    * @SINCE_1_0.0
512    * @param[in] id the ID of the actor to find
513    * @return A handle to the actor if found, or an empty handle if not.
514    * @pre The Actor has been initialized.
515    */
516   Actor FindChildById(const unsigned int id);
517
518   /**
519    * @brief Retrieve the actor's parent.
520    *
521    * @SINCE_1_0.0
522    * @return A handle to the actor's parent. If the actor has no parent, this handle will be invalid.
523    * @pre The actor has been initialized.
524    */
525   Actor GetParent() const;
526
527   // Positioning
528
529   /**
530    * @brief Set the origin of an actor, within its parent's area.
531    *
532    * This is expressed in unit coordinates, such that (0.0, 0.0, 0.5) is the top-left corner of the parent,
533    * and (1.0, 1.0, 0.5) is the bottom-right corner.
534    * The default parent-origin is Dali::ParentOrigin::TOP_LEFT (0.0, 0.0, 0.5).
535    * An actor position is the distance between this origin, and the actors anchor-point.
536    * @SINCE_1_0.0
537    * @param [in] origin The new parent-origin.
538    * @pre The Actor has been initialized.
539    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentParentOrigin().
540    * @see Dali::ParentOrigin for predefined parent origin values
541    */
542   void SetParentOrigin(const Vector3& origin);
543
544   /**
545    * @brief Retrieve the parent-origin of an actor.
546    *
547    * @SINCE_1_0.0
548    * @return The current parent-origin.
549    * @pre The Actor has been initialized.
550    * @note This property can be animated; the return value may not match the value written with SetParentOrigin().
551    */
552   Vector3 GetCurrentParentOrigin() const;
553
554   /**
555    * @brief Set the anchor-point of an actor.
556    *
557    * This is expressed in unit coordinates, such that (0.0, 0.0, 0.5)
558    * is the top-left corner of the actor, and (1.0, 1.0, 0.5) is the
559    * bottom-right corner.  The default anchor point is
560    * Dali::AnchorPoint::CENTER (0.5, 0.5, 0.5).
561    * An actor position is the distance between its parent-origin, and this anchor-point.
562    * An actor's orientation is the rotation from its default orientation, the rotation is centered around its anchor-point.
563    * @SINCE_1_0.0
564    * @param [in] anchorPoint The new anchor-point.
565    * @pre The Actor has been initialized.
566    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentAnchorPoint().
567    * @see Dali::AnchorPoint for predefined anchor point values
568    */
569   void SetAnchorPoint(const Vector3& anchorPoint);
570
571   /**
572    * @brief Retrieve the anchor-point of an actor.
573    *
574    * @SINCE_1_0.0
575    * @return The current anchor-point.
576    * @pre The Actor has been initialized.
577    * @note This property can be animated; the return value may not match the value written with SetAnchorPoint().
578    */
579   Vector3 GetCurrentAnchorPoint() const;
580
581   /**
582    * @brief Sets the size of an actor.
583    *
584    * Geometry can be scaled to fit within this area.
585    * This does not interfere with the actors scale factor.
586    * The actors default depth is the minimum of width & height.
587    * @SINCE_1_0.0
588    * @param [in] width  The new width.
589    * @param [in] height The new height.
590    * @pre The actor has been initialized.
591    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentSize().
592    */
593   void SetSize(float width, float height);
594
595   /**
596    * @brief Sets the size of an actor.
597    *
598    * Geometry can be scaled to fit within this area.
599    * This does not interfere with the actors scale factor.
600    * @SINCE_1_0.0
601    * @param [in] width  The size of the actor along the x-axis.
602    * @param [in] height The size of the actor along the y-axis.
603    * @param [in] depth The size of the actor along the z-axis.
604    * @pre The actor has been initialized.
605    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentSize().
606    */
607   void SetSize(float width, float height, float depth);
608
609   /**
610    * @brief Sets the size of an actor.
611    *
612    * Geometry can be scaled to fit within this area.
613    * This does not interfere with the actors scale factor.
614    * The actors default depth is the minimum of width & height.
615    * @SINCE_1_0.0
616    * @param [in] size The new size.
617    * @pre The actor has been initialized.
618    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentSize().
619    */
620   void SetSize(const Vector2& size);
621
622   /**
623    * @brief Sets the size of an actor.
624    *
625    * Geometry can be scaled to fit within this area.
626    * This does not interfere with the actors scale factor.
627    * @SINCE_1_0.0
628    * @param [in] size The new size.
629    * @pre The actor has been initialized.
630    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentSize().
631    */
632   void SetSize(const Vector3& size);
633
634   /**
635    * @brief Retrieve the actor's size.
636    *
637    * @SINCE_1_0.0
638    * @return The actor's current size.
639    * @pre The actor has been initialized.
640    * @note This return is the value that was set using SetSize or the target size of an animation
641    */
642   Vector3 GetTargetSize() const;
643
644   /**
645    * @brief Retrieve the actor's size.
646    *
647    * @SINCE_1_0.0
648    * @return The actor's current size.
649    * @pre The actor has been initialized.
650    * @note This property can be animated; the return value may not match the value written with SetSize().
651    */
652   Vector3 GetCurrentSize() const;
653
654   /**
655    * @brief Return the natural size of the actor.
656    *
657    * Deriving classes stipulate the natural size and by default an actor has a ZERO natural size.
658    *
659    * @SINCE_1_0.0
660    * @return The actor's natural size
661    */
662   Vector3 GetNaturalSize() const;
663
664   /**
665    * @brief Sets the position of the actor.
666    *
667    * The Actor's z position will be set to 0.0f.
668    * @SINCE_1_0.0
669    * @param [in] x The new x position
670    * @param [in] y The new y position
671    * @pre The Actor has been initialized.
672    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentPosition().
673    */
674   void SetPosition(float x, float y);
675
676   /**
677    * @brief Sets the position of the Actor.
678    *
679    * @SINCE_1_0.0
680    * @param [in] x The new x position
681    * @param [in] y The new y position
682    * @param [in] z The new z position
683    * @pre The Actor has been initialized.
684    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentPosition().
685    */
686   void SetPosition(float x, float y, float z);
687
688   /**
689    * @brief Sets the position of the Actor.
690    *
691    * @SINCE_1_0.0
692    * @param [in] position The new position
693    * @pre The Actor has been initialized.
694    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentPosition().
695    */
696   void SetPosition(const Vector3& position);
697
698   /**
699    * @brief Set the position of an actor along the X-axis.
700    *
701    * @SINCE_1_0.0
702    * @param [in] x The new x position
703    * @pre The Actor has been initialized.
704    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentPosition().
705    */
706   void SetX(float x);
707
708   /**
709    * @brief Set the position of an actor along the Y-axis.
710    *
711    * @SINCE_1_0.0
712    * @param [in] y The new y position.
713    * @pre The Actor has been initialized.
714    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentPosition().
715    */
716   void SetY(float y);
717
718   /**
719    * @brief Set the position of an actor along the Z-axis.
720    *
721    * @SINCE_1_0.0
722    * @param [in] z The new z position
723    * @pre The Actor has been initialized.
724    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentPosition().
725    */
726   void SetZ(float z);
727
728   /**
729    * @brief Translate an actor relative to its existing position.
730    *
731    * @SINCE_1_0.0
732    * @param[in] distance The actor will move by this distance.
733    * @pre The actor has been initialized.
734    */
735   void TranslateBy(const Vector3& distance);
736
737   /**
738    * @brief Retrieve the position of the Actor.
739    *
740    * @SINCE_1_0.0
741    * @return the Actor's current position.
742    * @pre The Actor has been initialized.
743    * @note This property can be animated; the return value may not match the value written with SetPosition().
744    */
745   Vector3 GetCurrentPosition() const;
746
747   /**
748    * @brief Retrieve the world-position of the Actor.
749    *
750    * @SINCE_1_0.0
751    * @return The Actor's current position in world coordinates.
752    * @pre The Actor has been initialized.
753    * @note The actor will not have a world-position, unless it has previously been added to the stage.
754    */
755   Vector3 GetCurrentWorldPosition() const;
756
757   /**
758    * @brief Set the actors position inheritance mode.
759    *
760    * The default is to inherit.
761    * Switching this off means that using SetPosition() sets the actor's world position.
762    * @SINCE_1_0.0
763    * @param[in] mode to use
764    * @pre The Actor has been initialized.
765    * @see PositionInheritanceMode
766    */
767   void SetPositionInheritanceMode( PositionInheritanceMode mode );
768
769   /**
770    * @brief Returns the actors position inheritance mode.
771    *
772    * @SINCE_1_0.0
773    * @return true if the actor inherit's it's parent orientation, false if it uses world orientation.
774    * @pre The Actor has been initialized.
775    */
776   PositionInheritanceMode GetPositionInheritanceMode() const;
777
778   /**
779    * @brief Sets the orientation of the Actor.
780    *
781    * An actor's orientation is the rotation from its default orientation, and the rotation is centered around its anchor-point.
782    * @SINCE_1_0.0
783    * @param [in] angle The new orientation angle in degrees.
784    * @param [in] axis The new axis of orientation.
785    * @pre The Actor has been initialized.
786    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentOrientation().
787    */
788   void SetOrientation( const Degree& angle, const Vector3& axis )
789   {
790     SetOrientation( Radian( angle ), axis );
791   }
792
793   /**
794    * @brief Sets the orientation of the Actor.
795    *
796    * An actor's orientation is the rotation from its default orientation, and the rotation is centered around its anchor-point.
797    * @SINCE_1_0.0
798    * @param [in] angle The new orientation angle in radians.
799    * @param [in] axis The new axis of orientation.
800    * @pre The Actor has been initialized.
801    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentOrientation().
802    */
803   void SetOrientation(const Radian& angle, const Vector3& axis);
804
805   /**
806    * @brief Sets the orientation of the Actor.
807    *
808    * An actor's orientation is the rotation from its default orientation, and the rotation is centered around its anchor-point.
809    * @SINCE_1_0.0
810    * @param [in] orientation The new orientation.
811    * @pre The Actor has been initialized.
812    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentOrientation().
813    */
814   void SetOrientation(const Quaternion& orientation);
815
816   /**
817    * @brief Apply a relative rotation to an actor.
818    *
819    * @SINCE_1_0.0
820    * @param[in] angle The angle to the rotation to combine with the existing orientation.
821    * @param[in] axis The axis of the rotation to combine with the existing orientation.
822    * @pre The actor has been initialized.
823    */
824   void RotateBy( const Degree& angle, const Vector3& axis )
825   {
826     RotateBy( Radian( angle ), axis );
827   }
828
829   /**
830    * @brief Apply a relative rotation to an actor.
831    *
832    * @SINCE_1_0.0
833    * @param[in] angle The angle to the rotation to combine with the existing orientation.
834    * @param[in] axis The axis of the rotation to combine with the existing orientation.
835    * @pre The actor has been initialized.
836    */
837   void RotateBy(const Radian& angle, const Vector3& axis);
838
839   /**
840    * @brief Apply a relative rotation to an actor.
841    *
842    * @SINCE_1_0.0
843    * @param[in] relativeRotation The rotation to combine with the existing orientation.
844    * @pre The actor has been initialized.
845    */
846   void RotateBy(const Quaternion& relativeRotation);
847
848   /**
849    * @brief Retreive the Actor's orientation.
850    *
851    * @SINCE_1_0.0
852    * @return The current orientation.
853    * @pre The Actor has been initialized.
854    * @note This property can be animated; the return value may not match the value written with SetOrientation().
855    */
856   Quaternion GetCurrentOrientation() const;
857
858   /**
859    * @brief Set whether a child actor inherits it's parent's orientation.
860    *
861    * Default is to inherit.
862    * Switching this off means that using SetOrientation() sets the actor's world orientation.
863    * @SINCE_1_0.0
864    * @param[in] inherit - true if the actor should inherit orientation, false otherwise.
865    * @pre The Actor has been initialized.
866    */
867   void SetInheritOrientation(bool inherit);
868
869   /**
870    * @brief Returns whether the actor inherit's it's parent's orientation.
871    *
872    * @SINCE_1_0.0
873    * @return true if the actor inherit's it's parent orientation, false if it uses world orientation.
874    * @pre The Actor has been initialized.
875    */
876   bool IsOrientationInherited() const;
877
878   /**
879    * @brief Retrieve the world-orientation of the Actor.
880    *
881    * @SINCE_1_0.0
882    * @return The Actor's current orientation in the world.
883    * @pre The Actor has been initialized.
884    * @note The actor will not have a world-orientation, unless it has previously been added to the stage.
885    */
886   Quaternion GetCurrentWorldOrientation() const;
887
888   /**
889    * @brief Set the scale factor applied to an actor.
890    *
891    * @SINCE_1_0.0
892    * @param [in] scale The scale factor applied on all axes.
893    * @pre The Actor has been initialized.
894    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentScale().
895    */
896   void SetScale(float scale);
897
898   /**
899    * @brief Set the scale factor applied to an actor.
900    *
901    * @SINCE_1_0.0
902    * @param [in] scaleX The scale factor applied along the x-axis.
903    * @param [in] scaleY The scale factor applied along the y-axis.
904    * @param [in] scaleZ The scale factor applied along the z-axis.
905    * @pre The Actor has been initialized.
906    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentScale().
907    */
908   void SetScale(float scaleX, float scaleY, float scaleZ);
909
910   /**
911    * @brief Set the scale factor applied to an actor.
912    *
913    * @SINCE_1_0.0
914    * @param [in] scale A vector representing the scale factor for each axis.
915    * @pre The Actor has been initialized.
916    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentScale().
917    */
918   void SetScale(const Vector3& scale);
919
920   /**
921    * @brief Apply a relative scale to an actor.
922    *
923    * @SINCE_1_0.0
924    * @param[in] relativeScale The scale to combine with the actors existing scale.
925    * @pre The actor has been initialized.
926    */
927   void ScaleBy(const Vector3& relativeScale);
928
929   /**
930    * @brief Retrieve the scale factor applied to an actor.
931    *
932    * @SINCE_1_0.0
933    * @return A vector representing the scale factor for each axis.
934    * @pre The Actor has been initialized.
935    * @note This property can be animated; the return value may not match the value written with SetScale().
936    */
937   Vector3 GetCurrentScale() const;
938
939   /**
940    * @brief Retrieve the world-scale of the Actor.
941    *
942    * @SINCE_1_0.0
943    * @return The Actor's current scale in the world.
944    * @pre The Actor has been initialized.
945    * @note The actor will not have a world-scale, unless it has previously been added to the stage.
946    */
947   Vector3 GetCurrentWorldScale() const;
948
949   /**
950    * @brief Set whether a child actor inherits it's parent's scale.
951    *
952    * Default is to inherit.
953    * Switching this off means that using SetScale() sets the actor's world scale.
954    * @SINCE_1_0.0
955    * @param[in] inherit - true if the actor should inherit scale, false otherwise.
956    * @pre The Actor has been initialized.
957    */
958   void SetInheritScale( bool inherit );
959
960   /**
961    * @brief Returns whether the actor inherit's it's parent's scale.
962    *
963    * @SINCE_1_0.0
964    * @return true if the actor inherit's it's parent scale, false if it uses world scale.
965    * @pre The Actor has been initialized.
966    */
967   bool IsScaleInherited() const;
968
969   /**
970    * @brief Retrieves the world-matrix of the actor.
971    *
972    * @SINCE_1_0.0
973    * @return The Actor's current world matrix
974    * @pre The Actor has been initialized.
975    * @note The actor will not have a world-matrix, unless it has previously been added to the stage.
976    */
977   Matrix GetCurrentWorldMatrix() const;
978
979   // Visibility & Color
980
981   /**
982    * @brief Sets the visibility flag of an actor.
983    *
984    * @SINCE_1_0.0
985    * @param [in] visible The new visibility flag.
986    * @pre The actor has been initialized.
987    * @note This is an asynchronous method; the value written may not match a value subsequently read with IsVisible().
988    * @note If an actor's visibility flag is set to false, then the actor and its children will not be rendered.
989    *       This is regardless of the individual visibility values of the children i.e. an actor will only be
990    *       rendered if all of its parents have visibility set to true.
991    */
992   void SetVisible(bool visible);
993
994   /**
995    * @brief Retrieve the visibility flag of an actor.
996    *
997    * @SINCE_1_0.0
998    * @return The visibility flag.
999    * @pre The actor has been initialized.
1000    * @note This property can be animated; the return value may not match the value written with SetVisible().
1001    * @note If an actor is not visible, then the actor and its children will not be rendered.
1002    *       This is regardless of the individual visibility values of the children i.e. an actor will only be
1003    *       rendered if all of its parents have visibility set to true.
1004    */
1005   bool IsVisible() const;
1006
1007   /**
1008    * @brief Sets the opacity of an actor.
1009    *
1010    * @SINCE_1_0.0
1011    * @param [in] opacity The new opacity.
1012    * @pre The actor has been initialized.
1013    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentOpacity().
1014    */
1015   void SetOpacity(float opacity);
1016
1017   /**
1018    * @brief Retrieve the actor's opacity.
1019    *
1020    * @SINCE_1_0.0
1021    * @return The actor's opacity.
1022    * @pre The actor has been initialized.
1023    * @note This property can be animated; the return value may not match the value written with SetOpacity().
1024    */
1025   float GetCurrentOpacity() const;
1026
1027   /**
1028    * @brief Sets the actor's color; this is an RGBA value.
1029    *
1030    * The final color of the actor depends on its color mode.
1031    * @SINCE_1_0.0
1032    * @param [in] color The new color.
1033    * @pre The Actor has been initialized.
1034    * @note This is an asynchronous method; the value written may not match a value subsequently read with GetCurrentColor().
1035    */
1036   void SetColor(const Vector4& color);
1037
1038   /**
1039    * @brief Retrieve the actor's color.
1040    *
1041    * Actor's own color is not clamped.
1042    * @SINCE_1_0.0
1043    * @return The color.
1044    * @pre The Actor has been initialized.
1045    * @note This property can be animated; the return value may not match the value written with SetColor().
1046    */
1047   Vector4 GetCurrentColor() const;
1048
1049   /**
1050    * @brief Sets the actor's color mode.
1051    *
1052    * This specifies whether the Actor uses its own color, or inherits
1053    * its parent color. The default is USE_OWN_MULTIPLY_PARENT_ALPHA.
1054    * @SINCE_1_0.0
1055    * @param [in] colorMode to use.
1056    * @pre The Actor has been initialized.
1057    */
1058   void SetColorMode( ColorMode colorMode );
1059
1060   /**
1061    * @brief Returns the actor's color mode.
1062    *
1063    * @SINCE_1_0.0
1064    * @return currently used colorMode.
1065    * @pre The Actor has been initialized.
1066    */
1067   ColorMode GetColorMode() const;
1068
1069   /**
1070    * @brief Retrieve the world-color of the Actor, where each component is clamped within the 0->1 range.
1071    *
1072    * @SINCE_1_0.0
1073    * @return The Actor's current color in the world.
1074    * @pre The Actor has been initialized.
1075    * @note The actor will not have a world-color, unless it has previously been added to the stage.
1076    */
1077   Vector4 GetCurrentWorldColor() const;
1078
1079   /**
1080    * @brief Set how the actor and its children should be drawn.
1081    *
1082    * Not all actors are renderable, but DrawMode can be inherited from any actor.
1083    * By default a renderable actor will be drawn as a 3D object. It will be depth-tested against
1084    * other objects in the world i.e. it may be obscured if other objects are in front.
1085    *
1086    * If DrawMode::OVERLAY_2D is used, the actor and its children will be drawn as a 2D overlay.
1087    * Overlay actors are drawn in a separate pass, after all non-overlay actors within the Layer.
1088    * For overlay actors, the drawing order is with respect to depthIndex property of Renderers,
1089    * and depth-testing will not be used.
1090    *
1091    * If DrawMode::STENCIL is used, the actor and its children will be used to stencil-test other actors
1092    * within the Layer. Stencil actors are therefore drawn into the stencil buffer before any other
1093    * actors within the Layer.
1094    *
1095    * @SINCE_1_0.0
1096    * @param[in] drawMode The new draw-mode to use.
1097    * @note Setting STENCIL will override OVERLAY_2D, if that would otherwise have been inherited.
1098    * @note Layers do not inherit the DrawMode from their parents.
1099    */
1100   void SetDrawMode( DrawMode::Type drawMode );
1101
1102   /**
1103    * @brief Query how the actor and its children will be drawn.
1104    *
1105    * @SINCE_1_0.0
1106    * @return True if the Actor is an overlay.
1107    */
1108   DrawMode::Type GetDrawMode() const;
1109
1110   // Input Handling
1111
1112   /**
1113    * @brief Sets whether an actor should emit touch or hover signals; see SignalTouch() and SignalHover().
1114    *
1115    * An actor is sensitive by default, which means that as soon as an application connects to the SignalTouch(),
1116    * the touch event signal will be emitted, and as soon as an application connects to the SignalHover(), the
1117    * hover event signal will be emitted.
1118    *
1119    * If the application wishes to temporarily disable the touch or hover event signal emission, then they can do so by calling:
1120    * @code
1121    * actor.SetSensitive(false);
1122    * @endcode
1123    *
1124    * Then, to re-enable the touch or hover event signal emission, the application should call:
1125    * @code
1126    * actor.SetSensitive(true);
1127    * @endcode
1128    *
1129    * @SINCE_1_0.0
1130    * @param[in]  sensitive  true to enable emission of the touch or hover event signals, false otherwise.
1131    * @pre The Actor has been initialized.
1132    * @note If an actor's sensitivity is set to false, then it's children will not be hittable either.
1133    *       This is regardless of the individual sensitivity values of the children i.e. an actor will only be
1134    *       hittable if all of its parents have sensitivity set to true.
1135    * @see @see SignalTouch() and SignalHover().
1136    */
1137   void SetSensitive(bool sensitive);
1138
1139   /**
1140    * @brief Query whether an actor emits touch or hover event signals.
1141    *
1142    * @SINCE_1_0.0
1143    * @return true, if emission of touch or hover event signals is enabled, false otherwise.
1144    * @pre The Actor has been initialized.
1145    * @note If an actor is not sensitive, then it's children will not be hittable either.
1146    *       This is regardless of the individual sensitivity values of the children i.e. an actor will only be
1147    *       hittable if all of its parents have sensitivity set to true.
1148    */
1149   bool IsSensitive() const;
1150
1151   /**
1152    * @brief Converts screen coordinates into the actor's coordinate system using the default camera.
1153    *
1154    * @SINCE_1_0.0
1155    * @param[out] localX On return, the X-coordinate relative to the actor.
1156    * @param[out] localY On return, the Y-coordinate relative to the actor.
1157    * @param[in] screenX The screen X-coordinate.
1158    * @param[in] screenY The screen Y-coordinate.
1159    * @return True if the conversion succeeded.
1160    * @pre The Actor has been initialized.
1161    * @note The actor coordinates are relative to the top-left (0.0, 0.0, 0.5)
1162    */
1163   bool ScreenToLocal(float& localX, float& localY, float screenX, float screenY) const;
1164
1165   /**
1166    * @brief Sets whether the actor should receive a notification when touch or hover motion events leave
1167    * the boundary of the actor.
1168    *
1169    * @SINCE_1_0.0
1170    * @param[in]  required  Should be set to true if a Leave event is required
1171    * @pre The Actor has been initialized.
1172    * @note By default, this is set to false as most actors do not require this.
1173    * @note Need to connect to the SignalTouch or SignalHover to actually receive this event.
1174    *
1175    */
1176   void SetLeaveRequired(bool required);
1177
1178   /**
1179    * @brief This returns whether the actor requires touch or hover events whenever touch or hover motion events leave
1180    * the boundary of the actor.
1181    *
1182    * @SINCE_1_0.0
1183    * @return true if a Leave event is required, false otherwise.
1184    * @pre The Actor has been initialized.
1185    */
1186   bool GetLeaveRequired() const;
1187
1188   /**
1189    * @brief Sets whether the actor should be focusable by keyboard navigation.
1190    *
1191    * The default is false.
1192    * @SINCE_1_0.0
1193    * @param[in] focusable - true if the actor should be focusable by keyboard navigation,
1194    * false otherwise.
1195    * @pre The Actor has been initialized.
1196    */
1197   void SetKeyboardFocusable( bool focusable );
1198
1199   /**
1200    * @brief Returns whether the actor is focusable by keyboard navigation.
1201    *
1202    * @SINCE_1_0.0
1203    * @return true if the actor is focusable by keyboard navigation, false if not.
1204    * @pre The Actor has been initialized.
1205    */
1206   bool IsKeyboardFocusable() const;
1207
1208   // SIZE NEGOTIATION
1209
1210   /**
1211    * @brief Set the resize policy to be used for the given dimension(s)
1212    *
1213    * @SINCE_1_0.0
1214    * @param[in] policy The resize policy to use
1215    * @param[in] dimension The dimension(s) to set policy for. Can be a bitfield of multiple dimensions.
1216    */
1217   void SetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension );
1218
1219   /**
1220    * @brief Return the resize policy used for a single dimension
1221    *
1222    * @SINCE_1_0.0
1223    * @param[in] dimension The dimension to get policy for
1224    * @return Return the dimension resize policy
1225    */
1226   ResizePolicy::Type GetResizePolicy( Dimension::Type dimension ) const;
1227
1228   /**
1229    * @brief Set the policy to use when setting size with size negotiation. Defaults to SizeScalePolicy::USE_SIZE_SET.
1230    *
1231    * @SINCE_1_0.0
1232    * @param[in] policy The policy to use for when the size is set
1233    */
1234   void SetSizeScalePolicy( SizeScalePolicy::Type policy );
1235
1236   /**
1237    * @brief Return the size set policy in use
1238    *
1239    * @SINCE_1_0.0
1240    * @return Return the size set policy
1241    */
1242   SizeScalePolicy::Type GetSizeScalePolicy() const;
1243
1244   /**
1245    * @brief Sets the relative to parent size factor of the actor.
1246    *
1247    * This factor is only used when ResizePolicy is set to either:
1248    * ResizePolicy::SIZE_RELATIVE_TO_PARENT or ResizePolicy::SIZE_FIXED_OFFSET_FROM_PARENT.
1249    * This actor's size is set to the actor's size multipled by or added to this factor,
1250    * depending on ResizePolicy (See SetResizePolicy).
1251    *
1252    * @SINCE_1_0.0
1253    * @param [in] factor A Vector3 representing the relative factor to be applied to each axis.
1254    * @pre The Actor has been initialized.
1255    */
1256   void SetSizeModeFactor( const Vector3& factor );
1257
1258   /**
1259    * @brief Retrieve the relative to parent size factor of the actor.
1260    *
1261    * @SINCE_1_0.0
1262    * @return The Actor's current relative size factor.
1263    * @pre The Actor has been initialized.
1264    */
1265   Vector3 GetSizeModeFactor() const;
1266
1267   /**
1268    * @brief Calculate the height of the actor given a width
1269    *
1270    * The natural size is used for default calculation.
1271    * size 0 is treated as aspect ratio 1:1.
1272    *
1273    * @SINCE_1_0.0
1274    * @param width Width to use
1275    * @return Return the height based on the width
1276    */
1277   float GetHeightForWidth( float width );
1278
1279   /**
1280    * @brief Calculate the width of the actor given a height
1281    *
1282    * The natural size is used for default calculation.
1283    * size 0 is treated as aspect ratio 1:1.
1284    *
1285    * @SINCE_1_0.0
1286    * @param height Height to use
1287    * @return Return the width based on the height
1288    */
1289   float GetWidthForHeight( float height );
1290
1291   /**
1292    * @brief Return the value of negotiated dimension for the given dimension
1293    *
1294    * @SINCE_1_0.0
1295    * @param dimension The dimension to retrieve
1296    * @return Return the value of the negotiated dimension
1297    */
1298   float GetRelayoutSize( Dimension::Type dimension ) const;
1299
1300   /**
1301    * @brief Set the padding for use in layout
1302    *
1303    * @SINCE_1_0.0
1304    * @param[in] padding Padding for the actor
1305    */
1306   void SetPadding( const Padding& padding );
1307
1308   /**
1309    * @brief Return the value of the padding
1310    *
1311    * @SINCE_1_0.0
1312    * @param paddingOut The returned padding data
1313    */
1314   void GetPadding( Padding& paddingOut ) const;
1315
1316   /**
1317    * @brief Set the minimum size an actor can be assigned in size negotiation
1318    *
1319    * @SINCE_1_0.0
1320    * @param[in] size The minimum size
1321    */
1322   void SetMinimumSize( const Vector2& size );
1323
1324   /**
1325    * @brief Return the minimum relayout size
1326    *
1327    * @SINCE_1_0.0
1328    * @return Return the mininmum size
1329    */
1330   Vector2 GetMinimumSize();
1331
1332   /**
1333    * @brief Set the maximum size an actor can be assigned in size negotiation
1334    *
1335    * @SINCE_1_0.0
1336    * @param[in] size The maximum size
1337    */
1338   void SetMaximumSize( const Vector2& size );
1339
1340   /**
1341    * @brief Return the maximum relayout size
1342    *
1343    * @SINCE_1_0.0
1344    * @return Return the maximum size
1345    */
1346   Vector2 GetMaximumSize();
1347
1348   /**
1349    * @brief Get depth in the hierarchy for the actor
1350    *
1351    * @SINCE_1_0.0
1352    * @return The current depth in the hierarchy of the actor, or -1 if actor is not in the hierarchy
1353    */
1354   int GetHierarchyDepth();
1355
1356 public: // Renderer
1357
1358   /**
1359    * @brief Add a renderer to this actor.
1360    *
1361    * @SINCE_1_0.0
1362    * @param[in] renderer Renderer to add to the actor
1363    * @return The index of the Renderer that was added
1364    * @pre The renderer must be initialized.
1365    *
1366    */
1367   unsigned int AddRenderer( Renderer& renderer );
1368
1369   /**
1370    * @brief Get the number of renderers on this actor.
1371    *
1372    * @SINCE_1_0.0
1373    * @return the number of renderers on this actor
1374    */
1375   unsigned int GetRendererCount() const;
1376
1377   /**
1378    * @brief Get a Renderer by index.
1379    *
1380    * @SINCE_1_0.0
1381    * @param[in] index The index of the renderer to fetch
1382    * @return The renderer at the specified index
1383    * @pre The index must be between 0 and GetRendererCount()-1
1384    *
1385    */
1386   Renderer GetRendererAt( unsigned int index );
1387
1388   /**
1389    * @brief Remove an renderer from the actor.
1390    *
1391    * @SINCE_1_0.0
1392    * @param[in] renderer Handle to the renderer that is to be removed
1393    */
1394   void RemoveRenderer( Renderer& renderer );
1395
1396   /**
1397    * @brief Remove an renderer from the actor by index.
1398    *
1399    * @SINCE_1_0.0
1400    * @param[in] index Index of the renderer that is to be removed
1401    * @pre The index must be between 0 and GetRendererCount()-1
1402    *
1403    */
1404   void RemoveRenderer( unsigned int index );
1405
1406 public: // Signals
1407
1408   /**
1409    * @brief This signal is emitted when touch input is received.
1410    *
1411    * A callback of the following type may be connected:
1412    * @code
1413    *   bool YourCallbackName(Actor actor, const TouchEvent& event);
1414    * @endcode
1415    * The return value of True, indicates that the touch event should be consumed.
1416    * Otherwise the signal will be emitted on the next sensitive parent of the actor.
1417    * @SINCE_1_0.0
1418    * @return The signal to connect to.
1419    * @pre The Actor has been initialized.
1420    */
1421   TouchSignalType& TouchedSignal();
1422
1423   /**
1424    * @brief This signal is emitted when hover input is received.
1425    *
1426    * A callback of the following type may be connected:
1427    * @code
1428    *   bool YourCallbackName(Actor actor, const HoverEvent& event);
1429    * @endcode
1430    * The return value of True, indicates that the hover event should be consumed.
1431    * Otherwise the signal will be emitted on the next sensitive parent of the actor.
1432    * @SINCE_1_0.0
1433    * @return The signal to connect to.
1434    * @pre The Actor has been initialized.
1435    */
1436   HoverSignalType& HoveredSignal();
1437
1438   /**
1439    * @brief This signal is emitted when wheel event is received.
1440    *
1441    * A callback of the following type may be connected:
1442    * @code
1443    *   bool YourCallbackName(Actor actor, const WheelEvent& event);
1444    * @endcode
1445    * The return value of True, indicates that the wheel event should be consumed.
1446    * Otherwise the signal will be emitted on the next sensitive parent of the actor.
1447    * @SINCE_1_0.0
1448    * @return The signal to connect to.
1449    * @pre The Actor has been initialized.
1450    */
1451   WheelEventSignalType& WheelEventSignal();
1452
1453   /**
1454    * @brief This signal is emitted after the actor has been connected to the stage.
1455    *
1456    * When an actor is connected, it will be directly or indirectly parented to the root Actor.
1457    * @SINCE_1_0.0
1458    * @return The signal
1459    * @note The root Actor is provided automatically by Dali::Stage, and is always considered to be connected.
1460    *
1461    * @note When the parent of a set of actors is connected to the stage, then all of the children
1462    * will received this callback.
1463    *
1464    * For the following actor tree, the callback order will be A, B, D, E, C, and finally F.
1465    *
1466    *       A (parent)
1467    *      / \
1468    *     B   C
1469    *    / \   \
1470    *   D   E   F
1471    *
1472    */
1473   OnStageSignalType& OnStageSignal();
1474
1475   /**
1476    * @brief This signal is emitted after the actor has been disconnected from the stage.
1477    *
1478    * If an actor is disconnected it either has no parent, or is parented to a disconnected actor.
1479    *
1480    * @SINCE_1_0.0
1481    * @return The signal
1482    * @note When the parent of a set of actors is disconnected to the stage, then all of the children
1483    * will received this callback, starting with the leaf actors.
1484    *
1485    * For the following actor tree, the callback order will be D, E, B, F, C, and finally A.
1486    *
1487    *       A (parent)
1488    *      / \
1489    *     B   C
1490    *    / \   \
1491    *   D   E   F
1492    *
1493    */
1494   OffStageSignalType& OffStageSignal();
1495
1496   /**
1497    * @brief This signal is emitted after the size has been set on the actor during relayout
1498    *
1499    * @SINCE_1_0.0
1500    * @return The signal
1501    */
1502   OnRelayoutSignalType& OnRelayoutSignal();
1503
1504 public: // Not intended for application developers
1505
1506   /**
1507    * @brief This constructor is used by Dali New() methods.
1508    *
1509    * @SINCE_1_0.0
1510    * @param [in] actor A pointer to a newly allocated Dali resource
1511    */
1512   explicit DALI_INTERNAL Actor(Internal::Actor* actor);
1513 };
1514
1515 /**
1516  * @brief Helper for discarding an actor handle.
1517  *
1518  * If the handle is empty, this method does nothing.  Otherwise
1519  * actor.Unparent() will be called, followed by actor.Reset().
1520  * @SINCE_1_0.0
1521  * @param[in,out] actor A handle to an actor, or an empty handle.
1522  */
1523 inline void UnparentAndReset( Actor& actor )
1524 {
1525   if( actor )
1526   {
1527     actor.Unparent();
1528     actor.Reset();
1529   }
1530 }
1531
1532 /**
1533  * @}
1534  */
1535 } // namespace Dali
1536
1537 #endif // __DALI_ACTOR_H__