[dali_2.3.19] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / page-turn-view / page-turn-portrait-view-impl.cpp
index cd01b9a..094de09 100644 (file)
 
 // 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>
 
 //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
@@ -48,25 +43,24 @@ const float GESTURE_SPEED_THRESHOLD(0.3f);
 // 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...
@@ -77,97 +71,94 @@ Toolkit::PageTurnPortraitView PageTurnPortraitView::New( PageFactory& pageFactor
 
 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 )
+void PageTurnPortraitView::SetPanActor(const Vector2& panPosition)
 {
-  if( mCurrentPageIndex < mTotalPageCount )
+  if(mCurrentPageIndex < mTotalPageCount)
   {
-    mPanActor = mPageActors[mCurrentPageIndex%NUMBER_OF_CACHED_PAGES];
+    mTurningPageIndex = mCurrentPageIndex;
   }
   else
   {
-    mPanActor.Reset();
+    mTurningPageIndex = -1;
   }
 }
 
-void PageTurnPortraitView::SetSpineEffect(ImageActor actor, bool isLeftSide)
-{
-  if(isLeftSide)
-  {
-    actor.RemoveShaderEffect();
-  }
-  else
-  {
-    actor.SetShaderEffect( mSpineEffectFront );
-  }
-}
-
-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", true );
-    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::DownCast(actor).SetCullFace( CullBack );
-    animation.FinishedSignal().Connect( this, &PageTurnPortraitView::OnTurnedOver );
+
+    animation.FinishedSignal().Connect(this, &PageTurnPortraitView::TurnedOverBackwards);
+  }
+}
+
+void PageTurnPortraitView::OnTurnedOver(Actor actor, bool isLeftSide)
+{
+  if(isLeftSide)
+  {
+    actor.SetProperty(Actor::Property::VISIBLE, false);
   }
 }
 
-void PageTurnPortraitView::OnTurnedOver( Animation& animation )
+void PageTurnPortraitView::TurnedOverBackwards(Animation& animation)
 {
-  ImageActor::DownCast(mAnimationActorPair[animation]).SetCullFace( CullNone );
-  TurnedOver( animation );
+  TurnedOver(animation);
 }
 
 } // namespace Internal