ScrollBar refactoring
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / public-api / controls / scrollable / item-view / item-layout.cpp
index 918b9bb..9e29736 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 namespace
 {
 
-// Lerps between current and target using the progress
+// Lerps between initial and target using the progress
 template< typename Type >
-void Lerp( Type& current, const Type& target, float progress )
+void Lerp( Type& current, const Type& initial, const Type& target, float progress )
 {
-  current += ((target - current) * progress);
+  current = initial + ((target - initial) * progress);
 }
 
 // Functors which wrap constraint functions with stored item IDs
@@ -41,7 +41,8 @@ struct WrappedQuaternionConstraint
 {
   WrappedQuaternionConstraint( Dali::Toolkit::ItemLayout::QuaternionFunction wrapMe, unsigned int itemId )
   :mWrapMe(wrapMe),
-   mItemId(itemId)
+   mItemId(itemId),
+   mInitialised( false )
   {
   }
 
@@ -50,18 +51,28 @@ struct WrappedQuaternionConstraint
     float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast<float>(mItemId);
     float weight = inputs[3]->GetFloat();
 
-    current = Dali::Quaternion::Slerp( current, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
+    if( !mInitialised )
+    {
+      mInitialised = true;
+      mInitial = current;
+    }
+
+    current = Dali::Quaternion::Slerp( mInitial, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
   }
 
   Dali::Toolkit::ItemLayout::QuaternionFunction mWrapMe;
   unsigned int mItemId;
+  Dali::Quaternion mInitial;
+  bool mInitialised:1;
 };
 
 struct WrappedVector3Constraint
 {
   WrappedVector3Constraint( Dali::Toolkit::ItemLayout::Vector3Function wrapMe, unsigned int itemId )
   : mWrapMe(wrapMe),
-    mItemId(itemId)
+    mItemId(itemId),
+    mInitial(),
+    mInitialised( false )
   {
   }
 
@@ -70,18 +81,28 @@ struct WrappedVector3Constraint
     float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast<float>(mItemId);
     float weight = inputs[3]->GetFloat();
 
-    Lerp( current, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
+    if( !mInitialised )
+    {
+      mInitialised = true;
+      mInitial = current;
+    }
+
+    Lerp( current, mInitial, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
   }
 
   Dali::Toolkit::ItemLayout::Vector3Function mWrapMe;
   unsigned int mItemId;
+  Dali::Vector3 mInitial;
+  bool mInitialised:1;
 };
 
 struct WrappedVector4Constraint
 {
   WrappedVector4Constraint( Dali::Toolkit::ItemLayout::Vector4Function wrapMe, unsigned int itemId )
   : mWrapMe(wrapMe),
-    mItemId(itemId)
+    mItemId(itemId),
+    mInitial(),
+    mInitialised( false )
   {
   }
 
@@ -90,11 +111,19 @@ struct WrappedVector4Constraint
     float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast<float>(mItemId);
     float weight = inputs[3]->GetFloat();
 
-    Lerp( current, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
+    if( !mInitialised )
+    {
+      mInitialised = true;
+      mInitial = current;
+    }
+
+    Lerp( current, mInitial, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
   }
 
   Dali::Toolkit::ItemLayout::Vector4Function mWrapMe;
   unsigned int mItemId;
+  Dali::Vector4 mInitial;
+  bool mInitialised:1;
 };
 
 struct WrappedBoolConstraint
@@ -130,7 +159,7 @@ namespace Toolkit
 
 ItemLayout::ItemLayout()
 : mOrientation( ControlOrientation::Up ),
-  mAlphaFunction( AlphaFunctions::Linear ),
+  mAlphaFunction( AlphaFunction::LINEAR ),
   mWeightObject()
 {
 }
@@ -201,16 +230,13 @@ float ItemLayout::GetFlickSpeedFactor() const
   return GetScrollSpeedFactor();
 }
 
-void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float durationSeconds, Handle scrollPositionObject, const Actor& itemViewActor )
+void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float durationSeconds, const Actor& itemViewActor )
 {
   // This just implements the default behaviour of constraint application.
   // Custom layouts can override this function to apply their custom constraints.
-  Dali::Toolkit::ItemView itemView = Dali::Toolkit::ItemView::DownCast( itemViewActor );
-  if(itemView && scrollPositionObject)
+  Toolkit::ItemView itemView = Toolkit::ItemView::DownCast( itemViewActor );
+  if(itemView)
   {
-    Property::Index scrollSpeedProperty = itemView.GetPropertyIndex("item-view-scroll-speed");
-    Property::Index scrollPositionProperty = scrollPositionObject.GetPropertyIndex("scroll-position");
-
     // We want to animate the layout in so use a weight object to do this
     if ( !mWeightObject )
     {
@@ -222,8 +248,8 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d
     {
       WrappedVector3Constraint wrapped(positionConstraint, itemId);
       Constraint constraint = Constraint::New<Vector3>( actor, Actor::Property::POSITION, wrapped );
-      constraint.AddSource( Source( scrollPositionObject, scrollPositionProperty ) );
-      constraint.AddSource( ParentSource( scrollSpeedProperty ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_POSITION ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_SPEED ) );
       constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
       constraint.AddSource( Source( mWeightObject, WeightObject::WEIGHT ) );
       constraint.Apply();
@@ -235,8 +261,8 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d
       WrappedQuaternionConstraint wrapped(rotationConstraint, itemId);
 
       Constraint constraint = Constraint::New<Quaternion>( actor, Actor::Property::ORIENTATION, wrapped );
-      constraint.AddSource( Source( scrollPositionObject, scrollPositionProperty ) );
-      constraint.AddSource( ParentSource( scrollSpeedProperty ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_POSITION ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_SPEED ) );
       constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
       constraint.AddSource( Source( mWeightObject, WeightObject::WEIGHT ) );
       constraint.Apply();
@@ -248,8 +274,8 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d
       WrappedVector3Constraint wrapped(scaleConstraint, itemId);
 
       Constraint constraint = Constraint::New<Vector3>( actor, Actor::Property::SCALE, wrapped );
-      constraint.AddSource( Source( scrollPositionObject, scrollPositionProperty ) );
-      constraint.AddSource( ParentSource( scrollSpeedProperty ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_POSITION ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_SPEED ) );
       constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
       constraint.AddSource( Source( mWeightObject, WeightObject::WEIGHT ) );
       constraint.Apply();
@@ -261,8 +287,8 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d
       WrappedVector4Constraint wrapped(colorConstraint, itemId);
 
       Constraint constraint = Constraint::New<Vector4>( actor, Actor::Property::COLOR, wrapped );
-      constraint.AddSource( Source( scrollPositionObject, scrollPositionProperty ) );
-      constraint.AddSource( ParentSource( scrollSpeedProperty ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_POSITION ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_SPEED ) );
       constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
       constraint.AddSource( Source( mWeightObject, WeightObject::WEIGHT ) );
       constraint.SetRemoveAction(Dali::Constraint::Discard);
@@ -275,8 +301,8 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d
       WrappedBoolConstraint wrapped(visibilityConstraint, itemId);
 
       Constraint constraint = Constraint::New<bool>( actor, Actor::Property::VISIBLE, wrapped );
-      constraint.AddSource( Source( scrollPositionObject, scrollPositionProperty ) );
-      constraint.AddSource( ParentSource( scrollSpeedProperty ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_POSITION ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_SPEED ) );
       constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
       constraint.AddSource( Source( mWeightObject, WeightObject::WEIGHT ) );
 
@@ -291,7 +317,7 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d
     keyFrames.Add( 1.0f, 1.0f );
 
     Animation applyAnimation = Dali::Animation::New( durationSeconds );
-    applyAnimation.AnimateBetween( Property( mWeightObject, WeightObject::WEIGHT ), keyFrames, mAlphaFunction, durationSeconds );
+    applyAnimation.AnimateBetween( Property( mWeightObject, WeightObject::WEIGHT ), keyFrames, mAlphaFunction, TimePeriod(durationSeconds) );
     applyAnimation.Play();
   }
 }