From 984a5ed799f9d40fedb38798deadfab343f0954a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 7 Aug 2018 10:47:42 +1000 Subject: [PATCH] replace clip media is now undoable --- dialogs/replaceclipmediadialog.cpp | 34 +++++++----------- project/undo.cpp | 55 ++++++++++++++++++++++++++++++ project/undo.h | 17 +++++++++ 3 files changed, 85 insertions(+), 21 deletions(-) diff --git a/dialogs/replaceclipmediadialog.cpp b/dialogs/replaceclipmediadialog.cpp index 9a7bbb11c..8a3321d52 100644 --- a/dialogs/replaceclipmediadialog.cpp +++ b/dialogs/replaceclipmediadialog.cpp @@ -8,6 +8,7 @@ #include "playback/playback.h" #include "playback/cacher.h" #include "io/media.h" +#include "project/undo.h" #include #include @@ -73,33 +74,24 @@ void ReplaceClipMediaDialog::replace() { QMessageBox::critical(this, "Active sequence selected", "You cannot insert a sequence into itself.", QMessageBox::Ok); } else { void* old_media = get_media_from_tree(media); - void* new_media = get_media_from_tree(new_item); - // TODO not undoable yet - bool changed = false; + ReplaceClipMediaCommand* rcmc = new ReplaceClipMediaCommand( + old_media, + get_media_from_tree(new_item), + get_type_from_tree(media), + get_type_from_tree(new_item), + use_same_media_in_points->isChecked() + ); + for (int i=0;iclip_count();i++) { Clip* c = sequence->get_clip(i); if (c != NULL && c->media == old_media) { - if (c->open) { - close_clip(c); - c->cacher->wait(); - } - - if (!use_same_media_in_points->isChecked()) { - c->clip_in = 0; - } - - c->media = new_media; - c->media_type = get_type_from_tree(new_item); - c->replaced = true; - - c->refresh(); - changed = true; + rcmc->clips.append(c); } } - if (changed) { - panel_timeline->redraw_all_clips(true); - } + + undo_stack.push(rcmc); + close(); } diff --git a/project/undo.cpp b/project/undo.cpp index f2e2cee17..a50a449dc 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -550,3 +550,58 @@ void ReplaceMediaCommand::redo() { project_changed = true; } + +ReplaceClipMediaCommand::ReplaceClipMediaCommand(void *a, void *b, int c, int d, bool e) : + old_media(a), + new_media(b), + old_type(c), + new_type(d), + preserve_clip_ins(e), + old_project_changed(project_changed) +{} + +void ReplaceClipMediaCommand::replace(bool undo) { + if (!undo) { + old_clip_ins.clear(); + } + + for (int i=0;iopen) { + close_clip(c); + c->cacher->wait(); + } + + if (undo) { + if (!preserve_clip_ins) { + c->clip_in = old_clip_ins.at(i); + } + + c->media = old_media; + c->media_type = old_type; + } else { + if (!preserve_clip_ins) { + old_clip_ins.append(c->clip_in); + c->clip_in = 0; + } + + c->media = new_media; + c->media_type = new_type; + } + + c->replaced = true; + c->refresh(); + } +} + +void ReplaceClipMediaCommand::undo() { + replace(true); + + project_changed = old_project_changed; +} + +void ReplaceClipMediaCommand::redo() { + replace(false); + + project_changed = true; +} diff --git a/project/undo.h b/project/undo.h index 98f868144..ac4c1bbe5 100644 --- a/project/undo.h +++ b/project/undo.h @@ -130,4 +130,21 @@ private: void replace(QString& filename); }; +class ReplaceClipMediaCommand : public QUndoCommand { +public: + ReplaceClipMediaCommand(void*, void*, int, int, bool); + void undo(); + void redo(); + QVector clips; +private: + void* old_media; + void* new_media; + int old_type; + int new_type; + bool preserve_clip_ins; + bool old_project_changed; + QVector old_clip_ins; + void replace(bool undo); +}; + #endif // UNDO_H