// EXTERNAL INCLUDES
#include <dali/public-api/animation/animation.h>
+#include <dali/public-api/object/type-registry-helper.h>
#include <dali/public-api/object/type-registry.h>
-#include <dali/devel-api/object/type-registry-helper.h>
-#include <dali/devel-api/rendering/cull-face.h>
//INTERNAL INCLUDES
#include <dali-toolkit/internal/controls/page-turn-view/page-turn-effect.h>
namespace Dali
{
-
namespace Toolkit
{
-
namespace Internal
{
-
namespace
{
-using namespace Dali;
-
-DALI_TYPE_REGISTRATION_BEGIN( Toolkit::PageTurnPortraitView, Toolkit::PageTurnView, NULL )
+DALI_TYPE_REGISTRATION_BEGIN(Toolkit::PageTurnPortraitView, Toolkit::PageTurnView, NULL)
DALI_TYPE_REGISTRATION_END()
// the panning speed threshold, no matter how far is the pan displacement, pan fast to left/right quickly (speed > 0.3) will turn over/back the page
// the animation duration of turning the previous page back when an outwards flick is detected
const float PAGE_TURN_OVER_ANIMATION_DURATION(0.5f);
-}
+} // namespace
-PageTurnPortraitView::PageTurnPortraitView( PageFactory& pageFactory, const Vector2& pageSize )
-: PageTurnView( pageFactory, pageSize )
+PageTurnPortraitView::PageTurnPortraitView(PageFactory& pageFactory, const Vector2& viewPageSize)
+: PageTurnView(pageFactory, viewPageSize)
{
-
}
PageTurnPortraitView::~PageTurnPortraitView()
{
}
-Toolkit::PageTurnPortraitView PageTurnPortraitView::New( PageFactory& pageFactory, const Vector2& pageSize )
+Toolkit::PageTurnPortraitView PageTurnPortraitView::New(PageFactory& pageFactory, const Vector2& viewPageSize)
{
// Create the implementation, temporarily owned on stack
- IntrusivePtr< PageTurnPortraitView > internalPageTurnView = new PageTurnPortraitView( pageFactory, pageSize );
+ IntrusivePtr<PageTurnPortraitView> internalPageTurnView = new PageTurnPortraitView(pageFactory, viewPageSize);
// Pass ownership to CustomActor
- Dali::Toolkit::PageTurnPortraitView pageTurnView( *internalPageTurnView );
+ Dali::Toolkit::PageTurnPortraitView pageTurnView(*internalPageTurnView);
// Second-phase init of the implementation
// This can only be done after the CustomActor connection has been made...
void PageTurnPortraitView::OnPageTurnViewInitialize()
{
- mControlSize = mPageSize;
- Self().SetSize( mPageSize );
- mTurningPageLayer.SetParentOrigin( ParentOrigin::CENTER_LEFT );
-}
+ mTurnEffectShader.RegisterProperty(PROPERTY_TEXTURE_WIDTH, 1.f);
+ mSpineEffectShader.RegisterProperty(PROPERTY_TEXTURE_WIDTH, 1.f);
-ImageActor PageTurnPortraitView::NewPageFromRenderBuffer( int pageIndex )
-{
- return ImageActor::New(mRenderedPage[pageIndex % NUMBER_OF_CACHED_PAGES]);
+ mControlSize = mPageSize;
+ Self().SetProperty(Actor::Property::SIZE, mPageSize);
+ mTurningPageLayer.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER_LEFT);
}
-Vector2 PageTurnPortraitView::SetPanPosition( const Vector2& gesturePosition )
+Vector2 PageTurnPortraitView::SetPanPosition(const Vector2& gesturePosition)
{
return gesturePosition;
}
-void PageTurnPortraitView::SetPanActor( const Vector2& panPosition )
-{
- if( mCurrentPageIndex < mTotalPageCount )
- {
- mPanActor = mPageActors[mCurrentPageIndex%NUMBER_OF_CACHED_PAGES];
- }
- else
- {
- mPanActor.Reset();
- }
-}
-
-void PageTurnPortraitView::SetSpineEffect(ImageActor actor, bool isLeftSide)
+void PageTurnPortraitView::SetPanActor(const Vector2& panPosition)
{
- if(isLeftSide)
+ if(mCurrentPageIndex < mTotalPageCount)
{
- actor.RemoveShaderEffect();
+ mTurningPageIndex = mCurrentPageIndex;
}
else
{
- actor.SetShaderEffect( mSpineEffectFront );
+ mTurningPageIndex = -1;
}
}
-void PageTurnPortraitView::OnPossibleOutwardsFlick( const Vector2& panPosition, float gestureSpeed )
+void PageTurnPortraitView::OnPossibleOutwardsFlick(const Vector2& panPosition, float gestureSpeed)
{
Vector2 offset = panPosition - mPressDownPosition;
// There is previous page and an outwards flick is detected
- if( mCurrentPageIndex > 0 && gestureSpeed > GESTURE_SPEED_THRESHOLD && offset.x > fabs( offset.y ))
+ if(mCurrentPageIndex > 0 && gestureSpeed > GESTURE_SPEED_THRESHOLD && offset.x > fabs(offset.y))
{
- ImageActor actor = mPageActors[ (mCurrentPageIndex-1) % NUMBER_OF_CACHED_PAGES ];
- if(actor.GetParent() != mRootOnScreen)
+ int actorIndex = (mCurrentPageIndex - 1) % NUMBER_OF_CACHED_PAGES;
+ Actor actor = mPages[actorIndex].actor;
+ if(actor.GetParent() != Self())
{
return;
}
// Guard against destruction during signal emission
//Emit signal, to notify that page[mCurrentPageIndex-1] is turning backwards
- Toolkit::PageTurnView handle( GetOwner() );
- mPageTurnStartedSignal.Emit( handle, static_cast<unsigned int>(mCurrentPageIndex-1), false );
+ Toolkit::PageTurnView handle(GetOwner());
+ mTurningPageIndex = mCurrentPageIndex - 1;
+ mPageTurnStartedSignal.Emit(handle, static_cast<unsigned int>(mTurningPageIndex), false);
//update pages
mCurrentPageIndex--;
- RemovePage( mCurrentPageIndex+NUMBER_OF_CACHED_PAGES_EACH_SIDE );
- AddPage( mCurrentPageIndex-NUMBER_OF_CACHED_PAGES_EACH_SIDE );
+ RemovePage(mCurrentPageIndex + NUMBER_OF_CACHED_PAGES_EACH_SIDE);
+ AddPage(mCurrentPageIndex - NUMBER_OF_CACHED_PAGES_EACH_SIDE);
OrganizePageDepth();
+ mPageUpdated = true;
+
+ actor.SetProperty(Actor::Property::VISIBLE, true);
// Add the page to tuning page layer and set up PageTurnEffect
- mShadowView.Add( actor );
- actor.SetShaderEffect( mTurnEffect[mIndex] );
- PageTurnApplyInternalConstraint(mTurnEffect[mIndex]);
- mIsAnimating[mIndex] = true;
- mTurnEffect[mIndex].SetUniform("uIsTurningBack", 1.f );
- Vector2 originalCenter( mPageSize.width*1.5f, 0.5f*mPageSize.height );
- mTurnEffect[mIndex].SetUniform("uOriginalCenter", originalCenter );
- mTurnEffect[mIndex].SetUniform("uCurrentCenter", Vector2( mPageSize.width*0.5f, mPageSize.height*0.5f ) );
+ mShadowView.Add(actor);
+ mPages[actorIndex].UseEffect(mTurnEffectShader);
+ mAnimatingCount++;
+ Vector2 originalCenter(mPageSize.width * 1.5f, 0.5f * mPageSize.height);
+ mPages[actorIndex].SetOriginalCenter(originalCenter);
+ mPages[actorIndex].SetCurrentCenter(Vector2(mPageSize.width * 0.5f, mPageSize.height * 0.5f));
+ PageTurnApplyInternalConstraint(actor, mPageSize.height);
// Start an animation to turn the previous page back
- Animation animation = Animation::New( PAGE_TURN_OVER_ANIMATION_DURATION );
- mAnimationActorPair[animation] = actor;
- mAnimationIndexPair[animation] = mIndex;
-
- animation.AnimateTo( Property( mTurnEffect[mIndex], "uCurrentCenter" ),
- originalCenter,
- AlphaFunction::EASE_OUT, TimePeriod(PAGE_TURN_OVER_ANIMATION_DURATION*0.75f) );
- animation.AnimateBy( Property( actor, Actor::Property::ORIENTATION ), AngleAxis( Degree( 180.0f ), Vector3::YAXIS ) ,AlphaFunction::EASE_OUT );
+ Animation animation = Animation::New(PAGE_TURN_OVER_ANIMATION_DURATION);
+ mAnimationPageIdPair[animation] = mCurrentPageIndex;
+
+ animation.AnimateTo(Property(actor, mPages[actorIndex].propertyCurrentCenter),
+ originalCenter,
+ AlphaFunction::EASE_OUT,
+ TimePeriod(PAGE_TURN_OVER_ANIMATION_DURATION * 0.75f));
+ animation.AnimateBy(Property(actor, Actor::Property::ORIENTATION), AngleAxis(Degree(180.0f), Vector3::YAXIS), AlphaFunction::EASE_OUT);
animation.Play();
- ImageActor imageActor = ImageActor::DownCast(actor);
- if( imageActor )
- {
- SetCullFace( imageActor, CullBack );
- }
- animation.FinishedSignal().Connect( this, &PageTurnPortraitView::OnTurnedOver );
+ animation.FinishedSignal().Connect(this, &PageTurnPortraitView::TurnedOverBackwards);
}
}
-void PageTurnPortraitView::OnTurnedOver( Animation& animation )
+void PageTurnPortraitView::OnTurnedOver(Actor actor, bool isLeftSide)
{
- ImageActor imageActor = ImageActor::DownCast( mAnimationActorPair[ animation ] );
- if( imageActor )
+ if(isLeftSide)
{
- SetCullFace( imageActor, CullNone );
+ actor.SetProperty(Actor::Property::VISIBLE, false);
}
- TurnedOver( animation );
+}
+
+void PageTurnPortraitView::TurnedOverBackwards(Animation& animation)
+{
+ TurnedOver(animation);
}
} // namespace Internal