Merge "Add C# binding for ItemView." 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   /**
116    * Set the size of the overshoot effect.
117    * @parm[in] size The size of the overshoot effect
118    */
119   virtual void SetOvershootSize( const Vector2& size ) = 0;
120
121 private:
122
123   /**
124    * Temporary function to override EnableScrollOvershoot functionality for overshoot
125    * Only ScrollView needs to override this as HQ has not requested disable functionality in ItemView
126    * @param[in] enable true to enable, false to disable overshoot indicator
127    */
128   virtual void EnableScrollOvershoot(bool enable) {}
129
130 public: //Signals
131
132   /**
133    * @copydoc Dali::Toolkit::Scrollable::ScrollStartedSignal()
134    */
135   Toolkit::Scrollable::ScrollStartedSignalType& ScrollStartedSignal();
136
137   /**
138    * @copydoc Dali::Toolkit::Scrollable::ScrollUpdatedSignal()
139    */
140   Toolkit::Scrollable::ScrollUpdatedSignalType& ScrollUpdatedSignal();
141
142   /**
143    * @copydoc Dali::Toolkit::Scrollable::ScrollCompletedSignal()
144    */
145   Toolkit::Scrollable::ScrollCompletedSignalType& ScrollCompletedSignal();
146
147   /**
148    * Connects a callback function with the object's signals.
149    * @param[in] object The object providing the signal.
150    * @param[in] tracker Used to disconnect the signal.
151    * @param[in] signalName The signal to connect to.
152    * @param[in] functor A newly allocated FunctorDelegate.
153    * @return True if the signal was connected.
154    * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the caller is responsible for deleting the unused functor.
155    */
156   static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor );
157
158   //properties
159
160   /**
161    * Called when a property of an object of this type is set.
162    * @param[in] object The object whose property is set.
163    * @param[in] index The property index.
164    * @param[in] value The new property value.
165    */
166   static void SetProperty( BaseObject* object, Property::Index index, const Property::Value& value );
167
168   /**
169    * Called to retrieve a property of an object of this type.
170    * @param[in] object The object whose property is to be retrieved.
171    * @param[in] index The property index.
172    * @return The current value of the property.
173    */
174   static Property::Value GetProperty( BaseObject* object, Property::Index index );
175
176 protected:
177
178   /**
179    * Construct a new Scrollable.
180    */
181   Scrollable();
182
183   /**
184    * @brief Construct a new Scrollable.
185    *
186    * @param[in] behaviourFlags Flags to enable
187    */
188   Scrollable( ControlBehaviour behaviourFlags );
189
190   /**
191    * A reference counted object may only be deleted by calling Unreference()
192    */
193   virtual ~Scrollable();
194
195 private:
196
197   /**
198    * Gets position property.
199    *
200    * @return The current position
201    */
202   Vector2 GetPropertyPosition() const;
203
204 private:
205
206   // Undefined
207   Scrollable(const Scrollable&);
208
209   // Undefined
210   Scrollable& operator=(const Scrollable& rhs);
211
212 protected:
213
214   Vector4         mOvershootEffectColor;    ///<The color of the overshoot bouncing effect
215   float           mOvershootAnimationSpeed; ///<The speed of the overshoot animation (pixels per second)
216   Vector2         mOvershootSize;           ///<The size of the overshoot effect
217
218   Dali::AlphaFunction::BuiltinFunction mScrollToAlphaFunction; ///< The ScrollTo() animations use this
219
220   Toolkit::Scrollable::ScrollStartedSignalType mScrollStartedSignal;
221   Toolkit::Scrollable::ScrollUpdatedSignalType mScrollUpdatedSignal;
222   Toolkit::Scrollable::ScrollCompletedSignalType mScrollCompletedSignal;
223
224 private:
225
226   bool mOvershootEnabled:1;
227 };
228
229 } // namespace Internal
230
231 // Helpers for public-api forwarding methods
232
233 inline Toolkit::Internal::Scrollable& GetImpl(Toolkit::Scrollable& scrollable)
234 {
235   DALI_ASSERT_ALWAYS(scrollable);
236
237   Dali::RefObject& handle = scrollable.GetImplementation();
238
239   return static_cast<Toolkit::Internal::Scrollable&>(handle);
240 }
241
242 inline const Toolkit::Internal::Scrollable& GetImpl(const Toolkit::Scrollable& scrollable)
243 {
244   DALI_ASSERT_ALWAYS(scrollable);
245
246   const Dali::RefObject& handle = scrollable.GetImplementation();
247
248   return static_cast<const Toolkit::Internal::Scrollable&>(handle);
249 }
250
251 } // namespace Toolkit
252
253 } // namespace Dali
254
255 #endif // __DALI_TOOLKIT_INTERNAL_SCROLLABLE_H__