1 /*
2 Copyright (C) 2006-2007 Remon Sijrier
3
4 This file is part of Traverso
5
6 Traverso is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19
20 */
21
22
23 #include "Fade.h"
24
25 #include "Curve.h"
26 #include "AudioClip.h"
27 #include "ContextPointer.h"
28 #include <ViewPort.h>
29 #include <FadeCurve.h>
30 #include <FadeView.h>
31 #include <Peak.h>
32 #include <Sheet.h>
33 #include "Project.h"
34 #include "ProjectManager.h"
35
36 // Always put me below _all_ includes, this is needed
37 // in case we run with memory leak detection enabled!
38 #include "Debugger.h"
39
40 static const float CURSOR_SPEED = 150.0;
41 static const float RASTER_SIZE = 0.05;
42
43
FadeRange(AudioClip * clip,FadeCurve * curve,qint64 scalefactor)44 FadeRange::FadeRange(AudioClip* clip, FadeCurve* curve, qint64 scalefactor)
45 : Command(clip, "")
46 , d(new Private())
47 {
48 m_curve = curve;
49 d->direction = (m_curve->get_fade_type() == FadeCurve::FadeIn) ? 1 : -1;
50 d->scalefactor = scalefactor;
51 setText( (d->direction == 1) ? tr("Fade In: length") : tr("Fade Out: length"));
52 }
53
54
FadeRange(AudioClip * clip,FadeCurve * curve,double newRange)55 FadeRange::FadeRange(AudioClip* clip, FadeCurve* curve, double newRange)
56 : Command(clip, "")
57 , d(new Private())
58 {
59 m_curve = curve;
60 d->direction = (m_curve->get_fade_type() == FadeCurve::FadeIn) ? 1 : -1;
61 m_origRange = m_curve->get_range();
62 m_newRange = newRange;
63 setText( (d->direction == 1) ? tr("Fade In: remove") : tr("Fade Out: remove"));
64 }
65
66
~FadeRange()67 FadeRange::~FadeRange()
68 {}
69
prepare_actions()70 int FadeRange::prepare_actions()
71 {
72 return 1;
73 }
74
begin_hold()75 int FadeRange::begin_hold()
76 {
77 d->origX = cpointer().on_first_input_event_x();
78 m_newRange = m_origRange = m_curve->get_range();
79 return 1;
80 }
81
82
finish_hold()83 int FadeRange::finish_hold()
84 {
85 QCursor::setPos(d->mousePos);
86 delete d;
87 return 1;
88 }
89
90
do_action()91 int FadeRange::do_action()
92 {
93 m_curve->set_range( m_newRange );
94 return 1;
95 }
96
97
undo_action()98 int FadeRange::undo_action()
99 {
100 m_curve->set_range( m_origRange );
101 return 1;
102 }
103
104
cancel_action()105 void FadeRange::cancel_action()
106 {
107 finish_hold();
108 undo_action();
109 }
110
set_cursor_shape(int useX,int useY)111 void FadeRange::set_cursor_shape(int useX, int useY)
112 {
113 Q_UNUSED(useX);
114 Q_UNUSED(useY);
115
116 d->mousePos = QCursor::pos();
117
118 cpointer().get_viewport()->set_holdcursor(":/cursorHoldLr");
119 }
120
121
jog()122 int FadeRange::jog()
123 {
124 int dx = (d->origX - (cpointer().x()) ) * d->direction;
125 m_newRange = m_origRange - ( dx * d->scalefactor);
126
127 if (m_newRange < 1) {
128 m_newRange = 1;
129 }
130
131 m_curve->set_range( m_newRange );
132
133 TimeRef location = TimeRef(m_newRange);
134 cpointer().get_viewport()->set_holdcursor_text(timeref_to_ms_3(location));
135
136 return 1;
137 }
138
139
round_float(float f)140 static float round_float( float f)
141 {
142 return float(int(0.5 + f / RASTER_SIZE)) * RASTER_SIZE;
143 }
144
145 /********** FadeBend **********/
146 /******************************/
147
FadeBend(FadeView * fadeview)148 FadeBend::FadeBend(FadeView * fadeview)
149 : Command(fadeview->get_fade())
150 , m_fade(fadeview->get_fade())
151 , m_fv(fadeview)
152 {
153 setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: bend") : tr("Fade Out: bend"));
154 }
155
FadeBend(FadeCurve * fade,double val)156 FadeBend::FadeBend(FadeCurve *fade, double val)
157 : Command(fade)
158 , m_fade(fade)
159 , m_fv(0)
160 {
161 setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: bend") : tr("Fade Out: bend"));
162 origBend = m_fade->get_bend_factor();
163 newBend = val;
164 }
165
begin_hold()166 int FadeBend::begin_hold()
167 {
168 PENTER;
169 origY = cpointer().on_first_input_event_y();
170 oldValue = m_fade->get_bend_factor();
171 newBend = origBend = oldValue;
172 m_fv->set_holding(true);
173 return 1;
174 }
175
finish_hold()176 int FadeBend::finish_hold()
177 {
178 QCursor::setPos(mousePos);
179 m_fv->set_holding(false);
180 return 1;
181 }
182
prepare_actions()183 int FadeBend::prepare_actions()
184 {
185 return 1;
186 }
187
do_action()188 int FadeBend::do_action()
189 {
190 m_fade->set_bend_factor(newBend);
191 return 1;
192 }
193
undo_action()194 int FadeBend::undo_action()
195 {
196 m_fade->set_bend_factor(origBend);
197 return 1;
198 }
199
cancel_action()200 void FadeBend::cancel_action()
201 {
202 finish_hold();
203 undo_action();
204 }
205
set_cursor_shape(int useX,int useY)206 void FadeBend::set_cursor_shape(int useX, int useY)
207 {
208 Q_UNUSED(useX);
209 Q_UNUSED(useY);
210
211 mousePos = QCursor::pos();
212 cpointer().get_viewport()->set_holdcursor(":/cursorHoldUd");
213 }
214
jog()215 int FadeBend::jog()
216 {
217 int direction = (m_fade->get_fade_type() == FadeCurve::FadeIn) ? 1 : -1;
218
219 float dx = (float(origY - cpointer().y()) / CURSOR_SPEED);
220
221 if (m_fade->get_raster()) {
222 float value = round_float(oldValue + dx * direction);
223 m_fade->set_bend_factor(value);
224 } else {
225 m_fade->set_bend_factor(oldValue + dx * direction);
226 }
227
228 oldValue = m_fade->get_bend_factor();
229 newBend = oldValue;
230 cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(newBend, 'f', 2));
231
232 origY = cpointer().y();
233
234 return 1;
235 }
236
237 /********** FadeStrength **********/
238 /******************************/
239
FadeStrength(FadeView * fadeview)240 FadeStrength::FadeStrength(FadeView* fadeview)
241 : Command(fadeview->get_fade())
242 , m_fade(fadeview->get_fade())
243 , m_fv(fadeview)
244 {
245 setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: strength") : tr("Fade Out: strength"));
246 }
247
FadeStrength(FadeCurve * fade,double val)248 FadeStrength::FadeStrength(FadeCurve *fade, double val)
249 : Command(fade)
250 , m_fade(fade)
251 , m_fv(0)
252 {
253 setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: strength") : tr("Fade Out: strength"));
254 origStrength = m_fade->get_strength_factor();
255 newStrength = val;
256 }
257
begin_hold()258 int FadeStrength::begin_hold()
259 {
260 PENTER;
261 origY = cpointer().on_first_input_event_y();
262 oldValue = m_fade->get_strength_factor();
263 newStrength = origStrength = oldValue;
264 m_fv->set_holding(true);
265 return 1;
266 }
267
finish_hold()268 int FadeStrength::finish_hold()
269 {
270 QCursor::setPos(mousePos);
271 m_fv->set_holding(false);
272 return 1;
273 }
274
prepare_actions()275 int FadeStrength::prepare_actions()
276 {
277 return 1;
278 }
279
do_action()280 int FadeStrength::do_action()
281 {
282 m_fade->set_strength_factor(newStrength);
283 return 1;
284 }
285
undo_action()286 int FadeStrength::undo_action()
287 {
288 m_fade->set_strength_factor(origStrength);
289 return 1;
290 }
291
cancel_action()292 void FadeStrength::cancel_action()
293 {
294 finish_hold();
295 undo_action();
296 }
297
set_cursor_shape(int useX,int useY)298 void FadeStrength::set_cursor_shape(int useX, int useY)
299 {
300 Q_UNUSED(useX);
301 Q_UNUSED(useY);
302
303 mousePos = QCursor::pos();
304 cpointer().get_viewport()->set_holdcursor(":/cursorHoldUd");
305 }
306
jog()307 int FadeStrength::jog()
308 {
309 float dy = float(origY - cpointer().y()) / CURSOR_SPEED;
310
311 if (m_fade->get_bend_factor() >= 0.5) {
312 m_fade->set_strength_factor(oldValue + dy );
313 } else {
314 if (m_fade->get_raster()) {
315 float value = round_float(oldValue + dy);
316 m_fade->set_strength_factor(value);
317 } else {
318 m_fade->set_strength_factor(oldValue - dy);
319 }
320 }
321
322 oldValue = m_fade->get_strength_factor();
323 newStrength = oldValue;
324 cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(newStrength, 'f', 2));
325
326 origY = cpointer().y();
327
328 return 1;
329 }
330
331
332 /********** FadeMode **********/
333 /******************************/
334
FadeMode(FadeCurve * fade,int oldMode,int newMode)335 FadeMode::FadeMode(FadeCurve* fade, int oldMode, int newMode)
336 : Command(fade)
337 , m_fade(fade)
338 {
339 setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: shape") : tr("Fade Out: shape"));
340
341 m_newMode = newMode;
342 m_oldMode = oldMode;
343 }
344
prepare_actions()345 int FadeMode::prepare_actions()
346 {
347 return 1;
348 }
349
do_action()350 int FadeMode::do_action()
351 {
352 m_fade->set_mode(m_newMode);
353 return 1;
354 }
355
undo_action()356 int FadeMode::undo_action()
357 {
358 m_fade->set_mode(m_oldMode);
359 return 1;
360 }
361
362