X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fscrollable%2Fitem-view%2Fitem-view-impl.cpp;h=a3f222e156d953c60bb6a33e7e377f4cefc9d879;hp=9ac90b91f6a44a9d48f8e656797e43085d5050ad;hb=4b347781c8761d2909b235ded2e98d272fa9ac16;hpb=6e824d3bfb11cab305d0d8375b202076d59222b0 diff --git a/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp b/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp index 9ac90b9..a3f222e 100644 --- a/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp +++ b/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp @@ -19,8 +19,8 @@ #include // EXTERNAL INCLUDES +#include // for strcmp #include -#include #include #include #include @@ -87,202 +87,165 @@ float CalculateScrollDistance(Vector2 panDistance, Toolkit::ItemLayout& layout) } // Overshoot overlay constraints - -struct OvershootOverlaySizeConstraint +void OvershootOverlaySizeConstraint( Vector3& current, const PropertyInputContainer& inputs ) { - Vector3 operator()(const Vector3& current, - const PropertyInput& parentScrollDirectionProperty, - const PropertyInput& parentOvershootProperty, - const PropertyInput& parentSizeProperty) - { - const Vector3 parentScrollDirection = parentScrollDirectionProperty.GetVector3(); - const Vector3 parentSize = parentSizeProperty.GetVector3(); - const Toolkit::ControlOrientation::Type& parentOrientation = static_cast(parentScrollDirection.z); + const Vector3& parentScrollDirection = inputs[0]->GetVector3(); + const Vector3& parentSize = inputs[1]->GetVector3(); + const Toolkit::ControlOrientation::Type& parentOrientation = static_cast(parentScrollDirection.z); - float overlayWidth; - - if(Toolkit::IsVertical(parentOrientation)) - { - overlayWidth = fabsf(parentScrollDirection.y) > Math::MACHINE_EPSILON_1 ? parentSize.x : parentSize.y; - } - else - { - overlayWidth = fabsf(parentScrollDirection.x) > Math::MACHINE_EPSILON_1 ? parentSize.y : parentSize.x; - } - - float overlayHeight = (overlayWidth > OVERSHOOT_BOUNCE_ACTOR_RESIZE_THRESHOLD) ? OVERSHOOT_BOUNCE_ACTOR_DEFAULT_SIZE.height : OVERSHOOT_BOUNCE_ACTOR_DEFAULT_SIZE.height*0.5f; - - return Vector3( overlayWidth, overlayHeight, current.depth ); + if(Toolkit::IsVertical(parentOrientation)) + { + current.width = fabsf(parentScrollDirection.y) > Math::MACHINE_EPSILON_1 ? parentSize.x : parentSize.y; + } + else + { + current.width = fabsf(parentScrollDirection.x) > Math::MACHINE_EPSILON_1 ? parentSize.y : parentSize.x; } -}; -struct OvershootOverlayRotationConstraint + current.height = ( current.width > OVERSHOOT_BOUNCE_ACTOR_RESIZE_THRESHOLD ) ? OVERSHOOT_BOUNCE_ACTOR_DEFAULT_SIZE.height : OVERSHOOT_BOUNCE_ACTOR_DEFAULT_SIZE.height*0.5f; +} + +void OvershootOverlayRotationConstraint( Quaternion& current, const PropertyInputContainer& inputs ) { - Quaternion operator()(const Quaternion& current, - const PropertyInput& parentScrollDirectionProperty, - const PropertyInput& parentOvershootProperty) - { - const Vector3 parentScrollDirection = parentScrollDirectionProperty.GetVector3(); - const float parentOvershoot = parentOvershootProperty.GetFloat(); - const Toolkit::ControlOrientation::Type& parentOrientation = static_cast(parentScrollDirection.z); + const Vector3& parentScrollDirection = inputs[0]->GetVector3(); + const float parentOvershoot = inputs[1]->GetFloat(); + const Toolkit::ControlOrientation::Type& parentOrientation = static_cast(parentScrollDirection.z); - float multiplier = 0; - if(Toolkit::IsVertical(parentOrientation)) + float multiplier = 0; + if(Toolkit::IsVertical(parentOrientation)) + { + if(fabsf(parentScrollDirection.y) <= Math::MACHINE_EPSILON_1) { - if(fabsf(parentScrollDirection.y) <= Math::MACHINE_EPSILON_1) + if( (parentOrientation == Toolkit::ControlOrientation::Up && parentOvershoot < Math::MACHINE_EPSILON_0) + || (parentOrientation == Toolkit::ControlOrientation::Down && parentOvershoot > Math::MACHINE_EPSILON_0) ) { - if( (parentOrientation == Toolkit::ControlOrientation::Up && parentOvershoot < Math::MACHINE_EPSILON_0) - || (parentOrientation == Toolkit::ControlOrientation::Down && parentOvershoot > Math::MACHINE_EPSILON_0) ) - { - multiplier = 0.5f; - } - else - { - multiplier = 1.5f; - } - } - else if( (parentOvershoot > Math::MACHINE_EPSILON_0 && parentScrollDirection.y > Math::MACHINE_EPSILON_0) - || (parentOvershoot < Math::MACHINE_EPSILON_0 && parentScrollDirection.y < Math::MACHINE_EPSILON_0) ) - { - multiplier = 0.0f; + multiplier = 0.5f; } else { - multiplier = 1.0f; + multiplier = 1.5f; } } + else if( (parentOvershoot > Math::MACHINE_EPSILON_0 && parentScrollDirection.y > Math::MACHINE_EPSILON_0) + || (parentOvershoot < Math::MACHINE_EPSILON_0 && parentScrollDirection.y < Math::MACHINE_EPSILON_0) ) + { + multiplier = 0.0f; + } else { - if(fabsf(parentScrollDirection.x) <= Math::MACHINE_EPSILON_1) - { - if( (parentOrientation == Toolkit::ControlOrientation::Left && parentOvershoot > Math::MACHINE_EPSILON_0) - ||(parentOrientation == Toolkit::ControlOrientation::Right && parentOvershoot < Math::MACHINE_EPSILON_0) ) - { - multiplier = 1.0f; - } - else - { - multiplier = 0.0f; - } - } - else if( (parentOvershoot > Math::MACHINE_EPSILON_0 && parentScrollDirection.x > Math::MACHINE_EPSILON_0) - || (parentOvershoot < Math::MACHINE_EPSILON_0 && parentScrollDirection.x < Math::MACHINE_EPSILON_0) ) + multiplier = 1.0f; + } + } + else + { + if(fabsf(parentScrollDirection.x) <= Math::MACHINE_EPSILON_1) + { + if( (parentOrientation == Toolkit::ControlOrientation::Left && parentOvershoot > Math::MACHINE_EPSILON_0) + ||(parentOrientation == Toolkit::ControlOrientation::Right && parentOvershoot < Math::MACHINE_EPSILON_0) ) { - multiplier = 1.5f; + multiplier = 1.0f; } else { - multiplier = 0.5f; + multiplier = 0.0f; } } - - Quaternion rotation( Radian( multiplier * Math::PI ), Vector3::ZAXIS ); - - return rotation; + else if( (parentOvershoot > Math::MACHINE_EPSILON_0 && parentScrollDirection.x > Math::MACHINE_EPSILON_0) + || (parentOvershoot < Math::MACHINE_EPSILON_0 && parentScrollDirection.x < Math::MACHINE_EPSILON_0) ) + { + multiplier = 1.5f; + } + else + { + multiplier = 0.5f; + } } -}; -struct OvershootOverlayPositionConstraint + current = Quaternion( Radian( multiplier * Math::PI ), Vector3::ZAXIS ); +} + +void OvershootOverlayPositionConstraint( Vector3& current, const PropertyInputContainer& inputs ) { - Vector3 operator()(const Vector3& current, - const PropertyInput& parentSizeProperty, - const PropertyInput& parentScrollDirectionProperty, - const PropertyInput& parentOvershootProperty) - { - const Vector3 parentScrollDirection = parentScrollDirectionProperty.GetVector3(); - const float parentOvershoot = parentOvershootProperty.GetFloat(); - const Vector3 parentSize = parentSizeProperty.GetVector3(); - const Toolkit::ControlOrientation::Type& parentOrientation = static_cast(parentScrollDirection.z); + const Vector3& parentSize = inputs[0]->GetVector3(); + const Vector3& parentScrollDirection = inputs[1]->GetVector3(); + const float parentOvershoot = inputs[2]->GetFloat(); + const Toolkit::ControlOrientation::Type& parentOrientation = static_cast(parentScrollDirection.z); - Vector3 relativeOffset; + Vector3 relativeOffset; - if(Toolkit::IsVertical(parentOrientation)) + if(Toolkit::IsVertical(parentOrientation)) + { + if(fabsf(parentScrollDirection.y) <= Math::MACHINE_EPSILON_1) { - if(fabsf(parentScrollDirection.y) <= Math::MACHINE_EPSILON_1) + if( (parentOrientation == Toolkit::ControlOrientation::Up && parentOvershoot < Math::MACHINE_EPSILON_0) + || (parentOrientation == Toolkit::ControlOrientation::Down && parentOvershoot > Math::MACHINE_EPSILON_0) ) { - if( (parentOrientation == Toolkit::ControlOrientation::Up && parentOvershoot < Math::MACHINE_EPSILON_0) - || (parentOrientation == Toolkit::ControlOrientation::Down && parentOvershoot > Math::MACHINE_EPSILON_0) ) - { - relativeOffset = Vector3(1.0f, 0.0f, 0.0f); - } - else - { - relativeOffset =Vector3(0.0f, 1.0f, 0.0f); - } - } - else if( (parentOvershoot > Math::MACHINE_EPSILON_0 && parentScrollDirection.y > Math::MACHINE_EPSILON_0) - || (parentOvershoot < Math::MACHINE_EPSILON_0 && parentScrollDirection.y < Math::MACHINE_EPSILON_0) ) - { - relativeOffset = Vector3(0.0f, 0.0f, 0.0f); + relativeOffset = Vector3(1.0f, 0.0f, 0.0f); } else { - relativeOffset = Vector3(1.0f, 1.0f, 0.0f); + relativeOffset =Vector3(0.0f, 1.0f, 0.0f); } } + else if( (parentOvershoot > Math::MACHINE_EPSILON_0 && parentScrollDirection.y > Math::MACHINE_EPSILON_0) + || (parentOvershoot < Math::MACHINE_EPSILON_0 && parentScrollDirection.y < Math::MACHINE_EPSILON_0) ) + { + relativeOffset = Vector3(0.0f, 0.0f, 0.0f); + } else { - if(fabsf(parentScrollDirection.x) <= Math::MACHINE_EPSILON_1) - { - if( (parentOrientation == Toolkit::ControlOrientation::Left && parentOvershoot < Math::MACHINE_EPSILON_0) - || (parentOrientation == Toolkit::ControlOrientation::Right && parentOvershoot > Math::MACHINE_EPSILON_0) ) - { - relativeOffset = Vector3(0.0f, 0.0f, 0.0f); - } - else - { - relativeOffset = Vector3(1.0f, 1.0f, 0.0f); - } - } - else if( (parentOvershoot > Math::MACHINE_EPSILON_0 && parentScrollDirection.x > Math::MACHINE_EPSILON_0) - || (parentOvershoot < Math::MACHINE_EPSILON_0 && parentScrollDirection.x < Math::MACHINE_EPSILON_0) ) + relativeOffset = Vector3(1.0f, 1.0f, 0.0f); + } + } + else + { + if(fabsf(parentScrollDirection.x) <= Math::MACHINE_EPSILON_1) + { + if( (parentOrientation == Toolkit::ControlOrientation::Left && parentOvershoot < Math::MACHINE_EPSILON_0) + || (parentOrientation == Toolkit::ControlOrientation::Right && parentOvershoot > Math::MACHINE_EPSILON_0) ) { - relativeOffset = Vector3(0.0f, 1.0f, 0.0f); + relativeOffset = Vector3(0.0f, 0.0f, 0.0f); } else { - relativeOffset = Vector3(1.0f, 0.0f, 0.0f); + relativeOffset = Vector3(1.0f, 1.0f, 0.0f); } } - - return relativeOffset * parentSize; - + else if( (parentOvershoot > Math::MACHINE_EPSILON_0 && parentScrollDirection.x > Math::MACHINE_EPSILON_0) + || (parentOvershoot < Math::MACHINE_EPSILON_0 && parentScrollDirection.x < Math::MACHINE_EPSILON_0) ) + { + relativeOffset = Vector3(0.0f, 1.0f, 0.0f); + } + else + { + relativeOffset = Vector3(1.0f, 0.0f, 0.0f); + } } -}; -struct OvershootOverlayVisibilityConstraint -{ - bool operator()(const bool& current, - const PropertyInput& parentLayoutScrollableProperty) - { - const bool parentLayoutScrollable = parentLayoutScrollableProperty.GetBoolean(); + current = relativeOffset * parentSize; +} - return parentLayoutScrollable; - } -}; +void OvershootOverlayVisibilityConstraint( bool& current, const PropertyInputContainer& inputs ) +{ + current = inputs[0]->GetBoolean(); +} /** * Relative position Constraint * Generates the relative position value of the item view based on the layout position, * and it's relation to the layout domain. This is a value from 0.0f to 1.0f in each axis. */ -Vector3 RelativePositionConstraint(const Vector3& current, - const PropertyInput& scrollPositionProperty, - const PropertyInput& scrollMinProperty, - const PropertyInput& scrollMaxProperty, - const PropertyInput& layoutSizeProperty) +void RelativePositionConstraint( Vector3& current, const PropertyInputContainer& inputs ) { - const Vector3& position = Vector3(0.0f, scrollPositionProperty.GetFloat(), 0.0f); - const Vector3& min = scrollMinProperty.GetVector3(); - const Vector3& max = scrollMaxProperty.GetVector3(); + const Vector3& position = Vector3(0.0f, inputs[0]->GetFloat(), 0.0f); + const Vector3& min = inputs[1]->GetVector3(); + const Vector3& max = inputs[2]->GetVector3(); - Vector3 relativePosition; Vector3 domainSize = max - min; - relativePosition.x = fabsf(domainSize.x) > Math::MACHINE_EPSILON_1 ? ((min.x - position.x) / fabsf(domainSize.x)) : 0.0f; - relativePosition.y = fabsf(domainSize.y) > Math::MACHINE_EPSILON_1 ? ((min.y - position.y) / fabsf(domainSize.y)) : 0.0f; - - return relativePosition; + current.x = fabsf(domainSize.x) > Math::MACHINE_EPSILON_1 ? ((min.x - position.x) / fabsf(domainSize.x)) : 0.0f; + current.y = fabsf(domainSize.y) > Math::MACHINE_EPSILON_1 ? ((min.y - position.y) / fabsf(domainSize.y)) : 0.0f; + current.z = 0.0f; } } // unnamed namespace @@ -377,13 +340,11 @@ void ItemView::OnInitialize() EnableScrollComponent(Toolkit::Scrollable::OvershootIndicator); - Constraint constraint = Constraint::New(Toolkit::Scrollable::Property::SCROLL_RELATIVE_POSITION, - LocalSource(mPropertyPosition), - LocalSource(Toolkit::Scrollable::Property::SCROLL_POSITION_MIN), - LocalSource(Toolkit::Scrollable::Property::SCROLL_POSITION_MAX), - LocalSource(Actor::Property::SIZE), - RelativePositionConstraint); - self.ApplyConstraint(constraint); + Constraint constraint = Constraint::New( self, Toolkit::Scrollable::Property::SCROLL_RELATIVE_POSITION, RelativePositionConstraint ); + constraint.AddSource( LocalSource( mPropertyPosition ) ); + constraint.AddSource( LocalSource( Toolkit::Scrollable::Property::SCROLL_POSITION_MIN ) ); + constraint.AddSource( LocalSource( Toolkit::Scrollable::Property::SCROLL_POSITION_MAX ) ); + constraint.Apply(); Vector2 stageSize = Stage::GetCurrent().GetSize(); mMouseWheelScrollDistanceStep = stageSize.y * DEFAULT_MOUSE_WHEEL_SCROLL_DISTANCE_STEP_PROPORTION; @@ -1561,36 +1522,31 @@ void ItemView::SetOvershootEnabled( bool enable ) mOvershootOverlay.SetDrawMode(DrawMode::OVERLAY); self.Add(mOvershootOverlay); - Constraint constraint = Constraint::New( Actor::Property::SIZE, - ParentSource( Toolkit::Scrollable::Property::SCROLL_DIRECTION ), - Source( mScrollPositionObject, ScrollConnector::OVERSHOOT ), - ParentSource( Actor::Property::SIZE ), - OvershootOverlaySizeConstraint() ); - mOvershootOverlay.ApplyConstraint(constraint); + Constraint constraint = Constraint::New( mOvershootOverlay, Actor::Property::SIZE, OvershootOverlaySizeConstraint ); + constraint.AddSource( ParentSource( Toolkit::Scrollable::Property::SCROLL_DIRECTION ) ); + constraint.AddSource( ParentSource( Actor::Property::SIZE ) ); + constraint.Apply(); + mOvershootOverlay.SetSize(OVERSHOOT_BOUNCE_ACTOR_DEFAULT_SIZE.width, OVERSHOOT_BOUNCE_ACTOR_DEFAULT_SIZE.height); - constraint = Constraint::New( Actor::Property::ORIENTATION, - ParentSource( Toolkit::Scrollable::Property::SCROLL_DIRECTION ), - Source( mScrollPositionObject, ScrollConnector::OVERSHOOT ), - OvershootOverlayRotationConstraint() ); - mOvershootOverlay.ApplyConstraint(constraint); - - constraint = Constraint::New( Actor::Property::POSITION, - ParentSource( Actor::Property::SIZE ), - ParentSource( Toolkit::Scrollable::Property::SCROLL_DIRECTION ), - Source( mScrollPositionObject, ScrollConnector::OVERSHOOT ), - OvershootOverlayPositionConstraint() ); - mOvershootOverlay.ApplyConstraint(constraint); - - constraint = Constraint::New( Actor::Property::VISIBLE, - ParentSource( Toolkit::Scrollable::Property::CAN_SCROLL_VERTICAL ), - OvershootOverlayVisibilityConstraint() ); - mOvershootOverlay.ApplyConstraint(constraint); - - constraint = Constraint::New( effectOvershootPropertyIndex, - Source( mScrollPositionObject, ScrollConnector::OVERSHOOT ), - EqualToConstraint() ); - mOvershootOverlay.ApplyConstraint(constraint); + constraint = Constraint::New( mOvershootOverlay, Actor::Property::ORIENTATION, OvershootOverlayRotationConstraint ); + constraint.AddSource( ParentSource( Toolkit::Scrollable::Property::SCROLL_DIRECTION ) ); + constraint.AddSource( Source( mScrollPositionObject, ScrollConnector::OVERSHOOT ) ); + constraint.Apply(); + + constraint = Constraint::New( mOvershootOverlay, Actor::Property::POSITION, OvershootOverlayPositionConstraint ); + constraint.AddSource( ParentSource( Actor::Property::SIZE ) ); + constraint.AddSource( ParentSource( Toolkit::Scrollable::Property::SCROLL_DIRECTION ) ); + constraint.AddSource( Source( mScrollPositionObject, ScrollConnector::OVERSHOOT ) ); + constraint.Apply(); + + constraint = Constraint::New( mOvershootOverlay, Actor::Property::VISIBLE, OvershootOverlayVisibilityConstraint ); + constraint.AddSource( ParentSource( Toolkit::Scrollable::Property::CAN_SCROLL_VERTICAL ) ); + constraint.Apply(); + + constraint = Constraint::New( mOvershootOverlay, effectOvershootPropertyIndex, EqualToConstraint() ); + constraint.AddSource( Source( mScrollPositionObject, ScrollConnector::OVERSHOOT ) ); + constraint.Apply(); } else { @@ -1638,7 +1594,12 @@ void ItemView::AnimateScrollOvershoot(float overshootAmount, bool animateBack) if(mOvershootAnimationSpeed > Math::MACHINE_EPSILON_0) { float currentOvershoot = mScrollPositionObject.GetProperty(ScrollConnector::OVERSHOOT); - float duration = mOvershootOverlay.GetCurrentSize().height * (animatingOn ? (1.0f - fabsf(currentOvershoot)) : fabsf(currentOvershoot)) / mOvershootAnimationSpeed; + float duration = 0.0f; + + if (mOvershootOverlay) + { + duration = mOvershootOverlay.GetCurrentSize().height * (animatingOn ? (1.0f - fabsf(currentOvershoot)) : fabsf(currentOvershoot)) / mOvershootAnimationSpeed; + } RemoveAnimation(mScrollOvershootAnimation); mScrollOvershootAnimation = Animation::New(duration);