Control impl just uses Visual Registration instead of a visual member variable
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / public-api / controls / control-impl.cpp
index 6c4b211..a01cc5e 100644 (file)
@@ -38,6 +38,7 @@
 #include <dali-toolkit/public-api/styling/style-manager.h>
 #include <dali-toolkit/public-api/visuals/color-visual-properties.h>
 #include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
+#include <dali-toolkit/devel-api/visual-factory/devel-visual-properties.h>
 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
 #include <dali-toolkit/devel-api/focus-manager/keyinput-focus-manager.h>
 #include <dali-toolkit/internal/styling/style-manager-impl.h>
@@ -64,25 +65,24 @@ struct RegisteredVisual
 {
   Property::Index index;
   Toolkit::Visual::Base visual;
-  Actor placementActor;
   bool enabled;
 
-  RegisteredVisual( Property::Index aIndex, Toolkit::Visual::Base &aVisual, Actor &aPlacementActor, bool aEnabled) :
-                   index(aIndex), visual(aVisual), placementActor(aPlacementActor), enabled(aEnabled) {}
+  RegisteredVisual( Property::Index aIndex, Toolkit::Visual::Base &aVisual, bool aEnabled) :
+                   index(aIndex), visual(aVisual), enabled(aEnabled) {}
 };
 
-struct VisualProperty
+struct HandleIndex
 {
   Handle handle; ///< a handle to the target object
   Property::Index index; ///< The index of a property provided by the referenced object
 
-  VisualProperty( )
+  HandleIndex( )
   : handle(),
     index( Property::INVALID_INDEX )
   {
   }
 
-  VisualProperty( Handle& handle, Property::Index index )
+  HandleIndex( Handle& handle, Property::Index index )
   : handle( handle ),
     index( index )
   {
@@ -107,7 +107,7 @@ bool FindVisual( Property::Index targetIndex, RegisteredVisualContainer& visuals
   return false;
 }
 
-VisualProperty GetVisualProperty(
+HandleIndex GetVisualProperty(
   Internal::Control& controlImpl,
   RegisteredVisualContainer& visuals,
   const std::string& visualName,
@@ -115,7 +115,7 @@ VisualProperty GetVisualProperty(
 {
 #if defined(DEBUG_ENABLED)
   std::ostringstream oss;
-  oss << "Control::GetVisualProperty(" << visualName << ", " << propertyKey << ")" << std::endl;
+  oss << "Control::GetHandleIndex(" << visualName << ", " << propertyKey << ")" << std::endl;
   DALI_LOG_INFO( gLogFilter, Debug::General, oss.str().c_str() );
 #endif
 
@@ -129,46 +129,40 @@ VisualProperty GetVisualProperty(
     }
   }
 
-  // Does either it's renderer or placement actor have an associated property?
+  // Does it's renderer have an associated property?
   if( iter != visuals.End() )
   {
-    Actor placementActor = (*iter)->placementActor;
-    if( !placementActor )
-    {
-      placementActor = controlImpl.Self();
-    }
-
-    Property::Index index = placementActor.GetPropertyIndex( propertyKey );
+    Actor self = controlImpl.Self();
+    Property::Index index = self.GetPropertyIndex( propertyKey );
     if( index != Property::INVALID_INDEX )
     {
-      // It's a placement actor property:
-      return VisualProperty( placementActor, index );
+      // It's an actor property:
+      return HandleIndex( self, index );
     }
     else
     {
       // Check if it is a renderer property:
-      if( placementActor.GetRendererCount() > 0 )
+      if( self.GetRendererCount() > 0 )
       {
-        // @todo Need to use correct renderer index when placement actors
-        // are removed
-        Renderer renderer = placementActor.GetRendererAt(0);
+        // @todo Need to use correct renderer index
+        Renderer renderer = self.GetRendererAt(0);
         Property::Index index = renderer.GetPropertyIndex( propertyKey );
         if( index != Property::INVALID_INDEX )
         {
           // It's a renderer property:
-          return VisualProperty( renderer, index );
+          return HandleIndex( renderer, index );
         }
       }
       else
       {
         std::ostringstream oss;
         oss << propertyKey;
-        DALI_LOG_WARNING( "Control::GetVisualProperty(%s, %s) No renderers\n", visualName.c_str(), oss.str().c_str() );
+        DALI_LOG_WARNING( "Control::GetHandleIndex(%s, %s) No renderers\n", visualName.c_str(), oss.str().c_str() );
       }
     }
   }
   Handle handle;
-  return VisualProperty( handle, Property::INVALID_INDEX );
+  return HandleIndex( handle, Property::INVALID_INDEX );
 }
 
 
@@ -298,7 +292,6 @@ public:
   Impl(Control& controlImpl)
   : mControlImpl( controlImpl ),
     mStyleName(""),
-    mBackgroundVisual(),
     mBackgroundColor(Color::TRANSPARENT),
     mStartingPinchScale( NULL ),
     mKeyEventSignal(),
@@ -381,7 +374,7 @@ public:
           }
           else
           {
-            // An empty map means the background is no longer required
+            // An empty image means the background is no longer required
             controlImpl.ClearBackground();
           }
           break;
@@ -403,13 +396,13 @@ public:
         case Toolkit::Control::Property::BACKGROUND:
         {
           const Property::Map* map = value.GetMap();
-          if( map )
+          if( map && !map->Empty() )
           {
             controlImpl.SetBackground( *map );
           }
           else
           {
-            // The background is not a property map, so we should clear the background
+            // The background is an empty property map, so we should clear the background
             controlImpl.ClearBackground();
           }
           break;
@@ -453,9 +446,10 @@ public:
         {
           DALI_LOG_WARNING( "BACKGROUND_IMAGE property is deprecated. Use BACKGROUND property instead\n" );
           Property::Map map;
-          if( controlImpl.mImpl->mBackgroundVisual )
+          Toolkit::Visual::Base visual = controlImpl.GetVisual( Toolkit::Control::Property::BACKGROUND );
+          if( visual )
           {
-            controlImpl.mImpl->mBackgroundVisual.CreatePropertyMap( map );
+            visual.CreatePropertyMap( map );
           }
           value = map;
           break;
@@ -470,9 +464,10 @@ public:
         case Toolkit::Control::Property::BACKGROUND:
         {
           Property::Map map;
-          if( controlImpl.mImpl->mBackgroundVisual )
+          Toolkit::Visual::Base visual = controlImpl.GetVisual( Toolkit::Control::Property::BACKGROUND );
+          if( visual )
           {
-            (controlImpl.mImpl->mBackgroundVisual).CreatePropertyMap( map );
+            visual.CreatePropertyMap( map );
           }
 
           value = map;
@@ -490,7 +485,6 @@ public:
   Control& mControlImpl;
   RegisteredVisualContainer mVisuals; // Stores visuals needed by the control, non trivial type so std::vector used.
   std::string mStyleName;
-  Toolkit::Visual::Base mBackgroundVisual;   ///< The visual to render the background
   Vector4 mBackgroundColor;                       ///< The color of the background visual
   Vector3* mStartingPinchScale;      ///< The scale when a pinch gesture starts, TODO: consider removing this
   Toolkit::Control::KeyEventSignalType mKeyEventSignal;
@@ -564,17 +558,12 @@ const std::string& Control::GetStyleName() const
 
 void Control::SetBackgroundColor( const Vector4& color )
 {
-  Actor self( Self() );
   mImpl->mBackgroundColor = color;
   Property::Map map;
-  map[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::COLOR;
+  map[ Toolkit::VisualProperty::TYPE ] = Toolkit::Visual::COLOR;
   map[ Toolkit::ColorVisual::Property::MIX_COLOR ] = color;
-  mImpl->mBackgroundVisual = Toolkit::VisualFactory::Get().CreateVisual( map );
-  RegisterVisual( Toolkit::Control::Property::BACKGROUND, self, mImpl->mBackgroundVisual );
-  if( mImpl->mBackgroundVisual )
-  {
-    mImpl->mBackgroundVisual.SetDepthIndex( DepthIndex::BACKGROUND );
-  }
+
+  SetBackground( map );
 }
 
 Vector4 Control::GetBackgroundColor() const
@@ -584,31 +573,29 @@ Vector4 Control::GetBackgroundColor() const
 
 void Control::SetBackground( const Property::Map& map )
 {
-  Actor self( Self() );
-  mImpl->mBackgroundVisual = Toolkit::VisualFactory::Get().CreateVisual( map );
-  RegisterVisual( Toolkit::Control::Property::BACKGROUND, self, mImpl->mBackgroundVisual );
-  if( mImpl->mBackgroundVisual )
+  Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( map );
+  if( visual )
   {
-    mImpl->mBackgroundVisual.SetDepthIndex( DepthIndex::BACKGROUND );
+    RegisterVisual( Toolkit::Control::Property::BACKGROUND, visual );
+    visual.SetDepthIndex( DepthIndex::BACKGROUND );
   }
 }
 
 void Control::SetBackgroundImage( Image image )
 {
-  Actor self( Self() );
-  mImpl->mBackgroundVisual = Toolkit::VisualFactory::Get().CreateVisual( image );
-  RegisterVisual( Toolkit::Control::Property::BACKGROUND, self, mImpl->mBackgroundVisual );
-  if( mImpl->mBackgroundVisual )
+  DALI_LOG_WARNING( "SetBackgroundImage is for the depreciated Property::BACKGROUND_IMAGE use SetBackground( const Property::Map& map )\n" );
+  Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( image );
+  if( visual )
   {
-    mImpl->mBackgroundVisual.SetDepthIndex( DepthIndex::BACKGROUND );
+    RegisterVisual( Toolkit::Control::Property::BACKGROUND, visual );
+    visual.SetDepthIndex( DepthIndex::BACKGROUND );
   }
 }
 
 void Control::ClearBackground()
 {
-  Actor self( Self() );
-  mImpl->mBackgroundVisual.RemoveAndReset( self );
-  mImpl->mBackgroundColor = Color::TRANSPARENT;
+   UnregisterVisual( Toolkit::Control::Property::BACKGROUND );
+   mImpl->mBackgroundColor = Color::TRANSPARENT;
 }
 
 void Control::EnableGestureDetection(Gesture::Type type)
@@ -750,22 +737,16 @@ void Control::KeyboardEnter()
   OnKeyboardEnter();
 }
 
-void Control::RegisterVisual( Property::Index index, Actor& placementActor, Toolkit::Visual::Base& visual )
+void Control::RegisterVisual( Property::Index index, Toolkit::Visual::Base& visual )
 {
-  RegisterVisual( index, placementActor, visual, true );
+  RegisterVisual( index, visual, true );
 }
 
-void Control::RegisterVisual( Property::Index index, Actor& placementActor, Toolkit::Visual::Base& visual, bool enabled )
+void Control::RegisterVisual( Property::Index index, Toolkit::Visual::Base& visual, bool enabled )
 {
   bool visualReplaced ( false );
-  Actor actorToRegister; // Null actor, replaced if placement actor not Self
   Actor self = Self();
 
-  if ( placementActor != self ) // Prevent increasing ref count if actor self
-  {
-    actorToRegister = placementActor;
-  }
-
   if ( !mImpl->mVisuals.Empty() )
   {
       RegisteredVisualContainer::Iterator iter;
@@ -774,29 +755,21 @@ void Control::RegisterVisual( Property::Index index, Actor& placementActor, Tool
       {
         if( (*iter)->visual && self.OnStage() )
         {
-          if( (*iter)->placementActor )
-          {
-            (*iter)->visual.SetOffStage( (*iter)->placementActor );
-          }
-          else
-          {
-            (*iter)->visual.SetOffStage( self );
-          }
+          Toolkit::GetImplementation((*iter)->visual).SetOffStage( self );
         }
         (*iter)->visual = visual;
-        (*iter)->placementActor = actorToRegister;
         visualReplaced = true;
       }
   }
 
   if ( !visualReplaced ) // New registration entry
   {
-    mImpl->mVisuals.PushBack( new RegisteredVisual( index, visual, actorToRegister, enabled ) );
+    mImpl->mVisuals.PushBack( new RegisteredVisual( index, visual, enabled ) );
   }
 
   if( visual && self.OnStage() && enabled )
   {
-    visual.SetOnStage( placementActor );
+    Toolkit::GetImplementation(visual).SetOnStage( self );
   }
 }
 
@@ -805,6 +778,9 @@ void Control::UnregisterVisual( Property::Index index )
    RegisteredVisualContainer::Iterator iter;
    if ( FindVisual( index, mImpl->mVisuals, iter ) )
    {
+     Actor self( Self() );
+     Toolkit::GetImplementation((*iter)->visual).SetOffStage( self );
+     (*iter)->visual.Reset();
      mImpl->mVisuals.Erase( iter );
    }
 }
@@ -832,21 +808,16 @@ void Control::EnableVisual( Property::Index index, bool enable )
 
     (*iter)->enabled = enable;
     Actor parentActor = Self();
-    if ( (*iter)->placementActor )
-    {
-      parentActor = (*iter)->placementActor;
-    }
-
     if ( Self().OnStage() ) // If control not on Stage then Visual will be added when StageConnection is called.
     {
       if ( enable )
       {
 
-        (*iter)->visual.SetOnStage( parentActor );
+        Toolkit::GetImplementation((*iter)->visual).SetOnStage( parentActor );
       }
       else
       {
-        (*iter)->visual.SetOffStage( parentActor );  // No need to call if control not staged.
+        Toolkit::GetImplementation((*iter)->visual).SetOffStage( parentActor );  // No need to call if control not staged.
       }
     }
   }
@@ -862,24 +833,6 @@ bool Control::IsVisualEnabled( Property::Index index ) const
   return false;
 }
 
-Actor Control::GetPlacementActor( Property::Index index ) const
-{
-  RegisteredVisualContainer::Iterator iter;
-  if ( FindVisual( index, mImpl->mVisuals, iter ) )
-  {
-    if( (*iter)->placementActor )
-    {
-      return (*iter)->placementActor;
-    }
-    else
-    {
-      return Self();
-    }
-  }
-
-  return Actor();
-}
-
 Dali::Animation Control::CreateTransition( const Toolkit::TransitionData& handle )
 {
   Dali::Animation transition;
@@ -893,37 +846,36 @@ Dali::Animation Control::CreateTransition( const Toolkit::TransitionData& handle
          iter != end; ++iter )
     {
       TransitionData::Animator* animator = (*iter);
-      VisualProperty visualProperty;
+      HandleIndex handleIndex;
 
       // Attempt to find the object name as a child actor
       Actor child = Self().FindChildByName( animator->objectName );
       if( child )
       {
         Property::Index propertyIndex = child.GetPropertyIndex( animator->propertyKey );
-        visualProperty = VisualProperty( child, propertyIndex );
+        handleIndex = HandleIndex( child, propertyIndex );
       }
       else
       {
-        // Is it a placement actor/visual pair?;
-        visualProperty = GetVisualProperty( *this, mImpl->mVisuals,
+        handleIndex = GetVisualProperty( *this, mImpl->mVisuals,
                                             animator->objectName,
                                             animator->propertyKey );
       }
 
-      if( visualProperty.handle && visualProperty.index != Property::INVALID_INDEX )
+      if( handleIndex.handle && handleIndex.index != Property::INVALID_INDEX )
       {
         if( animator->animate == false )
         {
           if( animator->targetValue.GetType() != Property::NONE )
           {
-            visualProperty.handle.SetProperty( visualProperty.index, animator->targetValue );
+            handleIndex.handle.SetProperty( handleIndex.index, animator->targetValue );
           }
         }
         else
         {
           if( animator->initialValue.GetType() != Property::NONE )
           {
-            visualProperty.handle.SetProperty( visualProperty.index, animator->initialValue );
+            handleIndex.handle.SetProperty( handleIndex.index, animator->initialValue );
           }
 
           if( ! transition )
@@ -933,7 +885,7 @@ Dali::Animation Control::CreateTransition( const Toolkit::TransitionData& handle
             transition = Dali::Animation::New( 0.1f );
           }
 
-          transition.AnimateTo( Property( visualProperty.handle, visualProperty.index ),
+          transition.AnimateTo( Property( handleIndex.handle, handleIndex.index ),
                                 animator->targetValue,
                                 animator->alphaFunction,
                                 TimePeriod( animator->timePeriodDelay,
@@ -946,7 +898,6 @@ Dali::Animation Control::CreateTransition( const Toolkit::TransitionData& handle
   return transition;
 }
 
-
 bool Control::OnAccessibilityActivated()
 {
   return false; // Accessibility activation is not handled by default
@@ -1135,18 +1086,11 @@ void Control::OnStageConnection( int depth )
 {
   for(RegisteredVisualContainer::Iterator iter = mImpl->mVisuals.Begin(); iter!= mImpl->mVisuals.End(); iter++)
   {
-    // Check whether the visual is empty, as it is allowed to register a placement actor without visual.
+    // Check whether the visual is empty and enabled
     if( (*iter)->visual && (*iter)->enabled )
     {
-      if( (*iter)->placementActor )
-      {
-        (*iter)->visual.SetOnStage( (*iter)->placementActor );
-      }
-      else
-      {
-        Actor self( Self() );
-        (*iter)->visual.SetOnStage( self );
-      }
+      Actor self( Self() );
+      Toolkit::GetImplementation((*iter)->visual).SetOnStage( self );
     }
   }
 }
@@ -1155,18 +1099,11 @@ void Control::OnStageDisconnection()
 {
   for(RegisteredVisualContainer::Iterator iter = mImpl->mVisuals.Begin(); iter!= mImpl->mVisuals.End(); iter++)
   {
-    // Check whether the visual is empty, as it is allowed to register a placement actor without visual.
+    // Check whether the visual is empty
     if( (*iter)->visual )
     {
-      if( (*iter)->placementActor )
-      {
-        (*iter)->visual.SetOffStage( (*iter)->placementActor );
-      }
-      else
-      {
-        Actor self( Self() );
-        (*iter)->visual.SetOffStage( self );
-      }
+      Actor self( Self() );
+      Toolkit::GetImplementation((*iter)->visual).SetOffStage( self );
     }
   }
 }
@@ -1195,10 +1132,11 @@ void Control::OnChildRemove(Actor& child)
 
 void Control::OnSizeSet(const Vector3& targetSize)
 {
-  if( mImpl->mBackgroundVisual )
+  Toolkit::Visual::Base visual = GetVisual( Toolkit::Control::Property::BACKGROUND );
+  if( visual )
   {
     Vector2 size( targetSize );
-    mImpl->mBackgroundVisual.SetSize( size );
+    visual.SetSize( size );
   }
 }
 
@@ -1241,11 +1179,12 @@ void Control::OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dime
 
 Vector3 Control::GetNaturalSize()
 {
-  if( mImpl->mBackgroundVisual )
+  Toolkit::Visual::Base visual = GetVisual( Toolkit::Control::Property::BACKGROUND );
+  if( visual )
   {
     Vector2 naturalSize;
-    mImpl->mBackgroundVisual.GetNaturalSize(naturalSize);
-    return Vector3(naturalSize);
+    visual.GetNaturalSize( naturalSize );
+    return Vector3( naturalSize );
   }
   return Vector3::ZERO;
 }