Merge "Removed feedback controller Boost dependency" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / public-api / controls / control-impl.cpp
index 88b588d..c0780c4 100644 (file)
@@ -64,12 +64,12 @@ BaseHandle Create()
  * @param[in] attributes The attributes with which to perfrom this action.
  * @return true if action has been accepted by this control
  */
-const char* ACTION_CONTROL_ACTIVATED = "control-activated";
+const char* ACTION_ACCESSIBILITY_ACTIVATED = "accessibility-activated";
 static bool DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
 {
   bool ret = false;
 
-  if( object && ( 0 == strcmp( actionName.c_str(), ACTION_CONTROL_ACTIVATED ) ) )
+  if( object && ( 0 == strcmp( actionName.c_str(), ACTION_ACCESSIBILITY_ACTIVATED ) ) )
   {
     Toolkit::Control control = Toolkit::Control::DownCast( BaseHandle( object ) );
     if( control )
@@ -158,7 +158,7 @@ SignalConnectorType registerSignal5( typeRegistration, SIGNAL_PANNED, &DoConnect
 SignalConnectorType registerSignal6( typeRegistration, SIGNAL_PINCHED, &DoConnectSignal );
 SignalConnectorType registerSignal7( typeRegistration, SIGNAL_LONG_PRESSED, &DoConnectSignal );
 
-TypeAction registerAction( typeRegistration, ACTION_CONTROL_ACTIVATED, &DoAction );
+TypeAction registerAction( typeRegistration, ACTION_ACCESSIBILITY_ACTIVATED, &DoAction );
 
 DALI_TYPE_REGISTRATION_END()
 
@@ -189,18 +189,6 @@ Vector2 gQuad[] = {
                    Vector2(  0.5f,  0.5f )
 };
 
-struct VertexWithTexture
-{
-  Vector2 position;
-  Vector2 texCoord;
-};
-
-VertexWithTexture gQuadWithTexture[] = {
-                                        { Vector2( -0.5f, -0.5f ), Vector2( 0.0f, 0.0f ) },
-                                        { Vector2(  0.5f, -0.5f ), Vector2( 1.0f, 0.0f ) },
-                                        { Vector2( -0.5f,  0.5f ), Vector2( 0.0f, 1.0f ) },
-                                        { Vector2(  0.5f,  0.5f ), Vector2( 1.0f, 1.0f ) }
-};
 
 const char* VERTEX_SHADER_COLOR = DALI_COMPOSE_SHADER(
     attribute mediump vec2 aPosition;\n
@@ -220,29 +208,6 @@ const char* FRAGMENT_SHADER_COLOR = DALI_COMPOSE_SHADER(
     }\n
 );
 
-const char* VERTEX_SHADER_TEXTURE = DALI_COMPOSE_SHADER(
-    attribute mediump vec2 aPosition;\n
-    attribute mediump vec2 aTexCoord;\n
-    uniform mediump mat4 uMvpMatrix;\n
-    varying mediump vec2 vTexCoord;\n
-    void main()\n
-    {\n
-      gl_Position = uMvpMatrix * vec4( aPosition, 0.0, 1.0 );\n
-      vTexCoord = aTexCoord;\n
-    }\n
-);
-
-const char* FRAGMENT_SHADER_TEXTURE = DALI_COMPOSE_SHADER(
-    uniform lowp vec4 uBackgroundColor;\n
-    uniform lowp vec4 uColor;\n
-    uniform sampler2D sTexture;\n
-    varying mediump vec2 vTexCoord;\n
-
-    void main()\n
-    {\n
-      gl_FragColor = texture2D( sTexture, vTexCoord ) * uBackgroundColor * uColor;\n
-    }\n
-);
 
 /**
  * @brief Create the background actor for the control.
@@ -256,26 +221,12 @@ const char* FRAGMENT_SHADER_TEXTURE = DALI_COMPOSE_SHADER(
  */
 Actor CreateBackground( Actor parent, const Vector4& color, Image image = Image() )
 {
-  PropertyBuffer vertexBuffer;
-  Shader shader;
-  Material material;
-  if( image )
+  if( !image )
   {
-    Property::Map vertexFormat;
-    vertexFormat["aPosition"] = Property::VECTOR2;
-    vertexFormat["aTexCoord"] = Property::VECTOR2;
+    PropertyBuffer vertexBuffer;
+    Shader shader;
+    Material material;
 
-    //Create a vertex buffer for vertex positions and texture coordinates
-    vertexBuffer = PropertyBuffer::New( vertexFormat, 4u );
-    vertexBuffer.SetData( gQuadWithTexture );
-
-    shader = Shader::New( VERTEX_SHADER_TEXTURE, FRAGMENT_SHADER_TEXTURE );
-    Sampler textureSampler = Sampler::New( image, "sTexture" );
-    material = Material::New( shader );
-    material.AddSampler(textureSampler);
-  }
-  else
-  {
     Property::Map vertexFormat;
     vertexFormat["aPosition"] = Property::VECTOR2;
 
@@ -285,41 +236,53 @@ Actor CreateBackground( Actor parent, const Vector4& color, Image image = Image(
 
     shader = Shader::New( VERTEX_SHADER_COLOR, FRAGMENT_SHADER_COLOR );
     material = Material::New( shader );
-  }
-
-  //Create the index buffer
-  Property::Map indexFormat;
-  indexFormat["indices"] = Property::UNSIGNED_INTEGER;
-  PropertyBuffer indexBuffer = PropertyBuffer::New( indexFormat, 6u );
-  indexBuffer.SetData(gQuadIndex);
-
-  //Create the geometry
-  Geometry mesh = Geometry::New();
-  mesh.AddVertexBuffer( vertexBuffer );
-  mesh.SetIndexBuffer( indexBuffer );
-
-  //Add uniforms to the shader
-  shader.RegisterProperty( "uBackgroundColor", color );
-
-  //Create the renderer
-  Renderer renderer = Renderer::New( mesh, material );
-  renderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX );
 
-  //Create the actor
-  Actor meshActor = Actor::New();
-  meshActor.SetSize( Vector3::ONE );
-  meshActor.AddRenderer( renderer );
-  meshActor.SetPositionInheritanceMode( USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
-  meshActor.SetColorMode( USE_PARENT_COLOR );
-
-  //Constraint scale of the mesh actor to the size of the control
-  Constraint constraint = Constraint::New<Vector3>( meshActor,
-                                                    Actor::Property::SCALE,
-                                                    EqualToConstraint() );
-  constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
-  constraint.Apply();
+    //Create the index buffer
+    Property::Map indexFormat;
+    indexFormat["indices"] = Property::INTEGER;
+    PropertyBuffer indexBuffer = PropertyBuffer::New( indexFormat, 6u );
+    indexBuffer.SetData(gQuadIndex);
+
+    //Create the geometry
+    Geometry mesh = Geometry::New();
+    mesh.AddVertexBuffer( vertexBuffer );
+    mesh.SetIndexBuffer( indexBuffer );
+
+    //Add uniforms to the shader
+    shader.RegisterProperty( "uBackgroundColor", color );
+
+    //Create the renderer
+    Renderer renderer = Renderer::New( mesh, material );
+    renderer.SetDepthIndex( parent.GetHierarchyDepth() + BACKGROUND_DEPTH_INDEX );
+
+    //Create the actor
+    Actor meshActor = Actor::New();
+    meshActor.SetSize( Vector3::ONE );
+    meshActor.AddRenderer( renderer );
+    meshActor.SetPositionInheritanceMode( USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
+    meshActor.SetColorMode( USE_PARENT_COLOR );
+
+    //Constraint scale of the mesh actor to the size of the control
+    Constraint constraint = Constraint::New<Vector3>( meshActor,
+                                                      Actor::Property::SCALE,
+                                                      EqualToConstraint() );
+    constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
+    constraint.Apply();
+
+    return meshActor;
+  }
+  else
+  {
+    ImageActor imageActor = ImageActor::New( image );
+    imageActor.SetColor( color );
+    imageActor.SetPositionInheritanceMode( USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
+    imageActor.SetColorMode( USE_OWN_MULTIPLY_PARENT_COLOR );
+    imageActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
+    imageActor.SetSortModifier( parent.GetHierarchyDepth() + BACKGROUND_DEPTH_INDEX );
+
+    return imageActor;
+  }
 
-  return meshActor;
 }
 
 } // unnamed namespace
@@ -489,12 +452,24 @@ public:
           Property::Map map;
 
           Background* back = controlImpl.mImpl->mBackground;
-          if ( back && back->actor && back->actor.GetRendererAt(0).GetMaterial().GetNumberOfSamplers() > 0)
+          if ( back && back->actor )
           {
-            Image image = back->actor.GetRendererAt(0).GetMaterial().GetSamplerAt(0).GetImage();
-            if ( image )
+            if( back->actor.GetRendererCount() > 0 && back->actor.GetRendererAt(0).GetMaterial().GetNumberOfSamplers() > 0 )
             {
-              Scripting::CreatePropertyMap( image, map );
+              Image image = back->actor.GetRendererAt(0).GetMaterial().GetSamplerAt(0).GetImage();
+              if ( image )
+              {
+                Scripting::CreatePropertyMap( image, map );
+              }
+            }
+            else
+            {
+              ImageActor imageActor = ImageActor::DownCast( back->actor );
+              if ( imageActor )
+              {
+                Image image = imageActor.GetImage();
+                Scripting::CreatePropertyMap( image, map );
+              }
             }
           }
 
@@ -573,9 +548,12 @@ void Control::SetStyleName( const std::string& styleName )
   {
     mImpl->mStyleName = styleName;
 
-    // Apply new style
+    // Apply new style, if stylemanager is available
     Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
-    GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) );
+    if( styleManager )
+    {
+      GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) );
+    }
   }
 }
 
@@ -590,8 +568,15 @@ void Control::SetBackgroundColor( const Vector4& color )
 
   if ( background.actor )
   {
-    Shader shader = background.actor.GetRendererAt(0).GetMaterial().GetShader();
-    shader.SetProperty( shader.GetPropertyIndex("uBackgroundColor"), color );
+    if( background.actor.GetRendererCount() > 0 )
+    {
+      Shader shader = background.actor.GetRendererAt(0).GetMaterial().GetShader();
+      shader.SetProperty( shader.GetPropertyIndex("uBackgroundColor"), color );
+    }
+    else
+    {
+      background.actor.SetColor( color );
+    }
   }
   else
   {
@@ -599,7 +584,7 @@ void Control::SetBackgroundColor( const Vector4& color )
     Actor actor = CreateBackground(Self(), color );
     background.actor = actor;
     mImpl->mAddRemoveBackgroundChild = true;
-    // use insert to guarantee its the first child (so that OVERLAY mode works)
+    // use insert to guarantee its the first child (so that OVERLAY_2D mode works)
     Self().Insert( 0, actor );
     mImpl->mAddRemoveBackgroundChild = false;
   }
@@ -619,31 +604,24 @@ Vector4 Control::GetBackgroundColor() const
 void Control::SetBackgroundImage( Image image )
 {
   Background& background( mImpl->GetBackground() );
-  if( !background.actor || background.actor.GetRendererAt(0).GetMaterial().GetNumberOfSamplers() == 0)
-  {
-    // Remove current actor as it has not texture coordinates
-    if( background.actor )
-    {
-      mImpl->mAddRemoveBackgroundChild = true;
-      Self().Remove( background.actor );
-      mImpl->mAddRemoveBackgroundChild = false;
-      background.actor.Reset();
-    }
 
-    //Create a new actor with texture coordinates
-    Actor actor = CreateBackground(Self(), background.color, image);
-    mImpl->mAddRemoveBackgroundChild = true;
-    // use insert to guarantee its the first child (so that OVERLAY mode works)
-    Self().Insert( 0, actor );
-    mImpl->mAddRemoveBackgroundChild = false;
-    background.actor = actor;
-  }
-  else
-  {
-    //Change sampler image
-    Sampler sampler =  background.actor.GetRendererAt(0).GetMaterial().GetSamplerAt(0);
-    sampler.SetImage(image);
-  }
+   if ( background.actor )
+   {
+     // Remove Current actor, unset AFTER removal
+     mImpl->mAddRemoveBackgroundChild = true;
+     Self().Remove( background.actor );
+     mImpl->mAddRemoveBackgroundChild = false;
+     background.actor.Reset();
+   }
+
+   Actor actor = CreateBackground(Self(), background.color, image);
+
+   // Set the background actor before adding so that we do not inform derived classes
+   background.actor = actor;
+   mImpl->mAddRemoveBackgroundChild = true;
+   // use insert to guarantee its the first child (so that OVERLAY_2D mode works)
+   Self().Insert( 0, actor );
+   mImpl->mAddRemoveBackgroundChild = false;
 }
 
 void Control::ClearBackground()
@@ -793,11 +771,22 @@ void Control::AccessibilityActivate()
   OnAccessibilityActivated();
 }
 
+void Control::KeyboardEnter()
+{
+  // Inform deriving classes
+  OnKeyboardEnter();
+}
+
 bool Control::OnAccessibilityActivated()
 {
   return false; // Accessibility activation is not handled by default
 }
 
+bool Control::OnKeyboardEnter()
+{
+  return false; // Keyboard enter is not handled by default
+}
+
 bool Control::OnAccessibilityPan(PanGesture gesture)
 {
   return false; // Accessibility pan gesture is not handled by default
@@ -813,6 +802,11 @@ bool Control::OnAccessibilityValueChange(bool isIncrease)
   return false; // Accessibility value change action is not handled by default
 }
 
+bool Control::OnAccessibilityZoom()
+{
+  return false; // Accessibility zoom action is not handled by default
+}
+
 Actor Control::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Toolkit::Control::KeyboardFocus::Direction direction, bool loopEnabled)
 {
   return Actor();
@@ -874,12 +868,15 @@ void Control::Initialize()
   if( mImpl->mFlags & REQUIRES_STYLE_CHANGE_SIGNALS )
   {
     Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
+    // if stylemanager is available
+    if( styleManager )
+    {
+      // Register for style changes
+      styleManager.StyleChangeSignal().Connect( this, &Control::OnStyleChange );
 
-    // Register for style changes
-    styleManager.StyleChangeSignal().Connect( this, &Control::OnStyleChange );
-
-    // Apply the current style
-    GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) );
+      // Apply the current style
+      GetImpl( styleManager ).ApplyThemeStyleAtInit( Toolkit::Control( GetOwner() ) );
+    }
   }
 
   if( mImpl->mFlags & REQUIRES_KEYBOARD_NAVIGATION_SUPPORT )
@@ -903,7 +900,7 @@ void Control::OnControlChildRemove( Actor& child )
 void Control::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change )
 {
   // By default the control is only interested in theme (not font) changes
-  if( change == StyleChange::THEME_CHANGE )
+  if( styleManager && change == StyleChange::THEME_CHANGE )
   {
     GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) );
   }
@@ -959,7 +956,7 @@ void Control::EmitKeyInputFocusSignal( bool focusGained )
   }
 }
 
-void Control::OnStageConnection( unsigned int depth )
+void Control::OnStageConnection( int depth )
 {
   unsigned int controlRendererCount = Self().GetRendererCount();
   for( unsigned int i(0); i<controlRendererCount; ++i )
@@ -973,10 +970,22 @@ void Control::OnStageConnection( unsigned int depth )
 
   if( mImpl->mBackground )
   {
-    Renderer backgroundRenderer = mImpl->mBackground->actor.GetRendererAt( 0 );
-    if(backgroundRenderer)
+    if(mImpl->mBackground->actor.GetRendererCount() > 0 )
     {
-      backgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX+depth );
+      Renderer backgroundRenderer = mImpl->mBackground->actor.GetRendererAt( 0 );
+      if(backgroundRenderer)
+      {
+        backgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX+depth );
+      }
+    }
+    else
+    {
+
+      ImageActor imageActor = ImageActor::DownCast( mImpl->mBackground->actor );
+      if ( imageActor )
+      {
+        imageActor.SetSortModifier( BACKGROUND_DEPTH_INDEX+depth );
+      }
     }
   }
 }
@@ -1067,16 +1076,23 @@ Vector3 Control::GetNaturalSize()
   Vector3 naturalSize = Vector3::ZERO;
   if( mImpl->mBackground )
   {
-    Material backgroundMaterial = mImpl->mBackground->actor.GetRendererAt(0).GetMaterial();
-    if( backgroundMaterial.GetNumberOfSamplers() > 0 )
+    if( mImpl->mBackground->actor.GetRendererCount() > 0 )
     {
-      Image backgroundImage =  backgroundMaterial.GetSamplerAt(0).GetImage();
-      if( backgroundImage )
+      Material backgroundMaterial = mImpl->mBackground->actor.GetRendererAt(0).GetMaterial();
+      if( backgroundMaterial.GetNumberOfSamplers() > 0 )
       {
-        naturalSize.x = backgroundImage.GetWidth();
-        naturalSize.y = backgroundImage.GetHeight();
+        Image backgroundImage =  backgroundMaterial.GetSamplerAt(0).GetImage();
+        if( backgroundImage )
+        {
+          naturalSize.x = backgroundImage.GetWidth();
+          naturalSize.y = backgroundImage.GetHeight();
+        }
       }
     }
+    else
+    {
+      return mImpl->mBackground->actor.GetNaturalSize();
+    }
   }
 
   return naturalSize;