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