Revert "[3.0] Exclude internal tag module in Public API reference"
[platform/core/uifw/dali-adaptor.git] / adaptors / public-api / adaptor-framework / application.h
1 #ifndef __DALI_APPLICATION_H__
2 #define __DALI_APPLICATION_H__
3
4 /*
5  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <string>
23 #include <dali/public-api/common/view-mode.h>
24 #include <dali/public-api/object/base-handle.h>
25 #include <dali/public-api/signals/callback.h>
26
27
28 // INTERNAL INCLUDES
29 #include "application-configuration.h"
30 #include "window.h"
31
32 namespace Dali
33 {
34 /**
35  * @addtogroup dali_adaptor_framework
36  * @{
37  */
38
39 namespace Internal DALI_INTERNAL
40 {
41 namespace Adaptor
42 {
43 class Application;
44 }
45 }
46 /**
47  * @brief An Application class object should be created by every application
48  * that wishes to use Dali.
49  *
50  * It provides a means for initialising the
51  * resources required by the Dali::Core.
52  *
53  * The Application class emits several signals which the user can
54  * connect to.  The user should not create any Dali objects in the main
55  * function and instead should connect to the Init signal of the
56  * Application and create the Dali objects in the connected callback.
57  *
58  * Applications should follow the example below:
59  *
60  * @code
61  * class ExampleController: public ConnectionTracker
62  * {
63  * public:
64  *   ExampleController( Application& application )
65  *   : mApplication( application )
66  *   {
67  *     mApplication.InitSignal().Connect( this, &ExampleController::Create );
68  *   }
69  *
70  *   void Create( Application& application )
71  *   {
72  *     // Create Dali components...
73  *   }
74  *  ...
75  * private:
76  *   Application& mApplication;
77  * };
78  *
79  * int main (int argc, char **argv)
80  * {
81  *   Application app = Application::New(&argc, &argv);
82  *   ExampleController example( app );
83  *   app.MainLoop();
84  * }
85  * @endcode
86  *
87  * If required, you can also connect class member functions to a signal:
88  *
89  * @code
90  * MyApplication app;
91  * app.ResumeSignal().Connect(&app, &MyApplication::Resume);
92  * @endcode
93  *
94  * This class accepts command line arguments as well. The following options are supported:
95  *
96  * @code
97  *     --no-vsync       Disable VSync on Render
98  *  -w|--width          Stage Width
99  *  -h|--height         Stage Height
100  *  -d|--dpi            Emulated DPI
101  *     --help           Help
102  * @endcode
103  *
104  * When the above options are found, they are stripped from argv, and argc is updated appropriately.
105  * @SINCE_1_0.0
106  */
107 class DALI_IMPORT_API Application : public BaseHandle
108 {
109 public:
110
111   typedef Signal< void (Application&) > AppSignalType;  ///< Application lifecycle signal and system signal callback type @SINCE_1_0.0
112   typedef Signal< void (Application&, void *) > AppControlSignalType; ///< Application control signal callback type @SINCE_1_0.0
113
114   /**
115    * @brief Decides whether a Dali application window is opaque or transparent.
116    * @SINCE_1_0.0
117    */
118   enum WINDOW_MODE
119   {
120     OPAQUE = 0,       ///< The window will be opaque @SINCE_1_0.0
121     TRANSPARENT = 1   ///< The window transparency will match the alpha value set in Dali::Stage::SetBackgroundcolor() @SINCE_1_0.0
122   };
123
124 public:
125
126   /**
127    * @brief This is the constructor for applications without an argument list.
128    * @SINCE_1_0.0
129    */
130   static Application New();
131
132   /**
133    * @brief This is the constructor for applications.
134    *
135    * @SINCE_1_0.0
136    * @param[in,out]  argc        A pointer to the number of arguments
137    * @param[in,out]  argv        A pointer the the argument list
138    */
139   static Application New( int* argc, char **argv[] );
140
141   /**
142    * @brief This is the constructor for applications with a name
143    *
144    * @SINCE_1_0.0
145    * @param[in,out]  argc        A pointer to the number of arguments
146    * @param[in,out]  argv        A pointer the the argument list
147    * @param[in]      stylesheet  The path to user defined theme file
148    */
149   static Application New( int* argc, char **argv[], const std::string& stylesheet );
150
151   /**
152    * @brief This is the constructor for applications with a name
153    *
154    * @SINCE_1_0.0
155    * @param[in,out]  argc        A pointer to the number of arguments
156    * @param[in,out]  argv        A pointer the the argument list
157    * @param[in]      stylesheet  The path to user defined theme file
158    * @param[in]      windowMode  A member of WINDOW_MODE
159    */
160   static Application New( int* argc, char **argv[], const std::string& stylesheet, WINDOW_MODE windowMode );
161
162   /**
163    * @brief Construct an empty handle
164    * @SINCE_1_0.0
165    */
166   Application();
167
168   /**
169    * @brief Copy Constructor
170    * @SINCE_1_0.0
171    */
172   Application( const Application& application );
173
174   /**
175    * @brief Assignment operator
176    * @SINCE_1_0.0
177    */
178   Application& operator=( const Application& applicaton );
179
180   /**
181    * @brief Destructor
182    *
183    * This is non-virtual since derived Handle types must not contain data or virtual methods.
184    * @SINCE_1_0.0
185    */
186   ~Application();
187
188 public:
189   /**
190    * @brief This starts the application.
191    *
192    * Choosing this form of main loop indicates that the default
193    * application configuration of APPLICATION_HANDLES_CONTEXT_LOSS is used. On platforms where
194    * context loss can occur, the application is responsible for tearing down and re-loading UI.
195    * The application should listen to Stage::ContextLostSignal and Stage::ContextRegainedSignal.
196    * @SINCE_1_0.0
197    */
198   void MainLoop();
199
200   /**
201    * @brief This starts the application, and allows the app to choose a different configuration.
202    *
203    * If the application plans on using the ReplaceSurface or ReplaceWindow API, then this will
204    * trigger context loss & regain.
205    * The application should listen to Stage::ContextLostSignal and Stage::ContextRegainedSignal.
206    * @SINCE_1_0.0
207    */
208   void MainLoop(Configuration::ContextLoss configuration);
209
210   /**
211    * @brief This lowers the application to bottom without actually quitting it
212    * @SINCE_1_0.0
213    */
214   void Lower();
215
216   /**
217    * @brief This quits the application.  Tizen applications should use Lower to improve re-start performance unless they need to Quit completely.
218    * @SINCE_1_0.0
219    */
220   void Quit();
221
222   /**
223    * @brief Ensures that the function passed in is called from the main loop when it is idle.
224    * @SINCE_1_0.0
225    * @param[in]  callback  The function to call.
226    * @return true if added successfully, false otherwise
227    *
228    * @note Function must be called from main event thread only
229    *
230    * A callback of the following type may be used:
231    * @code
232    *   void MyFunction();
233    * @endcode
234    *
235    * @note Ownership of the callback is passed onto this class.
236    */
237   bool AddIdle( CallbackBase* callback );
238
239   /**
240    * @brief Retrieves the window used by the Application class.
241    *
242    * The application writer can use the window to change indicator and orientation
243    * properties.
244    * @SINCE_1_0.0
245    * @return A handle to the window
246    */
247   Window GetWindow();
248
249   /**
250    * @brief Replace the current window.
251    *
252    * This will force context loss.
253    * If you plan on using this API in your application, then you should configure
254    * it to prevent discard behaviour when handling the Init signal.
255    * @SINCE_1_0.0
256    * @param[in] windowPosition The position and size parameters of the new window
257    * @param[in] name The name of the new window
258    */
259   void ReplaceWindow(PositionSize windowPosition, const std::string& name);
260
261 public: // Stereoscopy
262
263   /**
264    * @brief Set the viewing mode for the application.
265    * @SINCE_1_0.0
266    * @param[in] viewMode The new viewing mode.
267    */
268   void SetViewMode( ViewMode viewMode );
269
270   /**
271    * @brief Get the current viewing mode.
272    * @SINCE_1_0.0
273    * @return The current viewing mode.
274    */
275   ViewMode GetViewMode() const;
276
277   /**
278    * @brief Set the stereo base (eye separation) for Stereoscopic 3D
279    *
280    * @SINCE_1_0.0
281    * @param[in] stereoBase The stereo base (eye separation) for Stereoscopic 3D
282    */
283   void SetStereoBase( float stereoBase );
284
285   /**
286    * @brief Get the stereo base (eye separation) for Stereoscopic 3D
287    *
288    * @SINCE_1_0.0
289    * @return The stereo base (eye separation) for Stereoscopic 3D
290    */
291   float GetStereoBase() const;
292
293 public:  // Signals
294
295   /**
296    * @brief The user should connect to this signal to determine when they should initialise
297    * their application.
298    * @SINCE_1_0.0
299    */
300   AppSignalType& InitSignal();
301
302   /**
303    * @brief The user should connect to this signal to determine when they should terminate
304    * their application
305    * @SINCE_1_0.0
306    */
307   AppSignalType& TerminateSignal();
308
309   /**
310    * @brief The user should connect to this signal if they need to perform any special
311    * activities when the application is about to be paused.
312    * @SINCE_1_0.0
313    */
314   AppSignalType& PauseSignal();
315
316   /**
317    * @brief The user should connect to this signal if they need to perform any special
318    * activities when the application has resumed.
319    * @SINCE_1_0.0
320    */
321   AppSignalType& ResumeSignal();
322
323   /**
324    * @brief This signal is sent when the system requires the user to reinitialise itself.
325    * @SINCE_1_0.0
326    */
327   AppSignalType& ResetSignal();
328
329   /**
330    * @brief This signal is emitted when the window the application is rendering on is resized.
331    * @SINCE_1_0.0
332    */
333   AppSignalType& ResizeSignal();
334
335   /**
336   * @brief This signal is emitted when another application sends a launch request to the application.
337   *
338   * When the application is launched, this signal is emitted after the main loop of the application starts up.
339   * The passed parameter describes the launch request and contains the information about why the application is launched.
340   * @SINCE_1_0.0
341   */
342   AppControlSignalType& AppControlSignal();
343
344   /**
345    * @brief This signal is emitted when the language is changed on the device.
346    * @SINCE_1_0.0
347    */
348   AppSignalType& LanguageChangedSignal();
349
350   /**
351   * @brief This signal is emitted when the region of the device is changed.
352   * @SINCE_1_0.0
353   */
354   AppSignalType& RegionChangedSignal();
355
356   /**
357   * @brief This signal is emitted when the battery level of the device is low.
358   * @SINCE_1_0.0
359   */
360   AppSignalType& BatteryLowSignal();
361
362   /**
363   * @brief This signal is emitted when the memory level of the device is low.
364   * @SINCE_1_0.0
365   */
366   AppSignalType& MemoryLowSignal();
367
368 public: // Not intended for application developers
369   /**
370    * @brief Internal constructor
371    * @SINCE_1_0.0
372    */
373   explicit DALI_INTERNAL Application(Internal::Adaptor::Application* application);
374 };
375
376 /**
377  * @}
378  */
379 } // namespace Dali
380
381 #endif // __DALI_APPLICATION_H__