openshot-audio  0.1.2
juce_AnimatedPosition.h
Go to the documentation of this file.
1 /*
2  ==============================================================================
3 
4  This file is part of the JUCE library.
5  Copyright (c) 2015 - ROLI Ltd.
6 
7  Permission is granted to use this software under the terms of either:
8  a) the GPL v2 (or any later version)
9  b) the Affero GPL v3
10 
11  Details of these licenses can be found at: www.gnu.org/licenses
12 
13  JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
14  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15  A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 
17  ------------------------------------------------------------------------------
18 
19  To release a closed-source product which uses JUCE, commercial licenses are
20  available: visit www.juce.com for more information.
21 
22  ==============================================================================
23 */
24 
25 #ifndef JUCE_ANIMATEDPOSITION_H_INCLUDED
26 #define JUCE_ANIMATEDPOSITION_H_INCLUDED
27 
28 
29 //==============================================================================
50 template <typename Behaviour>
51 class AnimatedPosition : private Timer
52 {
53 public:
55  : position(), grabbedPos(), releaseVelocity(),
56  range (-std::numeric_limits<double>::max(),
57  std::numeric_limits<double>::max())
58  {
59  }
60 
62  void setLimits (Range<double> newRange)
63  {
64  range = newRange;
65  }
66 
67  //==============================================================================
76  void beginDrag()
77  {
78  grabbedPos = position;
79  releaseVelocity = 0;
80  stopTimer();
81  }
82 
87  void drag (double deltaFromStartOfDrag)
88  {
89  moveTo (grabbedPos + deltaFromStartOfDrag);
90  }
91 
95  void endDrag()
96  {
97  startTimerHz (60);
98  }
99 
103  void nudge (double deltaFromCurrentPosition)
104  {
105  startTimerHz (10);
106  moveTo (position + deltaFromCurrentPosition);
107  }
108 
109  //==============================================================================
112  {
113  return position;
114  }
115 
120  void setPosition (double newPosition)
121  {
122  stopTimer();
123  setPositionAndSendChange (newPosition);
124  }
125 
126  //==============================================================================
131  class Listener
132  {
133  public:
134  virtual ~Listener() {}
135 
137  virtual void positionChanged (AnimatedPosition&, double newPosition) = 0;
138  };
139 
141  void addListener (Listener* listener) { listeners.add (listener); }
142 
144  void removeListener (Listener* listener) { listeners.remove (listener); }
145 
146  //==============================================================================
150  Behaviour behaviour;
151 
152 private:
153  //==============================================================================
154  double position, grabbedPos, releaseVelocity;
155  Range<double> range;
156  Time lastUpdate, lastDrag;
157  ListenerList<Listener> listeners;
158 
159  static double getSpeed (const Time last, double lastPos,
160  const Time now, double newPos)
161  {
162  const double elapsedSecs = jmax (0.005, (now - last).inSeconds());
163  const double v = (newPos - lastPos) / elapsedSecs;
164  return std::abs (v) > 0.2 ? v : 0.0;
165  }
166 
167  void moveTo (double newPos)
168  {
169  const Time now (Time::getCurrentTime());
170  releaseVelocity = getSpeed (lastDrag, position, now, newPos);
171  behaviour.releasedWithVelocity (newPos, releaseVelocity);
172  lastDrag = now;
173 
174  setPositionAndSendChange (newPos);
175  }
176 
177  void setPositionAndSendChange (double newPosition)
178  {
179  newPosition = range.clipValue (newPosition);
180 
181  if (position != newPosition)
182  {
183  position = newPosition;
184  listeners.call (&Listener::positionChanged, *this, newPosition);
185  }
186  }
187 
188  void timerCallback() override
189  {
190  const Time now = Time::getCurrentTime();
191 
192  const double elapsed = jlimit (0.001, 0.020, (now - lastUpdate).inSeconds());
193  lastUpdate = now;
194 
195  const double newPos = behaviour.getNextPosition (position, elapsed);
196 
197  if (behaviour.isStopped (newPos))
198  stopTimer();
199  else
200  startTimerHz (60);
201 
202  setPositionAndSendChange (newPos);
203  }
204 
206 };
207 
208 
209 #endif // JUCE_ANIMATEDPOSITION_H_INCLUDED
AnimatedPosition()
Definition: juce_AnimatedPosition.h:54
double getPosition() const noexcept
Definition: juce_AnimatedPosition.h:111
#define noexcept
Definition: juce_CompilerSupport.h:141
virtual ~Listener()
Definition: juce_AnimatedPosition.h:134
Definition: juce_Time.h:41
void setPosition(double newPosition)
Definition: juce_AnimatedPosition.h:120
Definition: juce_Range.h:44
void setLimits(Range< double > newRange)
Definition: juce_AnimatedPosition.h:62
Behaviour behaviour
Definition: juce_AnimatedPosition.h:150
ValueType clipValue(const ValueType value) const noexcept
Definition: juce_Range.h:218
void addListener(Listener *listener)
Definition: juce_AnimatedPosition.h:141
void startTimerHz(int timerFrequencyHz) noexcept
Definition: juce_Timer.cpp:335
#define const
Definition: juce_ListenerList.h:69
Type jmax(const Type a, const Type b)
Definition: juce_core.h:101
void endDrag()
Definition: juce_AnimatedPosition.h:95
void removeListener(Listener *listener)
Definition: juce_AnimatedPosition.h:144
void nudge(double deltaFromCurrentPosition)
Definition: juce_AnimatedPosition.h:103
void stopTimer() noexcept
Definition: juce_Timer.cpp:343
Type jlimit(const Type lowerLimit, const Type upperLimit, const Type valueToConstrain) noexcept
Definition: juce_MathsFunctions.h:220
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
Definition: juce_PlatformDefs.h:198
void call(void(ListenerClass::*callbackFunction)())
Definition: juce_ListenerList.h:146
static Time JUCE_CALLTYPE getCurrentTime() noexcept
Definition: juce_Time.cpp:213
Definition: juce_Timer.h:52
#define max(x, y)
Definition: os.h:79
Definition: juce_AnimatedPosition.h:51
Definition: juce_AnimatedPosition.h:131
void beginDrag()
Definition: juce_AnimatedPosition.h:76
void drag(double deltaFromStartOfDrag)
Definition: juce_AnimatedPosition.h:87
virtual void positionChanged(AnimatedPosition &, double newPosition)=0