adding sequences can now be undone

This commit is contained in:
itsmattkc
2018-07-19 12:17:22 +01:00
parent 48b1c21d6c
commit 33f8d7274a
7 changed files with 92 additions and 23 deletions
+4 -1
View File
@@ -4,6 +4,7 @@
#include "panels/panels.h"
#include "panels/project.h"
#include "project/sequence.h"
#include "project/undo.h"
#include <QVariant>
#include <QDebug>
@@ -61,7 +62,9 @@ void NewSequenceDialog::on_buttonBox_accepted()
s->audio_frequency = ui->audio_frequency_combobox->currentData().toInt();
s->audio_layout = AV_CH_LAYOUT_STEREO;
panel_project->new_sequence(s, true, NULL);
TimelineAction* ta = new TimelineAction();
panel_project->new_sequence(ta, s, true, NULL);
undo_stack.push(ta);
}
void NewSequenceDialog::on_comboBox_currentIndexChanged(int index)
+20 -11
View File
@@ -86,28 +86,40 @@ void Project::rename_media(QTreeWidgetItem* item, int column) {
void Project::duplicate_selected() {
QList<QTreeWidgetItem*> items = ui->treeWidget->selectedItems();
bool duped = false;
TimelineAction* ta = new TimelineAction();
for (int j=0;j<items.size();j++) {
QTreeWidgetItem* i = items.at(j);
if (get_type_from_tree(i) == MEDIA_TYPE_SEQUENCE) {
new_sequence(get_sequence_from_tree(i)->copy(), false, i->parent());
new_sequence(ta, get_sequence_from_tree(i)->copy(), false, i->parent());
duped = true;
}
}
if (duped) {
undo_stack.push(ta);
} else {
delete ta;
}
}
void Project::new_sequence(Sequence *s, bool open, QTreeWidgetItem* parent) {
void Project::new_sequence(TimelineAction *ta, Sequence *s, bool open, QTreeWidgetItem* parent) {
QTreeWidgetItem* item = new_item();
item->setText(0, s->name);
set_sequence_of_tree(item, s);
if (parent == NULL) {
ui->treeWidget->addTopLevelItem(item);
if (ta != NULL) {
ta->new_sequence(item, parent);
if (open) ta->change_sequence(s);
} else {
parent->addChild(item);
if (parent == NULL) {
ui->treeWidget->addTopLevelItem(item);
} else {
parent->addChild(item);
}
if (open) set_sequence(s);
}
project_changed = true;
if (open) set_sequence(s);
}
QTreeWidgetItem* Project::import_file(QString file) {
@@ -371,9 +383,6 @@ void Project::delete_media(QTreeWidgetItem* item) {
break;
case MEDIA_TYPE_SEQUENCE:
Sequence* s = get_sequence_from_tree(item);
if (sequence == s) {
set_sequence(NULL);
}
delete s;
break;
}
@@ -632,7 +641,7 @@ bool Project::load_worker(QFile& f, QXmlStreamReader& stream, int type) {
}
}
new_sequence(s, false, parent);
new_sequence(NULL, s, false, parent);
}
break;
}
+3 -1
View File
@@ -25,6 +25,8 @@ class QFile;
#define LOAD_TYPE_VERSION 69
#define SAVE_SET_FOLDER_IDS 70
class TimelineAction;
namespace Ui {
class Project;
}
@@ -45,7 +47,7 @@ public:
void clear();
QTreeWidgetItem* import_file(QString url);
void import_dialog();
void new_sequence(Sequence* s, bool open, QTreeWidgetItem* parent);
void new_sequence(TimelineAction* ta, Sequence* s, bool open, QTreeWidgetItem* parent);
QString get_next_sequence_name();
void delete_media(QTreeWidgetItem* item);
void delete_selected_media();
+48 -5
View File
@@ -2,6 +2,7 @@
#include <QDebug>
#include <QTreeWidgetItem>
#include <QMessageBox>
#include "project/clip.h"
#include "project/sequence.h"
@@ -22,7 +23,7 @@ QUndoStack undo_stack;
#define TA_ADD_CLIP_IN 7
#define TA_ADD_TRACK 8
TimelineAction::TimelineAction() : done(false) {}
TimelineAction::TimelineAction() : done(false), change_seq(false) {}
TimelineAction::~TimelineAction() {
for (int i=0;i<clips_to_add.size();i++) {
@@ -37,10 +38,14 @@ TimelineAction::~TimelineAction() {
delete deleted_media.at(i);
}
} else {
/*for (int i=0;i<media_to_add.size();i++) {
for (int i=0;i<new_sequence_items.size();i++) {
delete panel_project->get_sequence_from_tree(new_sequence_items.at(i));
delete new_sequence_items.at(i);
}
for (int i=0;i<media_to_add.size();i++) {
panel_project->delete_media(media_to_add.at(i));
delete media_to_add.at(i);
}*/
}
}
}
@@ -53,6 +58,16 @@ void TimelineAction::offset_links(QVector<Clip*>& clips, int offset) {
}
}
void TimelineAction::change_sequence(Sequence* s) {
new_seq = s;
change_seq = true;
}
void TimelineAction::new_sequence(QTreeWidgetItem *s, QTreeWidgetItem* parent) {
new_sequence_items.append(s);
new_sequence_parents.append(parent);
}
void TimelineAction::add_clips(Sequence* s, QVector<Clip*>& add) {
offset_links(add, clips_to_add.size());
clips_to_add.append(add);
@@ -156,6 +171,15 @@ void TimelineAction::undo() {
}
}
// add new sequences
for (int i=0;i<new_sequence_items.size();i++) {
if (new_sequence_parents.at(i) == NULL) {
panel_project->source_table->takeTopLevelItem(panel_project->source_table->indexOfTopLevelItem(new_sequence_items.at(i)));
} else {
new_sequence_parents.at(i)->removeChild(new_sequence_items.at(i));
}
}
// restore link references to deleted clips
for (int i=0;i<removed_link_to.size();i++) {
removed_link_from_sequence.at(i)->get_clip(removed_link_from.at(i))->linked.append(removed_link_to.at(i));
@@ -177,6 +201,10 @@ void TimelineAction::undo() {
}
}
if (change_seq) {
set_sequence(old_seq);
}
done = false;
}
@@ -190,6 +218,14 @@ void TimelineAction::redo() {
deleted_media_parents.clear();
removed_link_from_sequence.clear();
for (int i=0;i<new_sequence_items.size();i++) {
if (new_sequence_parents.at(i) == NULL) {
panel_project->source_table->addTopLevelItem(new_sequence_items.at(i));
} else {
new_sequence_parents.at(i)->addChild(new_sequence_items.at(i));
}
}
for (int i=0;i<actions.size();i++) {
switch (actions.at(i)) {
case TA_IN:
@@ -288,8 +324,10 @@ void TimelineAction::redo() {
// if we're deleting the open sequence, close it
if (panel_project->get_type_from_tree(item) == MEDIA_TYPE_SEQUENCE) {
if (panel_project->get_sequence_from_tree(item) == sequence) {
set_sequence(NULL);
if (panel_project->get_sequence_from_tree(item) == sequence && !change_seq) {
old_seq = sequence;
new_seq = NULL;
change_seq = true;
}
}
@@ -308,6 +346,11 @@ void TimelineAction::redo() {
}
}
if (change_seq) {
old_seq = sequence;
set_sequence(new_seq);
}
done = true;
}
+9
View File
@@ -15,6 +15,8 @@ class TimelineAction : public QUndoCommand {
public:
TimelineAction();
~TimelineAction();
void change_sequence(Sequence* s);
void new_sequence(QTreeWidgetItem* s, QTreeWidgetItem* parent);
void add_clips(Sequence* s, QVector<Clip*>& add);
void set_timeline_in(Sequence* s, int clip, long value);
void increase_timeline_in(Sequence* s, int clip, long value);
@@ -32,6 +34,13 @@ public:
private:
bool done;
bool change_seq;
Sequence* old_seq;
Sequence* new_seq;
QVector<QTreeWidgetItem*> new_sequence_items;
QVector<QTreeWidgetItem*> new_sequence_parents;
QVector<Sequence*> sequences;
QVector<int> actions;
QVector<int> clips;
+3 -1
View File
@@ -62,7 +62,9 @@ void SourceTable::mouseDoubleClickEvent(QMouseEvent* ) {
} else if (selectedItems().count() == 1) {
QTreeWidgetItem* item = selectedItems().at(0);
if (panel_project->get_type_from_tree(item) == MEDIA_TYPE_SEQUENCE) {
set_sequence(panel_project->get_sequence_from_tree(item));
TimelineAction* ta = new TimelineAction();
ta->change_sequence(panel_project->get_sequence_from_tree(item));
undo_stack.push(ta);
}
}
}
+5 -4
View File
@@ -173,8 +173,9 @@ void TimelineWidget::dropEvent(QDropEvent* event) {
QVector<Clip*> added_clips;
if (sequence == NULL) {
Sequence* s = new Sequence();
Sequence* s = sequence;
if (s == NULL) {
s = new Sequence();
// dumb hardcoded default values, should be settable somewhere
s->name = panel_project->get_next_sequence_name();
@@ -184,7 +185,7 @@ void TimelineWidget::dropEvent(QDropEvent* event) {
s->audio_frequency = predicted_audio_freq;
s->audio_layout = predicted_audio_layout;
panel_project->new_sequence(s, true, NULL);
panel_project->new_sequence(ta, s, true, NULL);
} else {
// delete areas before adding
QVector<Selection> delete_areas;
@@ -252,7 +253,7 @@ void TimelineWidget::dropEvent(QDropEvent* event) {
}
}
ta->add_clips(sequence, added_clips);
ta->add_clips(s, added_clips);
panel_timeline->ghosts.clear();
panel_timeline->importing = false;