added replace function for pasting effects

This commit is contained in:
itsmattkc
2018-12-21 10:34:42 +11:00
parent c65e2557b5
commit c62d4803fb
3 changed files with 68 additions and 6 deletions
+54 -2
View File
@@ -31,6 +31,7 @@
#include <QMenu> #include <QMenu>
#include <QInputDialog> #include <QInputDialog>
#include <QMessageBox> #include <QMessageBox>
#include <QCheckBox>
long refactor_frame_number(long framenumber, double source_frame_rate, double target_frame_rate) { long refactor_frame_number(long framenumber, double source_frame_rate, double target_frame_rate) {
return qRound(((double)framenumber/source_frame_rate)*target_frame_rate); return qRound(((double)framenumber/source_frame_rate)*target_frame_rate);
@@ -965,14 +966,65 @@ void Timeline::paste(bool insert) {
} else if (clipboard_type == CLIPBOARD_TYPE_EFFECT) { } else if (clipboard_type == CLIPBOARD_TYPE_EFFECT) {
ComboAction* ca = new ComboAction(); ComboAction* ca = new ComboAction();
bool push = false; bool push = false;
bool replace = false;
bool skip = false;
bool ask_conflict = true;
for (int i=0;i<sequence->clips.size();i++) { for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i); Clip* c = sequence->clips.at(i);
if (c != NULL && is_clip_selected(c, true)) { if (c != NULL && is_clip_selected(c, true)) {
for (int j=0;j<clipboard.size();j++) { for (int j=0;j<clipboard.size();j++) {
Effect* e = static_cast<Effect*>(clipboard.at(j)); Effect* e = static_cast<Effect*>(clipboard.at(j));
if ((c->track < 0) == (e->meta->subtype == EFFECT_TYPE_VIDEO)) { if ((c->track < 0) == (e->meta->subtype == EFFECT_TYPE_VIDEO)) {
ca->append(new AddEffectCommand(c, e->copy(c), NULL)); int found = -1;
push = true; if (ask_conflict) {
replace = false;
skip = false;
}
for (int k=0;k<c->effects.size();k++) {
if (c->effects.at(k)->meta == e->meta) {
found = k;
break;
}
}
if (found >= 0 && ask_conflict) {
QMessageBox box(this);
box.setWindowTitle("Effect already exists");
box.setText("Clip '" + c->name + "' already contains a '" + e->meta->name + "' effect. Would you like to replace it with the pasted one or add it as a separate effect?");
box.setIcon(QMessageBox::Icon::Question);
box.addButton("Add", QMessageBox::YesRole);
QPushButton* replace_button = box.addButton("Replace", QMessageBox::NoRole);
QPushButton* skip_button = box.addButton("Skip", QMessageBox::RejectRole);
QCheckBox* future_box = new QCheckBox("Do this for all conflicts found");
box.setCheckBox(future_box);
box.exec();
if (box.clickedButton() == replace_button) {
replace = true;
} else if (box.clickedButton() == skip_button) {
skip = true;
}
ask_conflict = !future_box->isChecked();
}
if (found >= 0 && skip) {
// do nothing
} else if (found >= 0 && replace) {
EffectDeleteCommand* delcom = new EffectDeleteCommand();
delcom->clips.append(c);
delcom->fx.append(found);
ca->append(delcom);
ca->append(new AddEffectCommand(c, e->copy(c), NULL, found));
push = true;
} else {
ca->append(new AddEffectCommand(c, e->copy(c), NULL));
push = true;
}
} }
} }
} }
+12 -3
View File
@@ -199,10 +199,11 @@ void SetTimelineInOutCommand::redo() {
mainWindow->setWindowModified(true); mainWindow->setWindowModified(true);
} }
AddEffectCommand::AddEffectCommand(Clip* c, Effect* e, const EffectMeta *m) : AddEffectCommand::AddEffectCommand(Clip* c, Effect* e, const EffectMeta *m, int insert_pos) :
clip(c), clip(c),
meta(m), meta(m),
ref(e), ref(e),
pos(insert_pos),
done(false), done(false),
old_project_changed(mainWindow->isWindowModified()) old_project_changed(mainWindow->isWindowModified())
{} {}
@@ -213,7 +214,11 @@ AddEffectCommand::~AddEffectCommand() {
void AddEffectCommand::undo() { void AddEffectCommand::undo() {
clip->effects.last()->close(); clip->effects.last()->close();
clip->effects.removeLast(); if (pos < 0) {
clip->effects.removeLast();
} else {
clip->effects.removeAt(pos);
}
done = false; done = false;
mainWindow->setWindowModified(old_project_changed); mainWindow->setWindowModified(old_project_changed);
} }
@@ -222,7 +227,11 @@ void AddEffectCommand::redo() {
if (ref == NULL) { if (ref == NULL) {
ref = create_effect(clip, meta); ref = create_effect(clip, meta);
} }
clip->effects.append(ref); if (pos < 0) {
clip->effects.append(ref);
} else {
clip->effects.insert(pos, ref);
}
done = true; done = true;
mainWindow->setWindowModified(true); mainWindow->setWindowModified(true);
} }
+2 -1
View File
@@ -89,7 +89,7 @@ private:
class AddEffectCommand : public QUndoCommand { class AddEffectCommand : public QUndoCommand {
public: public:
AddEffectCommand(Clip* c, Effect *e, const EffectMeta* m); AddEffectCommand(Clip* c, Effect *e, const EffectMeta* m, int insert_pos = -1);
~AddEffectCommand(); ~AddEffectCommand();
void undo(); void undo();
void redo(); void redo();
@@ -97,6 +97,7 @@ private:
Clip* clip; Clip* clip;
const EffectMeta* meta; const EffectMeta* meta;
Effect* ref; Effect* ref;
int pos;
bool done; bool done;
bool old_project_changed; bool old_project_changed;
}; };