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=918b9bb47325a1e17d6c70074704ed90c8981e38;hp=7922ae0cdffd200117b925aa372f7ac7da60e6be;hb=0a2f5e1551be90466c7b64173bd750c4009c744e;hpb=6d762b4acd946b3d02e76c1805e7af9a1a5b1809 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 7922ae0..918b9bb 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 @@ -19,7 +19,7 @@ #include // EXTERNAL INCLUDES -#include +#include #include #include @@ -29,82 +29,96 @@ namespace { - // Functors which wrap constraint functions with stored item IDs - struct WrappedQuaternionConstraint +// Lerps between current and target using the progress +template< typename Type > +void Lerp( Type& current, const Type& target, float progress ) +{ + current += ((target - current) * progress); +} + +// Functors which wrap constraint functions with stored item IDs +struct WrappedQuaternionConstraint +{ + WrappedQuaternionConstraint( Dali::Toolkit::ItemLayout::QuaternionFunction wrapMe, unsigned int itemId ) + :mWrapMe(wrapMe), + mItemId(itemId) { - WrappedQuaternionConstraint(Dali::Toolkit::ItemLayout::QuaternionFunction wrapMe, unsigned int itemId) - :mWrapMe(wrapMe), - mItemId(itemId) - { - } + } - Dali::Quaternion operator()(const Dali::Quaternion& current, const Dali::PropertyInput& layoutPosition, const Dali::PropertyInput& scrollSpeed, const Dali::PropertyInput& layoutSize) - { - float offsetLayoutPosition = layoutPosition.GetFloat() + static_cast(mItemId); + void operator()( Dali::Quaternion& current, const Dali::PropertyInputContainer& inputs ) + { + float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast(mItemId); + float weight = inputs[3]->GetFloat(); - return mWrapMe(current, offsetLayoutPosition, scrollSpeed.GetFloat(), layoutSize.GetVector3()); - } + current = Dali::Quaternion::Slerp( current, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight ); + } - Dali::Toolkit::ItemLayout::QuaternionFunction mWrapMe; - unsigned int mItemId; - }; + Dali::Toolkit::ItemLayout::QuaternionFunction mWrapMe; + unsigned int mItemId; +}; - struct WrappedVector3Constraint +struct WrappedVector3Constraint +{ + WrappedVector3Constraint( Dali::Toolkit::ItemLayout::Vector3Function wrapMe, unsigned int itemId ) + : mWrapMe(wrapMe), + mItemId(itemId) { - WrappedVector3Constraint(Dali::Toolkit::ItemLayout::Vector3Function wrapMe, unsigned int itemId) - : mWrapMe(wrapMe), - mItemId(itemId) - { - } + } - Dali::Vector3 operator()(const Dali::Vector3& current, const Dali::PropertyInput& layoutPosition, const Dali::PropertyInput& scrollSpeed, const Dali::PropertyInput& layoutSize) - { - float offsetLayoutPosition = layoutPosition.GetFloat() + static_cast(mItemId); + void operator()( Dali::Vector3& current, const Dali::PropertyInputContainer& inputs ) + { + float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast(mItemId); + float weight = inputs[3]->GetFloat(); - return mWrapMe(current, offsetLayoutPosition, scrollSpeed.GetFloat(), layoutSize.GetVector3()); - } + Lerp( current, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight ); + } - Dali::Toolkit::ItemLayout::Vector3Function mWrapMe; - unsigned int mItemId; - }; + Dali::Toolkit::ItemLayout::Vector3Function mWrapMe; + unsigned int mItemId; +}; - struct WrappedVector4Constraint +struct WrappedVector4Constraint +{ + WrappedVector4Constraint( Dali::Toolkit::ItemLayout::Vector4Function wrapMe, unsigned int itemId ) + : mWrapMe(wrapMe), + mItemId(itemId) { - WrappedVector4Constraint(Dali::Toolkit::ItemLayout::Vector4Function wrapMe, unsigned int itemId) - : mWrapMe(wrapMe), - mItemId(itemId) - { - } + } - Dali::Vector4 operator()(const Dali::Vector4& current, const Dali::PropertyInput& layoutPosition, const Dali::PropertyInput& scrollSpeed, const Dali::PropertyInput& layoutSize) - { - float offsetLayoutPosition = layoutPosition.GetFloat() + static_cast(mItemId); + void operator()( Dali::Vector4& current, const Dali::PropertyInputContainer& inputs ) + { + float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast(mItemId); + float weight = inputs[3]->GetFloat(); - return mWrapMe(current, offsetLayoutPosition, scrollSpeed.GetFloat(), layoutSize.GetVector3()); - } + Lerp( current, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight ); + } - Dali::Toolkit::ItemLayout::Vector4Function mWrapMe; - unsigned int mItemId; - }; + Dali::Toolkit::ItemLayout::Vector4Function mWrapMe; + unsigned int mItemId; +}; - struct WrappedBoolConstraint +struct WrappedBoolConstraint +{ + WrappedBoolConstraint( Dali::Toolkit::ItemLayout::BoolFunction wrapMe, unsigned int itemId ) + : mWrapMe(wrapMe), + mItemId(itemId) { - WrappedBoolConstraint(Dali::Toolkit::ItemLayout::BoolFunction wrapMe, unsigned int itemId) - : mWrapMe(wrapMe), - mItemId(itemId) - { - } + } - bool operator()(const bool& current, const Dali::PropertyInput& layoutPosition, const Dali::PropertyInput& scrollSpeed, const Dali::PropertyInput& layoutSize) - { - float offsetLayoutPosition = layoutPosition.GetFloat() + static_cast(mItemId); + void operator()( bool& current, const Dali::PropertyInputContainer& inputs ) + { + float weight = inputs[3]->GetFloat(); - return mWrapMe(current, offsetLayoutPosition, scrollSpeed.GetFloat(), layoutSize.GetVector3()); + if ( weight >= 1.0f ) + { + float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast(mItemId); + current = mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ); } + } - Dali::Toolkit::ItemLayout::BoolFunction mWrapMe; - unsigned int mItemId; - }; + Dali::Toolkit::ItemLayout::BoolFunction mWrapMe; + unsigned int mItemId; +}; } //Unnamed namespace @@ -115,8 +129,9 @@ namespace Toolkit { ItemLayout::ItemLayout() -: mOrientation(ControlOrientation::Up), - mAlphaFunction(Dali::Constraint::DEFAULT_ALPHA_FUNCTION) +: mOrientation( ControlOrientation::Up ), + mAlphaFunction( AlphaFunctions::Linear ), + mWeightObject() { } @@ -152,150 +167,6 @@ float ItemLayout::GetClosestOnScreenLayoutPosition(int itemID, float currentLayo return currentLayoutPosition; } -void ItemLayout::GetXAxisScrollHint(Vector2& scrollHint) const -{ - scrollHint = Vector2::ZERO; - Radian scrollAngle(GetScrollDirection()); - Vector2 scrollDirection(sinf(scrollAngle), cosf(scrollAngle)); - switch(mOrientation) - { - case ControlOrientation::Up: - { - if(fabsf(scrollDirection.y) < Math::MACHINE_EPSILON_1) - { - // we probably want x scrolling - if(scrollDirection.x > 0.0f) - { - // normal positive scrolling - scrollHint = Vector2::XAXIS; - } - else - { - scrollHint = -Vector2::XAXIS; - } - } - break; - } - case ControlOrientation::Down: - { - if(fabsf(scrollDirection.y) < Math::MACHINE_EPSILON_1) - { - // we probably want x scrolling - if(scrollDirection.x > 0.0f) - { - // normal positive scrolling - scrollHint = -Vector2::XAXIS; - } - else - { - scrollHint = Vector2::XAXIS; - } - } - break; - } - case ControlOrientation::Left: - { - // we probably want x scrolling - if(scrollDirection.x > 0.0f) - { - // normal positive scrolling - scrollHint = Vector2::XAXIS; - } - else - { - scrollHint = -Vector2::XAXIS; - } - break; - } - case ControlOrientation::Right: - { - // we probably want x scrolling - if(scrollDirection.x > 0.0f) - { - // normal positive scrolling - scrollHint = -Vector2::XAXIS; - } - else - { - scrollHint = Vector2::XAXIS; - } - break; - } - } -} - -void ItemLayout::GetYAxisScrollHint(Vector2& scrollHint) const -{ - scrollHint = Vector2::ZERO; - Radian scrollAngle(GetScrollDirection()); - Vector2 scrollDirection(sinf(scrollAngle), cosf(scrollAngle)); - switch(mOrientation) - { - case ControlOrientation::Up: - { - // we probably want x scrolling - if(scrollDirection.y > 0.0f) - { - // normal positive scrolling - scrollHint = Vector2::YAXIS; - } - else - { - scrollHint = -Vector2::YAXIS; - } - break; - } - case ControlOrientation::Down: - { - // we probably want x scrolling - if(scrollDirection.y > 0.0f) - { - // normal positive scrolling - scrollHint = -Vector2::YAXIS; - } - else - { - scrollHint = Vector2::YAXIS; - } - break; - } - case ControlOrientation::Left: - { - if(fabsf(scrollDirection.x) < Math::MACHINE_EPSILON_1) - { - // we probably want x scrolling - if(scrollDirection.y > 0.0f) - { - // normal positive scrolling - scrollHint = -Vector2::YAXIS; - } - else - { - scrollHint = Vector2::YAXIS; - } - } - break; - } - case ControlOrientation::Right: - { - if(fabsf(scrollDirection.x) < Math::MACHINE_EPSILON_1) - { - // we probably want x scrolling - if(scrollDirection.y > 0.0f) - { - // normal positive scrolling - scrollHint = Vector2::YAXIS; - } - else - { - scrollHint = -Vector2::YAXIS; - } - } - break; - } - } -} - int ItemLayout::GetNextFocusItemID(int itemID, int maxItems, Dali::Toolkit::Control::KeyboardFocusNavigationDirection direction, bool loopEnabled) { switch( direction ) @@ -340,18 +211,22 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d 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 ) + { + mWeightObject = WeightObject::New(); + } + ItemLayout::Vector3Function positionConstraint; if (GetPositionConstraint(itemId, positionConstraint)) { WrappedVector3Constraint wrapped(positionConstraint, itemId); - Constraint constraint = Constraint::New( Actor::POSITION, - Source( scrollPositionObject, scrollPositionProperty ), - ParentSource( scrollSpeedProperty ), - ParentSource( Actor::SIZE ), - wrapped ); - constraint.SetApplyTime(durationSeconds); - constraint.SetAlphaFunction(mAlphaFunction); - actor.ApplyConstraint(constraint); + Constraint constraint = Constraint::New( actor, Actor::Property::POSITION, wrapped ); + constraint.AddSource( Source( scrollPositionObject, scrollPositionProperty ) ); + constraint.AddSource( ParentSource( scrollSpeedProperty ) ); + constraint.AddSource( ParentSource( Actor::Property::SIZE ) ); + constraint.AddSource( Source( mWeightObject, WeightObject::WEIGHT ) ); + constraint.Apply(); } ItemLayout::QuaternionFunction rotationConstraint; @@ -359,15 +234,12 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d { WrappedQuaternionConstraint wrapped(rotationConstraint, itemId); - Constraint constraint = Constraint::New( Actor::ROTATION, - Source( scrollPositionObject, scrollPositionProperty ), - ParentSource( scrollSpeedProperty ), - ParentSource( Actor::SIZE ), - wrapped ); - constraint.SetApplyTime(durationSeconds); - constraint.SetAlphaFunction(mAlphaFunction); - - actor.ApplyConstraint(constraint); + Constraint constraint = Constraint::New( actor, Actor::Property::ORIENTATION, wrapped ); + constraint.AddSource( Source( scrollPositionObject, scrollPositionProperty ) ); + constraint.AddSource( ParentSource( scrollSpeedProperty ) ); + constraint.AddSource( ParentSource( Actor::Property::SIZE ) ); + constraint.AddSource( Source( mWeightObject, WeightObject::WEIGHT ) ); + constraint.Apply(); } ItemLayout::Vector3Function scaleConstraint; @@ -375,15 +247,12 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d { WrappedVector3Constraint wrapped(scaleConstraint, itemId); - Constraint constraint = Constraint::New( Actor::SCALE, - Source( scrollPositionObject, scrollPositionProperty ), - ParentSource( scrollSpeedProperty ), - ParentSource( Actor::SIZE ), - wrapped ); - constraint.SetApplyTime(durationSeconds); - constraint.SetAlphaFunction(mAlphaFunction); - - actor.ApplyConstraint(constraint); + Constraint constraint = Constraint::New( actor, Actor::Property::SCALE, wrapped ); + constraint.AddSource( Source( scrollPositionObject, scrollPositionProperty ) ); + constraint.AddSource( ParentSource( scrollSpeedProperty ) ); + constraint.AddSource( ParentSource( Actor::Property::SIZE ) ); + constraint.AddSource( Source( mWeightObject, WeightObject::WEIGHT ) ); + constraint.Apply(); } ItemLayout::Vector4Function colorConstraint; @@ -391,17 +260,13 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d { WrappedVector4Constraint wrapped(colorConstraint, itemId); - Constraint constraint = Constraint::New( Actor::COLOR, - Source( scrollPositionObject, scrollPositionProperty ), - ParentSource( scrollSpeedProperty ), - ParentSource( Actor::SIZE ), - wrapped ); - - constraint.SetApplyTime(durationSeconds); - constraint.SetAlphaFunction(mAlphaFunction); + Constraint constraint = Constraint::New( actor, Actor::Property::COLOR, wrapped ); + constraint.AddSource( Source( scrollPositionObject, scrollPositionProperty ) ); + constraint.AddSource( ParentSource( scrollSpeedProperty ) ); + constraint.AddSource( ParentSource( Actor::Property::SIZE ) ); + constraint.AddSource( Source( mWeightObject, WeightObject::WEIGHT ) ); constraint.SetRemoveAction(Dali::Constraint::Discard); - - actor.ApplyConstraint(constraint); + constraint.Apply(); } ItemLayout::BoolFunction visibilityConstraint; @@ -409,20 +274,25 @@ void ItemLayout::ApplyConstraints( Actor& actor, const int itemId, const float d { WrappedBoolConstraint wrapped(visibilityConstraint, itemId); - Constraint constraint = Constraint::New( Actor::VISIBLE, - Source( scrollPositionObject, scrollPositionProperty ), - ParentSource( scrollSpeedProperty ), - ParentSource( Actor::SIZE ), - wrapped ); - - constraint.SetApplyTime(durationSeconds); - constraint.SetAlphaFunction(mAlphaFunction); + Constraint constraint = Constraint::New( actor, Actor::Property::VISIBLE, wrapped ); + constraint.AddSource( Source( scrollPositionObject, scrollPositionProperty ) ); + constraint.AddSource( ParentSource( scrollSpeedProperty ) ); + constraint.AddSource( ParentSource( Actor::Property::SIZE ) ); + constraint.AddSource( Source( mWeightObject, WeightObject::WEIGHT ) ); // Release visibility constraints the same time as the color constraint constraint.SetRemoveAction(Dali::Constraint::Discard); - actor.ApplyConstraint(constraint); + constraint.Apply(); } + + KeyFrames keyFrames = KeyFrames::New(); + keyFrames.Add( 0.0f, 0.0f ); + keyFrames.Add( 1.0f, 1.0f ); + + Animation applyAnimation = Dali::Animation::New( durationSeconds ); + applyAnimation.AnimateBetween( Property( mWeightObject, WeightObject::WEIGHT ), keyFrames, mAlphaFunction, durationSeconds ); + applyAnimation.Play(); } }