many fixes and ripple edit corrections
This commit is contained in:
+4
-4
@@ -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
@@ -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())
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user