Merge "Remove extension from shader." into devel/new_mesh
[platform/core/uifw/dali-core.git] / dali / internal / event / actors / layer-impl.h
1 #ifndef __DALI_INTERNAL_LAYER_H__
2 #define __DALI_INTERNAL_LAYER_H__
3
4 /*
5  * Copyright (c) 2014 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 // INTERNAL INCLUDES
22 #include <dali/public-api/actors/layer.h>
23 #include <dali/internal/event/actors/actor-impl.h>
24 #include <dali/internal/event/actors/actor-declarations.h>
25
26 namespace Dali
27 {
28
29 namespace Internal
30 {
31
32 class LayerList;
33
34 namespace SceneGraph
35 {
36 class UpdateManager;
37 class Layer;
38 }
39
40 typedef Dali::ClippingBox ClippingBox;
41
42 class Layer : public Actor
43 {
44 public:
45
46   /**
47    * @copydoc Dali::Layer::ZValue(const Vector3&, float)
48    *
49    * This is the default sorting function.
50    * It is useful for 2D user interfaces, and it's used to sort translucent renderers.
51    *
52    * Only the Z signed distance from the camera is considererd, lower values will be drawn on top.
53    * 
54    * @param[in] position     position of actor in view space
55    * @return depth
56    */
57   static float ZValue(const Vector3& position)
58   {
59     // inlined so we avoid a function call when sorting renderers
60     return position.z;
61   }
62
63   /**
64    * Create a new Layer.
65    * @return A smart-pointer to the newly allocated Layer.
66    */
67   static LayerPtr New();
68
69   /**
70    * Create a new root layer; this is typically owned by the stage.
71    * @param[in] layerList The layer will be added to this ordered list.
72    * @param[in] manager The update manager to install a root node with.
73    * @param[in] systemLevel True if using the SystemOverlay API; see Integration::GetSystemOverlay() for more details.
74    * @return A smart-pointer to the newly allocated Actor.
75    */
76   static LayerPtr NewRoot( LayerList& layerList, SceneGraph::UpdateManager& manager, bool systemLevel );
77
78   /**
79    * @copydoc Dali::Internal::Actor::OnInitialize
80    */
81   void OnInitialize();
82
83   /**
84    * Query the current depth of the layer
85    */
86   unsigned int GetDepth() const;
87
88   /**
89    * @copydoc Dali::Layer::Raise
90    */
91   void Raise();
92
93   /**
94    * @copydoc Dali::Layer::Lower
95    */
96   void Lower();
97
98   /**
99    * @copydoc Dali::Layer::RaiseAbove
100    */
101   void RaiseAbove( const Internal::Layer& target );
102
103   /**
104    * @copydoc Dali::Layer::LowerBelow
105    */
106   void LowerBelow( const Internal::Layer& target );
107
108   /**
109    * @copydoc Dali::Layer::RaiseToTop
110    */
111   void RaiseToTop();
112
113   /**
114    * @copydoc Dali::Layer::LowerToBottom
115    */
116   void LowerToBottom();
117
118   /**
119    * @copydoc Dali::Layer::MoveAbove
120    */
121   void MoveAbove( const Internal::Layer& target );
122
123   /**
124    * @copydoc Dali::Layer::MoveAbove
125    */
126   void MoveBelow( const Internal::Layer& target );
127
128   /**
129    * @copydoc Dali::Layer::SetClipping()
130    */
131   void SetClipping(bool enabled);
132
133   /**
134    * @copydoc Dali::Layer::IsClipping()
135    */
136   bool IsClipping() const
137   {
138     return mIsClipping; // Actor-side has most up-to-date value
139   }
140
141   /**
142    * @copydoc Dali::Layer::SetClippingBox()
143    */
144   void SetClippingBox(int x, int y, int width, int height);
145
146   /**
147    * @copydoc Dali::Layer::GetClippingBox()
148    */
149   const Dali::ClippingBox& GetClippingBox() const
150   {
151     return mClippingBox; // Actor-side has most up-to-date value
152   }
153
154   /**
155    * @copydoc Dali::Layer::SetDepthTestDisabled()
156    */
157   void SetDepthTestDisabled( bool disable );
158
159   /**
160    * @copydoc Dali::Layer::IsDepthTestDisabled()
161    */
162   bool IsDepthTestDisabled() const;
163
164   /**
165    * @copydoc Dali::Layer::SetSortFunction()
166    */
167   void SetSortFunction(Dali::Layer::SortFunctionType function);
168
169   /**
170    * @copydoc Dali::Layer::SetTouchConsumed()
171    */
172   void SetTouchConsumed( bool consume );
173
174   /**
175    * @copydoc Dali::Layer::IsTouchConsumed()
176    */
177   bool IsTouchConsumed() const;
178
179   /**
180    * @copydoc Dali::Layer::SetHoverConsumed()
181    */
182   void SetHoverConsumed( bool consume );
183
184   /**
185    * @copydoc Dali::Layer::IsHoverConsumed()
186    */
187   bool IsHoverConsumed() const;
188
189   /**
190    * Helper function to get the scene object.
191    * This should only be called by Stage
192    * @return the scene object for the layer.
193    */
194   const SceneGraph::Layer& GetSceneLayerOnStage() const;
195
196   /**
197    * @copydoc Dali::Internal::Actor::DoAction()
198    */
199   static bool DoAction(BaseObject* object, const std::string& actionName, const Property::Map& attributes);
200
201 public: // Default property extensions from Object
202   /**
203    * @copydoc Dali::Internal::Object::GetDefaultPropertyCount()
204    */
205   virtual unsigned int GetDefaultPropertyCount() const;
206
207   /**
208    * @copydoc Dali::Internal::Object::GetDefaultPropertyIndices()
209    */
210   virtual void GetDefaultPropertyIndices( Property::IndexContainer& indices ) const;
211
212   /**
213    * @copydoc Dali::Internal::Object::GetDefaultPropertyName()
214    */
215   virtual const char* GetDefaultPropertyName(Property::Index index) const;
216
217   /**
218    * @copydoc Dali::Internal::Object::GetDefaultPropertyIndex()
219    */
220   virtual Property::Index GetDefaultPropertyIndex(const std::string& name) const;
221
222   /**
223    * @copydoc Dali::Internal::Object::IsDefaultPropertyWritable()
224    */
225   virtual bool IsDefaultPropertyWritable(Property::Index index) const;
226
227   /**
228    * @copydoc Dali::Internal::Object::IsDefaultPropertyAnimatable()
229    */
230   virtual bool IsDefaultPropertyAnimatable(Property::Index index) const;
231
232   /**
233    * @copydoc Dali::Internal::Object::IsDefaultPropertyAConstraintInput()
234    */
235   virtual bool IsDefaultPropertyAConstraintInput( Property::Index index ) const;
236
237   /**
238    * @copydoc Dali::Internal::Object::GetDefaultPropertyType()
239    */
240   virtual Property::Type GetDefaultPropertyType(Property::Index index) const;
241
242   /**
243    * @copydoc Dali::Internal::Object::SetDefaultProperty()
244    */
245   virtual void SetDefaultProperty(Property::Index index, const Property::Value& propertyValue);
246
247   /**
248    * @copydoc Dali::Internal::Object::GetDefaultProperty()
249    */
250   virtual Property::Value GetDefaultProperty( Property::Index index ) const;
251
252 protected:
253
254   /**
255    * Construct a new layer.
256    * @param[in] type Either Actor::LAYER or Actor::ROOT_LAYER if this is the root actor.
257    */
258   Layer( Actor::DerivedType type );
259
260   /**
261    * A reference counted object may only be deleted by calling Unreference()
262    */
263   virtual ~Layer();
264
265 private: // From Actor
266
267   /**
268    * From Actor; create a node to represent the layer in the scene-graph.
269    * @return A newly allocated layer node.
270    */
271   virtual SceneGraph::Node* CreateNode() const;
272
273   /**
274    * From Actor.
275    */
276   virtual void OnStageConnectionInternal();
277
278   /**
279    * From Actor.
280    */
281   virtual void OnStageDisconnectionInternal();
282
283 private:
284
285   LayerList* mLayerList; ///< Only valid when layer is on-stage
286
287   // These properties not animatable; the actor side has the most up-to-date values
288   ClippingBox mClippingBox;                     ///< The clipping box, in window coordinates
289   Dali::Layer::SortFunctionType mSortFunction;  ///< Used to sort semi-transparent geometry
290
291   bool mIsClipping:1;                           ///< True when clipping is enabled
292   bool mDepthTestDisabled:1;                    ///< Whether depth test is disabled.
293   bool mTouchConsumed:1;                        ///< Whether we should consume touch (including gesture).
294   bool mHoverConsumed:1;                        ///< Whether we should consume hover.
295
296 };
297
298 } // namespace Internal
299
300 // Helpers for public-api forwarding methods
301
302 inline Internal::Layer& GetImplementation(Dali::Layer& layer)
303 {
304   DALI_ASSERT_ALWAYS(layer && "Layer handle is empty");
305
306   BaseObject& handle = layer.GetBaseObject();
307
308   return static_cast<Internal::Layer&>(handle);
309 }
310
311 inline const Internal::Layer& GetImplementation(const Dali::Layer& layer)
312 {
313   DALI_ASSERT_ALWAYS(layer && "Layer handle is empty");
314
315   const BaseObject& handle = layer.GetBaseObject();
316
317   return static_cast<const Internal::Layer&>(handle);
318 }
319
320 } // namespace Dali
321
322
323 #endif //__DALI_INTERNAL_LAYER_H__