1 #ifndef __DALI_TOOLKIT_SCROLL_VIEW_H__
2 #define __DALI_TOOLKIT_SCROLL_VIEW_H__
5 * Copyright (c) 2015 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/animation/alpha-function.h>
25 #include <dali-toolkit/public-api/controls/scrollable/scrollable.h>
33 namespace Internal DALI_INTERNAL
38 * @addtogroup dali_toolkit_controls_scroll_view
43 * @brief How axes/rotation or scale are clamped
48 NotClamped, ///< The quantity isn't clamped. @since_tizen 2.4
49 ClampedToMin, ///< The quantity is clamped to the min value. @since_tizen 2.4
50 ClampedToMax ///< The quantity is clamped to the max value. @since_tizen 2.4
54 * @brief A 2 dimensional clamp
59 ClampState x; ///< The clamp state of the x axis
60 ClampState y; ///< The clamp state of the y axis
64 * @brief The snap type
69 Snap, ///< Snap @since_tizen 2.4
70 Flick ///< Flick @since_tizen 2.4
74 * @brief DirectionBias types
79 DirectionBiasLeft = -1, ///< Bias scroll snap to Left @since_tizen 2.4
80 DirectionBiasNone = 0, ///< Don't bias scroll snap @since_tizen 2.4
81 DirectionBiasRight = 1 ///< Bias scroll snap to Right @since_tizen 2.4
85 * @brief Used for specifying minimum/maximum extents of a ruler.
88 class DALI_IMPORT_API RulerDomain
93 * @brief Creates Ruler domain allowing a point to traverse between min and max extents.
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.
100 explicit RulerDomain(float min, float max, bool enabled = true);
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.
109 * @brief Clamps value (x) from (min) to (max).
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.
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
120 float Clamp(float x, float length = 0.0f, float scale = 1.0f) const;
123 * @brief Clamps value (x) from (min) to (max).
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.
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
135 float Clamp(float x, float length, float scale, ClampState &clamped) const;
138 * @brief Returns (max-min) size of ruler.
141 * @return The size of the ruler from min to max
143 float GetSize() const;
147 // Forward declare future extension interface
148 class RulerExtension;
151 * @brief Abstract class to define scroll axes
153 * It can specify whether they are traversable, where their snap
154 * points are and their domain.
157 class DALI_IMPORT_API Ruler : public RefObject
160 /// @brief The type of the ruler
163 Fixed, ///< A fixed ruler @since_tizen 2.4
164 Free ///< A free ruler @since_tizen 2.4
170 * @brief Constructs ruler, default enabled, with limitless domain.
176 * @brief Snaps (x) in accordance to the ruler settings
179 * @param[in] x The input value on the ruler to be snapped.
180 * @param[in] bias (optional) The biasing employed for snapping
181 * 0 floor input (floor x) "Used for Flick Left"
182 * 0.5 round input (floor x + 0.5) "Used for Release"
183 * 1 ceil input (floor x + 1.0) "Used for Flick Right"
184 * @return The position of the one dimensional point passed in once snapped.
186 virtual float Snap(float x, float bias = 0.5f) const = 0;
189 * @brief Returns position from page, based on whatever the ruler
192 * If (wrap) is true, then will set volume to the number of
193 * times page has exceeded the domain's volume (volume being the
194 * number of pages within the domain), while wrapping the position
198 * @param[in] page The page index
199 * @param[out] volume The overflow volume when the page exceeds the domain (wrap must be enabled)
200 * @param[in] wrap Enable wrap mode
201 * @return The position representing this page point
203 virtual float GetPositionFromPage(unsigned int page, unsigned int &volume, bool wrap) const = 0;
206 * @brief Returns page from position, based on whatever the ruler
209 * If (wrap) is true, then will return a page wrapped within the domain.
212 * @param[in] position The position on the domain
213 * @param[in] wrap Enable wrap mode
214 * @return The page where this position resides
216 virtual unsigned int GetPageFromPosition(float position, bool wrap) const = 0;
219 * @brief Returns the total number of pages within this Ruler.
222 * @return The number of pages in the Ruler
224 virtual unsigned int GetTotalPages() const = 0;
227 * @brief Gets the extension interface of the Ruler.
230 * @return The extension interface of the Ruler
232 virtual RulerExtension* GetExtension() { return NULL; }
237 * @brief Gets the ruler type.
240 * @return The ruler type
242 Ruler::RulerType GetType() const;
245 * @brief Returns whether this axis has been enabled or not.
248 * @return True if axis is enabled
250 bool IsEnabled() const;
253 * @brief Enables ruler (ruler must be enabled in order to traverse along it).
259 * @brief Disables ruler.
265 * @brief Sets Domain.
268 * @param[in] domain Ruler domain object
270 void SetDomain(RulerDomain domain);
273 * @brief Gets Domain.
278 const RulerDomain &GetDomain() const;
281 * @brief Disables Domain (minimum/maximum extents for this axis).
284 void DisableDomain();
287 * @brief Clamps value (x) from (min) to (max).
289 * An optional length parameter can be specified to suggest that the
290 * subject is not a point but a line that should be clamped.
293 * @param[in] x X point to be clamped between (min) and (max) extents.
294 * @param[in] length (optional) The Length of the line from (x) to (x + length) to be clamped.
295 * @param[in] scale Scaling parameter which treats domain as scaled in calculations.
296 * @return The clamped value
298 float Clamp(float x, float length = 0.0f, float scale = 1.0f) const;
302 * @brief Clamps value (x) from (min) to (max).
304 * An optional length parameter can be specified to suggest that the
305 * subject is not a point but a line to that should be clamped.
308 * @param[in] x X point to be clamped between (min) and (max) extents.
309 * @param[in] length (optional) The Length of the line from (x) to (x + length) to be clamped.
310 * @param[in] scale Scaling parameter which treats domain as scaled in calculations.
311 * @param[out] clamped Whether clamping occured and which size (None, Min or Max)
312 * @return The clamped value
314 float Clamp(float x, float length, float scale, ClampState &clamped) const;
317 * @brief Snaps and Clamps (x) in accordance to ruler settings.
320 * @param[in] x value to be snapped in accordance to ruler snap value,
321 * and clamped in accordance to the ruler's domain (if set).
322 * @param[in] bias (optional) The biasing employed for snapping
323 * 0 floor input (floor x) "Used for Flick Left"
324 * 0.5 round input (floor x + 0.5) "Used for Release"
325 * 1 ceil input (floor x + 1.0) "Used for Flick Right"
326 * @param[in] length (optional) The Length of the line from (x) to (x + length)
328 * @param[in] scale Scaling parameter which treats domain as scaled in calculations.
329 * @return The clamped value after snapping
331 float SnapAndClamp(float x, float bias = 0.5f, float length = 0.0f, float scale = 1.0f) const;
334 * @brief Snaps and Clamps (x) in accordance to ruler settings.
337 * @param[in] x value to be snapped in accordance to ruler snap value,
338 * and clamped in accordance to the ruler's domain (if set).
339 * @param[in] bias (optional) The biasing employed for snapping
340 * 0 floor input (floor x) "Used for Flick Left"
341 * 0.5 round input (floor x + 0.5) "Used for Release"
342 * 1 ceil input (floor x + 1.0) "Used for Flick Right"
343 * @param[in] length (optional) The Length of the line from (x) to (x + length)
345 * @param[in] scale Scaling parameter which treats domain as scaled in calculations.
346 * @param[out] clamped Whether clamping occured and which size (None, Min or Max)
347 * @return The clamped value after snapping
349 float SnapAndClamp(float x, float bias, float length, float scale, ClampState &clamped) const;
354 * @brief Destructor - A reference counted object may only be deleted by calling Unreference().
361 RulerType mType; ///< Type of Ruler (Fixed or Free)
362 bool mEnabled; ///< If the ruler is enabled.
363 RulerDomain mDomain; ///< The domain of the ruler
367 typedef IntrusivePtr<Ruler> RulerPtr; ///< Pointer to Ruler object @since_tizen 2.4
370 * @brief Concrete implementation of Ruler that has no snapping and has one single page.
373 class DALI_IMPORT_API DefaultRuler : public Ruler
377 * @brief DefaultRuler constructor
383 * @copydoc Toolkit::Ruler::Snap
385 virtual float Snap(float x, float bias) const;
388 * @copydoc Toolkit::Ruler::GetPositionFromPage
390 virtual float GetPositionFromPage(unsigned int page, unsigned int &volume, bool wrap) const;
393 * @copydoc Toolkit::Ruler::GetPageFromPosition
395 virtual unsigned int GetPageFromPosition(float position, bool wrap) const;
398 * @copydoc Toolkit::Ruler::GetTotalPages
400 virtual unsigned int GetTotalPages() const;
404 * @brief Concrete implementation of Ruler that has fixed snapping.
407 class DALI_IMPORT_API FixedRuler : public Ruler
414 * @param[in] spacing The spacing between each interval on this ruler
416 FixedRuler(float spacing = 1.0f);
419 * @copydoc Toolkit::Ruler::Snap
421 virtual float Snap(float x, float bias) const;
424 * @copydoc Toolkit::Ruler::GetPositionFromPage
426 virtual float GetPositionFromPage(unsigned int page, unsigned int &volume, bool wrap) const;
429 * @copydoc Toolkit::Ruler::GetPageFromPosition
431 virtual unsigned int GetPageFromPosition(float position, bool wrap) const;
434 * @copydoc Toolkit::Ruler::GetTotalPages
436 virtual unsigned int GetTotalPages() const;
439 float mSpacing; ///< The spacing between each interval
442 class ScrollViewEffect;
446 * @brief ScrollView contains actors that can be scrolled manually (via touch)
451 class DALI_IMPORT_API ScrollView : public Scrollable
457 * @brief Clamp signal event's data
462 ClampState2D scale; ///< Clamp information for scale axes
463 ClampState2D position; ///< Clamp information for position axes
464 ClampState rotation; ///< Clamp information for rotation
468 * @brief Snap signal event's data.
473 SnapType type; ///< Current snap commencing
474 Vector2 position; ///< Target snap position
475 float duration; ///< Duration of snap animation.
479 * @brief The start and end property ranges for this control.
484 ANIMATABLE_PROPERTY_START_INDEX = Toolkit::Scrollable::ANIMATABLE_PROPERTY_END_INDEX + 1,
485 ANIMATABLE_PROPERTY_END_INDEX = ANIMATABLE_PROPERTY_START_INDEX + 1000 ///< Reserve animatable property indices @since_tizen 2.4
489 * @brief An enumeration of properties belonging to the ScrollView class.
496 SCROLL_POSITION = ANIMATABLE_PROPERTY_START_INDEX, ///< Property, name "scroll-position", type Vector2 @since_tizen 2.4
497 SCROLL_PRE_POSITION, ///< Property, name "scroll-pre-position", type Vector2 @since_tizen 2.4
498 SCROLL_PRE_POSITION_X, ///< Property, name "scroll-pre-position-x", type float @since_tizen 2.4
499 SCROLL_PRE_POSITION_Y, ///< Property, name "scroll-pre-position-y", type float @since_tizen 2.4
500 SCROLL_PRE_POSITION_MAX, ///< Property, name "scroll-pre-position-max", type Vector2 @since_tizen 2.4
501 SCROLL_PRE_POSITION_MAX_X, ///< Property, name "scroll-pre-position-max-x", type float @since_tizen 2.4
502 SCROLL_PRE_POSITION_MAX_Y, ///< Property, name "scroll-pre-position-max-y", type float @since_tizen 2.4
503 OVERSHOOT_X, ///< Property, name "overshoot-x", type float @since_tizen 2.4
504 OVERSHOOT_Y, ///< Property, name "overshoot-y", type float @since_tizen 2.4
505 SCROLL_FINAL, ///< Property, name "scroll-final", type Vector2 @since_tizen 2.4
506 SCROLL_FINAL_X, ///< Property, name "scroll-final-x", type float @since_tizen 2.4
507 SCROLL_FINAL_Y, ///< Property, name "scroll-final-y", type float @since_tizen 2.4
508 WRAP, ///< Property, name "wrap", type bool @since_tizen 2.4
509 PANNING, ///< Property, name "panning", type bool @since_tizen 2.4
510 SCROLLING, ///< Property, name "scrolling", type bool @since_tizen 2.4
511 SCROLL_DOMAIN_SIZE, ///< Property, name "scroll-domain-size" type Vector2 @since_tizen 2.4
512 SCROLL_DOMAIN_SIZE_X, ///< Property, name "scroll-domain-size-x" type float @since_tizen 2.4
513 SCROLL_DOMAIN_SIZE_Y, ///< Property, name "scroll-domain-size-y" type float @since_tizen 2.4
514 SCROLL_DOMAIN_OFFSET, ///< Property, name "scroll-domain-offset" type Vector2 @since_tizen 2.4
515 SCROLL_POSITION_DELTA, ///< Property, name "scroll-position-delta" type Vector2 @since_tizen 2.4
516 START_PAGE_POSITION ///< Property, name "start-page-position" type Vector3 @since_tizen 2.4
522 typedef Signal< void ( const SnapEvent& ) > SnapStartedSignalType; ///< SnapStarted signal type @since_tizen 2.4
527 * @brief Creates an empty ScrollView handle.
533 * @brief Copy constructor
535 * Creates another handle that points to the same real object.
538 * @param[in] handle to copy from
540 ScrollView( const ScrollView& handle );
543 * @brief Assignment operator
545 * Changes this handle to point to another real object.
547 * @param[in] handle The handle to copy from
548 * @return A reference to this
550 ScrollView& operator=( const ScrollView& handle );
555 * This is non-virtual since derived Handle types must not contain data or virtual methods.
561 * @brief Create an initialized ScrollView.
564 * @return A handle to a newly allocated Dali resource.
566 static ScrollView New();
569 * @brief Downcast a handle to ScrollView handle.
571 * If handle points to a ScrollView the downcast produces valid
572 * handle. If not the returned handle is left uninitialized.
575 * @param[in] handle Handle to an object
576 * @return A handle to a ScrollView or an uninitialized handle
578 static ScrollView DownCast( BaseHandle handle );
583 * @brief Get snap-animation's AlphaFunction.
586 * @return Current easing alpha function of the snap animation
588 AlphaFunction GetScrollSnapAlphaFunction() const;
591 * @brief Set snap-animation's AlphaFunction.
594 * @param[in] alpha Easing alpha function of the snap animation
596 void SetScrollSnapAlphaFunction(AlphaFunction alpha);
599 * @brief Get flick-animation's AlphaFunction.
602 * @return Current easing alpha function of the flick animation
604 AlphaFunction GetScrollFlickAlphaFunction() const;
607 * @brief Set flick-animation's AlphaFunction.
610 * @param[in] alpha Easing alpha function of the flick animation
612 void SetScrollFlickAlphaFunction(AlphaFunction alpha);
615 * @brief Gets the time for the scroll snap-animation.
617 * This animation occurs when the user drags, and releases.
620 * @return The time in seconds for the animation to take
622 float GetScrollSnapDuration() const;
625 * @brief Sets the time for the scroll snap-animation.
627 * This animation occurs when the user drags, and releases.
630 * @param[in] time The time in seconds for the animation to take
632 void SetScrollSnapDuration(float time);
635 * @brief Gets the time for the scroll flick-animation.
637 * This animation occurs when the user flicks scroll view.
640 * @return The time in seconds for the animation to take
642 float GetScrollFlickDuration() const;
645 * @brief Sets the time for the scroll flick-animation.
647 * This animation occurs when the user flicks scroll view.
650 * @param[in] time The time in seconds for the animation to take
652 void SetScrollFlickDuration(float time);
655 * @brief Set X axis ruler.
657 * Defines how scrolling horizontally is snapped, and
658 * the boundary (domain) in which the ScrollView can pan.
661 * @param[in] ruler The ruler to be used for the X axis
663 void SetRulerX(RulerPtr ruler);
666 * @brief Set Y axis ruler.
668 * Defines how scrolling vertically is snapped, and the boundary
669 * (domain) in which the ScrollView can pan.
672 * @param[in] ruler The ruler to be used for the Y axis
674 void SetRulerY(RulerPtr ruler);
677 * @brief Set scroll sensibility of pan gesture.
680 * @param[in] sensitive True to enable scroll, false to disable scrolling
681 * @note Unlike Actor::SetSensitive(), this determines whether this ScrollView
682 * should react (e.g. pan), without disrupting the sensitivity of it's children.
685 void SetScrollSensitive(bool sensitive);
688 * @brief Set maximum overshoot amount.
690 * The final overshoot value is within 0.0f to 1.0f, but the maximum
691 * overshoot is in pixels (e.g. if you scroll 75 pixels beyond the
692 * edge of a scrollable area and the maximum overshoot is 100 then
693 * the final overshoot value will be 0.75f).
696 * @param[in] overshootX The maximum number of horizontally scrolled pixels before overshoot X reaches 1.0f
697 * @param[in] overshootY The maximum number of vertically scrolled pixels before overshoot Y reaches 1.0f
699 void SetMaxOvershoot(float overshootX, float overshootY);
702 * @brief Set Snap Overshoot animation's AlphaFunction.
705 * @param[in] alpha Easing alpha function of the overshoot snap animation.
707 void SetSnapOvershootAlphaFunction(AlphaFunction alpha);
710 * @brief Set Snap Overshoot animation's Duration.
713 * @param[in] duration The duration of the overshoot snap animation.
714 * @note Set duration to 0 seconds, to disable Animation.
717 void SetSnapOvershootDuration(float duration);
720 * @brief Enables or Disables Actor Auto-Snap mode.
722 * When Actor Auto-Snap mode has been enabled, ScrollView will automatically
723 * snap to the closest actor (The closest actor will appear in the center of
727 * @param[in] enable Enables (true), or disables (false) Actor AutoSnap
729 void SetActorAutoSnap(bool enable);
732 * @brief Enables or Disables Wrap mode for ScrollView contents.
734 * When enabled, the ScrollView contents are wrapped over the X/Y Domain.
737 * @param[in] enable Enables (true), or disables (false) Wrap Mode.
738 * @note You must apply a position constraint that causes Wrapping
742 void SetWrapMode(bool enable);
745 * @brief Gets the current distance needed to scroll for ScrollUpdatedSignal to be emitted.
748 * @return Current scroll update distance
750 int GetScrollUpdateDistance() const;
753 * @brief Sets the distance needed to scroll for ScrollUpdatedSignal to be emitted.
755 * The scroll update distance tells ScrollView how far to move before ScrollUpdatedSignal the informs application.
756 * Each time the ScrollView crosses this distance the signal will be emitted.
759 * @param[in] distance The distance for ScrollView to move before emitting update signal
761 void SetScrollUpdateDistance(int distance);
764 * @brief Returns state of Axis Auto Lock mode.
767 * @return Whether Axis Auto Lock mode has been enabled or not.
769 bool GetAxisAutoLock() const;
772 * @brief Enables or Disables Axis Auto Lock mode for panning within the ScrollView.
774 * When enabled, any pan gesture that appears mostly horizontal or mostly
775 * vertical, will be automatically restricted to horizontal only or vertical
776 * only panning, until the pan gesture has completed.
779 * @param[in] enable Enables (true), or disables (false) AxisAutoLock mode.
781 void SetAxisAutoLock(bool enable);
784 * @brief Gets the gradient threshold at which a panning gesture
785 * should be locked to the Horizontal or Vertical axis.
788 * @return The gradient, a value between 0.0 and 1.0f
790 float GetAxisAutoLockGradient() const;
793 * @brief Sets the gradient threshold at which a panning gesture should be locked to the
794 * Horizontal or Vertical axis.
796 * By default this is 0.36 (0.36:1) which means angles less than 20
797 * degrees to an axis will lock to that axis.
800 * @param[in] gradient A value between 0.0 and 1.0 (auto-lock for all angles)
801 * @note Specifying a value of 1.0 (the maximum value accepted) indicates that
802 * all panning gestures will auto-lock. Either to the horizontal or vertical axis.
805 void SetAxisAutoLockGradient(float gradient);
808 * @brief Gets the friction coefficient setting for ScrollView when
809 * flicking in free panning mode.
811 * This is a value in stage-diagonals per second^2.
812 * stage-diagonal = Length( stage.width, stage.height )
814 * @return Friction coefficient is returned.
816 float GetFrictionCoefficient() const;
819 * @brief Sets the friction coefficient for ScrollView when flicking
820 * in free panning mode.
822 * This is a value in stage-diagonals per second^2.
823 * stage-diagonal = Length( stage.width, stage.height ).
825 * A stage 480x800 in size has a diagonal length of 933.
826 * Friction coefficient of 1.0 means the swipe velocity will
827 * reduce by 1.0 * 933 pixels/sec^2.
829 * @param[in] friction Friction coefficient, must be greater than 0.0 (default = 1.0).
831 void SetFrictionCoefficient(float friction);
834 * @brief Gets the flick speed coefficient for ScrollView when
835 * flicking in free panning mode.
837 * This is a constant which multiplies the input touch
838 * flick velocity to determine the actual velocity at
839 * which to move the scrolling area.
841 * @return The flick speed coefficient is returned.
843 float GetFlickSpeedCoefficient() const;
846 * @brief Sets the flick speed coefficient for ScrollView when
847 * flicking in free panning mode.
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.
853 * @param[in] speed The flick speed coefficient (default = 1.0)
855 void SetFlickSpeedCoefficient(float speed);
858 * @brief Returns the minimum pan distance required for a flick gesture in pixels.
861 * @return Minimum pan distance vector with separate x and y distance
863 Vector2 GetMinimumDistanceForFlick() const;
866 * @brief Sets the minimum pan distance required for a flick in pixels.
868 * 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.
871 * @param[in] distance The minimum pan distance for a flick
873 void SetMinimumDistanceForFlick( const Vector2& distance );
876 * @brief Returns the minimum pan speed required for a flick gesture in pixels per second.
879 * @return Minimum pan speed
881 float GetMinimumSpeedForFlick() const;
884 * @brief Sets the minimum pan speed required for a flick in pixels per second.
887 * @param[in] speed The minimum pan speed for a flick
889 void SetMinimumSpeedForFlick( float speed );
892 * @brief Gets the maximum flick speed setting for ScrollView when
893 * flicking in free panning mode.
895 * This is a value in stage-diagonals per second.
896 * stage-diagonal = Length( stage.width, stage.height )
898 * @return Maximum flick speed is returned.
900 float GetMaxFlickSpeed() const;
903 * @brief Sets the maximum flick speed for the ScrollView when
904 * flicking in free panning mode.
906 * This is a value in stage-diagonals per second.
907 * stage-diagonal = Length( stage.width, stage.height )
909 * A stage 480x800 in size has a diagonal length of 933.
910 * Max Flick speed of 1.0 means the maximum velocity of
911 * a swipe can be 1.0 * 933 pixels/sec.
913 * @param[in] speed Maximum flick speed (default = 3.0)
915 void SetMaxFlickSpeed(float speed);
918 * @brief Gets the step of scroll distance in actor coordinates for
919 * each wheel event received in free panning mode.
922 * @return The step of scroll distance(pixel) in X and Y axes
924 Vector2 GetWheelScrollDistanceStep() const;
927 * @brief Sets the step of scroll distance in actor coordinates for
928 * each wheel event received in free panning mode.
931 * @param[in] step The step of scroll distance(pixel) in X and Y axes.
933 * @note If snap points are defined in the rulers, it will always
934 * scroll to the next snap point towards the scroll direction while
935 * receiving the wheel events.
938 void SetWheelScrollDistanceStep(Vector2 step);
941 * @brief Retrieves current scroll position.
943 * @returns The current scroll position
946 Vector2 GetCurrentScrollPosition() const;
949 * @brief Retrieves current scroll page based on ScrollView
950 * dimensions being the size of one page, and all pages laid out in
951 * a grid fashion, increasing from left to right until the end of
955 * @note Pages start from 0 as the first page, not 1.
957 * @returns The Current page
959 unsigned int GetCurrentPage() const;
962 * @brief Scrolls View to position specified (contents will scroll to this position).
964 * Position 0,0 is the origin. Increasing X scrolls contents left, while
965 * increasing Y scrolls contents up.
966 * - If Rulers have been applied to the axes, then the contents will scroll until
967 * reaching the domain boundary.
969 * @param[in] position The position to scroll to
970 * @note Contents will not snap to ruler snap points.
973 void ScrollTo(const Vector2& position);
976 * @brief Scrolls View to position specified (contents will scroll to this position).
978 * Position 0,0 is the origin. Increasing X scrolls contents left, while
979 * increasing Y scrolls contents up.
980 * - If Rulers have been applied to the axes, then the contents will scroll until
981 * reaching the domain boundary.
983 * @param[in] position The position to scroll tO
984 * @param[in] duration The duration of the animation in seconds
985 * @note Contents will not snap to ruler snap points.
988 void ScrollTo(const Vector2& position, float duration);
991 * @brief Scrolls View to position specified (contents will scroll to this position).
993 * Position 0,0 is the origin. Increasing X scrolls contents left, while
994 * increasing Y scrolls contents up.
995 * - If Rulers have been applied to the axes, then the contents will scroll until
996 * reaching the domain boundary.
998 * @param[in] position The position to scroll to
999 * @param[in] duration The duration of the animation in seconds
1000 * @param[in] alpha The alpha function to use
1001 * @note Contents will not snap to ruler snap points.
1004 void ScrollTo(const Vector2& position, float duration, AlphaFunction alpha);
1007 * @brief Scrolls View to position specified (contents will scroll to this position).
1009 * Position 0,0 is the origin. Increasing X scrolls contents left, while
1010 * increasing Y scrolls contents up.
1011 * - If Rulers have been applied to the axes, then the contents will scroll until
1012 * reaching the domain boundary.
1014 * @param[in] position The position to scroll to.
1015 * @param[in] duration The duration of the animation in seconds
1016 * @param[in] horizontalBias Whether to bias scrolling to left or right.
1017 * @param[in] verticalBias Whether to bias scrolling to top or bottom.
1018 * @note Contents will not snap to ruler snap points.
1019 * Biasing parameters are provided such that in scenarios with 2 or 2x2 pages in
1020 * wrap mode, the application developer can decide whether to scroll left or right
1021 * to get to the target page.
1024 void ScrollTo(const Vector2& position, float duration,
1025 DirectionBias horizontalBias, DirectionBias verticalBias);
1028 * @brief Scrolls View to position specified (contents will scroll to this position).
1030 * Position 0,0 is the origin. Increasing X scrolls contents left, while
1031 * increasing Y scrolls contents up.
1032 * - If Rulers have been applied to the axes, then the contents will scroll until
1033 * reaching the domain boundary.
1035 * @param[in] position The position to scroll to
1036 * @param[in] duration The duration of the animation in seconds
1037 * @param[in] horizontalBias Whether to bias scrolling to left or right.
1038 * @param[in] verticalBias Whether to bias scrolling to top or bottom.
1039 * @param[in] alpha Alpha function to use
1040 * @note Contents will not snap to ruler snap points.
1041 * Biasing parameters are provided such that in scenarios with 2 or 2x2 pages in
1042 * wrap mode, the application developer can decide whether to scroll left or right
1043 * to get to the target page.
1046 void ScrollTo(const Vector2& position, float duration, AlphaFunction alpha,
1047 DirectionBias horizontalBias, DirectionBias verticalBias);
1050 * @brief Scrolls View to page currently based on assumption that each page is
1051 * "(page) * ScrollViewSize.width, 0".
1054 * @param[in] page to scroll to
1055 * @note Should probably be upgraded so that page is an abstract class, that can be
1056 * a function of ScrollViewSize, ruler domain, ruler snap points etc. as pages may be
1057 * orchestrated in a 2D grid fashion, or variable width.
1060 void ScrollTo(unsigned int page);
1063 * @brief Scrolls View to page currently based on assumption that each page is
1064 * "(page) * ScrollViewSize.width, 0".
1067 * @param[in] page to scroll to
1068 * @param[in] duration The duration of the animation in seconds
1069 * @note Should probably be upgraded so that page is an abstract class, that can be
1070 * a function of ScrollViewSize, ruler domain, ruler snap points etc. as pages may be
1071 * orchestrated in a 2D grid fashion, or variable width.
1074 void ScrollTo(unsigned int page, float duration);
1077 * @brief Scrolls View to page currently based on assumption that each page is
1078 * "(page) * ScrollViewSize.width, 0".
1081 * @param[in] page to scroll to
1082 * @param[in] duration The duration of the animation in seconds
1083 * @param[in] bias Whether to bias scrolling to left or right.
1084 * @note Should probably be upgraded so that page is an abstract class, that can be
1085 * a function of ScrollViewSize, ruler domain, ruler snap points etc. as pages may be
1086 * orchestrated in a 2D grid fashion, or variable width.
1087 * A biasing parameter is provided such that in scenarios with 2 pages in wrap mode,
1088 * the application developer can decide whether to scroll left or right to get to
1092 void ScrollTo(unsigned int page, float duration, DirectionBias bias);
1095 * @brief Scrolls View such that actor appears in the center of the ScrollView.
1098 * @param[in] actor The actor to center in on (via Scrolling).
1099 * @note Actor must be a direct child of ScrollView, otherwise will
1100 * cause an assertion failure.
1102 void ScrollTo(Actor& actor);
1105 * @brief Scrolls View such that actor appears in the center of the ScrollView.
1108 * @param[in] actor The actor to center in on (via Scrolling)
1109 * @param[in] duration The duration of the animation in seconds
1110 * @note Actor must be a direct child of ScrollView, otherwise will
1111 * cause an assertion failure.
1113 void ScrollTo(Actor& actor, float duration);
1116 * @brief Scrolls View to the nearest snap points as specified by the Rulers.
1118 * If already at snap points, then will return false, and not scroll.
1121 * @return True if Snapping necessary.
1123 bool ScrollToSnapPoint();
1126 * @brief Applies a constraint that will affect the children of ScrollView.
1129 * @param[in] constraint The constraint to apply
1130 * @note This affects all existing and future Actors that are added to scrollview.
1132 void ApplyConstraintToChildren(Constraint constraint);
1135 * @brief Removes all constraints that will affect the children of ScrollView.
1138 * @note This removes all constraints from actors that have been added
1141 void RemoveConstraintsFromChildren();
1144 * @brief Apply Effect to ScrollView.
1147 * @param[in] effect The effect to apply to scroll view
1149 void ApplyEffect(ScrollViewEffect effect);
1152 * @brief Remove Effect from ScrollView.
1155 * @param[in] effect The effect to remove
1157 void RemoveEffect(ScrollViewEffect effect);
1160 * @brief Remove All Effects from ScrollView.
1163 void RemoveAllEffects();
1166 * @brief Binds actor to this ScrollView.
1168 * Once an actor is bound to a ScrollView, it will be subject to
1169 * that ScrollView's properties.
1172 * @param[in] child The actor to add to this ScrollView
1174 void BindActor(Actor child);
1177 * @brief Unbind Actor from this ScrollView.
1179 * Once Unbound, this ScrollView will not affect the actor.
1181 * @param[in] child The actor to be unbound
1182 * @note This does not remove the child from the ScrollView container
1185 void UnbindActor(Actor child);
1188 * @brief Allows the user to constrain the scroll view in a particular direction.
1191 * @param[in] direction The axis to constrain the scroll-view to.
1192 * Usually set to PanGestureDetector::DIRECTION_VERTICAL or PanGestureDetector::DIRECTION_HORIZONTAL (but can be any other angle if desired).
1193 * @param[in] threshold The threshold to apply around the axis
1194 * @note If no threshold is specified, then the default threshold of PI * 0.25 radians (or 45 degrees) is used.
1196 void SetScrollingDirection( Radian direction, Radian threshold = PanGestureDetector::DEFAULT_THRESHOLD );
1199 * @brief Remove a direction constraint from the scroll view.
1202 * @param[in] direction The axis to stop constraining to.
1203 * Usually will be PanGestureDetector::DIRECTION_VERTICAL or PanGestureDetector::DIRECTION_HORIZONTAL (but can be any other angle if desired).
1205 void RemoveScrollingDirection( Radian direction );
1210 * @brief Signal emitted when the ScrollView has started to snap or flick (it tells the target
1211 * position, scale, rotation for the snap or flick).
1213 * A callback of the following type may be connected:
1215 * void YourCallbackName(const SnapEvent& event);
1218 * @return The signal to connect to
1219 * @pre The Object has been initialized.
1221 SnapStartedSignalType& SnapStartedSignal();
1223 public: // Not intended for application developers
1226 * @brief Creates a handle using the Toolkit::Internal implementation.
1229 * @param[in] implementation The Control implementation
1231 DALI_INTERNAL ScrollView( Internal::ScrollView& implementation );
1234 * @brief Allows the creation of this Control from an Internal::CustomActor pointer.
1237 * @param[in] internal A pointer to the internal CustomActor
1239 explicit DALI_INTERNAL ScrollView( Dali::Internal::CustomActor* internal );
1245 } // namespace Toolkit
1249 #endif // __DALI_TOOLKIT_SCROLL_VIEW_H__