Temporary removal of mesh based toolkit functionality
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / scrollable / scroll-view / scroll-overshoot-indicator-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/scrollable/scroll-view/scroll-overshoot-indicator-impl.h>
20
21 // EXTERNAL INCLUDES
22 #include <boost/bind.hpp>
23
24 // INTERNAL INCLUDES
25 #include <dali-toolkit/internal/controls/scrollable/scrollable-impl.h>
26 #include <dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h>
27
28 using namespace Dali;
29
30 namespace
31 {
32 const Vector2 OVERSHOOT_BOUNCE_ACTOR_DEFAULT_SIZE( 720.0f, 42.0f );
33 const float OVERSHOOT_BOUNCE_ACTOR_RESIZE_THRESHOLD = 180.0f;
34
35 // local helper function to resize the height of the bounce actor
36 float GetBounceActorHeight( float width )
37 {
38   return (width > OVERSHOOT_BOUNCE_ACTOR_RESIZE_THRESHOLD) ? OVERSHOOT_BOUNCE_ACTOR_DEFAULT_SIZE.height : OVERSHOOT_BOUNCE_ACTOR_DEFAULT_SIZE.height * 0.5f;
39 }
40
41 const float MAX_OVERSHOOT_NOTIFY_AMOUNT = 0.99f;                     // maximum amount to set notification for increased overshoot, beyond this we just wait for it to reduce again
42 const float MIN_OVERSHOOT_NOTIFY_AMOUNT = Math::MACHINE_EPSILON_0;  // minimum amount to set notification for reduced overshoot, beyond this we just wait for it to increase again
43 const float OVERSHOOT_NOTIFY_STEP = 0.01f;                          // amount to set notifications beyond current overshoot value
44
45 }
46
47 namespace Dali
48 {
49
50 namespace Toolkit
51 {
52
53 namespace Internal
54 {
55
56 ScrollOvershootIndicator::ScrollOvershootIndicator() :
57   mEffectX(NULL),
58   mEffectY(NULL)
59 {
60 }
61
62 ScrollOvershootIndicator::~ScrollOvershootIndicator()
63 {
64
65 }
66
67 ScrollOvershootIndicator* ScrollOvershootIndicator::New()
68 {
69   ScrollOvershootIndicator* scrollOvershootPtr = new ScrollOvershootIndicator();
70   return scrollOvershootPtr;
71 }
72
73 void ScrollOvershootIndicator::AttachToScrollable(Scrollable& scrollable)
74 {
75   if(!mEffectX)
76   {
77     mEffectX = ScrollOvershootEffectRipple::New(false, scrollable);
78   }
79   mEffectX->Apply();
80   if(!mEffectY)
81   {
82     mEffectY = ScrollOvershootEffectRipple::New(true, scrollable);
83   }
84   mEffectY->Apply();
85 }
86
87 void ScrollOvershootIndicator::DetachFromScrollable(Scrollable& scrollable)
88 {
89   if(mEffectX)
90   {
91     mEffectX->Remove(scrollable);
92   }
93   if(mEffectY)
94   {
95     mEffectY->Remove(scrollable);
96   }
97 }
98
99 void ScrollOvershootIndicator::Reset()
100 {
101   mEffectX->Reset();
102   mEffectY->Reset();
103 }
104
105 void ScrollOvershootIndicator::SetOvershootEffectColor( const Vector4& color )
106 {
107   if(mEffectX)
108   {
109     mEffectX->SetOvershootEffectColor(color);
110   }
111   if(mEffectY)
112   {
113     mEffectY->SetOvershootEffectColor(color);
114   }
115 }
116
117 void ScrollOvershootIndicator::ClearOvershoot()
118 {
119   if(mEffectX)
120   {
121     mEffectX->SetOvershoot(0.0f);
122   }
123   if(mEffectY)
124   {
125     mEffectY->SetOvershoot(0.0f);
126   }
127 }
128
129 ScrollOvershootEffect::ScrollOvershootEffect( bool vertical ) :
130     mVertical(vertical)
131 {
132
133 }
134
135 bool ScrollOvershootEffect::IsVertical() const
136 {
137   return mVertical;
138 }
139
140 ScrollOvershootEffectRipple::ScrollOvershootEffectRipple( bool vertical, Scrollable& scrollable ) :
141     ScrollOvershootEffect( vertical ),
142     mAttachedScrollView(scrollable),
143     mOvershootProperty(Property::INVALID_INDEX),
144     mEffectOvershootProperty(Property::INVALID_INDEX),
145     mOvershoot(0.0f),
146     mAnimationStateFlags(0)
147 {
148
149 }
150
151 void ScrollOvershootEffectRipple::Apply()
152 {
153   Actor self = mAttachedScrollView.Self();
154   mOvershootProperty = self.GetPropertyIndex(IsVertical() ? Toolkit::ScrollView::SCROLL_OVERSHOOT_Y_PROPERTY_NAME : Toolkit::ScrollView::SCROLL_OVERSHOOT_X_PROPERTY_NAME);
155
156   // make sure height is set, since we only create a constraint for image width
157
158
159   UpdatePropertyNotifications();
160 }
161
162 void ScrollOvershootEffectRipple::Remove( Scrollable& scrollable )
163 {
164 }
165
166 void ScrollOvershootEffectRipple::Reset()
167 {
168 }
169
170 void ScrollOvershootEffectRipple::UpdatePropertyNotifications()
171 {
172   float absOvershoot = fabsf(mOvershoot);
173
174   Actor self = mAttachedScrollView.Self();
175   // update overshoot increase notify
176   if( mOvershootIncreaseNotification )
177   {
178     self.RemovePropertyNotification( mOvershootIncreaseNotification );
179     mOvershootIncreaseNotification.Reset();
180   }
181   if( absOvershoot < MAX_OVERSHOOT_NOTIFY_AMOUNT )
182   {
183     float increaseStep = absOvershoot + OVERSHOOT_NOTIFY_STEP;
184     if( increaseStep > MAX_OVERSHOOT_NOTIFY_AMOUNT )
185     {
186       increaseStep = MAX_OVERSHOOT_NOTIFY_AMOUNT;
187     }
188     mOvershootIncreaseNotification = self.AddPropertyNotification( mOvershootProperty, OutsideCondition(-increaseStep, increaseStep) );
189     mOvershootIncreaseNotification.SetNotifyMode(PropertyNotification::NotifyOnTrue);
190     mOvershootIncreaseNotification.NotifySignal().Connect(this, &ScrollOvershootEffectRipple::OnOvershootNotification);
191   }
192
193   // update overshoot decrease notify
194   if( mOvershootDecreaseNotification )
195   {
196     self.RemovePropertyNotification( mOvershootDecreaseNotification );
197     mOvershootDecreaseNotification.Reset();
198   }
199   if( absOvershoot > MIN_OVERSHOOT_NOTIFY_AMOUNT )
200   {
201     float reduceStep = absOvershoot - OVERSHOOT_NOTIFY_STEP;
202     if( reduceStep < MIN_OVERSHOOT_NOTIFY_AMOUNT )
203     {
204       reduceStep = MIN_OVERSHOOT_NOTIFY_AMOUNT;
205     }
206     mOvershootDecreaseNotification = self.AddPropertyNotification( mOvershootProperty, InsideCondition(-reduceStep, reduceStep) );
207     mOvershootDecreaseNotification.SetNotifyMode(PropertyNotification::NotifyOnTrue);
208     mOvershootDecreaseNotification.NotifySignal().Connect(this, &ScrollOvershootEffectRipple::OnOvershootNotification);
209   }
210 }
211
212 void ScrollOvershootEffectRipple::SetOvershootEffectColor( const Vector4& color )
213 {
214 }
215
216 void ScrollOvershootEffectRipple::UpdateVisibility( bool visible )
217 {
218 }
219
220 void ScrollOvershootEffectRipple::OnOvershootNotification(PropertyNotification& source)
221 {
222   Actor self = mAttachedScrollView.Self();
223   mOvershoot = self.GetProperty<float>(mOvershootProperty);
224   SetOvershoot(mOvershoot, false);
225   UpdatePropertyNotifications();
226 }
227
228 void ScrollOvershootEffectRipple::SetOvershoot(float amount, bool animate)
229 {
230 }
231
232 void ScrollOvershootEffectRipple::OnOvershootAnimFinished(Animation& animation)
233 {
234   bool animateOff = false;
235   if( mAnimationStateFlags & AnimatingOut )
236   {
237   }
238   if( (mAnimationStateFlags & AnimateBack) )
239   {
240     animateOff = true;
241   }
242   mScrollOvershootAnimation.FinishedSignal().Disconnect( this, &ScrollOvershootEffectRipple::OnOvershootAnimFinished );
243   mScrollOvershootAnimation.Stop();
244   mScrollOvershootAnimation.Reset();
245   mAnimationStateFlags = 0;
246   if( animateOff )
247   {
248     SetOvershoot(0.0f, true);
249   }
250 }
251
252 ScrollOvershootEffectRipplePtr ScrollOvershootEffectRipple::New( bool vertical, Scrollable& scrollable )
253 {
254   return new ScrollOvershootEffectRipple(vertical, scrollable);
255 }
256
257 } // namespace Internal
258
259 } // namespace Toolkit
260
261 } // namespace Dali