X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Fpublic-api%2Fcontrols%2Fscrollable%2Fitem-view%2Fitem-layout.cpp;h=9e297365f698f94b1a11eea550a2d067982c9023;hp=918b9bb47325a1e17d6c70074704ed90c8981e38;hb=df89f9f230cadaac7be4007d1b1a7cf7dc893011;hpb=402784aceba9171e57ffca8769ca46ef8aebcd2f diff --git a/dali-toolkit/public-api/controls/scrollable/item-view/item-layout.cpp b/dali-toolkit/public-api/controls/scrollable/item-view/item-layout.cpp index 918b9bb..9e29736 100644 --- a/dali-toolkit/public-api/controls/scrollable/item-view/item-layout.cpp +++ b/dali-toolkit/public-api/controls/scrollable/item-view/item-layout.cpp @@ -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. @@ -29,11 +29,11 @@ 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(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(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(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( 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( 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( 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( 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( 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(); } }