Olive
undo.h
1 /***
2 
3  Olive - Non-Linear Video Editor
4  Copyright (C) 2019 Olive Team
5 
6  This program 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 3 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, see <http://www.gnu.org/licenses/>.
18 
19 ***/
20 
21 #ifndef UNDO_H
22 #define UNDO_H
23 
24 class Media;
25 class QCheckBox;
26 class LabelSlider;
27 class Effect;
28 class SourceTable;
29 class EffectRow;
30 class EffectField;
31 class Transition;
32 class EffectGizmo;
33 class Clip;
34 struct Sequence;
35 struct Footage;
36 struct EffectMeta;
37 
38 #include "project/marker.h"
39 #include "project/selection.h"
40 #include "project/effectfield.h"
41 
42 #include <QUndoStack>
43 #include <QUndoCommand>
44 #include <QVector>
45 #include <QVariant>
46 #include <QModelIndex>
47 
48 namespace Olive {
49  extern QUndoStack UndoStack;
50 }
51 
52 class ComboAction : public QUndoCommand {
53 public:
54  ComboAction();
55  virtual ~ComboAction() override;
56  virtual void undo() override;
57  virtual void redo() override;
58  void append(QUndoCommand* u);
59  void appendPost(QUndoCommand* u);
60 private:
61  QVector<QUndoCommand*> commands;
62  QVector<QUndoCommand*> post_commands;
63 };
64 
65 class OliveAction : public QUndoCommand {
66 public:
67  OliveAction(bool iset_window_modified = true);
68  virtual ~OliveAction() override;
69 
70  virtual void undo() override;
71  virtual void redo() override;
72 
73  virtual void doUndo() = 0;
74  virtual void doRedo() = 0;
75 private:
80 
85 };
86 
87 class MoveClipAction : public OliveAction {
88 public:
89  MoveClipAction(Clip* c, long iin, long iout, long iclip_in, int itrack, bool irelative);
90  virtual void doUndo() override;
91  virtual void doRedo() override;
92 private:
93  Clip* clip;
94 
95  long old_in;
96  long old_out;
97  long old_clip_in;
98  int old_track;
99 
100  long new_in;
101  long new_out;
102  long new_clip_in;
103  int new_track;
104 
105  bool relative;
106 };
107 
108 class RippleAction : public OliveAction {
109 public:
110  RippleAction(Sequence *is, long ipoint, long ilength, const QVector<int>& iignore);
111  virtual void doUndo() override;
112  virtual void doRedo() override;
113 private:
114  Sequence *s;
115  long point;
116  long length;
117  QVector<int> ignore;
118  ComboAction* ca;
119 };
120 
122 public:
123  DeleteClipAction(Sequence* s, int clip);
124  virtual ~DeleteClipAction() override;
125  virtual void doUndo() override;
126  virtual void doRedo() override;
127 private:
128  Sequence* seq;
129  Clip* ref;
130  int index;
131 
132  int opening_transition;
133  int closing_transition;
134 
135  QVector<int> linkClipIndex;
136  QVector<int> linkLinkIndex;
137 };
138 
140 public:
142  virtual void doUndo() override;
143  virtual void doRedo() override;
144 private:
145  Sequence* old_sequence;
146  Sequence* new_sequence;
147 };
148 
150 public:
151  AddEffectCommand(Clip* c, Effect *e, const EffectMeta* m, int insert_pos = -1);
152  virtual ~AddEffectCommand() override;
153  virtual void doUndo() override;
154  virtual void doRedo() override;
155 private:
156  Clip* clip;
157  const EffectMeta* meta;
158  Effect* ref;
159  int pos;
160  bool done;
161 };
162 
164 public:
165  AddTransitionCommand(Clip* c, Clip* s, Transition *copy, const EffectMeta* itransition, int itype, int ilength);
166  virtual void doUndo() override;
167  virtual void doRedo() override;
168 private:
169  Clip* clip;
170  Clip* secondary;
171  Transition* transition_to_copy;
172  const EffectMeta* transition;
173  int type;
174  int length;
175  int old_ptransition;
176  int old_stransition;
177 };
178 
180 public:
181  ModifyTransitionCommand(Clip* c, int itype, long ilength);
182  virtual void doUndo() override;
183  virtual void doRedo() override;
184 private:
185  Clip* clip;
186  int type;
187  long new_length;
188  long old_length;
189 };
190 
192 public:
193  DeleteTransitionCommand(Sequence* s, int transition_index);
194  virtual ~DeleteTransitionCommand() override;
195  virtual void doUndo() override;
196  virtual void doRedo() override;
197 private:
198  Sequence* seq;
199  int index;
200  Transition* transition;
201  Clip* otc;
202  Clip* ctc;
203 };
204 
206 public:
207  SetTimelineInOutCommand(Sequence* s, bool enabled, long in, long out);
208  virtual void doUndo() override;
209  virtual void doRedo() override;
210 private:
211  Sequence* seq;
212 
213  bool old_enabled;
214  long old_in;
215  long old_out;
216 
217  bool new_enabled;
218  long new_in;
219  long new_out;
220 };
221 
223 public:
224  NewSequenceCommand(Media *s, Media* iparent);
225  virtual ~NewSequenceCommand() override;
226  virtual void doUndo() override;
227  virtual void doRedo() override;
228 private:
229  Media* seq;
230  Media* parent;
231  bool done;
232 };
233 
234 class AddMediaCommand : public OliveAction {
235 public:
236  AddMediaCommand(Media* iitem, Media* iparent);
237  virtual ~AddMediaCommand() override;
238  virtual void doUndo() override;
239  virtual void doRedo() override;
240 private:
241  Media* item;
242  Media* parent;
243  bool done;
244 };
245 
247 public:
249  virtual ~DeleteMediaCommand() override;
250  virtual void doUndo() override;
251  virtual void doRedo() override;
252 private:
253  Media* item;
254  Media* parent;
255  bool done;
256 };
257 
258 class AddClipCommand : public OliveAction {
259 public:
260  AddClipCommand(Sequence* s, QVector<Clip*>& add);
261  virtual ~AddClipCommand() override;
262  virtual void doUndo() override;
263  virtual void doRedo() override;
264 private:
265  Sequence* seq;
266  QVector<Clip*> clips;
267  QVector<Clip*> undone_clips;
268 };
269 
270 class LinkCommand : public OliveAction {
271 public:
272  LinkCommand();
273  virtual void doUndo() override;
274  virtual void doRedo() override;
275  Sequence* s;
276  QVector<int> clips;
277  bool link;
278 private:
279  QVector< QVector<int> > old_links;
280 };
281 
282 class CheckboxCommand : public OliveAction {
283 public:
284  CheckboxCommand(QCheckBox* b);
285  virtual ~CheckboxCommand() override;
286  virtual void doUndo() override;
287  virtual void doRedo() override;
288 private:
289  QCheckBox* box;
290  bool checked;
291  bool done;
292 };
293 
295 public:
296  ReplaceMediaCommand(Media*, QString);
297  virtual void doUndo() override;
298  virtual void doRedo() override;
299 private:
300  Media *item;
301  QString old_filename;
302  QString new_filename;
303  void replace(QString& filename);
304 };
305 
307 public:
308  ReplaceClipMediaCommand(Media *, Media *, bool);
309  virtual void doUndo() override;
310  virtual void doRedo() override;
311  QVector<Clip*> clips;
312 private:
313  Media* old_media;
314  Media* new_media;
315  bool preserve_clip_ins;
316  QVector<int> old_clip_ins;
317  void replace(bool undo);
318 };
319 
321 public:
323  virtual ~EffectDeleteCommand() override;
324  virtual void doUndo() override;
325  virtual void doRedo() override;
326  QVector<Clip*> clips;
327  QVector<int> fx;
328 private:
329  bool done;
330  QVector<Effect*> deleted_objects;
331 };
332 
333 class MediaMove : public OliveAction {
334 public:
335  MediaMove();
336  QVector<Media*> items;
337  Media* to;
338  virtual void doUndo() override;
339  virtual void doRedo() override;
340 private:
341  QVector<Media*> froms;
342 };
343 
344 class MediaRename : public OliveAction {
345 public:
346  MediaRename(Media* iitem, QString to);
347  virtual void doUndo() override;
348  virtual void doRedo() override;
349 private:
350  Media* item;
351  QString from;
352  QString to;
353 };
354 
355 class KeyframeDelete : public OliveAction {
356 public:
357  KeyframeDelete(EffectField* ifield, int iindex);
358  virtual void doUndo() override;
359  virtual void doRedo() override;
360 private:
361  EffectField* field;
362  int index;
363  bool done;
364  EffectKeyframe deleted_key;
365 };
366 
367 // a more modern version of the above, could probably replace it
368 // assumes the keyframe already exists
370 public:
371  KeyframeFieldSet(EffectField* ifield, int ii);
372  virtual void doUndo() override;
373  virtual void doRedo() override;
374 private:
375  EffectField* field;
376  int index;
377  EffectKeyframe key;
378  bool done;
379 };
380 
381 class EffectFieldUndo : public OliveAction {
382 public:
384  virtual void doUndo() override;
385  virtual void doRedo() override;
386 private:
387  EffectField* field;
388  QVariant old_val;
389  QVariant new_val;
390  bool done;
391 };
392 
394 public:
396  virtual void doUndo() override;
397  virtual void doRedo() override;
398  QVector<Clip*> clips;
399 };
400 
401 class AddMarkerAction : public OliveAction {
402 public:
403  AddMarkerAction(QVector<Marker>* m, long t, QString n);
404  virtual void doUndo() override;
405  virtual void doRedo() override;
406 private:
407  QVector<Marker>* active_array;
408  long time;
409  QString name;
410  QString old_name;
411  int index;
412 };
413 
415 public:
416  MoveMarkerAction(Marker* m, long o, long n);
417  virtual void doUndo() override;
418  virtual void doRedo() override;
419 private:
420  Marker* marker;
421  long old_time;
422  long new_time;
423 };
424 
426 public:
427  DeleteMarkerAction(QVector<Marker>* m);
428  virtual void doUndo() override;
429  virtual void doRedo() override;
430  QVector<int> markers;
431 private:
432  QVector<Marker>* active_array;
433  QVector<Marker> copies;
434  bool sorted;
435 };
436 
437 class SetSpeedAction : public OliveAction {
438 public:
439  SetSpeedAction(Clip* c, double speed);
440  virtual void doUndo() override;
441  virtual void doRedo() override;
442 private:
443  Clip* clip;
444  double old_speed;
445  double new_speed;
446 };
447 
448 class SetBool : public OliveAction {
449 public:
450  SetBool(bool* b, bool setting);
451  virtual void doUndo() override;
452  virtual void doRedo() override;
453 private:
454  bool* boolean;
455  bool old_setting;
456  bool new_setting;
457 };
458 
460 public:
462  virtual void doUndo() override;
463  virtual void doRedo() override;
464  QVector<Selection> old_data;
465  QVector<Selection> new_data;
466 private:
467  Sequence* seq;
468  bool done;
469 };
470 
472 public:
474  virtual void doUndo() override;
475  virtual void doRedo() override;
476  void update();
477 
478  QString name;
479  int width;
480  int height;
481  double frame_rate;
482  int audio_frequency;
483  int audio_layout;
484 private:
485  Media* item;
486  Sequence* seq;
487 
488  QString old_name;
489  int old_width;
490  int old_height;
491  double old_frame_rate;
492  int old_audio_frequency;
493  int old_audio_layout;
494 };
495 
496 class SetInt : public OliveAction {
497 public:
498  SetInt(int* pointer, int new_value);
499  virtual void doUndo() override;
500  virtual void doRedo() override;
501 private:
502  int* p;
503  int oldval;
504  int newval;
505 };
506 
507 class SetLong : public OliveAction {
508 public:
509  SetLong(long* pointer, long old_value, long new_value);
510  virtual void doUndo() override;
511  virtual void doRedo() override;
512 private:
513  long* p;
514  long oldval;
515  long newval;
516 };
517 
518 class SetDouble : public OliveAction {
519 public:
520  SetDouble(double* pointer, double old_value, double new_value);
521  virtual void doUndo() override;
522  virtual void doRedo() override;
523 private:
524  double* p;
525  double oldval;
526  double newval;
527 };
528 
529 class SetString : public OliveAction {
530 public:
531  SetString(QString* pointer, QString new_value);
532  virtual void doUndo() override;
533  virtual void doRedo() override;
534 private:
535  QString* p;
536  QString oldval;
537  QString newval;
538 };
539 
541 public:
542  virtual void doUndo() override;
543  virtual void doRedo() override;
544 };
545 
547 public:
549  virtual void doUndo() override;
550  virtual void doRedo() override;
551 private:
552  Media* item;
553 };
554 
556 public:
558  virtual void doUndo() override;
559  virtual void doRedo() override;
560  Clip* clip;
561  int from;
562  int to;
563 };
564 
566 public:
567  RemoveClipsFromClipboard(int index);
568  virtual ~RemoveClipsFromClipboard() override;
569  virtual void doUndo() override;
570  virtual void doRedo() override;
571 private:
572  int pos;
573  Clip* clip;
574  bool done;
575 };
576 
578 public:
580  QVector<Clip*> clips;
581  QString new_name;
582  virtual void doUndo() override;
583  virtual void doRedo() override;
584 private:
585  QVector<QString> old_names;
586 };
587 
588 class SetPointer : public OliveAction {
589 public:
590  SetPointer(void** pointer, void* data);
591  virtual void doUndo() override;
592  virtual void doRedo() override;
593 private:
594  bool old_changed;
595  void** p;
596  void* new_data;
597  void* old_data;
598 };
599 
601 public:
602  virtual void doUndo() override;
603  virtual void doRedo() override;
604 };
605 
606 class SetQVariant : public OliveAction {
607 public:
608  SetQVariant(QVariant* itarget, const QVariant& iold, const QVariant& inew);
609  virtual void doUndo() override;
610  virtual void doRedo() override;
611 private:
612  QVariant* target;
613  QVariant old_val;
614  QVariant new_val;
615 };
616 
617 class SetKeyframing : public OliveAction {
618 public:
619  SetKeyframing(EffectRow* irow, bool ib);
620  virtual void doUndo() override;
621  virtual void doRedo() override;
622 private:
623  EffectRow* row;
624  bool b;
625 };
626 
627 class RefreshClips : public OliveAction {
628 public:
629  RefreshClips(Media* m);
630  virtual void doUndo() override;
631  virtual void doRedo() override;
632 private:
633  Media* media;
634 };
635 
636 class UpdateViewer : public OliveAction {
637 public:
638  virtual void doUndo() override;
639  virtual void doRedo() override;
640 };
641 
642 class SetEffectData : public OliveAction {
643 public:
644  SetEffectData(Effect* e, const QByteArray &s);
645  virtual void doUndo() override;
646  virtual void doRedo() override;
647 private:
648  Effect* effect;
649  QByteArray data;
650  QByteArray old_data;
651 };
652 
653 #endif // UNDO_H
Definition: undo.h:555
Definition: undo.h:333
Definition: undo.h:518
Definition: sequence.h:33
Definition: undo.h:294
Definition: undo.h:234
Definition: undo.h:529
Definition: undo.h:606
Definition: undo.h:191
bool set_window_modified
Setting whether to change the windowModified state of MainWindow.
Definition: undo.h:79
Definition: marker.h:31
Definition: undo.h:425
Definition: undo.h:87
Definition: undo.h:437
Definition: undo.h:565
Definition: undo.h:344
Definition: undo.h:163
Definition: sourcetable.h:31
Definition: undo.h:149
Definition: undo.h:65
Definition: undo.h:636
Definition: undo.h:414
Definition: undo.h:52
Definition: undo.h:627
Definition: effect.h:166
Definition: undo.h:179
Definition: effect.h:47
Definition: undo.h:401
Definition: undo.h:282
Definition: undo.h:121
Definition: effectrow.h:37
Definition: undo.h:108
Definition: undo.h:306
Definition: media.h:40
bool old_window_modified
Cache previous window modified value to return to if the user undoes this action.
Definition: undo.h:84
Definition: undo.h:381
Definition: undo.h:448
Definition: undo.h:139
Definition: undo.h:459
Definition: undo.h:320
Definition: undo.h:600
Definition: undo.h:205
Definition: undo.h:617
Definition: effectgizmo.h:41
Definition: keyframe.h:28
Definition: undo.h:355
Definition: undo.h:471
Definition: undo.h:642
Definition: undo.h:222
Definition: undo.h:588
The LabelSlider class.
Definition: labelslider.h:40
Definition: undo.h:540
Definition: undo.h:507
Definition: clip.h:53
Definition: undo.h:577
Definition: effectfield.h:43
Definition: undo.h:246
Definition: undo.h:258
Definition: undo.h:393
Definition: transition.h:39
Definition: undo.h:496
Definition: undo.h:369
Definition: footage.h:66
Definition: undo.h:546