Property refactor in dali-toolkit: Toolkit changes
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / page-turn-view / page-turn-portrait-view-impl.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali-toolkit/internal/controls/page-turn-view/page-turn-portrait-view-impl.h>
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/animation/animation.h>
23 #include <dali/public-api/object/type-registry.h>
24 #include <dali/public-api/object/type-registry-helper.h>
25
26 namespace Dali
27 {
28
29 namespace Toolkit
30 {
31
32 namespace Internal
33 {
34
35 namespace
36 {
37 using namespace Dali;
38
39 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::PageTurnPortraitView, Toolkit::PageTurnView, NULL )
40 DALI_TYPE_REGISTRATION_END()
41
42 // 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
43 const float GESTURE_SPEED_THRESHOLD(0.3f);
44
45 // the animation duration of turning the previous page back when an outwards flick is detected
46 const float PAGE_TURN_OVER_ANIMATION_DURATION(0.5f);
47
48 }
49
50 PageTurnPortraitView::PageTurnPortraitView( PageFactory& pageFactory, const Vector2& pageSize )
51 : PageTurnView( pageFactory, pageSize )
52 {
53
54 }
55
56 PageTurnPortraitView::~PageTurnPortraitView()
57 {
58 }
59
60 Toolkit::PageTurnPortraitView PageTurnPortraitView::New( PageFactory& pageFactory, const Vector2& pageSize )
61 {
62   // Create the implementation, temporarily owned on stack
63   IntrusivePtr< PageTurnPortraitView > internalPageTurnView = new PageTurnPortraitView( pageFactory, pageSize );
64
65   // Pass ownership to CustomActor
66   Dali::Toolkit::PageTurnPortraitView pageTurnView( *internalPageTurnView );
67
68   // Second-phase init of the implementation
69   // This can only be done after the CustomActor connection has been made...
70   internalPageTurnView->Initialize();
71
72   return pageTurnView;
73 }
74
75 void PageTurnPortraitView::OnPageTurnViewInitialize()
76 {
77   mControlSize = mPageSize;
78   Self().SetSize( mPageSize );
79   mTurningPageLayer.SetParentOrigin( ParentOrigin::CENTER_LEFT );
80 }
81
82 ImageActor PageTurnPortraitView::NewPageFromRenderBuffer( int pageIndex )
83 {
84   return ImageActor::New(mRenderedPage[pageIndex % NUMBER_OF_CACHED_PAGES]);
85 }
86
87 Vector2 PageTurnPortraitView::SetPanPosition( const Vector2& gesturePosition )
88 {
89   return gesturePosition;
90 }
91
92 void PageTurnPortraitView::SetPanActor( const Vector2& panPosition )
93 {
94   if( mCurrentPageIndex < mTotalPageCount )
95   {
96     mPanActor = mPageActors[mCurrentPageIndex%NUMBER_OF_CACHED_PAGES];
97   }
98   else
99   {
100     mPanActor.Reset();
101   }
102 }
103
104 void PageTurnPortraitView::SetSpineEffect(ImageActor actor, bool isLeftSide)
105 {
106   if(isLeftSide)
107   {
108     actor.RemoveShaderEffect();
109   }
110   else
111   {
112     actor.SetShaderEffect( mSpineEffectFront );
113   }
114 }
115
116 void PageTurnPortraitView::OnPossibleOutwardsFlick( const Vector2& panPosition, float gestureSpeed )
117 {
118   Vector2 offset = panPosition - mPressDownPosition;
119   // There is previous page and an outwards flick is detected
120   if( mCurrentPageIndex > 0 && gestureSpeed > GESTURE_SPEED_THRESHOLD && offset.x > fabs( offset.y ))
121   {
122     ImageActor actor = mPageActors[ (mCurrentPageIndex-1) % NUMBER_OF_CACHED_PAGES ];
123     if(actor.GetParent() != mRootOnScreen)
124     {
125       return;
126     }
127
128     // Guard against destruction during signal emission
129     //Emit signal, to notify that page[mCurrentPageIndex-1] is turning backwards
130     Toolkit::PageTurnView handle( GetOwner() );
131     mPageTurnStartedSignal.Emit( handle, static_cast<unsigned int>(mCurrentPageIndex-1), false );
132
133     //update pages
134     mCurrentPageIndex--;
135     RemovePage( mCurrentPageIndex+NUMBER_OF_CACHED_PAGES_EACH_SIDE );
136     AddPage( mCurrentPageIndex-NUMBER_OF_CACHED_PAGES_EACH_SIDE );
137     OrganizePageDepth();
138
139     // Add the page to tuning page layer and set up PageTurnEffect
140     mShadowView.Add( actor );
141     actor.SetShaderEffect( mTurnEffect[mIndex] );
142     GetImpl( mTurnEffect[mIndex] ).ApplyInternalConstraint();
143     mIsAnimating[mIndex] = true;
144     mTurnEffect[mIndex].SetIsTurningBack( true );
145     Vector2 originalCenter( mPageSize.width*1.5f, 0.5f*mPageSize.height );
146     mTurnEffect[mIndex].SetOriginalCenter( originalCenter );
147     mTurnEffect[mIndex].SetCurrentCenter( Vector2( mPageSize.width*0.5f, mPageSize.height*0.5f ));
148
149     // Start an animation to turn the previous page back
150     Animation animation = Animation::New( PAGE_TURN_OVER_ANIMATION_DURATION );
151     mAnimationActorPair[animation] = actor;
152     mAnimationIndexPair[animation] = mIndex;
153
154     animation.AnimateTo( Property( mTurnEffect[mIndex], mTurnEffect[mIndex].PageTurnEffect::GetCurrentCenterPropertyName() ),
155                          originalCenter,
156                          AlphaFunctions::EaseOut, PAGE_TURN_OVER_ANIMATION_DURATION*0.75f );
157     animation.AnimateBy( Property( actor, Actor::Property::ROTATION ), AngleAxis( Degree( 180.0f ), Vector3::YAXIS ) ,AlphaFunctions::EaseOut );
158     animation.Play();
159     ImageActor::DownCast(actor).SetCullFace( CullBack );
160     animation.FinishedSignal().Connect( this, &PageTurnPortraitView::OnTurnedOver );
161   }
162 }
163
164 void PageTurnPortraitView::OnTurnedOver( Animation& animation )
165 {
166   ImageActor::DownCast(mAnimationActorPair[animation]).SetCullFace( CullNone );
167   TurnedOver( animation );
168 }
169
170 } // namespace Internal
171
172 } // namespace Toolkit
173
174 } // namespace Dali