Merge "Updated Gradient renderer to use SetTexture" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / scrollable / scrollable-impl.h
1 #ifndef __DALI_TOOLKIT_INTERNAL_SCROLLABLE_H__
2 #define __DALI_TOOLKIT_INTERNAL_SCROLLABLE_H__
3
4 /*
5  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/animation/alpha-function.h>
23
24 // INTERNAL INCLUDES
25 #include <dali-toolkit/public-api/controls/control-impl.h>
26 #include <dali-toolkit/public-api/controls/scrollable/scrollable.h>
27
28 namespace Dali
29 {
30
31 namespace Toolkit
32 {
33
34 namespace Internal
35 {
36
37 class Scrollable;
38 typedef IntrusivePtr<Scrollable> ScrollablePtr;
39
40 /**
41  * @copydoc Toolkit::Scrollable
42  */
43 class Scrollable : public Control
44 {
45 public:
46
47   /**
48    * @copydoc Dali::Toolkit::Scrollable::IsOvershootEnabled
49    */
50   bool IsOvershootEnabled() const;
51
52   /**
53    * @copydoc Dali::Toolkit::Scrollable::SetOvershootEnabled
54    */
55   void SetOvershootEnabled(bool enable);
56
57   /**
58    * Adds actor as an Overlay to Scrollable
59    * This method is called by Add-on UI components
60    * such as scroll bars, page indicators.
61    * @param[in] actor Actor to add as an overlay.
62    */
63   virtual void AddOverlay(Actor actor) = 0;
64
65   /**
66    * Removes overlay actor from Scrollable
67    * This method is called by Add-on UI components
68    * such as scroll bars, page indicators.
69    * @param[in] actor Actor overlay to remove.
70    */
71   virtual void RemoveOverlay(Actor actor) = 0;
72
73   /**
74    * Retrieves current scroll position.
75    * @returns The current scroll position.
76    */
77   virtual Vector2 GetCurrentScrollPosition() const = 0;
78
79   /**
80    * Scrolls Scrollable to position specified (contents will scroll to this position)
81    * Position 0,0 is the origin. Increasing X scrolls contents left, while
82    * increasing Y scrolls contents up.
83    * @param[in] position The position to scroll to.
84    * @param[in] duration The duration of the animation in seconds
85    */
86   virtual void ScrollTo(const Vector2 &position, float duration) = 0;
87
88   /**
89    * Set the color of the overshoot effect.
90    * @parm[in] color The color of the overshoot effect
91    */
92   virtual void SetOvershootEffectColor( const Vector4& color ) = 0;
93
94   /**
95    * Retrieve the color of the overshoot effect.
96    * @return The color of the overshoot effect.
97    */
98   Vector4 GetOvershootEffectColor() const;
99
100   /**
101    * @copydoc Dali::Toolkit::Scrollable::SetOvershootAnimationSpeed(float pixelsPerSecond)
102    */
103   void SetOvershootAnimationSpeed( float pixelsPerSecond );
104
105   /**
106    * @copydoc Dali::Toolkit::Scrollable::GetOvershootAnimationSpeed()
107    */
108   float GetOvershootAnimationSpeed() const;
109
110   /**
111    * @copydoc Dali::Toolkit::Scrollable::GetOvershootSize()
112    */
113   const Vector2& GetOvershootSize() const;
114
115 private:
116
117   /**
118    * Temporary function to override EnableScrollOvershoot functionality for overshoot
119    * Only ScrollView needs to override this as HQ has not requested disable functionality in ItemView
120    * @param[in] enable true to enable, false to disable overshoot indicator
121    */
122   virtual void EnableScrollOvershoot(bool enable) {}
123
124 public: //Signals
125
126   /**
127    * @copydoc Dali::Toolkit::Scrollable::ScrollStartedSignal()
128    */
129   Toolkit::Scrollable::ScrollStartedSignalType& ScrollStartedSignal();
130
131   /**
132    * @copydoc Dali::Toolkit::Scrollable::ScrollUpdatedSignal()
133    */
134   Toolkit::Scrollable::ScrollUpdatedSignalType& ScrollUpdatedSignal();
135
136   /**
137    * @copydoc Dali::Toolkit::Scrollable::ScrollCompletedSignal()
138    */
139   Toolkit::Scrollable::ScrollCompletedSignalType& ScrollCompletedSignal();
140
141   /**
142    * Connects a callback function with the object's signals.
143    * @param[in] object The object providing the signal.
144    * @param[in] tracker Used to disconnect the signal.
145    * @param[in] signalName The signal to connect to.
146    * @param[in] functor A newly allocated FunctorDelegate.
147    * @return True if the signal was connected.
148    * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the caller is responsible for deleting the unused functor.
149    */
150   static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor );
151
152   //properties
153
154   /**
155    * Called when a property of an object of this type is set.
156    * @param[in] object The object whose property is set.
157    * @param[in] index The property index.
158    * @param[in] value The new property value.
159    */
160   static void SetProperty( BaseObject* object, Property::Index index, const Property::Value& value );
161
162   /**
163    * Called to retrieve a property of an object of this type.
164    * @param[in] object The object whose property is to be retrieved.
165    * @param[in] index The property index.
166    * @return The current value of the property.
167    */
168   static Property::Value GetProperty( BaseObject* object, Property::Index index );
169
170 protected:
171
172   /**
173    * Construct a new Scrollable.
174    */
175   Scrollable();
176
177   /**
178    * @brief Construct a new Scrollable.
179    *
180    * @param[in] behaviourFlags Flags to enable
181    */
182   Scrollable( ControlBehaviour behaviourFlags );
183
184   /**
185    * A reference counted object may only be deleted by calling Unreference()
186    */
187   virtual ~Scrollable();
188
189 private:
190
191   /**
192    * Gets position property.
193    *
194    * @return The current position
195    */
196   Vector2 GetPropertyPosition() const;
197
198 private:
199
200   // Undefined
201   Scrollable(const Scrollable&);
202
203   // Undefined
204   Scrollable& operator=(const Scrollable& rhs);
205
206 protected:
207
208   Vector4         mOvershootEffectColor;    ///<The color of the overshoot bouncing effect
209   float           mOvershootAnimationSpeed; ///<The speed of the overshoot animation (pixels per second)
210   Vector2         mOvershootSize;           ///<The size of the overshoot effect
211
212   Dali::AlphaFunction::BuiltinFunction mScrollToAlphaFunction; ///< The ScrollTo() animations use this
213
214   Toolkit::Scrollable::ScrollStartedSignalType mScrollStartedSignal;
215   Toolkit::Scrollable::ScrollUpdatedSignalType mScrollUpdatedSignal;
216   Toolkit::Scrollable::ScrollCompletedSignalType mScrollCompletedSignal;
217
218 private:
219
220   bool mOvershootEnabled:1;
221 };
222
223 } // namespace Internal
224
225 // Helpers for public-api forwarding methods
226
227 inline Toolkit::Internal::Scrollable& GetImpl(Toolkit::Scrollable& scrollable)
228 {
229   DALI_ASSERT_ALWAYS(scrollable);
230
231   Dali::RefObject& handle = scrollable.GetImplementation();
232
233   return static_cast<Toolkit::Internal::Scrollable&>(handle);
234 }
235
236 inline const Toolkit::Internal::Scrollable& GetImpl(const Toolkit::Scrollable& scrollable)
237 {
238   DALI_ASSERT_ALWAYS(scrollable);
239
240   const Dali::RefObject& handle = scrollable.GetImplementation();
241
242   return static_cast<const Toolkit::Internal::Scrollable&>(handle);
243 }
244
245 } // namespace Toolkit
246
247 } // namespace Dali
248
249 #endif // __DALI_TOOLKIT_INTERNAL_SCROLLABLE_H__