Merge "Exclude internal tag module in Public API reference" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / public-api / controls / scrollable / scroll-view / scroll-view.h
1 #ifndef __DALI_TOOLKIT_SCROLL_VIEW_H__
2 #define __DALI_TOOLKIT_SCROLL_VIEW_H__
3
4 /*
5  * Copyright (c) 2015 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/scrollable/scrollable.h>
26
27 namespace Dali
28 {
29
30 namespace Toolkit
31 {
32
33 namespace Internal DALI_INTERNAL
34 {
35 class ScrollView;
36 }
37 /**
38  * @addtogroup dali_toolkit_controls_scroll_view
39  * @{
40  */
41
42 /**
43  * @brief How axes/rotation or scale are clamped
44  * @SINCE_1_0.0
45  */
46 enum ClampState
47 {
48   NotClamped,   ///< The quantity isn't clamped @SINCE_1_0.0
49   ClampedToMin, ///< The quantity is clamped to the min value @SINCE_1_0.0
50   ClampedToMax  ///< The quantity is clamped to the max value @SINCE_1_0.0
51 };
52
53 /**
54  * @brief A 2 dimensional clamp
55  * @SINCE_1_0.0
56  */
57 struct ClampState2D
58 {
59   ClampState x; ///< The clamp state of the x axis
60   ClampState y; ///< The clamp state of the y axis
61 };
62
63 /**
64  * @brief The snap type
65  * @SINCE_1_0.0
66  */
67 enum SnapType
68 {
69   Snap,  ///< Snap @SINCE_1_0.0
70   Flick  ///< Flick @SINCE_1_0.0
71 };
72
73 /**
74  * @brief DirectionBias types.
75  * @SINCE_1_0.0
76  */
77 enum DirectionBias
78 {
79   DirectionBiasLeft  = -1,  ///< Bias scroll snap to Left @SINCE_1_0.0
80   DirectionBiasNone  =  0,  ///< Don't bias scroll snap @SINCE_1_0.0
81   DirectionBiasRight =  1   ///< Bias scroll snap to Right @SINCE_1_0.0
82 };
83
84 /**
85  * @brief Used for specifying minimum/maximum extents of a ruler.
86  * @SINCE_1_0.0
87  */
88 class DALI_IMPORT_API RulerDomain
89 {
90 public:
91
92   /**
93    * @brief Creates Ruler domain allowing a point to traverse between min and max extents.
94    *
95    * @SINCE_1_0.0
96    * @param[in] min Minimum extent (point cannot traverse less than this)
97    * @param[in] max Maximum extent (point cannot traverse greater than this)
98    * @param[in] enabled Whether domain has been enabled or not.
99    */
100   explicit RulerDomain(float min, float max, bool enabled = true);
101
102 public:
103
104   float min;    ///< Minimum extent (point cannot traverse less than this)
105   float max;    ///< Maximum extent (point cannot traverse greater than this)
106   bool enabled; ///< Whether domain has been enabled or not.
107
108   /**
109    * @brief Clamps value (x) from (min) to (max).
110    *
111    * An optional length parameter can be specified to suggest that the
112    * subject is not a point but a line to that should be clamped.
113    *
114    * @SINCE_1_0.0
115    * @param[in] x X point to be clamped between (min) and (max) extents.
116    * @param[in] length (optional) The Length of the line from (x) to (x + length) to be clamped.
117    * @param[in] scale Scaling parameter which treats domain as scaled in calculations.
118    * @return The clamped value.
119    */
120   float Clamp(float x, float length = 0.0f, float scale = 1.0f) const;
121
122   /**
123    * @brief Clamps value (x) from (min) to (max).
124    *
125    * An optional length parameter can be specified to suggest that the
126    * subject is not a point but a line to that should be clamped.
127    *
128    * @SINCE_1_0.0
129    * @param[in] x X point to be clamped between (min) and (max) extents.
130    * @param[in] length (optional) The Length of the line from (x) to (x + length) to be clamped.
131    * @param[in] scale Scaling parameter which treats domain as scaled in calculations.
132    * @param[out] clamped Whether clamping occured and which size (None, Min or Max)
133    * @return The clamped value.
134    */
135   float Clamp(float x, float length, float scale, ClampState &clamped) const;
136
137   /**
138    * @brief Returns (max-min) size of ruler.
139    *
140    * @SINCE_1_0.0
141    * @return The size of the ruler from min to max.
142    */
143   float GetSize() const;
144
145 };
146
147 // Forward declare future extension interface
148 class RulerExtension;
149
150 /**
151  * @brief Abstract class to define scroll axes.
152  *
153  * It can specify whether they are traversable, where their snap
154  * points are and their domain.
155  * @SINCE_1_0.0
156  */
157 class DALI_IMPORT_API Ruler : public RefObject
158 {
159 public:
160   /// @brief The type of the ruler
161   enum RulerType {
162     Fixed,  ///< A fixed ruler @SINCE_1_0.0
163     Free    ///< A free ruler @SINCE_1_0.0
164   };
165
166 public:
167
168   /**
169    * @brief Constructs ruler, default enabled, with limitless domain.
170    * @SINCE_1_0.0
171    */
172   Ruler();
173
174   /**
175    * @brief Snaps (x) in accordance to the ruler settings.
176    *
177    * @SINCE_1_0.0
178    * @param[in] x The input value on the ruler to be snapped.
179    * @param[in] bias (optional) The biasing employed for snapping
180    * 0 floor input (floor x) "Used for Flick Left"
181    * 0.5 round input (floor x + 0.5) "Used for Release"
182    * 1 ceil input (floor x + 1.0) "Used for Flick Right"
183    * @return The position of the one dimensional point passed in once snapped.
184    */
185   virtual float Snap(float x, float bias = 0.5f) const = 0;
186
187   /**
188    * @brief Returns position from page, based on whatever the ruler
189    * defines as a page.
190    *
191    * If (wrap) is true, then will set volume to the number of
192    * times page has exceeded the domain's volume (volume being the
193    * number of pages within the domain), while wrapping the position
194    * within the domain.
195    *
196    * @SINCE_1_0.0
197    * @param[in] page The page index
198    * @param[out] volume The overflow volume when the page exceeds the domain (wrap must be enabled)
199    * @param[in] wrap Enable wrap mode
200    * @return The position representing this page point.
201    */
202   virtual float GetPositionFromPage(unsigned int page, unsigned int &volume, bool wrap) const = 0;
203
204   /**
205    * @brief Returns page from position, based on whatever the ruler
206    * defines as a page.
207    *
208    * If (wrap) is true, then will return a page wrapped within the domain.
209    *
210    * @SINCE_1_0.0
211    * @param[in] position The position on the domain
212    * @param[in] wrap Enable wrap mode
213    * @return The page where this position resides.
214    */
215   virtual unsigned int GetPageFromPosition(float position, bool wrap) const = 0;
216
217   /**
218    * @brief Returns the total number of pages within this Ruler.
219    *
220    * @SINCE_1_0.0
221    * @return The number of pages in the Ruler.
222    */
223   virtual unsigned int GetTotalPages() const = 0;
224
225   /**
226    * @brief Gets the extension interface of the Ruler.
227    *
228    * @SINCE_1_0.0
229    * @return The extension interface of the Ruler
230    */
231   virtual RulerExtension* GetExtension() { return NULL; }
232
233 public:
234
235   /**
236    * @brief Gets the ruler type.
237    *
238    * @SINCE_1_0.0
239    * @return The ruler type.
240    */
241   Ruler::RulerType GetType() const;
242
243   /**
244    * @brief Returns whether this axis has been enabled or not.
245    *
246    * @SINCE_1_0.0
247    * @return true if axis is enabled
248    */
249   bool IsEnabled() const;
250
251   /**
252    * @brief Enables ruler (ruler must be enabled in order to traverse along it).
253    * @SINCE_1_0.0
254    */
255   void Enable();
256
257   /**
258    * @brief Disables ruler.
259    * @SINCE_1_0.0
260    */
261   void Disable();
262
263   /**
264    * @brief Sets Domain.
265    *
266    * @SINCE_1_0.0
267    * @param[in] domain Ruler domain object.
268    */
269   void SetDomain(RulerDomain domain);
270
271   /**
272    * @brief Gets Domain.
273    *
274    * @SINCE_1_0.0
275    * @return The domain
276    */
277   const RulerDomain &GetDomain() const;
278
279   /**
280    * @brief Disables Domain (minimum/maximum extents for this axis).
281    * @SINCE_1_0.0
282    */
283   void DisableDomain();
284
285   /**
286    * @brief Clamps value (x) from (min) to (max).
287    *
288    * An optional length parameter can be specified to suggest that the
289    * subject is not a point but a line that should be clamped.
290    *
291    * @SINCE_1_0.0
292    * @param[in] x X point to be clamped between (min) and (max) extents.
293    * @param[in] length (optional) The Length of the line from (x) to (x + length) to be clamped.
294    * @param[in] scale Scaling parameter which treats domain as scaled in calculations.
295    * @return The clamped value.
296    */
297   float Clamp(float x, float length = 0.0f, float scale = 1.0f) const;
298
299
300   /**
301    * @brief Clamps value (x) from (min) to (max).
302    *
303    * An optional length parameter can be specified to suggest that the
304    * subject is not a point but a line to that should be clamped.
305    *
306    * @SINCE_1_0.0
307    * @param[in] x X point to be clamped between (min) and (max) extents.
308    * @param[in] length (optional) The Length of the line from (x) to (x + length) to be clamped.
309    * @param[in] scale Scaling parameter which treats domain as scaled in calculations.
310    * @param[out] clamped Whether clamping occured and which size (None, Min or Max)
311    * @return The clamped value.
312    */
313   float Clamp(float x, float length, float scale, ClampState &clamped) const;
314
315   /**
316    * @brief Snaps and Clamps (x) in accordance to ruler settings.
317    *
318    * @SINCE_1_0.0
319    * @param[in] x value to be snapped in accordance to ruler snap value,
320    *            and clamped in accordance to the ruler's domain (if set).
321    * @param[in] bias (optional) The biasing employed for snapping
322    *            0 floor input (floor x) "Used for Flick Left"
323    *            0.5 round input (floor x + 0.5) "Used for Release"
324    *            1 ceil input (floor x + 1.0) "Used for Flick Right"
325    * @param[in] length (optional) The Length of the line from (x) to (x + length)
326    *            to be clamped.
327    * @param[in] scale Scaling parameter which treats domain as scaled in calculations.
328    * @return the clamped value after snapping
329    */
330   float SnapAndClamp(float x, float bias = 0.5f, float length = 0.0f, float scale = 1.0f) const;
331
332   /**
333    * @brief Snaps and Clamps (x) in accordance to ruler settings.
334    *
335    * @SINCE_1_0.0
336    * @param[in] x value to be snapped in accordance to ruler snap value,
337    *            and clamped in accordance to the ruler's domain (if set).
338    * @param[in] bias (optional) The biasing employed for snapping
339    * 0 floor input (floor x) "Used for Flick Left"
340    * 0.5 round input (floor x + 0.5) "Used for Release"
341    * 1 ceil input (floor x + 1.0) "Used for Flick Right"
342    * @param[in] length (optional) The Length of the line from (x) to (x + length)
343    * to be clamped.
344    * @param[in] scale Scaling parameter which treats domain as scaled in calculations.
345    * @param[out] clamped Whether clamping occured and which size (None, Min or Max)
346    * @return The clamped value after snapping
347    */
348   float SnapAndClamp(float x, float bias, float length, float scale, ClampState &clamped) const;
349
350 protected:
351
352   /**
353    * @brief Destructor - A reference counted object may only be deleted by calling Unreference().
354    * @SINCE_1_0.0
355    */
356   virtual ~Ruler();
357
358 protected:
359
360   RulerType mType;               ///< Type of Ruler (Fixed or Free).
361   bool mEnabled;                 ///< If the ruler is enabled.
362   RulerDomain mDomain;           ///< The domain of the ruler.
363
364 };
365
366 typedef IntrusivePtr<Ruler> RulerPtr; ///< Pointer to Dali::Toolkit::Ruler object @SINCE_1_0.0
367
368 /**
369  * @brief Concrete implementation of Ruler that has no snapping and has one single page.
370  * @SINCE_1_0.0
371  */
372 class DALI_IMPORT_API DefaultRuler : public Ruler
373 {
374 public:
375   /**
376    * @brief DefaultRuler constructor.
377    * @SINCE_1_0.0
378    */
379   DefaultRuler();
380
381   /**
382    * @copydoc Toolkit::Ruler::Snap
383    */
384   virtual float Snap(float x, float bias) const;
385
386   /**
387    * @copydoc Toolkit::Ruler::GetPositionFromPage
388    */
389   virtual float GetPositionFromPage(unsigned int page, unsigned int &volume, bool wrap) const;
390
391   /**
392    * @copydoc Toolkit::Ruler::GetPageFromPosition
393    */
394   virtual unsigned int GetPageFromPosition(float position, bool wrap) const;
395
396   /**
397    * @copydoc Toolkit::Ruler::GetTotalPages
398    */
399   virtual unsigned int GetTotalPages() const;
400 };
401
402 /**
403  * @brief Concrete implementation of Ruler that has fixed snapping.
404  * @SINCE_1_0.0
405  */
406 class DALI_IMPORT_API FixedRuler : public Ruler
407 {
408 public:
409   /**
410    * @brief Constructor
411    *
412    * @SINCE_1_0.0
413    * @param[in] spacing The spacing between each interval on this ruler.
414    */
415   FixedRuler(float spacing = 1.0f);
416
417   /**
418    * @copydoc Toolkit::Ruler::Snap
419    */
420   virtual float Snap(float x, float bias) const;
421
422   /**
423    * @copydoc Toolkit::Ruler::GetPositionFromPage
424    */
425   virtual float GetPositionFromPage(unsigned int page, unsigned int &volume, bool wrap) const;
426
427   /**
428    * @copydoc Toolkit::Ruler::GetPageFromPosition
429    */
430   virtual unsigned int GetPageFromPosition(float position, bool wrap) const;
431
432   /**
433    * @copydoc Toolkit::Ruler::GetTotalPages
434    */
435   virtual unsigned int GetTotalPages() const;
436
437 private:
438   float mSpacing; ///< The spacing between each interval
439 };
440
441 class ScrollViewEffect;
442 class ScrollView;
443
444 /**
445  * @brief ScrollView contains actors that can be scrolled manually (via touch)
446  * or automatically.
447  *
448  * Signals
449  * | %Signal Name      | Method                     |
450  * |-------------------|----------------------------|
451  * | snap-started      | @ref SnapStartedSignal()   |
452  * @SINCE_1_0.0
453  */
454 class DALI_IMPORT_API ScrollView : public Scrollable
455 {
456
457 public:
458
459   /**
460    * @brief Clamp signal event's data
461    * @SINCE_1_0.0
462    */
463   struct ClampEvent
464   {
465     ClampState2D scale;       ///< Clamp information for scale axes
466     ClampState2D position;    ///< Clamp information for position axes
467     ClampState   rotation;    ///< Clamp information for rotation
468   };
469
470   /**
471    * @brief Snap signal event's data.
472    * @SINCE_1_0.0
473    */
474   struct SnapEvent
475   {
476     SnapType type;    ///< Current snap commencing
477     Vector2 position; ///< Target snap position
478     float duration;   ///< Duration of snap animation.
479   };
480
481   /**
482    * @brief The start and end property ranges for this control.
483    * @SINCE_1_0.0
484    */
485   enum PropertyRange
486   {
487     PROPERTY_START_INDEX = Toolkit::Scrollable::PROPERTY_END_INDEX + 1,                        ///< @SINCE_1_1.18
488     PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000,                                        ///< Reserve property indices, @SINCE_1_1.18
489
490     ANIMATABLE_PROPERTY_START_INDEX = Toolkit::Scrollable::ANIMATABLE_PROPERTY_END_INDEX + 1,
491     ANIMATABLE_PROPERTY_END_INDEX   = ANIMATABLE_PROPERTY_START_INDEX + 1000                   ///< Reserve animatable property indices @SINCE_1_0.0
492   };
493
494   /**
495    * @brief An enumeration of properties belonging to the ScrollView class.
496    * @SINCE_1_0.0
497    */
498   struct Property
499   {
500     enum
501     {
502       // Event side properties
503       WRAP_ENABLED = PROPERTY_START_INDEX,               ///< Property, name "wrapEnabled",              @see SetWrapMode(),                 type bool,     @SINCE_1_1.18
504       PANNING_ENABLED,                                   ///< Property, name "panningEnabled",           @see SetScrollSensitive(),          type bool,     @SINCE_1_1.18
505       AXIS_AUTO_LOCK_ENABLED,                            ///< Property, name "axisAutoLockEnabled",      @see SetAxisAutoLock(),             type bool,     @SINCE_1_1.18
506       WHEEL_SCROLL_DISTANCE_STEP,                        ///< Property, name "wheelScrollDistanceStep",  @see SetWheelScrollDistanceStep(),  type Vector2,  @SINCE_1_1.18
507
508       SCROLL_POSITION = ANIMATABLE_PROPERTY_START_INDEX, ///< Property, name "scrollPosition",            type Vector2 @SINCE_1_0.0
509       SCROLL_PRE_POSITION,                               ///< Property, name "scrollPrePosition",         type Vector2 @SINCE_1_0.0
510       SCROLL_PRE_POSITION_X,                             ///< Property, name "scrollPrePositionX",        type float @SINCE_1_0.0
511       SCROLL_PRE_POSITION_Y,                             ///< Property, name "scrollPrePositionY",        type float @SINCE_1_0.0
512       SCROLL_PRE_POSITION_MAX,                           ///< Property, name "scrollPrePositionMax",      type Vector2 @SINCE_1_0.0
513       SCROLL_PRE_POSITION_MAX_X,                         ///< Property, name "scrollPrePositionMaxX",     type float @SINCE_1_0.0
514       SCROLL_PRE_POSITION_MAX_Y,                         ///< Property, name "scrollPrePositionMaxY",     type float @SINCE_1_0.0
515       OVERSHOOT_X,                                       ///< Property, name "overshootX",                type float @SINCE_1_0.0
516       OVERSHOOT_Y,                                       ///< Property, name "overshootY",                type float @SINCE_1_0.0
517       SCROLL_FINAL,                                      ///< Property, name "scrollFinal",               type Vector2 @SINCE_1_0.0
518       SCROLL_FINAL_X,                                    ///< Property, name "scrollFinalX",              type float @SINCE_1_0.0
519       SCROLL_FINAL_Y,                                    ///< Property, name "scrollFinalY",              type float @SINCE_1_0.0
520       WRAP,                                              ///< Property, name "wrap",                      type bool @SINCE_1_0.0
521       PANNING,                                           ///< Property, name "panning",                   type bool @SINCE_1_0.0
522       SCROLLING,                                         ///< Property, name "scrolling",                 type bool @SINCE_1_0.0
523       SCROLL_DOMAIN_SIZE,                                ///< Property, name "scrollDomainSize",          type Vector2 @SINCE_1_0.0
524       SCROLL_DOMAIN_SIZE_X,                              ///< Property, name "scrollDomainSizeX",         type float @SINCE_1_0.0
525       SCROLL_DOMAIN_SIZE_Y,                              ///< Property, name "scrollDomainSizeY",         type float @SINCE_1_0.0
526       SCROLL_DOMAIN_OFFSET,                              ///< Property, name "scrollDomainOffset",        type Vector2 @SINCE_1_0.0
527       SCROLL_POSITION_DELTA,                             ///< Property, name "scrollPositionDelta",       type Vector2 @SINCE_1_0.0
528       START_PAGE_POSITION                                ///< Property, name "startPagePosition",         type Vector3 @SINCE_1_0.0
529     };
530   };
531
532   // Typedefs
533
534   typedef Signal< void ( const SnapEvent& ) > SnapStartedSignalType; ///< SnapStarted signal type @SINCE_1_0.0
535
536 public:
537
538   /**
539    * @brief Creates an empty ScrollView handle.
540    * @SINCE_1_0.0
541    */
542   ScrollView();
543
544   /**
545    * @brief Copy constructor.
546    *
547    * Creates another handle that points to the same real object.
548    *
549    * @SINCE_1_0.0
550    * @param[in] handle to copy from
551    */
552   ScrollView( const ScrollView& handle );
553
554   /**
555    * @brief Assignment operator.
556    *
557    * Changes this handle to point to another real object.
558    * @SINCE_1_0.0
559    * @param[in] handle The handle to copy from
560    * @return A reference to this
561    */
562   ScrollView& operator=( const ScrollView& handle );
563
564   /**
565    * @brief Destructor
566    *
567    * This is non-virtual since derived Handle types must not contain data or virtual methods.
568    * @SINCE_1_0.0
569    */
570   ~ScrollView();
571
572   /**
573    * @brief Create an initialized ScrollView.
574    *
575    * @SINCE_1_0.0
576    * @return A handle to a newly allocated Dali resource.
577    */
578   static ScrollView New();
579
580   /**
581    * @brief Downcast a handle to ScrollView handle.
582    *
583    * If handle points to a ScrollView the downcast produces valid
584    * handle. If not the returned handle is left uninitialized.
585    *
586    * @SINCE_1_0.0
587    * @param[in] handle Handle to an object
588    * @return A handle to a ScrollView or an uninitialized handle
589    */
590   static ScrollView DownCast( BaseHandle handle );
591
592 public:
593
594   /**
595    * @brief Get snap-animation's AlphaFunction.
596    *
597    * @SINCE_1_0.0
598    * @return Current easing alpha function of the snap animation.
599    */
600   AlphaFunction GetScrollSnapAlphaFunction() const;
601
602   /**
603    * @brief Set snap-animation's AlphaFunction.
604    *
605    * @SINCE_1_0.0
606    * @param[in] alpha Easing alpha function of the snap animation.
607    */
608   void SetScrollSnapAlphaFunction(AlphaFunction alpha);
609
610   /**
611    * @brief Get flick-animation's AlphaFunction.
612    *
613    * @SINCE_1_0.0
614    * @return Current easing alpha function of the flick animation.
615    */
616   AlphaFunction GetScrollFlickAlphaFunction() const;
617
618   /**
619    * @brief Set flick-animation's AlphaFunction.
620    *
621    * @SINCE_1_0.0
622    * @param[in] alpha Easing alpha function of the flick animation.
623    */
624   void SetScrollFlickAlphaFunction(AlphaFunction alpha);
625
626   /**
627    * @brief Gets the time for the scroll snap-animation.
628    *
629    * This animation occurs when the user drags, and releases.
630    *
631    * @SINCE_1_0.0
632    * @return The time in seconds for the animation to take.
633    */
634   float GetScrollSnapDuration() const;
635
636   /**
637    * @brief Sets the time for the scroll snap-animation.
638    *
639    * This animation occurs when the user drags, and releases.
640    *
641    * @SINCE_1_0.0
642    * @param[in] time The time in seconds for the animation to take.
643    */
644   void SetScrollSnapDuration(float time);
645
646   /**
647    * @brief Gets the time for the scroll flick-animation.
648    *
649    * This animation occurs when the user flicks scroll view.
650    *
651    * @SINCE_1_0.0
652    * @return The time in seconds for the animation to take.
653    */
654   float GetScrollFlickDuration() const;
655
656   /**
657    * @brief Sets the time for the scroll flick-animation.
658    *
659    * This animation occurs when the user flicks scroll view.
660    *
661    * @SINCE_1_0.0
662    * @param[in] time The time in seconds for the animation to take.
663    */
664   void SetScrollFlickDuration(float time);
665
666   /**
667    * @brief Set X axis ruler.
668    *
669    * Defines how scrolling horizontally is snapped, and
670    * the boundary (domain) in which the ScrollView can pan.
671    *
672    * @SINCE_1_0.0
673    * @param[in] ruler The ruler to be used for the X axis
674    */
675   void SetRulerX(RulerPtr ruler);
676
677   /**
678    * @brief Set Y axis ruler.
679    *
680    * Defines how scrolling vertically is snapped, and the boundary
681    * (domain) in which the ScrollView can pan.
682    *
683    * @SINCE_1_0.0
684    * @param[in] ruler The ruler to be used for the Y axis
685    */
686   void SetRulerY(RulerPtr ruler);
687
688   /**
689    * @brief Set scroll sensibility of pan gesture.
690    *
691    * @SINCE_1_0.0
692    * @param[in] sensitive true to enable scroll, false to disable scrolling
693    * @note Unlike Actor::SetSensitive(), this determines whether this ScrollView
694    * should react (e.g. pan), without disrupting the sensitivity of it's children.
695    *
696    */
697   void SetScrollSensitive(bool sensitive);
698
699   /**
700    * @brief Set maximum overshoot amount.
701    *
702    * The final overshoot value is within 0.0f to 1.0f, but the maximum
703    * overshoot is in pixels (e.g. if you scroll 75 pixels beyond the
704    * edge of a scrollable area and the maximum overshoot is 100 then
705    * the final overshoot value will be 0.75f).
706    *
707    * @SINCE_1_0.0
708    * @param[in] overshootX The maximum number of horizontally scrolled pixels before overshoot X reaches 1.0f
709    * @param[in] overshootY The maximum number of vertically scrolled pixels before overshoot Y reaches 1.0f
710    */
711   void SetMaxOvershoot(float overshootX, float overshootY);
712
713   /**
714    * @brief Set Snap Overshoot animation's AlphaFunction.
715    *
716    * @SINCE_1_0.0
717    * @param[in] alpha Easing alpha function of the overshoot snap animation.
718    */
719   void SetSnapOvershootAlphaFunction(AlphaFunction alpha);
720
721   /**
722    * @brief Set Snap Overshoot animation's Duration.
723    *
724    * @SINCE_1_0.0
725    * @param[in] duration The duration of the overshoot snap animation.
726    * @note Set duration to 0 seconds, to disable Animation.
727    *
728    */
729   void SetSnapOvershootDuration(float duration);
730
731   /**
732    * @brief Enables or Disables Actor Auto-Snap mode.
733    *
734    * When Actor Auto-Snap mode has been enabled, ScrollView will automatically
735    * snap to the closest actor (The closest actor will appear in the center of
736    * the ScrollView).
737    *
738    * @SINCE_1_0.0
739    * @param[in] enable Enables (true), or disables (false) Actor AutoSnap
740    */
741   void SetActorAutoSnap(bool enable);
742
743   /**
744    * @brief Enables or Disables Wrap mode for ScrollView contents.
745    *
746    * When enabled, the ScrollView contents are wrapped over the X/Y Domain.
747    *
748    * @SINCE_1_0.0
749    * @param[in] enable Enables (true), or disables (false) Wrap Mode.
750    * @note You must apply a position constraint that causes Wrapping
751    * to all children.
752    *
753    */
754   void SetWrapMode(bool enable);
755
756   /**
757    * @brief Gets the current distance needed to scroll for ScrollUpdatedSignal to be emitted.
758    *
759    * @SINCE_1_0.0
760    * @return Current scroll update distance
761    */
762   int GetScrollUpdateDistance() const;
763
764   /**
765    * @brief Sets the distance needed to scroll for ScrollUpdatedSignal to be emitted.
766    *
767    * The scroll update distance tells ScrollView how far to move before ScrollUpdatedSignal the informs application.
768    * Each time the ScrollView crosses this distance the signal will be emitted.
769    *
770    * @SINCE_1_0.0
771    * @param[in] distance The distance for ScrollView to move before emitting update signal
772    */
773   void SetScrollUpdateDistance(int distance);
774
775   /**
776    * @brief Returns state of Axis Auto Lock mode.
777    *
778    * @SINCE_1_0.0
779    * @return Whether Axis Auto Lock mode has been enabled or not.
780    */
781   bool GetAxisAutoLock() const;
782
783   /**
784    * @brief Enables or Disables Axis Auto Lock mode for panning within the ScrollView.
785    *
786    * When enabled, any pan gesture that appears mostly horizontal or mostly
787    * vertical, will be automatically restricted to horizontal only or vertical
788    * only panning, until the pan gesture has completed.
789    *
790    * @SINCE_1_0.0
791    * @param[in] enable Enables (true), or disables (false) AxisAutoLock mode.
792    */
793   void SetAxisAutoLock(bool enable);
794
795   /**
796    * @brief Gets the gradient threshold at which a panning gesture
797    * should be locked to the Horizontal or Vertical axis.
798    *
799    * @SINCE_1_0.0
800    * @return The gradient, a value between 0.0 and 1.0f.
801    */
802   float GetAxisAutoLockGradient() const;
803
804   /**
805    * @brief Sets the gradient threshold at which a panning gesture should be locked to the
806    * Horizontal or Vertical axis.
807    *
808    * By default this is 0.36 (0.36:1) which means angles less than 20
809    * degrees to an axis will lock to that axis.
810    *
811    * @SINCE_1_0.0
812    * @param[in] gradient A value between 0.0 and 1.0 (auto-lock for all angles)
813    * @note Specifying a value of 1.0 (the maximum value accepted) indicates that
814    * all panning gestures will auto-lock. Either to the horizontal or vertical axis.
815    *
816    */
817   void SetAxisAutoLockGradient(float gradient);
818
819   /**
820    * @brief Gets the friction coefficient setting for ScrollView when
821    * flicking in free panning mode.
822    *
823    * This is a value in stage-diagonals per second^2.
824    * stage-diagonal = Length( stage.width, stage.height )
825    * @SINCE_1_0.0
826    * @return Friction coefficient is returned.
827    */
828   float GetFrictionCoefficient() const;
829
830   /**
831    * @brief Sets the friction coefficient for ScrollView when flicking
832    * in free panning mode.
833    *
834    * This is a value in stage-diagonals per second^2.
835    * stage-diagonal = Length( stage.width, stage.height ).
836    * example:
837    * A stage 480x800 in size has a diagonal length of 933.
838    * Friction coefficient of 1.0 means the swipe velocity will
839    * reduce by 1.0 * 933 pixels/sec^2.
840    * @SINCE_1_0.0
841    * @param[in] friction Friction coefficient, must be greater than 0.0 (default = 1.0)
842    */
843   void SetFrictionCoefficient(float friction);
844
845   /**
846    * @brief Gets the flick speed coefficient for ScrollView when
847    * flicking in free panning mode.
848    *
849    * This is a constant which multiplies the input touch
850    * flick velocity to determine the actual velocity at
851    * which to move the scrolling area.
852    * @SINCE_1_0.0
853    * @return The flick speed coefficient is returned.
854    */
855   float GetFlickSpeedCoefficient() const;
856
857   /**
858    * @brief Sets the flick speed coefficient for ScrollView when
859    * flicking in free panning mode.
860    *
861    * This is a constant which multiplies the input touch
862    * flick velocity to determine the actual velocity at
863    * which to move the scrolling area.
864    * @SINCE_1_0.0
865    * @param[in] speed The flick speed coefficient (default = 1.0).
866    */
867   void SetFlickSpeedCoefficient(float speed);
868
869   /**
870    * @brief Returns the minimum pan distance required for a flick gesture in pixels.
871    *
872    * @SINCE_1_0.0
873    * @return Minimum pan distance vector with separate x and y distance
874    */
875   Vector2 GetMinimumDistanceForFlick() const;
876
877   /**
878    * @brief Sets the minimum pan distance required for a flick in pixels.
879    *
880    * Takes a Vector2 containing separate x and y values. As long as the pan distance exceeds one of these axes a flick will be allowed.
881    *
882    * @SINCE_1_0.0
883    * @param[in] distance The minimum pan distance for a flick
884    */
885   void SetMinimumDistanceForFlick( const Vector2& distance );
886
887   /**
888    * @brief Returns the minimum pan speed required for a flick gesture in pixels per second.
889    *
890    * @SINCE_1_0.0
891    * @return Minimum pan speed
892    */
893   float GetMinimumSpeedForFlick() const;
894
895   /**
896    * @brief Sets the minimum pan speed required for a flick in pixels per second.
897    *
898    * @SINCE_1_0.0
899    * @param[in] speed The minimum pan speed for a flick
900    */
901   void SetMinimumSpeedForFlick( float speed );
902
903   /**
904    * @brief Gets the maximum flick speed setting for ScrollView when
905    * flicking in free panning mode.
906    *
907    * This is a value in stage-diagonals per second.
908    * stage-diagonal = Length( stage.width, stage.height )
909    * @SINCE_1_0.0
910    * @return Maximum flick speed is returned
911    */
912   float GetMaxFlickSpeed() const;
913
914   /**
915    * @brief Sets the maximum flick speed for the ScrollView when
916    * flicking in free panning mode.
917    *
918    * This is a value in stage-diagonals per second.
919    * stage-diagonal = Length( stage.width, stage.height )
920    * example:
921    * A stage 480x800 in size has a diagonal length of 933.
922    * Max Flick speed of 1.0 means the maximum velocity of
923    * a swipe can be 1.0 * 933 pixels/sec.
924    * @SINCE_1_0.0
925    * @param[in] speed Maximum flick speed (default = 3.0)
926    */
927   void SetMaxFlickSpeed(float speed);
928
929   /**
930    * @brief Gets the step of scroll distance in actor coordinates for
931    * each wheel event received in free panning mode.
932    *
933    * @SINCE_1_0.0
934    * @return The step of scroll distance(pixel) in X and Y axes.
935    */
936   Vector2 GetWheelScrollDistanceStep() const;
937
938   /**
939    * @brief Sets the step of scroll distance in actor coordinates for
940    * each wheel event received in free panning mode.
941    *
942    * @SINCE_1_0.0
943    * @param[in] step The step of scroll distance(pixel) in X and Y axes.
944    *
945    * @note If snap points are defined in the rulers, it will always
946    * scroll to the next snap point towards the scroll direction while
947    * receiving the wheel events.
948    *
949    */
950   void SetWheelScrollDistanceStep(Vector2 step);
951
952   /**
953    * @brief Retrieves current scroll position.
954    *
955    * @returns The current scroll position.
956    * @SINCE_1_0.0
957    */
958   Vector2 GetCurrentScrollPosition() const;
959
960   /**
961    * @brief Retrieves current scroll page based on ScrollView
962    * dimensions being the size of one page, and all pages laid out in
963    * a grid fashion, increasing from left to right until the end of
964    * the X-domain.
965    *
966    * @SINCE_1_0.0
967    * @note Pages start from 0 as the first page, not 1.
968    *
969    * @returns The Current page.
970    */
971   unsigned int GetCurrentPage() const;
972
973   /**
974    * @brief Scrolls View to position specified (contents will scroll to this position).
975    *
976    * Position 0,0 is the origin. Increasing X scrolls contents left, while
977    * increasing Y scrolls contents up.
978    * - If Rulers have been applied to the axes, then the contents will scroll until
979    * reaching the domain boundary.
980    * @SINCE_1_0.0
981    * @param[in] position The position to scroll to.
982    * @note Contents will not snap to ruler snap points.
983    *
984    */
985   void ScrollTo(const Vector2& position);
986
987   /**
988    * @brief Scrolls View to position specified (contents will scroll to this position).
989    *
990    * Position 0,0 is the origin. Increasing X scrolls contents left, while
991    * increasing Y scrolls contents up.
992    * - If Rulers have been applied to the axes, then the contents will scroll until
993    * reaching the domain boundary.
994    * @SINCE_1_0.0
995    * @param[in] position The position to scroll to.
996    * @param[in] duration The duration of the animation in seconds
997    * @note Contents will not snap to ruler snap points.
998    *
999    */
1000   void ScrollTo(const Vector2& position, float duration);
1001
1002   /**
1003    * @brief Scrolls View to position specified (contents will scroll to this position).
1004    *
1005    * Position 0,0 is the origin. Increasing X scrolls contents left, while
1006    * increasing Y scrolls contents up.
1007    * - If Rulers have been applied to the axes, then the contents will scroll until
1008    * reaching the domain boundary.
1009    * @SINCE_1_0.0
1010    * @param[in] position The position to scroll to.
1011    * @param[in] duration The duration of the animation in seconds
1012    * @param[in] alpha The alpha function to use
1013    * @note Contents will not snap to ruler snap points.
1014    *
1015    */
1016   void ScrollTo(const Vector2& position, float duration, AlphaFunction alpha);
1017
1018   /**
1019    * @brief Scrolls View to position specified (contents will scroll to this position).
1020    *
1021    * Position 0,0 is the origin. Increasing X scrolls contents left, while
1022    * increasing Y scrolls contents up.
1023    * - If Rulers have been applied to the axes, then the contents will scroll until
1024    * reaching the domain boundary.
1025    * @SINCE_1_0.0
1026    * @param[in] position The position to scroll to.
1027    * @param[in] duration The duration of the animation in seconds
1028    * @param[in] horizontalBias Whether to bias scrolling to left or right.
1029    * @param[in] verticalBias Whether to bias scrolling to top or bottom.
1030    * @note Contents will not snap to ruler snap points.
1031    * Biasing parameters are provided such that in scenarios with 2 or 2x2 pages in
1032    * wrap mode, the application developer can decide whether to scroll left or right
1033    * to get to the target page.
1034    *
1035    */
1036   void ScrollTo(const Vector2& position, float duration,
1037                 DirectionBias horizontalBias, DirectionBias verticalBias);
1038
1039   /**
1040    * @brief Scrolls View to position specified (contents will scroll to this position).
1041    *
1042    * Position 0,0 is the origin. Increasing X scrolls contents left, while
1043    * increasing Y scrolls contents up.
1044    * - If Rulers have been applied to the axes, then the contents will scroll until
1045    * reaching the domain boundary.
1046    * @SINCE_1_0.0
1047    * @param[in] position The position to scroll to.
1048    * @param[in] duration The duration of the animation in seconds
1049    * @param[in] horizontalBias Whether to bias scrolling to left or right.
1050    * @param[in] verticalBias Whether to bias scrolling to top or bottom.
1051    * @param[in] alpha Alpha function to use
1052    * @note Contents will not snap to ruler snap points.
1053    * Biasing parameters are provided such that in scenarios with 2 or 2x2 pages in
1054    * wrap mode, the application developer can decide whether to scroll left or right
1055    * to get to the target page.
1056    *
1057    */
1058   void ScrollTo(const Vector2& position, float duration, AlphaFunction alpha,
1059                 DirectionBias horizontalBias, DirectionBias verticalBias);
1060
1061   /**
1062    * @brief Scrolls View to page currently based on assumption that each page is
1063    * "(page) * ScrollViewSize.width, 0".
1064    *
1065    * @SINCE_1_0.0
1066    * @param[in] page to scroll to
1067    * @note Should probably be upgraded so that page is an abstract class, that can be
1068    * a function of ScrollViewSize, ruler domain, ruler snap points etc. as pages may be
1069    * orchestrated in a 2D grid fashion, or variable width.
1070    *
1071    */
1072   void ScrollTo(unsigned int page);
1073
1074   /**
1075    * @brief Scrolls View to page currently based on assumption that each page is
1076    * "(page) * ScrollViewSize.width, 0".
1077    *
1078    * @SINCE_1_0.0
1079    * @param[in] page to scroll to
1080    * @param[in] duration The duration of the animation in seconds
1081    * @note Should probably be upgraded so that page is an abstract class, that can be
1082    * a function of ScrollViewSize, ruler domain, ruler snap points etc. as pages may be
1083    * orchestrated in a 2D grid fashion, or variable width.
1084    *
1085    */
1086   void ScrollTo(unsigned int page, float duration);
1087
1088   /**
1089    * @brief Scrolls View to page currently based on assumption that each page is
1090    * "(page) * ScrollViewSize.width, 0".
1091    *
1092    * @SINCE_1_0.0
1093    * @param[in] page to scroll to
1094    * @param[in] duration The duration of the animation in seconds
1095    * @param[in] bias Whether to bias scrolling to left or right.
1096    * @note Should probably be upgraded so that page is an abstract class, that can be
1097    * a function of ScrollViewSize, ruler domain, ruler snap points etc. as pages may be
1098    * orchestrated in a 2D grid fashion, or variable width.
1099    * A biasing parameter is provided such that in scenarios with 2 pages in wrap mode,
1100    * the application developer can decide whether to scroll left or right to get to
1101    * the target page.
1102    *
1103    */
1104   void ScrollTo(unsigned int page, float duration, DirectionBias bias);
1105
1106   /**
1107    * @brief Scrolls View such that actor appears in the center of the ScrollView.
1108    *
1109    * @SINCE_1_0.0
1110    * @param[in] actor The actor to center in on (via Scrolling).
1111    * @note Actor must be a direct child of ScrollView, otherwise will
1112    * cause an assertion failure.
1113    */
1114   void ScrollTo(Actor& actor);
1115
1116   /**
1117    * @brief Scrolls View such that actor appears in the center of the ScrollView.
1118    *
1119    * @SINCE_1_0.0
1120    * @param[in] actor The actor to center in on (via Scrolling).
1121    * @param[in] duration The duration of the animation in seconds
1122    * @note Actor must be a direct child of ScrollView, otherwise will
1123    * cause an assertion failure.
1124    */
1125   void ScrollTo(Actor& actor, float duration);
1126
1127   /**
1128    * @brief Scrolls View to the nearest snap points as specified by the Rulers.
1129    *
1130    * If already at snap points, then will return false, and not scroll.
1131    *
1132    * @SINCE_1_0.0
1133    * @return True if Snapping necessary.
1134    */
1135   bool ScrollToSnapPoint();
1136
1137   /**
1138    * @brief Applies a constraint that will affect the children of ScrollView.
1139    *
1140    * @SINCE_1_0.0
1141    * @param[in] constraint The constraint to apply
1142    * @note This affects all existing and future Actors that are added to scrollview.
1143    */
1144   void ApplyConstraintToChildren(Constraint constraint);
1145
1146   /**
1147    * @brief Removes all constraints that will affect the children of ScrollView.
1148    *
1149    * @SINCE_1_0.0
1150    * @note This removes all constraints from actors that have been added
1151    * to scrollview.
1152    */
1153   void RemoveConstraintsFromChildren();
1154
1155   /**
1156    * @brief Apply Effect to ScrollView.
1157    *
1158    * @SINCE_1_0.0
1159    * @param[in] effect The effect to apply to scroll view
1160    */
1161   void ApplyEffect(ScrollViewEffect effect);
1162
1163   /**
1164    * @brief Remove Effect from ScrollView.
1165    *
1166    * @SINCE_1_0.0
1167    * @param[in] effect The effect to remove.
1168    */
1169   void RemoveEffect(ScrollViewEffect effect);
1170
1171   /**
1172    * @brief Remove All Effects from ScrollView.
1173    * @SINCE_1_0.0
1174    */
1175   void RemoveAllEffects();
1176
1177   /**
1178    * @brief Binds actor to this ScrollView.
1179    *
1180    * Once an actor is bound to a ScrollView, it will be subject to
1181    * that ScrollView's properties.
1182    *
1183    * @SINCE_1_0.0
1184    * @param[in] child The actor to add to this ScrollView.
1185    */
1186   void BindActor(Actor child);
1187
1188   /**
1189    * @brief Unbind Actor from this ScrollView.
1190    *
1191    * Once Unbound, this ScrollView will not affect the actor.
1192    * @SINCE_1_0.0
1193    * @param[in] child The actor to be unbound.
1194    * @note This does not remove the child from the ScrollView container
1195    *
1196    */
1197   void UnbindActor(Actor child);
1198
1199   /**
1200    * @brief Allows the user to constrain the scroll view in a particular direction.
1201    *
1202    * @SINCE_1_0.0
1203    * @param[in] direction The axis to constrain the scroll-view to.
1204    *                      Usually set to PanGestureDetector::DIRECTION_VERTICAL or PanGestureDetector::DIRECTION_HORIZONTAL (but can be any other angle if desired).
1205    * @param[in] threshold The threshold to apply around the axis.
1206    * @note If no threshold is specified, then the default threshold of PI * 0.25 radians (or 45 degrees) is used.
1207    */
1208   void SetScrollingDirection( Radian direction, Radian threshold = PanGestureDetector::DEFAULT_THRESHOLD );
1209
1210   /**
1211    * @brief Remove a direction constraint from the scroll view.
1212    *
1213    * @SINCE_1_0.0
1214    * @param[in] direction The axis to stop constraining to.
1215    *                      Usually will be PanGestureDetector::DIRECTION_VERTICAL or PanGestureDetector::DIRECTION_HORIZONTAL (but can be any other angle if desired).
1216    */
1217   void RemoveScrollingDirection( Radian direction );
1218
1219 public: // Signals
1220
1221   /**
1222    * @brief Signal emitted when the ScrollView has started to snap or flick (it tells the target
1223    * position, scale, rotation for the snap or flick).
1224    *
1225    * A callback of the following type may be connected:
1226    * @code
1227    *   void YourCallbackName(const SnapEvent& event);
1228    * @endcode
1229    * @SINCE_1_0.0
1230    * @return The signal to connect to.
1231    * @pre The Object has been initialized.
1232    */
1233   SnapStartedSignalType& SnapStartedSignal();
1234
1235 public: // Not intended for application developers
1236
1237   /// @cond internal
1238   /**
1239    * @brief Creates a handle using the Toolkit::Internal implementation.
1240    *
1241    * @SINCE_1_0.0
1242    * @param[in]  implementation  The Control implementation.
1243    */
1244   DALI_INTERNAL ScrollView(Internal::ScrollView& implementation);
1245
1246   /**
1247    * @brief Allows the creation of this Control from an Internal::CustomActor pointer.
1248    *
1249    * @SINCE_1_0.0
1250    * @param[in]  internal  A pointer to the internal CustomActor.
1251    */
1252   explicit DALI_INTERNAL ScrollView( Dali::Internal::CustomActor* internal );
1253   /// @endcond
1254 };
1255
1256 /**
1257  * @}
1258  */
1259 } // namespace Toolkit
1260
1261 } // namespace Dali
1262
1263 #endif // __DALI_TOOLKIT_SCROLL_VIEW_H__