Get world scale more faster
[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) 2022 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        * @brief Sets the update area hint of the actor.
730        * @details Name "updateAreaHint", type Property::VECTOR4 (x, y, width, height).
731        * @note Overrides the area - the position and the size - used for the actor damaged area calculation. Affected by the actor model view matrix.
732        * The position is relative to the center of the actor and it is also the center of the damaged area.
733        * @SINCE_2_1.33
734        */
735       UPDATE_AREA_HINT
736     };
737   };
738
739   // Typedefs
740
741   using TouchEventSignalType             = Signal<bool(Actor, const TouchEvent&)>;     ///< Touch signal type @SINCE_1_1.37
742   using HoverSignalType                  = Signal<bool(Actor, const HoverEvent&)>;     ///< Hover signal type @SINCE_1_0.0
743   using WheelEventSignalType             = Signal<bool(Actor, const WheelEvent&)>;     ///< Wheel signal type @SINCE_1_0.0
744   using OnSceneSignalType                = Signal<void(Actor)>;                        ///< Scene connection signal type @SINCE_1_9.24
745   using OffSceneSignalType               = Signal<void(Actor)>;                        ///< Scene disconnection signal type @SINCE_1_9.24
746   using OnRelayoutSignalType             = Signal<void(Actor)>;                        ///< Called when the actor is relaid out @SINCE_1_0.0
747   using LayoutDirectionChangedSignalType = Signal<void(Actor, LayoutDirection::Type)>; ///< Layout direction changes signal type. @SINCE_1_2.60
748
749   // Creation
750
751   /**
752    * @brief Creates an uninitialized Actor; this can be initialized with Actor::New().
753    *
754    * Calling member functions with an uninitialized Actor handle is not allowed.
755    * @SINCE_1_0.0
756    */
757   Actor();
758
759   /**
760    * @brief Creates an initialized Actor.
761    *
762    * @SINCE_1_0.0
763    * @return A handle to a newly allocated Dali resource
764    */
765   static Actor New();
766
767   /**
768    * @brief Downcasts a handle to Actor handle.
769    *
770    * If handle points to an Actor object, the downcast produces valid handle.
771    * If not, the returned handle is left uninitialized.
772    *
773    * @SINCE_1_0.0
774    * @param[in] handle to An object
775    * @return handle to a Actor object or an uninitialized handle
776    */
777   static Actor DownCast(BaseHandle handle);
778
779   /**
780    * @brief Dali::Actor is intended as a base class.
781    *
782    * This is non-virtual since derived Handle types must not contain data or virtual methods.
783    * @SINCE_1_0.0
784    */
785   ~Actor();
786
787   /**
788    * @brief Copy constructor.
789    *
790    * @SINCE_1_0.0
791    * @param[in] copy The actor to copy
792    */
793   Actor(const Actor& copy);
794
795   /**
796    * @brief Assignment operator
797    *
798    * @SINCE_1_0.0
799    * @param[in] rhs The actor to copy
800    * @return A reference to this
801    */
802   Actor& operator=(const Actor& rhs);
803
804   /**
805    * @brief Move constructor.
806    *
807    * @SINCE_1_9.22
808    * @param[in] rhs A reference to the actor to move
809    */
810   Actor(Actor&& rhs);
811
812   /**
813    * @brief Move assignment operator.
814    *
815    * @SINCE_1_9.22
816    * @param[in] rhs A reference to the actor to move
817    * @return A reference to this
818    */
819   Actor& operator=(Actor&& rhs);
820
821   // Containment
822
823   /**
824    * @brief Gets the layer in which the actor is present.
825    *
826    * @SINCE_1_0.0
827    * @return The layer, which will be uninitialized if the actor is off-stage
828    * @pre The Actor has been initialized.
829    */
830   Layer GetLayer();
831
832   /**
833    * @brief Adds a child Actor to this Actor.
834    *
835    * @SINCE_1_0.0
836    * @param[in] child The child
837    * @pre This Actor (the parent) has been initialized.
838    * @pre The child actor has been initialized.
839    * @pre The child actor is not the same as the parent actor.
840    * @pre The actor is not the Root actor.
841    * @post The child will be referenced by its parent. This means that the child will be kept alive,
842    * even if the handle passed into this method is reset or destroyed.
843    * @note If the child already has a parent, it will be removed from old parent
844    * and reparented to this actor. This may change child's position, color,
845    * scale etc as it now inherits them from this actor.
846    */
847   void Add(Actor child);
848
849   /**
850    * @brief Removes a child Actor from this Actor.
851    *
852    * If the actor was not a child of this actor, this is a no-op.
853    * @SINCE_1_0.0
854    * @param[in] child The child
855    * @pre This Actor (the parent) has been initialized.
856    * @pre The child actor is not the same as the parent actor.
857    */
858   void Remove(Actor child);
859
860   /**
861    * @brief Removes an actor from its parent.
862    *
863    * If the actor has no parent, this method does nothing.
864    * @SINCE_1_0.0
865    * @pre The (child) actor has been initialized.
866    */
867   void Unparent();
868
869   /**
870    * @brief Retrieves the number of children held by the actor.
871    *
872    * @SINCE_1_0.0
873    * @return The number of children
874    * @pre The Actor has been initialized.
875    */
876   uint32_t GetChildCount() const;
877
878   /**
879    * @brief Retrieve and child actor by index.
880    *
881    * @SINCE_1_0.0
882    * @param[in] index The index of the child to retrieve
883    * @return The actor for the given index or empty handle if children not initialized
884    * @pre The Actor has been initialized.
885    */
886   Actor GetChildAt(uint32_t index) const;
887
888   /**
889    * @brief Search through this actor's hierarchy for an actor with the given name.
890    *
891    * The actor itself is also considered in the search.
892    * @SINCE_2_0.9
893    * @param[in] actorName The name of the actor to find
894    * @return A handle to the actor if found, or an empty handle if not
895    * @pre The Actor has been initialized.
896    */
897   Actor FindChildByName(std::string_view actorName);
898
899   /**
900    * @brief Search through this actor's hierarchy for an actor with the given unique ID.
901    *
902    * The actor itself is also considered in the search.
903    * @SINCE_1_0.0
904    * @param[in] id The ID of the actor to find
905    * @return A handle to the actor if found, or an empty handle if not
906    * @pre The Actor has been initialized.
907    */
908   Actor FindChildById(const uint32_t id);
909
910   /**
911    * @brief Retrieves the actor's parent.
912    *
913    * @SINCE_1_0.0
914    * @return A handle to the actor's parent. If the actor has no parent, this handle will be invalid
915    * @pre The actor has been initialized.
916    */
917   Actor GetParent() const;
918
919   // Positioning
920
921   /**
922    * @brief Retrieves the actor's size.
923    *
924    * @SINCE_1_0.0
925    * @return The actor's target size
926    * @pre The actor has been initialized.
927    * @note This return is the value that was set using SetSize or the target size of an animation.
928    *       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.
929    */
930   Vector3 GetTargetSize() const;
931
932   /**
933    * @brief Returns the natural size of the actor.
934    *
935    * Deriving classes stipulate the natural size and by default an actor has a ZERO natural size.
936    *
937    * @SINCE_1_0.0
938    * @return The actor's natural size
939    */
940   Vector3 GetNaturalSize() const;
941
942   /**
943    * @brief Translates an actor relative to its existing position.
944    *
945    * @SINCE_1_0.0
946    * @param[in] distance The actor will move by this distance
947    * @pre The actor has been initialized.
948    */
949   void TranslateBy(const Vector3& distance);
950
951   /**
952    * @brief Applies a relative rotation to an actor.
953    *
954    * @SINCE_1_0.0
955    * @param[in] angle The angle to the rotation to combine with the existing orientation
956    * @param[in] axis The axis of the rotation to combine with the existing orientation
957    * @pre The actor has been initialized.
958    */
959   void RotateBy(const Degree& angle, const Vector3& axis)
960   {
961     RotateBy(Radian(angle), axis);
962   }
963
964   /**
965    * @brief Applies a relative rotation to an actor.
966    *
967    * @SINCE_1_0.0
968    * @param[in] angle The angle to the rotation to combine with the existing orientation
969    * @param[in] axis The axis of the rotation to combine with the existing orientation
970    * @pre The actor has been initialized.
971    */
972   void RotateBy(const Radian& angle, const Vector3& axis);
973
974   /**
975    * @brief Applies a relative rotation to an actor.
976    *
977    * @SINCE_1_0.0
978    * @param[in] relativeRotation The rotation to combine with the existing orientation
979    * @pre The actor has been initialized.
980    */
981   void RotateBy(const Quaternion& relativeRotation);
982
983   /**
984    * @brief Applies a relative scale to an actor.
985    *
986    * @SINCE_1_0.0
987    * @param[in] relativeScale The scale to combine with the actor's existing scale
988    * @pre The actor has been initialized.
989    */
990   void ScaleBy(const Vector3& relativeScale);
991
992   // Input Handling
993
994   /**
995    * @brief Converts screen coordinates into the actor's coordinate system using the default camera.
996    *
997    * @SINCE_1_0.0
998    * @param[out] localX On return, the X-coordinate relative to the actor
999    * @param[out] localY On return, the Y-coordinate relative to the actor
1000    * @param[in] screenX The screen X-coordinate
1001    * @param[in] screenY The screen Y-coordinate
1002    * @return True if the conversion succeeded
1003    * @pre The Actor has been initialized.
1004    * @note The actor coordinates are relative to the top-left (0.0, 0.0, 0.5)
1005    */
1006   bool ScreenToLocal(float& localX, float& localY, float screenX, float screenY) const;
1007
1008   /**
1009    * @brief Raise actor above the next 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 Raise();
1016
1017   /**
1018    * @brief Lower the actor below the previous sibling actor.
1019    *
1020    * @SINCE_1_2.60
1021    * @pre The Actor has been initialized.
1022    * @pre The Actor has been parented.
1023    */
1024   void Lower();
1025
1026   /**
1027    * @brief Raise actor above 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 RaiseToTop();
1034
1035   /**
1036    * @brief Lower actor to the bottom of all other sibling actors.
1037    *
1038    * @SINCE_1_2.60
1039    * @pre The Actor has been initialized.
1040    * @pre The Actor has been parented.
1041    */
1042   void LowerToBottom();
1043
1044   /**
1045    * @brief Raises the actor above the target actor.
1046    *
1047    * @SINCE_1_2.60
1048    * @param[in] target The target actor
1049    * @pre The Actor has been initialized.
1050    * @pre The Actor has been parented.
1051    * @pre The target actor is a sibling.
1052    */
1053   void RaiseAbove(Actor target);
1054
1055   /**
1056    * @brief Lower the actor to below the target actor.
1057    *
1058    * @SINCE_1_2.60
1059    * @param[in] target The target actor
1060    * @pre The Actor has been initialized.
1061    * @pre The Actor has been parented.
1062    * @pre The target actor is a sibling.
1063    */
1064   void LowerBelow(Actor target);
1065
1066   // SIZE NEGOTIATION
1067
1068   /**
1069    * @brief Sets the resize policy to be used for the given dimension(s).
1070    *
1071    * @SINCE_1_0.0
1072    * @param[in] policy The resize policy to use
1073    * @param[in] dimension The dimension(s) to set policy for. Can be a bitfield of multiple dimensions
1074    */
1075   void SetResizePolicy(ResizePolicy::Type policy, Dimension::Type dimension);
1076
1077   /**
1078    * @brief Returns the resize policy used for a single dimension.
1079    *
1080    * @SINCE_1_0.0
1081    * @param[in] dimension The dimension to get policy for
1082    * @return Return the dimension resize policy. If more than one dimension is requested, just return the first one found
1083    */
1084   ResizePolicy::Type GetResizePolicy(Dimension::Type dimension) const;
1085
1086   /**
1087    * @brief Calculates the height of the actor given a width.
1088    *
1089    * The natural size is used for default calculation.
1090    * size 0 is treated as aspect ratio 1:1.
1091    *
1092    * @SINCE_1_0.0
1093    * @param[in] width Width to use
1094    * @return Return the height based on the width
1095    */
1096   float GetHeightForWidth(float width);
1097
1098   /**
1099    * @brief Calculates the width of the actor given a height.
1100    *
1101    * The natural size is used for default calculation.
1102    * size 0 is treated as aspect ratio 1:1.
1103    *
1104    * @SINCE_1_0.0
1105    * @param[in] height Height to use
1106    * @return Return the width based on the height
1107    */
1108   float GetWidthForHeight(float height);
1109
1110   /**
1111    * @brief Returns the value of negotiated dimension for the given dimension.
1112    *
1113    * @SINCE_1_0.0
1114    * @param[in] dimension The dimension to retrieve
1115    * @return Return the value of the negotiated dimension. If more than one dimension is requested, just return the first one found
1116    */
1117   float GetRelayoutSize(Dimension::Type dimension) const;
1118
1119 public: // Renderer
1120   /**
1121    * @brief Adds a renderer to this actor.
1122    *
1123    * @SINCE_1_0.0
1124    * @param[in] renderer Renderer to add to the actor
1125    * @return The index of the Renderer that was added
1126    * @pre The renderer must be initialized.
1127    *
1128    */
1129   uint32_t AddRenderer(Renderer& renderer);
1130
1131   /**
1132    * @brief Gets the number of renderers on this actor.
1133    *
1134    * @SINCE_1_0.0
1135    * @return The number of renderers on this actor
1136    */
1137   uint32_t GetRendererCount() const;
1138
1139   /**
1140    * @brief Gets a Renderer by index.
1141    *
1142    * @SINCE_1_0.0
1143    * @param[in] index The index of the renderer to fetch
1144    * @return The renderer at the specified index
1145    * @pre The index must be between 0 and GetRendererCount()-1
1146    *
1147    */
1148   Renderer GetRendererAt(uint32_t index);
1149
1150   /**
1151    * @brief Removes a renderer from the actor.
1152    *
1153    * @SINCE_1_0.0
1154    * @param[in] renderer Handle to the renderer that is to be removed
1155    */
1156   void RemoveRenderer(Renderer& renderer);
1157
1158   /**
1159    * @brief Removes a renderer from the actor by index.
1160    *
1161    * @SINCE_1_0.0
1162    * @param[in] index Index of the renderer that is to be removed
1163    * @pre The index must be between 0 and GetRendererCount()-1
1164    *
1165    */
1166   void RemoveRenderer(uint32_t index);
1167
1168 public: // Signals
1169   /**
1170    * @brief This signal is emitted when touch input is received.
1171    *
1172    * A callback of the following type may be connected:
1173    * @code
1174    *   bool YourCallbackName( Actor actor, TouchEvent& touch );
1175    * @endcode
1176    * The return value of True, indicates that the touch event has been consumed.
1177    * Otherwise the signal will be emitted on the next sensitive parent of the actor.
1178    * @SINCE_1_9.28
1179    * @return The signal to connect to
1180    * @pre The Actor has been initialized.
1181    */
1182   TouchEventSignalType& TouchedSignal();
1183
1184   /**
1185    * @brief This signal is emitted when hover input is received.
1186    *
1187    * A callback of the following type may be connected:
1188    * @code
1189    *   bool YourCallbackName(Actor actor, const HoverEvent& event);
1190    * @endcode
1191    * The return value of True, indicates that the hover event should be consumed.
1192    * Otherwise the signal will be emitted on the next sensitive parent of the actor.
1193    * @SINCE_1_0.0
1194    * @return The signal to connect to
1195    * @pre The Actor has been initialized.
1196    */
1197   HoverSignalType& HoveredSignal();
1198
1199   /**
1200    * @brief This signal is emitted when wheel event is received.
1201    *
1202    * A callback of the following type may be connected:
1203    * @code
1204    *   bool YourCallbackName(Actor actor, const WheelEvent& event);
1205    * @endcode
1206    * The return value of True, indicates that the wheel event should be consumed.
1207    * Otherwise the signal will be emitted on the next sensitive parent of the actor.
1208    * @SINCE_1_0.0
1209    * @return The signal to connect to
1210    * @pre The Actor has been initialized.
1211    */
1212   WheelEventSignalType& WheelEventSignal();
1213
1214   /**
1215    * @brief This signal is emitted after the actor has been connected to the scene.
1216    *
1217    * When an actor is connected, it will be directly or indirectly parented to the root Actor.
1218    * @SINCE_1_9.24
1219    * @return The signal to connect to
1220    * @note The root Actor is provided automatically by the Scene, and is always considered to be connected.
1221    *
1222    * @note When the parent of a set of actors is connected to the stage, then all of the children
1223    * will received this callback.
1224    * For the following actor tree, the callback order will be A, B, D, E, C, and finally F.
1225    *
1226    * @code
1227    *
1228    *       A (parent)
1229    *      / \
1230    *     B   C
1231    *    / \   \
1232    *   D   E   F
1233    *
1234    * @endcode
1235    */
1236   OnSceneSignalType& OnSceneSignal();
1237
1238   /**
1239    * @brief This signal is emitted after the actor has been disconnected from the scene.
1240    *
1241    * If an actor is disconnected it either has no parent, or is parented to a disconnected actor.
1242    *
1243    * @SINCE_1_9.24
1244    * @return The signal to connect to
1245    * @note When the parent of a set of actors is disconnected to the scene, then all of the children
1246    * will received this callback, starting with the leaf actors.
1247    * For the following actor tree, the callback order will be D, E, B, F, C, and finally A.
1248    *
1249    * @code
1250    *
1251    *       A (parent)
1252    *      / \
1253    *     B   C
1254    *    / \   \
1255    *   D   E   F
1256    *
1257    * @endcode
1258    *
1259    */
1260   OffSceneSignalType& OffSceneSignal();
1261
1262   /**
1263    * @brief This signal is emitted after the size has been set on the actor during relayout
1264    *
1265    * @SINCE_1_0.0
1266    * @return The signal
1267    */
1268   OnRelayoutSignalType& OnRelayoutSignal();
1269
1270   /**
1271    * @brief This signal is emitted when the layout direction property of this or a parent actor is changed.
1272    *
1273    * A callback of the following type may be connected:
1274    * @code
1275    *   void YourCallbackName( Actor actor, LayoutDirection::Type type );
1276    * @endcode
1277    * actor: The actor, or child of actor, whose layout direction has changed
1278    * type: Whether the actor's layout direction property has changed or a parent's.
1279    *
1280    * @SINCE_1_2.60
1281    * @return The signal to connect to
1282    * @pre The Actor has been initialized.
1283    */
1284   LayoutDirectionChangedSignalType& LayoutDirectionChangedSignal();
1285
1286 public: // Not intended for application developers
1287   /// @cond internal
1288   /**
1289    * @brief This constructor is used by Actor::New() methods.
1290    *
1291    * @SINCE_1_0.0
1292    * @param [in] actor A pointer to a newly allocated Dali resource
1293    */
1294   explicit DALI_INTERNAL Actor(Internal::Actor* actor);
1295   /// @endcond
1296 };
1297
1298 /**
1299  * @brief Helper for discarding an actor handle.
1300  *
1301  * If the handle is empty, this method does nothing.  Otherwise
1302  * Actor::Unparent() will be called, followed by Actor::Reset().
1303  * @SINCE_1_0.0
1304  * @param[in,out] actor A handle to an actor, or an empty handle
1305  */
1306 inline void UnparentAndReset(Actor& actor)
1307 {
1308   if(actor)
1309   {
1310     actor.Unparent();
1311     actor.Reset();
1312   }
1313 }
1314
1315 /**
1316  * @}
1317  */
1318 } // namespace Dali
1319
1320 #endif // DALI_ACTOR_H