LMMS
Loading...
Searching...
No Matches
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) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
29//==============================================================================
52template <typename Behaviour>
53class AnimatedPosition : private Timer
54{
55public:
57 : range (-std::numeric_limits<double>::max(),
58 std::numeric_limits<double>::max())
59 {
60 }
61
63 void setLimits (Range<double> newRange) noexcept
64 {
65 range = newRange;
66 }
67
68 //==============================================================================
77 void beginDrag()
78 {
81 stopTimer();
82 }
83
88 void drag (double deltaFromStartOfDrag)
89 {
90 moveTo (grabbedPos + deltaFromStartOfDrag);
91 }
92
96 void endDrag()
97 {
98 startTimerHz (60);
99 }
100
104 void nudge (double deltaFromCurrentPosition)
105 {
106 startTimerHz (10);
107 moveTo (position + deltaFromCurrentPosition);
108 }
109
110 //==============================================================================
113 {
114 return position;
115 }
116
121 void setPosition (double newPosition)
122 {
123 stopTimer();
124 setPositionAndSendChange (newPosition);
125 }
126
127 //==============================================================================
133 {
134 public:
135 virtual ~Listener() = default;
136
138 virtual void positionChanged (AnimatedPosition&, double newPosition) = 0;
139 };
140
142 void addListener (Listener* listener) { listeners.add (listener); }
143
145 void removeListener (Listener* listener) { listeners.remove (listener); }
146
147 //==============================================================================
151 Behaviour behaviour;
152
153private:
154 //==============================================================================
155 double position = 0.0, grabbedPos = 0.0, releaseVelocity = 0.0;
159
160 static double getSpeed (const Time last, double lastPos,
161 const Time now, double newPos)
162 {
163 auto elapsedSecs = jmax (0.005, (now - last).inSeconds());
164 auto v = (newPos - lastPos) / elapsedSecs;
165 return std::abs (v) > 0.2 ? v : 0.0;
166 }
167
168 void moveTo (double newPos)
169 {
170 auto now = Time::getCurrentTime();
171 releaseVelocity = getSpeed (lastDrag, position, now, newPos);
172 behaviour.releasedWithVelocity (newPos, releaseVelocity);
173 lastDrag = now;
174
176 }
177
178 void setPositionAndSendChange (double newPosition)
179 {
180 newPosition = range.clipValue (newPosition);
181
182 if (position != newPosition)
183 {
184 position = newPosition;
185 listeners.call ([this, newPosition] (Listener& l) { l.positionChanged (*this, newPosition); });
186 }
187 }
188
189 void timerCallback() override
190 {
191 auto now = Time::getCurrentTime();
192 auto elapsed = jlimit (0.001, 0.020, (now - lastUpdate).inSeconds());
193 lastUpdate = now;
194 auto newPos = behaviour.getNextPosition (position, elapsed);
195
196 if (behaviour.isStopped (newPos))
197 stopTimer();
198 else
199 startTimerHz (60);
200
202 }
203
205};
206
207} // namespace juce
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_AnimatedPosition.h:133
virtual void positionChanged(AnimatedPosition &, double newPosition)=0
Definition juce_AnimatedPosition.h:54
AnimatedPositionBehaviours::ContinuousWithMomentum behaviour
Definition juce_AnimatedPosition.h:151
void addListener(Listener *listener)
Definition juce_AnimatedPosition.h:142
void endDrag()
Definition juce_AnimatedPosition.h:96
void setPosition(double newPosition)
Definition juce_AnimatedPosition.h:121
double getPosition() const noexcept
Definition juce_AnimatedPosition.h:112
void removeListener(Listener *listener)
Definition juce_AnimatedPosition.h:145
Range< double > range
Definition juce_AnimatedPosition.h:156
void nudge(double deltaFromCurrentPosition)
Definition juce_AnimatedPosition.h:104
ListenerList< Listener > listeners
Definition juce_AnimatedPosition.h:158
void beginDrag()
Definition juce_AnimatedPosition.h:77
void timerCallback() override
Definition juce_AnimatedPosition.h:189
void moveTo(double newPos)
Definition juce_AnimatedPosition.h:168
static double getSpeed(const Time last, double lastPos, const Time now, double newPos)
Definition juce_AnimatedPosition.h:160
void setLimits(Range< double > newRange) noexcept
Definition juce_AnimatedPosition.h:63
AnimatedPosition()
Definition juce_AnimatedPosition.h:56
void setPositionAndSendChange(double newPosition)
Definition juce_AnimatedPosition.h:178
void drag(double deltaFromStartOfDrag)
Definition juce_AnimatedPosition.h:88
Definition juce_ListenerList.h:70
Definition juce_Range.h:40
Definition juce_Time.h:37
static Time JUCE_CALLTYPE getCurrentTime() noexcept
Definition juce_Time.cpp:233
void stopTimer() noexcept
Definition juce_Timer.cpp:357
Timer() noexcept
Definition juce_Timer.cpp:316
void startTimerHz(int timerFrequencyHz) noexcept
Definition juce_Timer.cpp:349
int * l
Definition inflate.c:1579
unsigned v[N_MAX]
Definition inflate.c:1584
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
Definition carla_juce.cpp:31
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
Definition juce_Uuid.h:141
#define max(x, y)
Definition os.h:78
#define const
Definition zconf.h:137