many fixes and ripple edit corrections

This commit is contained in:
itsmattkc
2018-07-22 17:59:03 +01:00
parent ce4d7fda60
commit 6109ed9002
22 changed files with 400 additions and 181 deletions
+4 -4
View File
@@ -12,7 +12,7 @@ extern "C" {
#include <libavformat/avformat.h>
}
Clip::Clip() {
Clip::Clip(Sequence* s) : sequence(s) {
reset();
enabled = true;
clip_in = 0;
@@ -27,8 +27,8 @@ Clip::Clip() {
pkt = new AVPacket();
}
Clip* Clip::copy() {
Clip* copy = new Clip();
Clip* Clip::copy(Sequence* s) {
Clip* copy = new Clip(s);
copy->enabled = enabled;
copy->name = QString(name);
@@ -39,7 +39,7 @@ Clip* Clip::copy() {
copy->color_r = color_r;
copy->color_g = color_g;
copy->color_b = color_b;
copy->sequence = sequence;
copy->sequence = s;
copy->media = media;
copy->media_stream = media_stream;
+3 -3
View File
@@ -36,9 +36,9 @@ struct ClipCache {
struct Clip
{
Clip();
Clip(Sequence* s);
~Clip();
Clip* copy();
Clip* copy(Sequence* s);
void reset();
bool undeletable;
@@ -57,7 +57,7 @@ struct Clip
quint8 color_b;
long getLength();
Media* media; // attached media
MediaStream* media_stream;
int media_stream;
Sequence* sequence;
// other variables (should be "duplicated" in copy())
+1 -1
View File
@@ -25,7 +25,7 @@ Sequence* Sequence::copy() {
for (int i=0;i<clip_count();i++) {
Clip* c = get_clip(i);
if (c != NULL) {
Clip* copy = c->copy();
Clip* copy = c->copy(s);
copy->linked = c->linked;
s->add_clip(copy);
}
+61 -19
View File
@@ -24,7 +24,7 @@ QUndoStack undo_stack;
#define TA_ADD_CLIP_IN 7
#define TA_ADD_TRACK 8
TimelineAction::TimelineAction() : done(false), change_seq(false) {}
TimelineAction::TimelineAction() : done(false), change_seq(false), ripple_enabled(false) {}
TimelineAction::~TimelineAction() {
for (int i=0;i<clips_to_add.size();i++) {
@@ -40,7 +40,7 @@ TimelineAction::~TimelineAction() {
}
} else {
for (int i=0;i<new_sequence_items.size();i++) {
delete panel_project->get_sequence_from_tree(new_sequence_items.at(i));
delete 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++) {
@@ -129,7 +129,16 @@ void TimelineAction::delete_media(QTreeWidgetItem* item) {
deleted_media.append(item);
}
void TimelineAction::ripple(Sequence* s, long point, long length, QVector<int>& ignore) {
ripple_enabled = true;
ripple_point = point;
ripple_length = length;
ripple_sequence = s;
ripple_ignores = ignore;
}
void TimelineAction::undo() {
// re-add deleted media
for (int i=0;i<deleted_media.size();i++) {
QTreeWidgetItem* item = deleted_media.at(i);
QTreeWidgetItem* parent = deleted_media_parents.at(i);
@@ -140,7 +149,16 @@ void TimelineAction::undo() {
}
}
for (int i=0;i<actions.size();i++) {
// de-ripple clips
if (ripple_enabled) {
for (int i=0;i<rippled_clips.size();i++) {
Clip* c = ripple_sequence->get_clip(rippled_clips.at(i));
c->timeline_in -= ripple_length;
c->timeline_out -= ripple_length;
}
}
for (int i=actions.size()-1;i>=0;i--) {
switch (actions.at(i)) {
case TA_IN:
sequences.at(i)->get_clip(clips.at(i))->timeline_in = old_values.at(i);
@@ -172,7 +190,7 @@ void TimelineAction::undo() {
}
}
// add new sequences
// remove added 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)));
@@ -218,6 +236,7 @@ void TimelineAction::redo() {
added_indexes.clear();
deleted_media_parents.clear();
removed_link_from_sequence.clear();
rippled_clips.clear();
for (int i=0;i<new_sequence_items.size();i++) {
if (new_sequence_parents.at(i) == NULL) {
@@ -227,6 +246,23 @@ void TimelineAction::redo() {
}
}
// add any new clips
if (clips_to_add.size() > 0) {
QVector<Clip*> copies;
for (int i=0;i<clips_to_add.size();i++) {
Clip* original = clips_to_add.at(i);
Clip* copy = original->copy(sequence_to_add_clips_to.at(i));
copy->linked.resize(original->linked.size());
for (int j=0;j<original->linked.size();j++) {
copy->linked[j] = original->linked.at(j) + sequence_to_add_clips_to.at(i)->clip_count();
}
copies.append(copy);
}
for (int i=0;i<clips_to_add.size();i++) {
added_indexes.append(sequence_to_add_clips_to.at(i)->add_clip(copies.at(i)));
}
}
for (int i=0;i<actions.size();i++) {
switch (actions.at(i)) {
case TA_IN:
@@ -300,20 +336,25 @@ void TimelineAction::redo() {
}
}
// add any new clips
if (clips_to_add.size() > 0) {
QVector<Clip*> copies;
for (int i=0;i<clips_to_add.size();i++) {
Clip* original = clips_to_add.at(i);
Clip* copy = original->copy();
copy->linked.resize(original->linked.size());
for (int j=0;j<original->linked.size();j++) {
copy->linked[j] = original->linked.at(j) + sequence_to_add_clips_to.at(i)->clip_count();
// ripple clips - moves all clips after a certain ripple_point by ripple_length
if (ripple_enabled) {
for (int j=0;j<ripple_sequence->clip_count();j++) {
bool found = false;
for (int i=0;i<ripple_ignores.size();i++) {
if (ripple_ignores.at(i) == j) {
found = true;
break;
}
}
if (!found) {
Clip* c = ripple_sequence->get_clip(j);
if (c != NULL && c->timeline_in >= ripple_point) {
c->timeline_in += ripple_length;
c->timeline_out += ripple_length;
rippled_clips.append(j);
}
}
copies.append(copy);
}
for (int i=0;i<clips_to_add.size();i++) {
added_indexes.append(sequence_to_add_clips_to.at(i)->add_clip(copies.at(i)));
}
}
@@ -324,8 +365,8 @@ void TimelineAction::redo() {
deleted_media_parents.append(item->parent());
// if we're deleting the open sequence, close it
if (panel_project->get_type_from_tree(item) == MEDIA_TYPE_SEQUENCE &&
panel_project->get_sequence_from_tree(item) == sequence &&
if (get_type_from_tree(item) == MEDIA_TYPE_SEQUENCE &&
get_sequence_from_tree(item) == sequence &&
!change_seq) {
old_seq = sequence;
new_seq = NULL;
@@ -347,6 +388,7 @@ void TimelineAction::redo() {
}
}
// change current sequence
if (change_seq) {
old_seq = sequence;
set_sequence(new_seq);
+8
View File
@@ -30,6 +30,7 @@ public:
void delete_clip(Sequence* s, int clip);
void add_media(QTreeWidgetItem* item);
void delete_media(QTreeWidgetItem* item);
void ripple(Sequence* s, long point, long length, QVector<int> &ignore);
void undo();
void redo();
private:
@@ -65,6 +66,13 @@ private:
QVector<QTreeWidgetItem*> media_to_add;
Sequence* ripple_sequence;
bool ripple_enabled;
long ripple_point;
long ripple_length;
QVector<int> rippled_clips;
QVector<int> ripple_ignores;
void new_action(Sequence* s, int action, int clip, long old_val, long new_val);
void offset_links(QVector<Clip*>& clips, int offset);
};