Add MARGIN and PADDING property in Control
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / public-api / controls / control-impl.cpp
index 68fd55a..d7df20a 100644 (file)
@@ -83,6 +83,46 @@ void CreateClippingRenderer( Control& controlImpl )
   }
 }
 
+/**
+ * @brief Sets Control::Property::BACKGROUND visual
+ * @param[in] controlImpl The control implementation
+ * @param[in] visual The control background visual
+ * @param[in] size The current size
+ */
+void SetBackgroundVisual( Control::Impl& controlImpl, Toolkit::Visual::Base& visual, const Vector2& size )
+{
+  Property::Map transformMap = Property::Map();
+
+  Vector2 newSize( 0.f, 0.f );
+  newSize.width = size.width + ( controlImpl.mPadding.start + controlImpl.mPadding.end );
+  newSize.height = size.height + ( controlImpl.mPadding.top + controlImpl.mPadding.bottom );
+
+  if( ( controlImpl.mMargin.start != 0 ) ||
+      ( controlImpl.mMargin.end != 0 ) ||
+      ( controlImpl.mMargin.top != 0 ) ||
+      ( controlImpl.mMargin.bottom != 0 ) )
+  {
+    transformMap.Add( Toolkit::Visual::Transform::Property::SIZE, newSize )
+                .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
+                .Add( Toolkit::Visual::Transform::Property::OFFSET, Vector2( controlImpl.mMargin.start, controlImpl.mMargin.top ) )
+                .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
+                .Add( Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
+                .Add( Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN );
+  }
+  else if( ( controlImpl.mPadding.start != 0 ) ||
+           ( controlImpl.mPadding.end != 0 ) ||
+           ( controlImpl.mPadding.top != 0 ) ||
+           ( controlImpl.mPadding.bottom != 0 ) )
+  {
+    transformMap.Add( Toolkit::Visual::Transform::Property::SIZE, newSize )
+                .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
+                .Add( Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
+                .Add( Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN );
+  }
+
+  visual.SetTransformAndSize( transformMap, newSize ); // Send an empty map as we do not want to modify the visual's set transform
+}
+
 } // unnamed namespace
 
 
@@ -563,7 +603,8 @@ void Control::OnSizeSet(const Vector3& targetSize)
   if( visual )
   {
     Vector2 size( targetSize );
-    visual.SetTransformAndSize( Property::Map(), size ); // Send an empty map as we do not want to modify the visual's set transform
+    SetBackgroundVisual( *mImpl, visual, size );
+
   }
 }
 
@@ -596,13 +637,30 @@ void Control::OnRelayout( const Vector2& size, RelayoutContainer& container )
 {
   for( unsigned int i = 0, numChildren = Self().GetChildCount(); i < numChildren; ++i )
   {
-    container.Add( Self().GetChildAt( i ), size );
+    Actor child = Self().GetChildAt( i );
+    Vector2 newChildSize( size );
+
+    // When set the padding or margin on the control, child should be resized and repositioned.
+    if( ( mImpl->mPadding.start != 0 ) || ( mImpl->mPadding.end != 0 ) || ( mImpl->mPadding.top != 0 ) || ( mImpl->mPadding.bottom != 0 ) ||
+        ( mImpl->mMargin.start != 0 ) || ( mImpl->mMargin.end != 0 ) || ( mImpl->mMargin.top != 0 ) || ( mImpl->mMargin.bottom != 0 ) )
+    {
+      newChildSize.width = size.width - ( mImpl->mPadding.start + mImpl->mPadding.end );
+      newChildSize.height = size.height - ( mImpl->mPadding.top + mImpl->mPadding.bottom );
+
+      Vector3 childPosition = child.GetTargetSize();
+      childPosition.x += ( mImpl->mMargin.start + mImpl->mPadding.start );
+      childPosition.y += ( mImpl->mMargin.top + mImpl->mPadding.top );
+
+      child.SetPosition( childPosition );
+    }
+
+    container.Add( child, newChildSize );
   }
 
   Toolkit::Visual::Base visual = mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND );
   if( visual )
   {
-    visual.SetTransformAndSize( Property::Map(), size ); // Send an empty map as we do not want to modify the visual's set transform
+    SetBackgroundVisual( *mImpl, visual, size );
   }
 }
 
@@ -617,6 +675,8 @@ Vector3 Control::GetNaturalSize()
   {
     Vector2 naturalSize;
     visual.GetNaturalSize( naturalSize );
+    naturalSize.width += ( mImpl->mPadding.start + mImpl->mPadding.end );
+    naturalSize.height += ( mImpl->mPadding.top + mImpl->mPadding.bottom );
     return Vector3( naturalSize );
   }
   return Vector3::ZERO;