X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fscroll-bar%2Fscroll-bar-impl.cpp;h=8d3aa6401afd84d9e179a99dd35c108649146626;hb=refs%2Fchanges%2F60%2F52060%2F3;hp=350ace5f4483f8e93696aef0cdfa167cc97eeb1e;hpb=d41c68d7d25046369262fd8a238a80d3eea21034;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.cpp b/dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.cpp index 350ace5..8d3aa64 100755 --- a/dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.cpp +++ b/dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.cpp @@ -31,14 +31,14 @@ // INTERNAL INCLUDES #include +#include using namespace Dali; namespace { -const char* DEFAULT_INDICATOR_IMAGE_PATH = DALI_IMAGE_DIR "popup_scroll.png"; -const Vector4 DEFAULT_INDICATOR_NINE_PATCH_BORDER(4.0f, 9.0f, 7.0f, 11.0f); +const char* DEFAULT_INDICATOR_IMAGE_PATH = DALI_IMAGE_DIR "popup_scroll.9.png"; const float MINIMUM_INDICATOR_HEIGHT(20.0f); // The minimum indicator height for the nine patch border const float DEFAULT_SLIDER_DEPTH(1.0f); const float DEFAULT_INDICATOR_SHOW_DURATION(0.5f); @@ -133,15 +133,15 @@ BaseHandle Create() // Setup properties, signals and actions using the type-registry. DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ScrollBar, Toolkit::Control, Create ); -DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "scroll-direction", STRING, SCROLL_DIRECTION ) -DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicator-height-policy", STRING, INDICATOR_HEIGHT_POLICY ) -DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicator-fixed-height", FLOAT, INDICATOR_FIXED_HEIGHT ) -DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicator-show-duration", FLOAT, INDICATOR_SHOW_DURATION ) -DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicator-hide-duration", FLOAT, INDICATOR_HIDE_DURATION ) -DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "scroll-position-intervals", ARRAY, SCROLL_POSITION_INTERVALS ) +DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "scrollDirection", STRING, SCROLL_DIRECTION ) +DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorHeightPolicy", STRING, INDICATOR_HEIGHT_POLICY ) +DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorFixedHeight", FLOAT, INDICATOR_FIXED_HEIGHT ) +DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorShowDuration", FLOAT, INDICATOR_SHOW_DURATION ) +DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorHideDuration", FLOAT, INDICATOR_HIDE_DURATION ) +DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "scrollPositionIntervals", ARRAY, SCROLL_POSITION_INTERVALS ) -DALI_SIGNAL_REGISTRATION( Toolkit, ScrollBar, "pan-finished", PAN_FINISHED_SIGNAL ) -DALI_SIGNAL_REGISTRATION( Toolkit, ScrollBar, "scroll-position-interval-reached", SCROLL_POSITION_INTERVAL_REACHED_SIGNAL ) +DALI_SIGNAL_REGISTRATION( Toolkit, ScrollBar, "panFinished", PAN_FINISHED_SIGNAL ) +DALI_SIGNAL_REGISTRATION( Toolkit, ScrollBar, "scrollPositionIntervalReached", SCROLL_POSITION_INTERVAL_REACHED_SIGNAL ) DALI_TYPE_REGISTRATION_END() @@ -152,8 +152,9 @@ const char* INDICATOR_HEIGHT_POLICY_NAME[] = {"Variable", "Fixed"}; ScrollBar::ScrollBar(Toolkit::ScrollBar::Direction direction) : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ), + mIndicatorShowAlpha(1.0f), mDirection(direction), - mScrollableObject(Handle()), + mScrollableObject(WeakHandleBase()), mPropertyScrollPosition(Property::INVALID_INDEX), mPropertyMinScrollPosition(Property::INVALID_INDEX), mPropertyMaxScrollPosition(Property::INVALID_INDEX), @@ -161,10 +162,11 @@ ScrollBar::ScrollBar(Toolkit::ScrollBar::Direction direction) mIndicatorShowDuration(DEFAULT_INDICATOR_SHOW_DURATION), mIndicatorHideDuration(DEFAULT_INDICATOR_HIDE_DURATION), mScrollStart(0.0f), - mIsPanning(false), mCurrentScrollPosition(0.0f), mIndicatorHeightPolicy(Toolkit::ScrollBar::Variable), - mIndicatorFixedHeight(DEFAULT_INDICATOR_FIXED_HEIGHT) + mIndicatorFixedHeight(DEFAULT_INDICATOR_FIXED_HEIGHT), + mIsPanning(false), + mIndicatorFirstShow(true) { } @@ -186,7 +188,7 @@ void ScrollBar::SetScrollPropertySource( Handle handle, Property::Index property && propertyMaxScrollPosition != Property::INVALID_INDEX && propertyScrollContentSize != Property::INVALID_INDEX ) { - mScrollableObject = handle; + mScrollableObject = WeakHandleBase(handle); mPropertyScrollPosition = propertyScrollPosition; mPropertyMinScrollPosition = propertyMinScrollPosition; mPropertyMaxScrollPosition = propertyMaxScrollPosition; @@ -202,10 +204,7 @@ void ScrollBar::SetScrollPropertySource( Handle handle, Property::Index property void ScrollBar::CreateDefaultIndicatorActor() { - Image indicatorImage = ResourceImage::New( DEFAULT_INDICATOR_IMAGE_PATH ); - ImageActor indicator = ImageActor::New( indicatorImage ); - indicator.SetNinePatchBorder( DEFAULT_INDICATOR_NINE_PATCH_BORDER ); - indicator.SetStyle( ImageActor::STYLE_NINE_PATCH ); + Toolkit::ImageView indicator = Toolkit::ImageView::New( DEFAULT_INDICATOR_IMAGE_PATH ); indicator.SetParentOrigin( ParentOrigin::TOP_LEFT ); indicator.SetAnchorPoint( AnchorPoint::TOP_LEFT ); @@ -218,6 +217,7 @@ void ScrollBar::SetScrollIndicator( Actor indicator ) if( indicator ) { mIndicator = indicator; + mIndicatorFirstShow = true; Self().Add(mIndicator); EnableGestureDetection(Gesture::Type(Gesture::Pan)); @@ -249,7 +249,9 @@ Actor ScrollBar::GetScrollIndicator() void ScrollBar::ApplyConstraints() { - if( mScrollableObject ) + Handle scrollableHandle = mScrollableObject.GetBaseHandle(); + + if( scrollableHandle ) { if(mIndicatorSizeConstraint) { @@ -265,7 +267,7 @@ void ScrollBar::ApplyConstraints() { mIndicatorSizeConstraint = Constraint::New( mIndicator, Actor::Property::SIZE, IndicatorSizeConstraint() ); mIndicatorSizeConstraint.AddSource( ParentSource( Actor::Property::SIZE ) ); - mIndicatorSizeConstraint.AddSource( Source( mScrollableObject, mPropertyScrollContentSize ) ); + mIndicatorSizeConstraint.AddSource( Source( scrollableHandle, mPropertyScrollContentSize ) ); mIndicatorSizeConstraint.Apply(); } @@ -277,9 +279,9 @@ void ScrollBar::ApplyConstraints() mIndicatorPositionConstraint = Constraint::New( mIndicator, Actor::Property::POSITION, IndicatorPositionConstraint() ); mIndicatorPositionConstraint.AddSource( LocalSource( Actor::Property::SIZE ) ); mIndicatorPositionConstraint.AddSource( ParentSource( Actor::Property::SIZE ) ); - mIndicatorPositionConstraint.AddSource( Source( mScrollableObject, mPropertyScrollPosition ) ); - mIndicatorPositionConstraint.AddSource( Source( mScrollableObject, mPropertyMinScrollPosition ) ); - mIndicatorPositionConstraint.AddSource( Source( mScrollableObject, mPropertyMaxScrollPosition ) ); + mIndicatorPositionConstraint.AddSource( Source( scrollableHandle, mPropertyScrollPosition ) ); + mIndicatorPositionConstraint.AddSource( Source( scrollableHandle, mPropertyMinScrollPosition ) ); + mIndicatorPositionConstraint.AddSource( Source( scrollableHandle, mPropertyMaxScrollPosition ) ); mIndicatorPositionConstraint.Apply(); } } @@ -288,14 +290,16 @@ void ScrollBar::SetScrollPositionIntervals( const Dali::Vector& positions { mScrollPositionIntervals = positions; - if( mScrollableObject ) + Handle scrollableHandle = mScrollableObject.GetBaseHandle(); + + if( scrollableHandle ) { if( mPositionNotification ) { - mScrollableObject.RemovePropertyNotification(mPositionNotification); + scrollableHandle.RemovePropertyNotification(mPositionNotification); } - mPositionNotification = mScrollableObject.AddPropertyNotification( mPropertyScrollPosition, VariableStepCondition(mScrollPositionIntervals) ); + mPositionNotification = scrollableHandle.AddPropertyNotification( mPropertyScrollPosition, VariableStepCondition(mScrollPositionIntervals) ); mPositionNotification.NotifySignal().Connect( this, &ScrollBar::OnScrollPositionIntervalReached ); } } @@ -308,9 +312,10 @@ Dali::Vector ScrollBar::GetScrollPositionIntervals() const void ScrollBar::OnScrollPositionIntervalReached(PropertyNotification& source) { // Emit the signal to notify the scroll position crossing - if(mScrollableObject) + Handle scrollableHandle = mScrollableObject.GetBaseHandle(); + if(scrollableHandle) { - mScrollPositionIntervalReachedSignal.Emit(mScrollableObject.GetProperty(mPropertyScrollPosition)); + mScrollPositionIntervalReachedSignal.Emit(scrollableHandle.GetProperty(mPropertyScrollPosition)); } } @@ -323,15 +328,22 @@ void ScrollBar::ShowIndicator() mAnimation.Reset(); } + if( mIndicatorFirstShow ) + { + // Preserve the alpha value from the stylesheet + mIndicatorShowAlpha = Self().GetCurrentColor().a; + mIndicatorFirstShow = false; + } + if(mIndicatorShowDuration > 0.0f) { mAnimation = Animation::New( mIndicatorShowDuration ); - mAnimation.AnimateTo( Property( mIndicator, Actor::Property::COLOR_ALPHA ), 1.0f, AlphaFunction::EASE_IN ); + mAnimation.AnimateTo( Property( mIndicator, Actor::Property::COLOR_ALPHA ), mIndicatorShowAlpha, AlphaFunction::EASE_IN ); mAnimation.Play(); } else { - mIndicator.SetOpacity(1.0f); + mIndicator.SetOpacity(mIndicatorShowAlpha); } } @@ -359,9 +371,10 @@ void ScrollBar::HideIndicator() bool ScrollBar::OnPanGestureProcessTick() { // Update the scroll position property. - if( mScrollableObject ) + Handle scrollableHandle = mScrollableObject.GetBaseHandle(); + if( scrollableHandle ) { - mScrollableObject.SetProperty(mPropertyScrollPosition, mCurrentScrollPosition); + scrollableHandle.SetProperty(mPropertyScrollPosition, mCurrentScrollPosition); } return true; @@ -369,9 +382,11 @@ bool ScrollBar::OnPanGestureProcessTick() void ScrollBar::OnPan( const PanGesture& gesture ) { - if(mScrollableObject) + Handle scrollableHandle = mScrollableObject.GetBaseHandle(); + + if(scrollableHandle) { - Dali::Toolkit::ItemView itemView = Dali::Toolkit::ItemView::DownCast(mScrollableObject); + Dali::Toolkit::ItemView itemView = Dali::Toolkit::ItemView::DownCast(scrollableHandle); switch(gesture.state) { @@ -386,7 +401,7 @@ void ScrollBar::OnPan( const PanGesture& gesture ) } ShowIndicator(); - mScrollStart = mScrollableObject.GetProperty(mPropertyScrollPosition); + mScrollStart = scrollableHandle.GetProperty(mPropertyScrollPosition); mGestureDisplacement = Vector3::ZERO; mIsPanning = true; @@ -398,8 +413,8 @@ void ScrollBar::OnPan( const PanGesture& gesture ) mGestureDisplacement+=delta; Vector3 span = Self().GetCurrentSize() - mIndicator.GetCurrentSize(); - float minScrollPosition = mScrollableObject.GetProperty(mPropertyMinScrollPosition); - float maxScrollPosition = mScrollableObject.GetProperty(mPropertyMaxScrollPosition); + float minScrollPosition = scrollableHandle.GetProperty(mPropertyMinScrollPosition); + float maxScrollPosition = scrollableHandle.GetProperty(mPropertyMaxScrollPosition); float domainSize = maxScrollPosition - minScrollPosition; mCurrentScrollPosition = mScrollStart - mGestureDisplacement.y * domainSize / span.y; @@ -434,7 +449,7 @@ void ScrollBar::OnPan( const PanGesture& gesture ) if(itemView) { // Disable automatic refresh in ItemView during fast scrolling - GetImpl(itemView).SetRefreshEnabled(true);//!mIsPanning); + GetImpl(itemView).SetRefreshEnabled(!mIsPanning); } } } @@ -656,11 +671,15 @@ Property::Value ScrollBar::GetProperty( BaseObject* object, Property::Index inde { Property::Value value( Property::ARRAY ); Property::Array* array = value.GetArray(); - Dali::Vector positions = scrollBarImpl.GetScrollPositionIntervals(); - size_t positionCount( array->Count() ); - for( size_t i( 0 ); i != positionCount; ++i ) + + if( array ) { - array->PushBack( positions[i] ); + Dali::Vector positions = scrollBarImpl.GetScrollPositionIntervals(); + size_t positionCount( array->Count() ); + for( size_t i( 0 ); i != positionCount; ++i ) + { + array->PushBack( positions[i] ); + } } break; }