1 #ifndef __DALI_TOOLKIT_INTERNAL_SCROLL_OVERSHOOT_INDICATOR_H__
2 #define __DALI_TOOLKIT_INTERNAL_SCROLL_OVERSHOOT_INDICATOR_H__
5 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/actors/actor.h>
23 #include <dali/public-api/animation/animation.h>
24 #include <dali/public-api/common/intrusive-ptr.h>
25 #include <dali/public-api/math/vector4.h>
26 #include <dali/public-api/object/property-notification.h>
27 #include <dali/public-api/object/ref-object.h>
38 class ScrollOvershootEffect;
39 class ScrollOvershootEffectGradient;
40 class ScrollOvershootEffectRipple;
41 typedef IntrusivePtr<ScrollOvershootEffect> ScrollOvershootEffectPtr;
42 typedef IntrusivePtr<ScrollOvershootEffectGradient> ScrollOvershootEffectGradientPtr;
43 typedef IntrusivePtr<ScrollOvershootEffectRipple> ScrollOvershootEffectRipplePtr;
45 struct ScrollOvershootIndicator : public Dali::RefObject
50 * ScrollOvershootIndicator constructor.
52 ScrollOvershootIndicator();
57 virtual ~ScrollOvershootIndicator();
60 * Attaches the scroll indicator to a scrollable actor
62 * ¶m[in] scrollable The scrollable actor to attach to
64 void AttachToScrollable(Scrollable& scrollable);
67 * Detaches the scroll indicator from a scrollable actor
69 * ¶m[in] scrollable The scrollable actor to detach from
71 void DetachFromScrollable(Scrollable& scrollable);
74 * Resets the indicator
79 * Clears the overshoot
81 void ClearOvershoot();
84 * Create an initialized ScrollOvershootIndicator
86 * @return A pointer to the created ScrollOvershootIndicator.
88 static ScrollOvershootIndicator* New();
91 * Set the color of the overshoot effect.
92 * @parm[in] color The color of the overshoot effect
94 void SetOvershootEffectColor( const Vector4& color );
97 ScrollOvershootEffectPtr mEffectX; ///< effect used for x-axis/horizontal display
98 ScrollOvershootEffectPtr mEffectY; ///< effect used for y-axis/vertical display
102 * ScrollOvershootEffect is a derivable class, designed to allow the application programmer to create their own
103 * overshoot effect and apply it with minimal implementation required
105 struct ScrollOvershootEffect : public Dali::RefObject
109 * Create a new overshoot effect, passing in whether it is vertical or horizontal
111 * @param[in] vertical whether this effect is a vertical or horizontal one
113 ScrollOvershootEffect( bool vertical );
118 virtual ~ScrollOvershootEffect() {}
121 * Returns if this is a vertical or horizontal overhoot effect
123 * @return true or false
125 bool IsVertical() const;
128 * Applies the indicator effect, all derived effects must implement this function
130 * @param[in] scrollable the scrollable object to apply this effect to
132 virtual void Apply() = 0;
135 * Removes the indicator effect, all derived effects must implement this function
137 * @param[in] scrollable the scrollable object to remove this effect from
139 virtual void Remove( Scrollable& scrollable ) = 0;
142 * Resets this overshoot effect
144 virtual void Reset() = 0;
147 * Sets up property notifications for overshoot values
149 virtual void UpdatePropertyNotifications() {}
152 * @copydoc ScrollOvershootIndicator::SetOvershootEffectColor()
154 virtual void SetOvershootEffectColor( const Vector4& color ) = 0;
157 * Sets shader overshoot value, either immediately of by animating over time
159 * @param[in] amount The amount to set overshoot to [-1.0f,1.0f]
160 * @param[in] animate Whether to animate or set immediately
162 virtual void SetOvershoot(float amount, bool animate = true) = 0;
165 bool mVertical; ///< whether this is a vertical/horizontal effect
169 * ScrollOvershootEffectRipple creates an animated bounce effect at the end of the scrollable area if the user
170 * attempts to scroll past it
172 struct ScrollOvershootEffectRipple : public ScrollOvershootEffect, public ConnectionTracker
176 AnimatingIn = 0x01, ///< animating overshoot to 0
177 AnimatingOut = 0x02, ///< animating overshoot to negative (overshoot image displays in +ve area of screen)
178 AnimateBack = 0x04, ///< indicates that we need to animate overshoot back to zero immediately after it has finished animating in
184 * Create a new gradient overshoot effect, passing in whether it is vertical or horizontal
186 * @param[in] vertical Whether this indicator is vertical or horizontal
188 ScrollOvershootEffectRipple( bool vertical, Scrollable& scrollable );
191 * @copydoc ScrollOvershootEffect::Apply
193 virtual void Apply();
196 * @copydoc ScrollOvershootEffect::Remove
198 virtual void Remove( Scrollable& scrollable );
201 * @copydoc ScrollOvershootEffect::Reset
203 virtual void Reset();
206 * @copydoc ScrollOvershootEffect::UpdatePropertyNotifications
208 void UpdatePropertyNotifications();
211 * @copydoc ScrollOvershootEffect::SetOvershootEffectColor()
213 void SetOvershootEffectColor( const Vector4& color );
216 * Updates the vibility of the overshoot image as well as updating its size, position and rotation
217 * This function is called when animation starts and finishes
219 * @param[in] visible Whether to set the image visible or not
221 void UpdateVisibility( bool visible );
224 * Informs overshoot effect to update image position and to animate effect overshoot value for a
225 * positive overshoot value from scrollview
227 * @param[in] source the property notification that triggered this callback
229 void OnOvershootNotification(PropertyNotification& source);
232 * @copydoc ScrollOvershootEffect::SetOvershoot()
234 void SetOvershoot(float amount, bool animate = true);
237 * Connects to the animation finished signal of our overshoot animation
239 * @param[in] animation the animation instance that has finished
241 void OnOvershootAnimFinished(Animation& animation);
244 * Creates a new ScrollOvershootEffectGradient objects and returns a pointer to it
246 * @param[in] vertical whether to create a vertical(true) or horizontal effect
247 * @return a pointer to the new effect
249 static ScrollOvershootEffectRipplePtr New( bool vertical, Scrollable& scrollable );
252 Actor mOvershootOverlay; ///< the actor which displays the overshoot effect
253 Scrollable& mAttachedScrollView; ///< the actor that this indicator has been attached to
254 Animation mScrollOvershootAnimation; ///< overshoot animation
255 PropertyNotification mOvershootIncreaseNotification;///< notification used to inform as overshoot increases
256 PropertyNotification mOvershootDecreaseNotification;///< notification used to inform as overshoot decreases
257 Property::Index mOvershootProperty; ///< index of the overshoot property in the scrollable actor
258 Property::Index mEffectOvershootProperty; ///< index of the effect's overshoot property
259 float mOvershoot; ///< last overshoot value as detected by notifications
260 unsigned short mAnimationStateFlags; ///< contains flags indicating the current state of the overshoot animation
263 } // namespace Internal
265 } // namespace Toolkit
269 #endif // __DALI_TOOLKIT_INTERNAL_SCROLL_OVERSHOOT_INDICATOR_H__