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