replace clip media is now undoable
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include "playback/playback.h"
|
||||
#include "playback/cacher.h"
|
||||
#include "io/media.h"
|
||||
#include "project/undo.h"
|
||||
|
||||
#include <QVBoxLayout>
|
||||
#include <QTreeWidget>
|
||||
@@ -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;i<sequence->clip_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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;i<clips.size();i++) {
|
||||
Clip* c = clips.at(i);
|
||||
if (c->open) {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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<Clip*> clips;
|
||||
private:
|
||||
void* old_media;
|
||||
void* new_media;
|
||||
int old_type;
|
||||
int new_type;
|
||||
bool preserve_clip_ins;
|
||||
bool old_project_changed;
|
||||
QVector<int> old_clip_ins;
|
||||
void replace(bool undo);
|
||||
};
|
||||
|
||||
#endif // UNDO_H
|
||||
|
||||
Reference in New Issue
Block a user