| 
							- /*
 -   ==============================================================================
 - 
 -    This file is part of the JUCE library.
 -    Copyright (c) 2015 - ROLI Ltd.
 - 
 -    Permission is granted to use this software under the terms of either:
 -    a) the GPL v2 (or any later version)
 -    b) the Affero GPL v3
 - 
 -    Details of these licenses can be found at: www.gnu.org/licenses
 - 
 -    JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
 -    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 -    A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 - 
 -    ------------------------------------------------------------------------------
 - 
 -    To release a closed-source product which uses JUCE, commercial licenses are
 -    available: visit www.juce.com for more information.
 - 
 -   ==============================================================================
 - */
 - 
 - #ifndef JUCE_ANIMATEDPOSITIONBEHAVIOURS_H_INCLUDED
 - #define JUCE_ANIMATEDPOSITIONBEHAVIOURS_H_INCLUDED
 - 
 - 
 - //==============================================================================
 - /** Contains classes for different types of physics behaviours - these classes
 -     are used as template parameters for the AnimatedPosition class.
 - */
 - namespace AnimatedPositionBehaviours
 - {
 -     /** A non-snapping behaviour that allows the content to be freely flicked in
 -         either direction, with momentum based on the velocity at which it was
 -         released, and variable friction to make it come to a halt.
 - 
 -         This class is intended to be used as a template parameter to the
 -         AnimatedPosition class.
 - 
 -         @see AnimatedPosition
 -     */
 -     struct ContinuousWithMomentum
 -     {
 -         ContinuousWithMomentum() noexcept
 -             : velocity (0), damping (0.92)
 -         {
 -         }
 - 
 -         /** Sets the friction that damps the movement of the value.
 -             A typical value is 0.08; higher values indicate more friction.
 -         */
 -         void setFriction (double newFriction) noexcept
 -         {
 -             damping = 1.0 - newFriction;
 -         }
 - 
 -         /** Called by the AnimatedPosition class. This tells us the position and
 -             velocity at which the user is about to release the object.
 -             The velocity is measured in units/second.
 -         */
 -         void releasedWithVelocity (double /*position*/, double releaseVelocity) noexcept
 -         {
 -             velocity = releaseVelocity;
 -         }
 - 
 -         /** Called by the AnimatedPosition class to get the new position, after
 -             the given time has elapsed.
 -         */
 -         double getNextPosition (double oldPos, double elapsedSeconds) noexcept
 -         {
 -             velocity *= damping;
 - 
 -             if (std::abs (velocity) < 0.05)
 -                 velocity = 0;
 - 
 -             return oldPos + velocity * elapsedSeconds;
 -         }
 - 
 -         /** Called by the AnimatedPosition class to check whether the object
 -             is now stationary.
 -         */
 -         bool isStopped (double /*position*/) const noexcept
 -         {
 -             return velocity == 0;
 -         }
 - 
 -     private:
 -         double velocity, damping;
 -     };
 - 
 -     //==============================================================================
 -     /** A behaviour that gravitates an AnimatedPosition object towards the nearest
 -         integer position when released.
 - 
 -         This class is intended to be used as a template parameter to the
 -         AnimatedPosition class. It's handy when using an AnimatedPosition to show a
 -         series of pages, because it allows the pages can be scrolled smoothly, but when
 -         released, snaps back to show a whole page.
 - 
 -         @see AnimatedPosition
 -     */
 -     struct SnapToPageBoundaries
 -     {
 -         SnapToPageBoundaries() noexcept   : targetSnapPosition()
 -         {
 -         }
 - 
 -         /** Called by the AnimatedPosition class. This tells us the position and
 -             velocity at which the user is about to release the object.
 -             The velocity is measured in units/second.
 -         */
 -         void releasedWithVelocity (double position, double releaseVelocity) noexcept
 -         {
 -             targetSnapPosition = std::floor (position + 0.5);
 - 
 -             if (releaseVelocity >  1.0 && targetSnapPosition < position)  ++targetSnapPosition;
 -             if (releaseVelocity < -1.0 && targetSnapPosition > position)  --targetSnapPosition;
 -         }
 - 
 -         /** Called by the AnimatedPosition class to get the new position, after
 -             the given time has elapsed.
 -         */
 -         double getNextPosition (double oldPos, double elapsedSeconds) const noexcept
 -         {
 -             if (isStopped (oldPos))
 -                 return targetSnapPosition;
 - 
 -             const double snapSpeed = 10.0;
 -             const double velocity = (targetSnapPosition - oldPos) * snapSpeed;
 -             const double newPos = oldPos + velocity * elapsedSeconds;
 - 
 -             return isStopped (newPos) ? targetSnapPosition : newPos;
 -         }
 - 
 -         /** Called by the AnimatedPosition class to check whether the object
 -             is now stationary.
 -         */
 -         bool isStopped (double position) const noexcept
 -         {
 -             return std::abs (targetSnapPosition - position) < 0.001;
 -         }
 - 
 -     private:
 -         double targetSnapPosition;
 -     };
 - };
 - 
 - 
 - #endif   // JUCE_ANIMATEDPOSITIONBEHAVIOURS_H_INCLUDED
 
 
  |