Use modern construct 'using' instead of typedef.
[platform/core/uifw/dali-core.git] / dali / devel-api / common / stage.h
1 #ifndef DALI_STAGE_H
2 #define DALI_STAGE_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
24 // INTERNAL INCLUDES
25 #include <dali/public-api/object/base-handle.h>
26 #include <dali/public-api/signals/dali-signal.h>
27
28 namespace Dali
29 {
30 /**
31  * @addtogroup dali_core_common
32  * @{
33  */
34
35 namespace Internal DALI_INTERNAL
36 {
37 class Stage;
38 }
39
40 class Actor;
41 class Layer;
42 class ObjectRegistry;
43 class TouchEvent;
44 class RenderTaskList;
45 class WheelEvent;
46 struct Vector2;
47 struct Vector3;
48 struct Vector4;
49 class KeyEvent;
50
51 /**
52  * @brief The Stage is a top-level object used for displaying a tree of Actors.
53  *
54  * Stage is a top-level object that represents the entire screen.
55  * It is used for displaying a hierarchy of actors managed by the scene graph structure,
56  * which means an actor inherits a position relative to its parent,
57  * and can be moved in relation to this point.
58  *
59  * The stage instance is a singleton object (the only instance of its class during the
60  * lifetime of the program). You can get it using a static function.
61  *
62  * To display the contents of an actor, it must be added to a stage.
63  * The following example shows how to connect a new actor to the stage:
64  * @code
65  * Actor actor = Actor::New();
66  * Stage::GetCurrent().Add( actor );
67  * @endcode
68  *
69  * The stage has a 2D size that matches the size of the application window.
70  * The default unit 1 is 1 pixel with the default camera.
71  *
72  * Multiple stage/window support is not currently provided.
73  *
74  * Signals
75  * | %Signal Name            | Method                               |
76  * |-------------------------|--------------------------------------|
77  * | keyEvent                | @ref KeyEventSignal()                |
78  * | eventProcessingFinished | @ref EventProcessingFinishedSignal() |
79  * | touched                 | @ref TouchedSignal()                 |
80  * | wheelEvent              | @ref WheelEventSignal()              |
81  * | contextLost             | @ref ContextLostSignal()             |
82  * | contextRegained         | @ref ContextRegainedSignal()         |
83  * | sceneCreated            | @ref SceneCreatedSignal()            |
84  */
85 class DALI_CORE_API Stage : public BaseHandle
86 {
87 public:
88   using KeyEventSignalType                = Signal<void( const KeyEvent& )>;   ///< Key event signal type
89   using EventProcessingFinishedSignalType = Signal<void()>;                    ///< Event Processing finished signal type
90   using TouchEventSignalType              = Signal<void( const TouchEvent& )>; ///< Touch signal type
91   using WheelEventSignalType              = Signal<void( const WheelEvent& )>; ///< Wheel signal type
92   using ContextStatusSignal               = Signal<void()>;                    ///< Context status signal type
93   using SceneCreatedSignalType            = Signal<void()>;                    ///< Scene created signal type
94
95   /**
96    * @brief Allows the creation of an empty stage handle.
97    *
98    * To retrieve the current stage, this handle can be set using Stage::GetCurrent().
99    */
100   Stage();
101
102   /**
103    * @brief Gets the current Stage.
104    *
105    * @return The current stage or an empty handle if the internal core has not been created or has been already destroyed
106    */
107   static Stage GetCurrent();
108
109   /**
110    * @brief Queries whether the Stage exists; this should only return false during or after destruction of Dali core.
111    *
112    * @return True when it's safe to call Stage::GetCurrent()
113    */
114   static bool IsInstalled();
115
116   /**
117    * @brief Destructor.
118    *
119    * This is non-virtual since derived Handle types must not contain data or virtual methods.
120    */
121   ~Stage();
122
123   /**
124    * @brief This copy constructor is required for (smart) pointer semantics.
125    *
126    * @param[in] handle A reference to the copied handle
127    */
128   Stage(const Stage& handle);
129
130   /**
131    * @brief This assignment operator is required for (smart) pointer semantics.
132    *
133    * @param[in] rhs A reference to the copied handle
134    * @return A reference to this
135    */
136   Stage& operator=(const Stage& rhs);
137
138   // Containment
139
140   /**
141    * @brief Adds a child Actor to the Stage.
142    *
143    * The child will be referenced.
144    * @param[in] actor The child
145    * @pre The actor has been initialized.
146    * @pre The actor does not have a parent.
147    */
148   void Add(Actor& actor);
149
150   /**
151    * @brief Removes a child Actor from the Stage.
152    *
153    * The child will be unreferenced.
154    * @param[in] actor The child
155    * @pre The actor has been added to the stage.
156    */
157   void Remove(Actor& actor);
158
159   /**
160    * @brief Returns the size of the Stage in pixels as a Vector.
161    *
162    * The x component will be the width of the Stage in pixels.
163    * The y component will be the height of the Stage in pixels.
164    * The z component will be the distance between far and near planes.
165    * @return The size of the Stage as a Vector
166    */
167   Vector2 GetSize() const;
168
169   // Render Tasks
170
171   /**
172    * @brief Retrieves the list of render-tasks.
173    *
174    * @return A valid handle to a RenderTaskList
175    */
176   RenderTaskList GetRenderTaskList() const;
177
178   // Layers
179
180   /**
181    * @brief Queries the number of on-stage layers.
182    *
183    * Note that a default layer is always provided (count >= 1).
184    * @return The number of layers
185    */
186   uint32_t GetLayerCount() const;
187
188   /**
189    * @brief Retrieves the layer at a specified depth.
190    *
191    * @param[in] depth The depth
192    * @return The layer found at the given depth
193    * @pre Depth is less than layer count; see GetLayerCount().
194    */
195   Layer GetLayer(uint32_t depth) const;
196
197   /**
198    * @brief Returns the Stage's Root Layer.
199    *
200    * @return The root layer
201    */
202   Layer GetRootLayer() const;
203
204   // Background color
205
206   /**
207    * @brief Sets the background color of the stage.
208    *
209    * @param[in] color The new background color
210    */
211   void SetBackgroundColor(Vector4 color);
212
213   /**
214    * @brief Retrieves the background color of the stage.
215    *
216    * @return The background color
217    */
218   Vector4 GetBackgroundColor() const;
219
220   /**
221    * @brief Retrieves the DPI of the display device to which the stage is connected.
222    *
223    * @return The horizontal and vertical DPI
224    */
225   Vector2 GetDpi() const;
226
227   /**
228    * @brief Gets the Object registry.
229    *
230    * @return The object registry
231    */
232   ObjectRegistry GetObjectRegistry() const;
233
234   // Rendering
235
236   /**
237    * @brief Keep rendering for at least the given amount of time.
238    *
239    * By default, Dali will stop rendering when no Actor positions are being set, and when no animations are running etc.
240    * This method is useful to force screen refreshes e.g. when updating a NativeImage.
241    * @param[in] durationSeconds Time to keep rendering, 0 means render at least one more frame
242    */
243   void KeepRendering( float durationSeconds );
244
245   // Signals
246
247   /**
248    * @brief This signal is emitted when key event is received.
249    *
250    * A callback of the following type may be connected:
251    * @code
252    *   void YourCallbackName(const KeyEvent& event);
253    * @endcode
254    * @return The signal to connect to
255    */
256   KeyEventSignalType& KeyEventSignal();
257
258   /**
259    * @brief This signal is emitted just after the event processing is finished.
260    *
261    * @return The signal to connect to
262    */
263   EventProcessingFinishedSignalType& EventProcessingFinishedSignal();
264
265   /**
266    * @brief This signal is emitted when the screen is touched and when the touch ends
267    * (i.e. the down & up touch events only).
268    *
269    * If there are multiple touch points, then this will be emitted when the first touch occurs and
270    * then when the last finger is lifted.
271    * An interrupted event will also be emitted (if it occurs).
272    * A callback of the following type may be connected:
273    * @code
274    *   void YourCallbackName( TouchEvent event );
275    * @endcode
276    *
277    * @return The touch signal to connect to
278    * @note Motion events are not emitted.
279    */
280   TouchEventSignalType& TouchedSignal();
281
282   /**
283    * @brief This signal is emitted when wheel event is received.
284    *
285    * A callback of the following type may be connected:
286    * @code
287    *   void YourCallbackName(const WheelEvent& event);
288    * @endcode
289    * @return The signal to connect to
290    */
291   WheelEventSignalType& WheelEventSignal();
292
293   /**
294    * @brief This signal is emitted when the GL context is lost (Platform specific behaviour).
295    *
296    * If the application is responsible for handling context loss, it should listen to
297    * this signal and tear down UI components when received.
298    * @return The context lost signal to connect to
299    */
300   ContextStatusSignal& ContextLostSignal();
301
302   /**
303    * @brief This signal is emitted when the GL context is regained (Platform specific
304    * behavior).
305    *
306    * If the application is responsible for handling context loss, it should listen to
307    * this signal and rebuild UI components on receipt.
308    * @return The context regained signal to connect to
309    */
310   ContextStatusSignal& ContextRegainedSignal();
311
312   /**
313    * @brief This signal is emitted after the initial scene is created.
314    *
315    * It will be triggered after the
316    * application init signal.
317    *
318    * A callback of the following type may be connected:
319    * @code
320    *   void YourCallbackName();
321    * @endcode
322    * @return The signal to connect to
323    */
324   SceneCreatedSignalType& SceneCreatedSignal();
325
326 public: // Not intended for application developers
327
328   /// @cond internal
329   /**
330    * @brief This constructor is used by Stage::GetCurrent() methods.
331    *
332    * @param[in] stage A pointer to a Dali resource
333    */
334   explicit DALI_INTERNAL Stage(Internal::Stage* stage);
335   /// @endcond
336 };
337
338 /**
339  * @}
340  */
341
342 } // namespace Dali
343
344 #endif // DALI_STAGE_H