[Tizen]Add KeyEventGeneratedSignal for Get KeyEvent normally
[platform/core/uifw/dali-core.git] / dali / internal / event / common / scene-impl.cpp
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/event/common/scene-impl.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/internal/event/actors/layer-impl.h>
23 #include <dali/internal/event/actors/layer-list.h>
24 #include <dali/internal/event/actors/camera-actor-impl.h>
25 #include <dali/internal/event/common/thread-local-storage.h>
26 #include <dali/internal/event/render-tasks/render-task-list-impl.h>
27 #include <dali/internal/event/render-tasks/render-task-impl.h>
28 #include <dali/internal/event/common/object-registry-impl.h>
29 #include <dali/internal/update/nodes/node.h>
30 #include <dali/internal/update/manager/update-manager.h>
31 #include <dali/public-api/object/type-registry.h>
32 #include <dali/public-api/render-tasks/render-task-list.h>
33 #include <dali/internal/event/rendering/frame-buffer-impl.h>
34 #include <dali/internal/event/size-negotiation/relayout-controller-impl.h>
35
36 using Dali::Internal::SceneGraph::Node;
37
38 namespace Dali
39 {
40
41 namespace Internal
42 {
43
44 namespace
45 {
46
47 const Vector4 DEFAULT_BACKGROUND_COLOR(0.0f, 0.0f, 0.0f, 1.0f); // Default background color
48
49 } //Unnamed namespace
50
51 ScenePtr Scene::New( const Size& size )
52 {
53   ScenePtr scene = new Scene( size );
54
55   // Second-phase construction
56   scene->Initialize();
57
58   return scene;
59 }
60
61 Scene::Scene( const Size& size )
62 : mSurface( nullptr ),
63   mSize( size ),
64   mSurfaceSize( Vector2::ZERO ),
65   mDpi( Vector2::ZERO ),
66   mDepthTreeDirty( false ),
67   mEventProcessor( *this, ThreadLocalStorage::GetInternal()->GetGestureEventProcessor() )
68 {
69 }
70
71 Scene::~Scene()
72 {
73   if( mDefaultCamera )
74   {
75     // its enough to release the handle so the object is released
76     // don't need to remove it from root actor as root actor will delete the object
77     mDefaultCamera.Reset();
78   }
79
80   if( mRootLayer )
81   {
82     // we are closing down so just delete the root, no point emit disconnect
83     // signals or send messages to update
84     mRootLayer.Reset();
85   }
86
87   if( mRenderTaskList )
88   {
89     mRenderTaskList.Reset();
90   }
91
92   if( ThreadLocalStorage::Created() )
93   {
94     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
95     tls->RemoveScene( this );
96   }
97 }
98
99 void Scene::Initialize()
100 {
101   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
102
103   DALI_ASSERT_ALWAYS( tls && "Attempt to create scene before core exists!" );
104
105   tls->AddScene( this );
106
107   SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
108
109   // Create the ordered list of layers
110   mLayerList = LayerList::New( updateManager );
111
112   // The scene owns the default layer
113   mRootLayer = Layer::NewRoot( *mLayerList, updateManager );
114   mRootLayer->SetName("RootLayer");
115   mRootLayer->SetScene( *this );
116
117   // The root layer needs to have a fixed resize policy (as opposed to the default USE_NATURAL_SIZE).
118   // This stops actors parented to the stage having their relayout requests propagating
119   // up to the root layer, and down through other children unnecessarily.
120   mRootLayer->SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
121
122   // Create the default camera actor first; this is needed by the RenderTaskList
123   // The default camera attributes and position is such that children of the default layer,
124   // can be positioned at (0,0) and be at the top-left of the viewport.
125   mDefaultCamera = CameraActor::New( mSize );
126   mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER);
127   Add(*(mDefaultCamera.Get()));
128
129   // Create the list of render-tasks
130   mRenderTaskList = RenderTaskList::New();
131
132   // Create the default render-task
133   mRenderTaskList->CreateTask( mRootLayer.Get(), mDefaultCamera.Get() );
134 }
135
136 void Scene::Add(Actor& actor)
137 {
138   mRootLayer->Add( actor );
139 }
140
141 void Scene::Remove(Actor& actor)
142 {
143   mRootLayer->Remove( actor );
144 }
145
146 Size Scene::GetSize() const
147 {
148   return mSize;
149 }
150
151 void Scene::SetDpi(Vector2 dpi)
152 {
153   mDpi = dpi;
154 }
155
156 Vector2 Scene::GetDpi() const
157 {
158   return mDpi;
159 }
160
161 RenderTaskList& Scene::GetRenderTaskList() const
162 {
163   return *mRenderTaskList;
164 }
165
166 Dali::Layer Scene::GetRootLayer() const
167 {
168   return Dali::Layer( mRootLayer.Get() );
169 }
170
171 LayerList& Scene::GetLayerList() const
172 {
173   return *mLayerList;
174 }
175
176 uint32_t Scene::GetLayerCount() const
177 {
178   return mLayerList->GetLayerCount();
179 }
180
181 Dali::Layer Scene::GetLayer( uint32_t depth ) const
182 {
183   return Dali::Layer(mLayerList->GetLayer( depth ));
184 }
185
186 CameraActor& Scene::GetDefaultCameraActor()
187 {
188   return *mDefaultCamera;
189 }
190
191 Actor& Scene::GetDefaultRootActor()
192 {
193   return *mRootLayer;
194 }
195
196 void Scene::SetSurface( Integration::RenderSurface& surface )
197 {
198   mSurface = &surface;
199   if ( mSurface )
200   {
201     mSurfaceSize.width = static_cast<float>( mSurface->GetPositionSize().width );
202     mSurfaceSize.height = static_cast<float>( mSurface->GetPositionSize().height );
203
204     mSize.width = mSurfaceSize.width;
205     mSize.height = mSurfaceSize.height;
206
207     // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
208     mDefaultCamera->SetPerspectiveProjection( mSurfaceSize );
209
210     mRootLayer->SetSize( mSize.width, mSize.height );
211
212     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
213     SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
214     SetDefaultSurfaceRectMessage( updateManager, Rect<int32_t>( 0, 0, static_cast<int32_t>( mSurfaceSize.width ), static_cast<int32_t>( mSurfaceSize.height ) ) ); // truncated
215
216     RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u );
217
218     // if single render task to screen then set its viewport parameters
219     if( 1 == mRenderTaskList->GetTaskCount() )
220     {
221       if( !defaultRenderTask->GetTargetFrameBuffer() )
222       {
223         defaultRenderTask->SetViewport( Viewport( 0, 0, static_cast<int32_t>( mSurfaceSize.width ), static_cast<int32_t>( mSurfaceSize.height ) ) ); // truncated
224       }
225     }
226
227     mFrameBuffer = Dali::Internal::FrameBuffer::New( surface, Dali::FrameBuffer::Attachment::NONE );
228     defaultRenderTask->SetFrameBuffer( mFrameBuffer );
229   }
230 }
231
232 Integration::RenderSurface* Scene::GetSurface() const
233 {
234   return mSurface;
235 }
236
237 void Scene::RequestRebuildDepthTree()
238 {
239   mDepthTreeDirty = true;
240 }
241
242 void Scene::QueueEvent( const Integration::Event& event )
243 {
244   mEventProcessor.QueueEvent( event );
245 }
246
247 void Scene::ProcessEvents()
248 {
249   mEventProcessor.ProcessEvents();
250 }
251
252 void Scene::RebuildDepthTree()
253 {
254   // If the depth tree needs rebuilding, do it in this frame only.
255   if( mDepthTreeDirty )
256   {
257     ActorPtr actor( mRootLayer.Get() );
258     actor->RebuildDepthTree();
259     mDepthTreeDirty = false;
260   }
261 }
262
263 void Scene::SetBackgroundColor(Vector4 color)
264 {
265   if( mSurface )
266   {
267     mSurface->SetBackgroundColor( color );
268   }
269 }
270
271 Vector4 Scene::GetBackgroundColor() const
272 {
273   return mSurface ? mSurface->GetBackgroundColor() : DEFAULT_BACKGROUND_COLOR;
274 }
275
276 void Scene::EmitKeyEventSignal(const KeyEvent& event)
277 {
278   mKeyEventSignal.Emit( event );
279 }
280
281 bool Scene::EmitKeyEventGeneratedSignal(const KeyEvent& event)
282 {
283   // Emit the KeyEventGenerated signal when KeyEvent is generated
284   return mKeyEventGeneratedSignal.Emit( event );
285 }
286
287 void Scene::EmitEventProcessingFinishedSignal()
288 {
289   mEventProcessingFinishedSignal.Emit();
290 }
291
292 void Scene::EmitTouchedSignal( const TouchEvent& touchEvent, const Dali::TouchData& touch )
293 {
294   mTouchedSignal.Emit( touchEvent );
295   mTouchSignal.Emit( touch );
296 }
297
298 void Scene::EmitWheelEventSignal(const WheelEvent& event)
299 {
300   mWheelEventSignal.Emit( event );
301 }
302
303 Integration::Scene::KeyEventSignalType& Scene::KeyEventSignal()
304 {
305   return mKeyEventSignal;
306 }
307
308 Integration::Scene::KeyEventGeneratedSignalType& Scene::KeyEventGeneratedSignal()
309 {
310   return mKeyEventGeneratedSignal;
311 }
312
313 Integration::Scene::EventProcessingFinishedSignalType& Scene::EventProcessingFinishedSignal()
314 {
315   return mEventProcessingFinishedSignal;
316 }
317
318 Scene::TouchedSignalType& Scene::TouchedSignal()
319 {
320   return mTouchedSignal;
321 }
322
323 Integration::Scene::TouchSignalType& Scene::TouchSignal()
324 {
325   return mTouchSignal;
326 }
327
328 Integration::Scene::WheelEventSignalType& Scene::WheelEventSignal()
329 {
330   return mWheelEventSignal;
331 }
332
333 } // Internal
334
335 } // Dali