7970256ca8dcdb36d1ae53bb62f6c4ce2777493d
[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) 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 // EXTERNAL INCLUDES
22 #include <string>
23 #include <cstdint> // uint32_t
24
25 // INTERNAL INCLUDES
26 #include <dali/public-api/actors/actor-enumerations.h>
27 #include <dali/public-api/actors/draw-mode.h>
28 #include <dali/public-api/math/radian.h>
29 #include <dali/public-api/object/handle.h>
30 #include <dali/public-api/object/property-index-ranges.h>
31 #include <dali/public-api/signals/dali-signal.h>
32
33 #undef SIZE_WIDTH // Defined in later versions of cstdint but is used in this header
34
35 namespace Dali
36 {
37 /**
38  * @addtogroup dali_core_actors
39  * @{
40  */
41
42 namespace Internal DALI_INTERNAL
43 {
44 class Actor;
45 }
46
47 class Actor;
48 class Renderer;
49 struct Degree;
50 class Quaternion;
51 class Layer;
52 class TouchEvent;
53 class HoverEvent;
54 class WheelEvent;
55 struct Vector2;
56 struct Vector3;
57 struct Vector4;
58
59 typedef Rect<float> Padding;      ///< Padding definition @SINCE_1_0.0
60
61 /**
62  * @brief Actor is the primary object with which Dali applications interact.
63  *
64  * UI controls can be built by combining multiple actors.
65  *
66  * <h3>Multi-Touch Events:</h3>
67  *
68  * Touch or hover events are received via signals; see Actor::TouchedSignal() and Actor::HoveredSignal() for more details.
69  *
70  * <i>Hit Testing Rules Summary:</i>
71  *
72  * - An actor is only hittable if the actor's touch or hover signal has a connection.
73  * - An actor is only hittable when it is between the camera's near and far planes.
74  * - If an actor is made insensitive, then the actor and its children are not hittable; see Actor::Property::SENSITIVE.
75  * - If an actor's visibility flag is unset, then none of its children are hittable either; see Actor::Property::VISIBLE.
76  * - To be hittable, an actor must have a non-zero size.
77  * - If an actor's world color is fully transparent, then it is not hittable; see GetCurrentWorldColor().
78  *
79  * <i>Hit Test Algorithm:</i>
80  *
81  * - Stage
82  *   - Gets the first down and the last up touch events to the screen, regardless of actor touch event consumption.
83  *   - Stage's root layer can be used to catch unconsumed touch events.
84  *
85  * - RenderTasks
86  *   - Hit testing is dependent on the camera used, which is specific to each RenderTask.
87  *
88  * - Layers
89  *   - For each RenderTask, hit testing starts from the top-most layer and we go through all the
90  *     layers until we have a hit or there are none left.
91  *   - Before we perform a hit test within a layer, we check if all the layer's parents are visible
92  *     and sensitive.
93  *   - If they are not, we skip hit testing the actors in that layer altogether.
94  *   - If a layer is set to consume all touch, then we do not check any layers behind this layer.
95  *
96  * - Actors
97  *   - The final part of hit testing is performed by walking through the actor tree within a layer.
98  *   - The following pseudocode shows the algorithm used:
99  *     @code
100  *     HIT-TEST-WITHIN-LAYER( ACTOR )
101  *     {
102  *       // Only hit-test the actor and its children if it is sensitive and visible
103  *       IF ( ACTOR-IS-SENSITIVE &&
104  *            ACTOR-IS-VISIBLE &&
105  *            ACTOR-IS-ON-SCENE )
106  *       {
107  *         // Depth-first traversal within current layer, visiting parent first
108  *
109  *         // Check whether current actor should be hit-tested.
110  *         IF ( ( TOUCH-SIGNAL-NOT-EMPTY || HOVER-SIGNAL-NOT-EMPTY ) &&
111  *              ACTOR-HAS-NON-ZERO-SIZE &&
112  *              ACTOR-WORLD-COLOR-IS-NOT-TRANSPARENT )
113  *         {
114  *           // Hit-test current actor
115  *           IF ( ACTOR-HIT )
116  *           {
117  *             IF ( ACTOR-IS-OVERLAY || ( DISTANCE-TO-ACTOR < DISTANCE-TO-LAST-HIT-ACTOR ) )
118  *             {
119  *               // The current actor is the closest actor that was underneath the touch.
120  *               LAST-HIT-ACTOR = CURRENT-ACTOR
121  *             }
122  *           }
123  *         }
124  *
125  *         // Keep checking children, in case we hit something closer.
126  *         FOR-EACH CHILD (in order)
127  *         {
128  *           IF ( CHILD-IS-NOT-A-LAYER )
129  *           {
130  *             // Continue traversal for this child's sub-tree
131  *             HIT-TEST-WITHIN-LAYER ( CHILD )
132  *           }
133  *           // else we skip hit-testing the child's sub-tree altogether.
134  *         }
135  *       }
136  *     }
137  *     @endcode
138  *   - Overlays always take priority (i.e. they're considered closer) regardless of distance.
139  *     The overlay children take priority over their parents, and overlay siblings take priority
140  *     over their previous siblings (i.e. reverse of rendering order):
141  *     @code
142  *           1
143  *          / \
144  *         /   \
145  *        2     5
146  *       / \     \
147  *      /   \     \
148  *     3     4     6
149  *
150  *     Hit Priority of above Actor tree (all overlays): 1 - Lowest. 6 - Highest.
151  *     @endcode
152  *     For more information, see Property::DRAW_MODE.
153  *
154  * <i>Touch or hover Event Delivery:</i>
155  *
156  * - Delivery
157  *   - The hit actor's touch or hover signal is emitted first; if it is not consumed by any of the listeners,
158  *     the parent's touch or hover signal is emitted, and so on.
159  *   - The following pseudocode shows the delivery mechanism:
160  *     @code
161  *     EMIT-TOUCH-SIGNAL( ACTOR )
162  *     {
163  *       IF ( TOUCH-SIGNAL-NOT-EMPTY )
164  *       {
165  *         // Only do the emission if touch signal of actor has connections.
166  *         CONSUMED = TOUCHED-SIGNAL( TOUCH-EVENT )
167  *       }
168  *
169  *       IF ( NOT-CONSUMED )
170  *       {
171  *         // If event is not consumed then deliver it to the parent unless we reach the root actor
172  *         IF ( ACTOR-PARENT )
173  *         {
174  *           EMIT-TOUCH-SIGNAL( ACTOR-PARENT )
175  *         }
176  *       }
177  *     }
178  *
179  *     EMIT-HOVER-SIGNAL( ACTOR )
180  *     {
181  *       IF ( HOVER-SIGNAL-NOT-EMPTY )
182  *       {
183  *         // Only do the emission if hover signal of actor has connections.
184  *         CONSUMED = HOVERED-SIGNAL( HOVER-EVENT )
185  *       }
186  *
187  *       IF ( NOT-CONSUMED )
188  *       {
189  *         // If event is not consumed then deliver it to the parent unless we reach the root actor.
190  *         IF ( ACTOR-PARENT )
191  *         {
192  *           EMIT-HOVER-SIGNAL( ACTOR-PARENT )
193  *         }
194  *       }
195  *     }
196  *     @endcode
197  *   - If there are several touch points, then the delivery is only to the first touch point's hit
198  *     actor (and its parents). There will be NO touch or hover signal delivery for the hit actors of the
199  *     other touch points.
200  *   - The local coordinates are from the top-left (0.0f, 0.0f, 0.5f) of the hit actor.
201  *
202  * - Leave State
203  *   - A "Leave" state is set when the first point exits the bounds of the previous first point's
204  *     hit actor (primary hit actor).
205  *   - When this happens, the last primary hit actor's touch or hover signal is emitted with a "Leave" state
206  *     (only if it requires leave signals); see SetLeaveRequired().
207  *
208  * - Interrupted State
209  *   - If a system event occurs which interrupts the touch or hover processing, then the last primary hit
210  *     actor's touch or hover signals are emitted with an "Interrupted" state.
211  *   - If the last primary hit actor, or one of its parents, is no longer touchable or hoverable, then its
212  *     touch or hover signals are also emitted with an "Interrupted" state.
213  *   - If the consumed actor on touch-down is not the same as the consumed actor on touch-up, then
214  *     touch signals are also emitted from the touch-down actor with an "Interrupted" state.
215  *   - If the consumed actor on hover-start is not the same as the consumed actor on hover-finished, then
216  *     hover signals are also emitted from the hover-started actor with an "Interrupted" state.
217  *
218  * @nosubgrouping
219  *
220  * Signals
221  * | %Signal Name      | Method                       |
222  * |-------------------|------------------------------|
223  * | touched           | @ref TouchedSignal()         |
224  * | hovered           | @ref HoveredSignal()         |
225  * | wheelEvent        | @ref WheelEventSignal()      |
226  * | onScene           | @ref OnSceneSignal()         |
227  * | offScene          | @ref OffSceneSignal()        |
228  * | onRelayout        | @ref OnRelayoutSignal()      |
229  *
230  * Actions
231  * | %Action Name      | %Actor method called         |
232  * |-------------------|------------------------------|
233  * | show              | %SetVisible( true )          |
234  * | hide              | %SetVisible( false )         |
235  * @SINCE_1_0.0
236  */
237
238 class DALI_CORE_API Actor : public Handle
239 {
240 public:
241
242   /**
243    * @brief Enumeration for the instance of properties belonging to the Actor class.
244    * @SINCE_1_0.0
245    */
246   struct Property
247   {
248     /**
249      * @brief Enumeration for instance of properties belonging to the Actor class.
250      * @SINCE_1_0.0
251      */
252     enum
253     {
254       /**
255        * @brief The origin of an actor, within its parent's area.
256        * @details Name "parentOrigin", type Property::VECTOR3, constraint-input
257        * @SINCE_1_0.0
258        */
259       PARENT_ORIGIN = DEFAULT_ACTOR_PROPERTY_START_INDEX,
260
261       /**
262        * @brief The x origin of an actor, within its parent's area.
263        * @details Name "parentOriginX", type Property::FLOAT, constraint-input
264        * @SINCE_1_0.0
265        */
266       PARENT_ORIGIN_X,
267
268       /**
269        * @brief The y origin of an actor, within its parent's area.
270        * @details Name "parentOriginY", type Property::FLOAT, constraint-input
271        * @SINCE_1_0.0
272        */
273       PARENT_ORIGIN_Y,
274
275       /**
276        * @brief The z origin of an actor, within its parent's area.
277        * @details Name "parentOriginZ", type Property::FLOAT, constraint-input
278        * @SINCE_1_0.0
279        */
280       PARENT_ORIGIN_Z,
281
282       /**
283        * @brief The anchor-point of an actor.
284        * @details Name "anchorPoint", type Property::VECTOR3, constraint-input
285        * @SINCE_1_0.0
286        */
287       ANCHOR_POINT,
288
289       /**
290        * @brief The x anchor-point of an actor.
291        * @details Name "anchorPointX", type Property::FLOAT, constraint-input
292        * @SINCE_1_0.0
293        */
294       ANCHOR_POINT_X,
295
296       /**
297        * @brief The y anchor-point of an actor.
298        * @details Name "anchorPointY", type Property::FLOAT, constraint-input
299        * @SINCE_1_0.0
300        */
301       ANCHOR_POINT_Y,
302
303       /**
304        * @brief The z anchor-point of an actor.
305        * @details Name "anchorPointZ", type Property::FLOAT, constraint-input
306        * @SINCE_1_0.0
307        */
308       ANCHOR_POINT_Z,
309
310       /**
311        * @brief The size of an actor.
312        * @details Name "size", type Property::VECTOR3 or Property::VECTOR2, animatable / constraint-input
313        * @note Only Property::VECTOR3 can be animated or used as constraint-input
314        * @SINCE_1_0.0
315        */
316       SIZE,
317
318       /**
319        * @brief The width of an actor.
320        * @details Name "sizeWidth", type Property::FLOAT, animatable / constraint-input
321        * @SINCE_1_0.0
322        */
323       SIZE_WIDTH,
324
325       /**
326        * @brief The height of an actor.
327        * @details Name "sizeHeight", type Property::FLOAT, animatable / constraint-input
328        * @SINCE_1_0.0
329        */
330       SIZE_HEIGHT,
331
332       /**
333        * @brief The depth of an actor.
334        * @details Name "sizeDepth", type Property::FLOAT, animatable / constraint-input
335        * @SINCE_1_0.0
336        */
337       SIZE_DEPTH,
338
339       /**
340        * @brief The position of an actor.
341        * @details Name "position", type Property::VECTOR3 or Property::VECTOR2, animatable / constraint-input
342        * @note Only Property::VECTOR3 can be animated or used as constraint-input
343        * @SINCE_1_0.0
344        */
345       POSITION,
346
347       /**
348        * @brief The x position of an actor.
349        * @details Name "positionX", type Property::FLOAT, animatable / constraint-input
350        * @SINCE_1_0.0
351        */
352       POSITION_X,
353
354       /**
355        * @brief The y position of an actor.
356        * @details Name "positionY", type Property::FLOAT, animatable / constraint-input
357        * @SINCE_1_0.0
358        */
359       POSITION_Y,
360
361       /**
362        * @brief The z position of an actor.
363        * @details Name "positionZ", type Property::FLOAT, animatable / constraint-input
364        * @SINCE_1_0.0
365        */
366       POSITION_Z,
367
368       /**
369        * @brief The world position of an actor.
370        * @details Name "worldPosition", type Property::VECTOR3, read-only / constraint-input
371        * @SINCE_1_0.0
372        */
373       WORLD_POSITION,
374
375       /**
376        * @brief The x world position of an actor.
377        * @details Name "worldPositionX", type Property::FLOAT, read-only / constraint-input
378        * @SINCE_1_0.0
379        */
380       WORLD_POSITION_X,
381
382       /**
383        * @brief The y world position of an actor.
384        * @details Name "worldPositionY", type Property::FLOAT, read-only / constraint-input
385        * @SINCE_1_0.0
386        */
387       WORLD_POSITION_Y,
388
389       /**
390        * @brief The z world position of an actor.
391        * @details Name "worldPositionZ", type Property::FLOAT, read-only / constraint-input
392        * @SINCE_1_0.0
393        */
394       WORLD_POSITION_Z,
395
396       /**
397        * @brief The orientation of an actor.
398        * @details Name "orientation", type Property::ROTATION, animatable / constraint-input
399        * @SINCE_1_0.0
400        */
401       ORIENTATION,
402
403       /**
404        * @brief The world orientation of an actor.
405        * @details Name "worldOrientation", type Property::ROTATION, read-only / constraint-input
406        * @SINCE_1_0.0
407        */
408       WORLD_ORIENTATION,
409
410       /**
411        * @brief The scale factor applied to an actor.
412        * @details Name "scale", type Property::VECTOR3 or Property::FLOAT, animatable / constraint-input
413        * @note Only Property::VECTOR3 can be animated or used as constraint-input
414        * @SINCE_1_0.0
415        */
416       SCALE,
417
418       /**
419        * @brief The x scale factor applied to an actor.
420        * @details Name "scaleX", type Property::FLOAT, animatable / constraint-input
421        * @SINCE_1_0.0
422        */
423       SCALE_X,
424
425       /**
426        * @brief The y scale factor applied to an actor.
427        * @details Name "scaleY", type Property::FLOAT, animatable / constraint-input
428        * @SINCE_1_0.0
429        */
430       SCALE_Y,
431
432       /**
433        * @brief The x scale factor applied to an actor.
434        * @details Name "scaleZ", type Property::FLOAT, animatable / constraint-input
435        * @SINCE_1_0.0
436        */
437       SCALE_Z,
438
439       /**
440        * @brief The world scale factor applied to an actor.
441        * @details Name "worldScale", type Property::VECTOR3, read-only / constraint-input
442        * @SINCE_1_0.0
443        */
444       WORLD_SCALE,
445
446       /**
447        * @brief The visibility flag of an actor.
448        * @details Name "visible", type Property::BOOL, animatable / constraint-input
449        * @SINCE_1_0.0
450        */
451       VISIBLE,
452
453       /**
454        * @brief The color of an actor.
455        * @details Name "color", type Property::VECTOR4 or Property::VECTOR3, animatable / constraint-input
456        * @note The alpha value will be 1.0f if a Vector3 type value is set.
457        * @SINCE_1_0.0
458        */
459       COLOR,
460
461       /**
462        * @brief The red component of an actor's color.
463        * @details Name "colorRed", type Property::FLOAT, animatable / constraint-input
464        * @SINCE_1_0.0
465        */
466       COLOR_RED,
467
468       /**
469        * @brief The green component of an actor's color.
470        * @details Name "colorGreen", type Property::FLOAT, animatable / constraint-input
471        * @SINCE_1_0.0
472        */
473       COLOR_GREEN,
474
475       /**
476        * @brief The blue component of an actor's color.
477        * @details Name "colorBlue", type Property::FLOAT, animatable / constraint-input
478        * @SINCE_1_0.0
479        */
480       COLOR_BLUE,
481
482       /**
483        * @brief The alpha component of an actor's color.
484        * @details Name "colorAlpha", type Property::FLOAT, animatable / constraint-input
485        * @SINCE_1_0.0
486        */
487       COLOR_ALPHA,
488
489       /**
490        * @brief The world color of an actor.
491        * @details Name "worldColor", type Property::VECTOR4, read-only / constraint-input
492        * @SINCE_1_0.0
493        */
494       WORLD_COLOR,
495
496       /**
497        * @brief The world matrix of an actor.
498        * @details Name "worldMatrix", type Property::MATRIX, read-only / constraint-input
499        * @SINCE_1_0.0
500        */
501       WORLD_MATRIX,
502
503       /**
504        * @brief The name of an actor.
505        * @details Name "name", type Property::STRING
506        * @SINCE_1_0.0
507        */
508       NAME,
509
510       /**
511        * @brief The flag whether an actor should emit touch or hover signals.
512        * @details Name "sensitive", type Property::BOOLEAN
513        * @SINCE_1_0.0
514        */
515       SENSITIVE,
516
517       /**
518        * @brief The flag whether an actor should receive a notification when touch or hover motion events leave.
519        * @details Name "leaveRequired", type Property::BOOLEAN
520        * @SINCE_1_0.0
521        */
522       LEAVE_REQUIRED,
523
524       /**
525        * @brief The flag whether a child actor inherits it's parent's orientation.
526        * @details Name "inheritOrientation", type Property::BOOLEAN
527        * @SINCE_1_0.0
528        */
529       INHERIT_ORIENTATION,
530
531       /**
532        * @brief The flag whether a child actor inherits it's parent's scale.
533        * @details Name "inheritScale", type Property::BOOLEAN
534        * @SINCE_1_0.0
535        */
536       INHERIT_SCALE,
537
538       /**
539        * @brief The color mode of an actor.
540        * @details Name "colorMode", type ColorMode (Property::INTEGER) or Property::STRING.
541        * @SINCE_1_0.0
542        */
543       COLOR_MODE,
544
545       /**
546        * @brief The draw mode of an actor.
547        * @details Name "drawMode", type DrawMode::Type (Property::INTEGER) or Property::STRING.
548        * @SINCE_1_0.0
549        */
550       DRAW_MODE,
551
552       /**
553        * @brief The size mode factor of an actor.
554        * @details Name "sizeModeFactor", type Property::VECTOR3.
555        * @SINCE_1_0.0
556        * @see Actor::SetSizeModeFactor()
557        */
558       SIZE_MODE_FACTOR,
559
560       /**
561        * @brief The resize policy for the width of an actor.
562        * @details Name "widthResizePolicy", type ResizePolicy::Type (Property::INTEGER) or Property::STRING.
563        * @SINCE_1_0.0
564        * @see Actor::SetResizePolicy()
565        */
566       WIDTH_RESIZE_POLICY,
567
568       /**
569        * @brief The resize policy for the height of an actor.
570        * @details Name "heightResizePolicy", type ResizePolicy::Type (Property::INTEGER) or Property::STRING.
571        * @SINCE_1_0.0
572        * @see Actor::SetResizePolicy()
573        */
574       HEIGHT_RESIZE_POLICY,
575
576       /**
577        * @brief The size scale policy of an actor.
578        * @details Name "sizeScalePolicy", type SizeScalePolicy::Type (Property::INTEGER) or Property::STRING.
579        * @SINCE_1_0.0
580        */
581       SIZE_SCALE_POLICY,
582
583       /**
584        * @brief The flag to determine the width dependent on the height.
585        * @details Name "widthForHeight", type Property::BOOLEAN.
586        * @SINCE_1_0.0
587        * @see Actor::SetResizePolicy()
588        */
589       WIDTH_FOR_HEIGHT,
590
591       /**
592        * @brief The flag to determine the height dependent on the width.
593        * @details Name "heightForWidth", type Property::BOOLEAN.
594        * @SINCE_1_0.0
595        * @see Actor::SetResizePolicy()
596        */
597       HEIGHT_FOR_WIDTH,
598
599       /**
600        * @brief The padding of an actor for use in layout.
601        * @details Name "padding", type Property::VECTOR4.
602        * @SINCE_1_0.0
603        */
604       PADDING,
605
606       /**
607        * @brief The minimum size an actor can be assigned in size negotiation.
608        * @details Name "minimumSize", type Property::VECTOR2.
609        * @SINCE_1_0.0
610        */
611       MINIMUM_SIZE,
612
613       /**
614        * @brief The maximum size an actor can be assigned in size negotiation.
615        * @details Name "maximumSize", type Property::VECTOR2.
616        * @SINCE_1_0.0
617        */
618       MAXIMUM_SIZE,
619
620       /**
621        * @brief The flag whether a child actor inherits it's parent's position.
622        * @details Name "inheritPosition", type Property::BOOLEAN.
623        * @SINCE_1_1.24
624        */
625       INHERIT_POSITION,
626
627       /**
628        * @brief The clipping mode of an actor.
629        * @details Name "clippingMode", type ClippingMode::Type (Property::INTEGER) or Property::STRING.
630        * @SINCE_1_2_5
631        * @see ClippingMode::Type for supported values.
632        */
633       CLIPPING_MODE,
634
635       /**
636        * @brief The direction of the layout.
637        * @details Name "layoutDirection", type LayoutDirection::Type (Property::INTEGER) or Property::STRING.
638        * @SINCE_1_2.60
639        * @see LayoutDirection::Type for supported values.
640        */
641       LAYOUT_DIRECTION,
642
643       /**
644        * @brief Determines whether child actors inherit the layout direction from a parent.
645        * @details Name "layoutDirectionInheritance", type Property::BOOLEAN.
646        * @SINCE_1_2.60
647        */
648       INHERIT_LAYOUT_DIRECTION,
649
650       /**
651        * @brief The opacity of the actor.
652        * @details Name "opacity", type Property::FLOAT.
653        * @SINCE_1_9.17
654        */
655       OPACITY,
656
657       /**
658        * @brief Returns the screen position of the Actor
659        * @details Name "screenPosition", type Property::VECTOR2. Read-only
660        * @note This assumes default camera and default render-task and the Z position is ZERO.
661        * @note The last known frame is used for the calculation. May not match a position value just set.
662        * @SINCE_1_9.17
663        */
664       SCREEN_POSITION,
665
666       /**
667        * @brief Determines whether the anchor point should be used to determine the position of the actor.
668        * @details Name "positionUsesAnchorPoint", type Property::BOOLEAN.
669        * @note This is true by default.
670        * @note If false, then the top-left of the actor is used for the position.
671        * @note Setting this to false will allow scaling or rotation around the anchor-point without affecting the actor's position.
672        * @SINCE_1_9.17
673        */
674       POSITION_USES_ANCHOR_POINT,
675
676       /**
677        * @brief Returns whether the actor is culled or not.
678        * @details Name "culled", type Property::BOOLEAN. Read-only
679        * @note True means that the actor is out of the view frustum.
680        * @SINCE_1_9.17
681        */
682       CULLED,
683
684       /**
685        * @brief The unique ID of the actor.
686        * @details Name "id", type Property::INTEGER. Read-only
687        * @SINCE_1_9.17
688        */
689       ID,
690
691       /**
692        * @brief The current depth in the hierarchy of the actor.
693        * @details Name "hierarchyDepth", type Property::INTEGER. Read-only
694        * @note The value is -1 if actor is not in the hierarchy.
695        * @SINCE_1_9.17
696        */
697       HIERARCHY_DEPTH,
698
699       /**
700        * @brief The flag whether an actor is the root actor, which is owned by the Scene.
701        * @details Name "isRoot", type Property::BOOLEAN. Read-only
702        * @SINCE_1_9.17
703        */
704       IS_ROOT,
705
706       /**
707        * @brief The flag whether the actor is of class Dali::Layer.
708        * @details Name "isLayer", type Property::BOOLEAN. Read-only
709        * @SINCE_1_9.17
710        */
711       IS_LAYER,
712
713       /**
714        * @brief The flag whether the actor is connected to the Scene.
715        * When an actor is connected, it will be directly or indirectly parented to the root Actor.
716        * @details Name "connectedToScene", type Property::BOOLEAN. Read-only
717        * @note The root Actor is provided automatically by the Scene, and is always considered to be connected.
718        * @SINCE_1_9.17
719        */
720       CONNECTED_TO_SCENE,
721
722       /**
723        * @brief The flag whether the actor should be focusable by keyboard navigation.
724        * @details Name "keyboardFocusable", type Property::BOOLEAN.
725        * @SINCE_1_9.17
726        */
727       KEYBOARD_FOCUSABLE,
728     };
729   };
730
731   // Typedefs
732
733   typedef Signal< bool (Actor, const TouchEvent&) > TouchEventSignalType;   ///< Touch signal type @SINCE_1_1.37
734   typedef Signal< bool (Actor, const HoverEvent&) > HoverSignalType;        ///< Hover signal type @SINCE_1_0.0
735   typedef Signal< bool (Actor, const WheelEvent&) > WheelEventSignalType;   ///< Wheel signal type @SINCE_1_0.0
736   typedef Signal< void (Actor) > OnSceneSignalType;                         ///< Scene connection signal type @SINCE_1_9.24
737   typedef Signal< void (Actor) > OffSceneSignalType;                        ///< Scene disconnection signal type @SINCE_1_9.24
738   typedef Signal< void (Actor) > OnRelayoutSignalType;                      ///< Called when the actor is relaid out @SINCE_1_0.0
739   typedef Signal< void ( Actor, LayoutDirection::Type ) > LayoutDirectionChangedSignalType; ///< Layout direction changes signal type. @SINCE_1_2.60
740
741   // Creation
742
743   /**
744    * @brief Creates an uninitialized Actor; this can be initialized with Actor::New().
745    *
746    * Calling member functions with an uninitialized Actor handle is not allowed.
747    * @SINCE_1_0.0
748    */
749   Actor();
750
751   /**
752    * @brief Creates an initialized Actor.
753    *
754    * @SINCE_1_0.0
755    * @return A handle to a newly allocated Dali resource
756    */
757   static Actor New();
758
759   /**
760    * @brief Downcasts a handle to Actor handle.
761    *
762    * If handle points to an Actor object, the downcast produces valid handle.
763    * If not, the returned handle is left uninitialized.
764    *
765    * @SINCE_1_0.0
766    * @param[in] handle to An object
767    * @return handle to a Actor object or an uninitialized handle
768    */
769   static Actor DownCast( BaseHandle handle );
770
771   /**
772    * @brief Dali::Actor is intended as a base class.
773    *
774    * This is non-virtual since derived Handle types must not contain data or virtual methods.
775    * @SINCE_1_0.0
776    */
777   ~Actor();
778
779   /**
780    * @brief Copy constructor.
781    *
782    * @SINCE_1_0.0
783    * @param[in] copy The actor to copy
784    */
785   Actor(const Actor& copy);
786
787   /**
788    * @brief Assignment operator
789    *
790    * @SINCE_1_0.0
791    * @param[in] rhs The actor to copy
792    * @return A reference to this
793    */
794   Actor& operator=(const Actor& rhs);
795
796   /**
797    * @brief Move constructor.
798    *
799    * @SINCE_1_9.22
800    * @param[in] rhs A reference to the actor to move
801    */
802   Actor( Actor&& rhs );
803
804   /**
805    * @brief Move assignment operator.
806    *
807    * @SINCE_1_9.22
808    * @param[in] rhs A reference to the actor to move
809    * @return A reference to this
810    */
811   Actor& operator=( Actor&& rhs );
812
813   // Containment
814
815   /**
816    * @brief Gets the layer in which the actor is present.
817    *
818    * @SINCE_1_0.0
819    * @return The layer, which will be uninitialized if the actor is off-stage
820    * @pre The Actor has been initialized.
821    */
822   Layer GetLayer();
823
824   /**
825    * @brief Adds a child Actor to this Actor.
826    *
827    * @SINCE_1_0.0
828    * @param[in] child The child
829    * @pre This Actor (the parent) has been initialized.
830    * @pre The child actor has been initialized.
831    * @pre The child actor is not the same as the parent actor.
832    * @pre The actor is not the Root actor.
833    * @post The child will be referenced by its parent. This means that the child will be kept alive,
834    * even if the handle passed into this method is reset or destroyed.
835    * @note If the child already has a parent, it will be removed from old parent
836    * and reparented to this actor. This may change child's position, color,
837    * scale etc as it now inherits them from this actor.
838    */
839   void Add(Actor child);
840
841   /**
842    * @brief Removes a child Actor from this Actor.
843    *
844    * If the actor was not a child of this actor, this is a no-op.
845    * @SINCE_1_0.0
846    * @param[in] child The child
847    * @pre This Actor (the parent) has been initialized.
848    * @pre The child actor is not the same as the parent actor.
849    */
850   void Remove(Actor child);
851
852   /**
853    * @brief Removes an actor from its parent.
854    *
855    * If the actor has no parent, this method does nothing.
856    * @SINCE_1_0.0
857    * @pre The (child) actor has been initialized.
858    */
859   void Unparent();
860
861   /**
862    * @brief Retrieves the number of children held by the actor.
863    *
864    * @SINCE_1_0.0
865    * @return The number of children
866    * @pre The Actor has been initialized.
867    */
868   uint32_t GetChildCount() const;
869
870   /**
871    * @brief Retrieve and child actor by index.
872    *
873    * @SINCE_1_0.0
874    * @param[in] index The index of the child to retrieve
875    * @return The actor for the given index or empty handle if children not initialized
876    * @pre The Actor has been initialized.
877    */
878   Actor GetChildAt( uint32_t index ) const;
879
880   /**
881    * @brief Search through this actor's hierarchy for an actor with the given name.
882    *
883    * The actor itself is also considered in the search.
884    * @SINCE_1_0.0
885    * @param[in] actorName The name of the actor to find
886    * @return A handle to the actor if found, or an empty handle if not
887    * @pre The Actor has been initialized.
888    */
889   Actor FindChildByName(const std::string& actorName);
890
891   /**
892    * @brief Search through this actor's hierarchy for an actor with the given unique ID.
893    *
894    * The actor itself is also considered in the search.
895    * @SINCE_1_0.0
896    * @param[in] id The ID of the actor to find
897    * @return A handle to the actor if found, or an empty handle if not
898    * @pre The Actor has been initialized.
899    */
900   Actor FindChildById( const uint32_t id );
901
902   /**
903    * @brief Retrieves the actor's parent.
904    *
905    * @SINCE_1_0.0
906    * @return A handle to the actor's parent. If the actor has no parent, this handle will be invalid
907    * @pre The actor has been initialized.
908    */
909   Actor GetParent() const;
910
911   // Positioning
912
913   /**
914    * @brief Retrieves the actor's size.
915    *
916    * @SINCE_1_0.0
917    * @return The actor's target size
918    * @pre The actor has been initialized.
919    * @note This return is the value that was set using SetSize or the target size of an animation.
920    *       It may not match the current value in some cases, i.e. when the animation is progressing or the maximum or minimum size is set.
921    */
922   Vector3 GetTargetSize() const;
923
924   /**
925    * @brief Returns the natural size of the actor.
926    *
927    * Deriving classes stipulate the natural size and by default an actor has a ZERO natural size.
928    *
929    * @SINCE_1_0.0
930    * @return The actor's natural size
931    */
932   Vector3 GetNaturalSize() const;
933
934   /**
935    * @brief Translates an actor relative to its existing position.
936    *
937    * @SINCE_1_0.0
938    * @param[in] distance The actor will move by this distance
939    * @pre The actor has been initialized.
940    */
941   void TranslateBy(const Vector3& distance);
942
943   /**
944    * @brief Applies a relative rotation to an actor.
945    *
946    * @SINCE_1_0.0
947    * @param[in] angle The angle to the rotation to combine with the existing orientation
948    * @param[in] axis The axis of the rotation to combine with the existing orientation
949    * @pre The actor has been initialized.
950    */
951   void RotateBy( const Degree& angle, const Vector3& axis )
952   {
953     RotateBy( Radian( angle ), axis );
954   }
955
956   /**
957    * @brief Applies a relative rotation to an actor.
958    *
959    * @SINCE_1_0.0
960    * @param[in] angle The angle to the rotation to combine with the existing orientation
961    * @param[in] axis The axis of the rotation to combine with the existing orientation
962    * @pre The actor has been initialized.
963    */
964   void RotateBy(const Radian& angle, const Vector3& axis);
965
966   /**
967    * @brief Applies a relative rotation to an actor.
968    *
969    * @SINCE_1_0.0
970    * @param[in] relativeRotation The rotation to combine with the existing orientation
971    * @pre The actor has been initialized.
972    */
973   void RotateBy(const Quaternion& relativeRotation);
974
975   /**
976    * @brief Applies a relative scale to an actor.
977    *
978    * @SINCE_1_0.0
979    * @param[in] relativeScale The scale to combine with the actor's existing scale
980    * @pre The actor has been initialized.
981    */
982   void ScaleBy(const Vector3& relativeScale);
983
984   // Input Handling
985
986   /**
987    * @brief Converts screen coordinates into the actor's coordinate system using the default camera.
988    *
989    * @SINCE_1_0.0
990    * @param[out] localX On return, the X-coordinate relative to the actor
991    * @param[out] localY On return, the Y-coordinate relative to the actor
992    * @param[in] screenX The screen X-coordinate
993    * @param[in] screenY The screen Y-coordinate
994    * @return True if the conversion succeeded
995    * @pre The Actor has been initialized.
996    * @note The actor coordinates are relative to the top-left (0.0, 0.0, 0.5)
997    */
998   bool ScreenToLocal(float& localX, float& localY, float screenX, float screenY) const;
999
1000   /**
1001    * @brief Raise actor above the next sibling actor.
1002    *
1003    * @SINCE_1_2.60
1004    * @pre The Actor has been initialized.
1005    * @pre The Actor has been parented.
1006    */
1007   void Raise();
1008
1009   /**
1010    * @brief Lower the actor below the previous sibling actor.
1011    *
1012    * @SINCE_1_2.60
1013    * @pre The Actor has been initialized.
1014    * @pre The Actor has been parented.
1015    */
1016   void Lower();
1017
1018   /**
1019    * @brief Raise actor above all other sibling actors.
1020    *
1021    * @SINCE_1_2.60
1022    * @pre The Actor has been initialized.
1023    * @pre The Actor has been parented.
1024    */
1025   void RaiseToTop();
1026
1027   /**
1028    * @brief Lower actor to the bottom of all other sibling actors.
1029    *
1030    * @SINCE_1_2.60
1031    * @pre The Actor has been initialized.
1032    * @pre The Actor has been parented.
1033    */
1034   void LowerToBottom();
1035
1036   /**
1037    * @brief Raises the actor above the target actor.
1038    *
1039    * @SINCE_1_2.60
1040    * @param[in] target The target actor
1041    * @pre The Actor has been initialized.
1042    * @pre The Actor has been parented.
1043    * @pre The target actor is a sibling.
1044    */
1045   void RaiseAbove( Actor target );
1046
1047   /**
1048    * @brief Lower the actor to below the target actor.
1049    *
1050    * @SINCE_1_2.60
1051    * @param[in] target The target actor
1052    * @pre The Actor has been initialized.
1053    * @pre The Actor has been parented.
1054    * @pre The target actor is a sibling.
1055    */
1056   void LowerBelow( Actor target );
1057
1058   // SIZE NEGOTIATION
1059
1060   /**
1061    * @brief Sets the resize policy to be used for the given dimension(s).
1062    *
1063    * @SINCE_1_0.0
1064    * @param[in] policy The resize policy to use
1065    * @param[in] dimension The dimension(s) to set policy for. Can be a bitfield of multiple dimensions
1066    */
1067   void SetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension );
1068
1069   /**
1070    * @brief Returns the resize policy used for a single dimension.
1071    *
1072    * @SINCE_1_0.0
1073    * @param[in] dimension The dimension to get policy for
1074    * @return Return the dimension resize policy. If more than one dimension is requested, just return the first one found
1075    */
1076   ResizePolicy::Type GetResizePolicy( Dimension::Type dimension ) const;
1077
1078   /**
1079    * @brief Calculates the height of the actor given a width.
1080    *
1081    * The natural size is used for default calculation.
1082    * size 0 is treated as aspect ratio 1:1.
1083    *
1084    * @SINCE_1_0.0
1085    * @param[in] width Width to use
1086    * @return Return the height based on the width
1087    */
1088   float GetHeightForWidth( float width );
1089
1090   /**
1091    * @brief Calculates the width of the actor given a height.
1092    *
1093    * The natural size is used for default calculation.
1094    * size 0 is treated as aspect ratio 1:1.
1095    *
1096    * @SINCE_1_0.0
1097    * @param[in] height Height to use
1098    * @return Return the width based on the height
1099    */
1100   float GetWidthForHeight( float height );
1101
1102   /**
1103    * @brief Returns the value of negotiated dimension for the given dimension.
1104    *
1105    * @SINCE_1_0.0
1106    * @param[in] dimension The dimension to retrieve
1107    * @return Return the value of the negotiated dimension. If more than one dimension is requested, just return the first one found
1108    */
1109   float GetRelayoutSize( Dimension::Type dimension ) const;
1110
1111 public: // Renderer
1112
1113   /**
1114    * @brief Adds a renderer to this actor.
1115    *
1116    * @SINCE_1_0.0
1117    * @param[in] renderer Renderer to add to the actor
1118    * @return The index of the Renderer that was added
1119    * @pre The renderer must be initialized.
1120    *
1121    */
1122   uint32_t AddRenderer( Renderer& renderer );
1123
1124   /**
1125    * @brief Gets the number of renderers on this actor.
1126    *
1127    * @SINCE_1_0.0
1128    * @return The number of renderers on this actor
1129    */
1130   uint32_t GetRendererCount() const;
1131
1132   /**
1133    * @brief Gets a Renderer by index.
1134    *
1135    * @SINCE_1_0.0
1136    * @param[in] index The index of the renderer to fetch
1137    * @return The renderer at the specified index
1138    * @pre The index must be between 0 and GetRendererCount()-1
1139    *
1140    */
1141   Renderer GetRendererAt( uint32_t index );
1142
1143   /**
1144    * @brief Removes a renderer from the actor.
1145    *
1146    * @SINCE_1_0.0
1147    * @param[in] renderer Handle to the renderer that is to be removed
1148    */
1149   void RemoveRenderer( Renderer& renderer );
1150
1151   /**
1152    * @brief Removes a renderer from the actor by index.
1153    *
1154    * @SINCE_1_0.0
1155    * @param[in] index Index of the renderer that is to be removed
1156    * @pre The index must be between 0 and GetRendererCount()-1
1157    *
1158    */
1159   void RemoveRenderer( uint32_t index );
1160
1161 public: // Signals
1162
1163   /**
1164    * @brief This signal is emitted when touch input is received.
1165    *
1166    * A callback of the following type may be connected:
1167    * @code
1168    *   bool YourCallbackName( Actor actor, TouchEvent& touch );
1169    * @endcode
1170    * The return value of True, indicates that the touch event has been consumed.
1171    * Otherwise the signal will be emitted on the next sensitive parent of the actor.
1172    * A true return will also cancel any ongoing gestures.
1173    * @SINCE_1_9.28
1174    * @return The signal to connect to
1175    * @pre The Actor has been initialized.
1176    */
1177   TouchEventSignalType& TouchedSignal();
1178
1179   /**
1180    * @brief This signal is emitted when hover input is received.
1181    *
1182    * A callback of the following type may be connected:
1183    * @code
1184    *   bool YourCallbackName(Actor actor, const HoverEvent& event);
1185    * @endcode
1186    * The return value of True, indicates that the hover event should be consumed.
1187    * Otherwise the signal will be emitted on the next sensitive parent of the actor.
1188    * @SINCE_1_0.0
1189    * @return The signal to connect to
1190    * @pre The Actor has been initialized.
1191    */
1192   HoverSignalType& HoveredSignal();
1193
1194   /**
1195    * @brief This signal is emitted when wheel event is received.
1196    *
1197    * A callback of the following type may be connected:
1198    * @code
1199    *   bool YourCallbackName(Actor actor, const WheelEvent& event);
1200    * @endcode
1201    * The return value of True, indicates that the wheel event should be consumed.
1202    * Otherwise the signal will be emitted on the next sensitive parent of the actor.
1203    * @SINCE_1_0.0
1204    * @return The signal to connect to
1205    * @pre The Actor has been initialized.
1206    */
1207   WheelEventSignalType& WheelEventSignal();
1208
1209   /**
1210    * @brief This signal is emitted after the actor has been connected to the scene.
1211    *
1212    * When an actor is connected, it will be directly or indirectly parented to the root Actor.
1213    * @SINCE_1_9.24
1214    * @return The signal to connect to
1215    * @note The root Actor is provided automatically by the Scene, and is always considered to be connected.
1216    *
1217    * @note When the parent of a set of actors is connected to the stage, then all of the children
1218    * will received this callback.
1219    * For the following actor tree, the callback order will be A, B, D, E, C, and finally F.
1220    *
1221    * @code
1222    *
1223    *       A (parent)
1224    *      / \
1225    *     B   C
1226    *    / \   \
1227    *   D   E   F
1228    *
1229    * @endcode
1230    */
1231   OnSceneSignalType& OnSceneSignal();
1232
1233   /**
1234    * @brief This signal is emitted after the actor has been disconnected from the scene.
1235    *
1236    * If an actor is disconnected it either has no parent, or is parented to a disconnected actor.
1237    *
1238    * @SINCE_1_9.24
1239    * @return The signal to connect to
1240    * @note When the parent of a set of actors is disconnected to the scene, then all of the children
1241    * will received this callback, starting with the leaf actors.
1242    * For the following actor tree, the callback order will be D, E, B, F, C, and finally A.
1243    *
1244    * @code
1245    *
1246    *       A (parent)
1247    *      / \
1248    *     B   C
1249    *    / \   \
1250    *   D   E   F
1251    *
1252    * @endcode
1253    *
1254    */
1255   OffSceneSignalType& OffSceneSignal();
1256
1257   /**
1258    * @brief This signal is emitted after the size has been set on the actor during relayout
1259    *
1260    * @SINCE_1_0.0
1261    * @return The signal
1262    */
1263   OnRelayoutSignalType& OnRelayoutSignal();
1264
1265   /**
1266    * @brief This signal is emitted when the layout direction property of this or a parent actor is changed.
1267    *
1268    * A callback of the following type may be connected:
1269    * @code
1270    *   void YourCallbackName( Actor actor, LayoutDirection::Type type );
1271    * @endcode
1272    * actor: The actor, or child of actor, whose layout direction has changed
1273    * type: Whether the actor's layout direction property has changed or a parent's.
1274    *
1275    * @SINCE_1_2.60
1276    * @return The signal to connect to
1277    * @pre The Actor has been initialized.
1278    */
1279   LayoutDirectionChangedSignalType& LayoutDirectionChangedSignal();
1280
1281 public: // Not intended for application developers
1282
1283   /// @cond internal
1284   /**
1285    * @brief This constructor is used by Actor::New() methods.
1286    *
1287    * @SINCE_1_0.0
1288    * @param [in] actor A pointer to a newly allocated Dali resource
1289    */
1290   explicit DALI_INTERNAL Actor(Internal::Actor* actor);
1291   /// @endcond
1292 };
1293
1294 /**
1295  * @brief Helper for discarding an actor handle.
1296  *
1297  * If the handle is empty, this method does nothing.  Otherwise
1298  * Actor::Unparent() will be called, followed by Actor::Reset().
1299  * @SINCE_1_0.0
1300  * @param[in,out] actor A handle to an actor, or an empty handle
1301  */
1302 inline void UnparentAndReset( Actor& actor )
1303 {
1304   if( actor )
1305   {
1306     actor.Unparent();
1307     actor.Reset();
1308   }
1309 }
1310
1311 /**
1312  * @}
1313  */
1314 } // namespace Dali
1315
1316 #endif // DALI_ACTOR_H