transitions are now editable

This commit is contained in:
itsmattkc
2018-08-08 08:55:22 +10:00
parent b29462e68b
commit ce9d7338af
9 changed files with 292 additions and 100 deletions
+103 -11
View File
@@ -15,6 +15,8 @@
#include "effects/effects.h"
#include "io/media.h"
#include "playback/cacher.h"
#include "effects/transition.h"
#include "ui/labelslider.h"
QUndoStack undo_stack;
@@ -28,6 +30,9 @@ QUndoStack undo_stack;
#define TA_ADD_CLIP_IN 7
#define TA_ADD_TRACK 8
#define TA_ADD_EFFECT 9
#define TA_ADD_TRANSITION 10
#define TA_MODIFY_TRANSITION 11
#define TA_DELETE_TRANSITION 12
TimelineAction::TimelineAction() :
done(false),
@@ -88,48 +93,49 @@ void TimelineAction::add_clips(Sequence* s, QVector<Clip*>& add) {
}
}
void TimelineAction::new_action(Sequence* s, int action, int clip, long old_val, long new_val) {
void TimelineAction::new_action(Sequence* s, int action, int clip, int transition_type, long old_val, long new_val) {
sequences.append(s);
actions.append(action);
clips.append(clip);
transition_types.append(transition_type);
old_values.append(old_val);
new_values.append(new_val);
}
void TimelineAction::set_timeline_in(Sequence* s, int clip, long value) {
new_action(s, TA_IN, clip, s->get_clip(clip)->timeline_in, value);
new_action(s, TA_IN, clip, TA_NO_TRANSITION, s->get_clip(clip)->timeline_in, value);
}
void TimelineAction::set_timeline_out(Sequence* s, int clip, long value) {
new_action(s, TA_OUT, clip, s->get_clip(clip)->timeline_out, value);
new_action(s, TA_OUT, clip, TA_NO_TRANSITION, s->get_clip(clip)->timeline_out, value);
}
void TimelineAction::set_clip_in(Sequence* s, int clip, long value) {
new_action(s, TA_CLIP_IN, clip, s->get_clip(clip)->clip_in, value);
new_action(s, TA_CLIP_IN, clip, TA_NO_TRANSITION, s->get_clip(clip)->clip_in, value);
}
void TimelineAction::set_track(Sequence* s, int clip, int value) {
new_action(s, TA_TRACK, clip, s->get_clip(clip)->track, value);
new_action(s, TA_TRACK, clip, TA_NO_TRANSITION, s->get_clip(clip)->track, value);
}
void TimelineAction::increase_timeline_in(Sequence* s, int clip, long value) {
new_action(s, TA_ADD_IN, clip, 0, value);
new_action(s, TA_ADD_IN, clip, TA_NO_TRANSITION, 0, value);
}
void TimelineAction::increase_timeline_out(Sequence* s, int clip, long value) {
new_action(s, TA_ADD_OUT, clip, 0, value);
new_action(s, TA_ADD_OUT, clip, TA_NO_TRANSITION, 0, value);
}
void TimelineAction::increase_clip_in(Sequence* s, int clip, long value) {
new_action(s, TA_ADD_CLIP_IN, clip, 0, value);
new_action(s, TA_ADD_CLIP_IN, clip, TA_NO_TRANSITION, 0, value);
}
void TimelineAction::increase_track(Sequence* s, int clip, int value) {
new_action(s, TA_ADD_TRACK, clip, 0, value);
new_action(s, TA_ADD_TRACK, clip, TA_NO_TRANSITION, 0, value);
}
void TimelineAction::delete_clip(Sequence* s, int clip) {
new_action(s, TA_DELETE, clip, 0, 0);
new_action(s, TA_DELETE, clip, TA_NO_TRANSITION, 0, 0);
}
void TimelineAction::add_media(QTreeWidgetItem* item, QTreeWidgetItem *parent) {
@@ -147,7 +153,19 @@ void TimelineAction::ripple(Sequence* s, long point, long length) {
}
void TimelineAction::add_effect(Sequence* s, int clip, int effect) {
new_action(s, TA_ADD_EFFECT, clip, 0, effect);
new_action(s, TA_ADD_EFFECT, clip, TA_NO_TRANSITION, 0, effect);
}
void TimelineAction::add_transition(Sequence* s, int clip, int transition, int type) {
new_action(s, TA_ADD_TRANSITION, clip, type, 0, transition);
}
void TimelineAction::modify_transition(Sequence* s, int clip, int type, long length) {
new_action(s, TA_MODIFY_TRANSITION, clip, type, 0, length);
}
void TimelineAction::delete_transition(Sequence* s, int clip, int type) {
new_action(s, TA_DELETE_TRANSITION, clip, type, 0, 0);
}
void TimelineAction::set_in_out(Sequence* s, bool enabled, long in, long out) {
@@ -223,11 +241,47 @@ void TimelineAction::undo() {
sequences.at(i)->get_clip(clips.at(i))->track -= new_values.at(i);
break;
case TA_ADD_EFFECT:
{
Clip* c = sequences.at(i)->get_clip(clips.at(i));
Effect* effect = c->effects.at(old_values.at(i));
c->effects.removeAt(old_values.at(i));
delete effect;
}
break;
case TA_ADD_TRANSITION:
{
Clip* c = sequences.at(i)->get_clip(clips.at(i));
if (transition_types.at(i) == TA_OPENING_TRANSITION) {
delete c->opening_transition;
c->opening_transition = NULL;
} else {
delete c->closing_transition;
c->closing_transition = NULL;
}
}
break;
case TA_MODIFY_TRANSITION:
{
Clip* c = sequences.at(i)->get_clip(clips.at(i));
if (transition_types.at(i) == TA_OPENING_TRANSITION) {
c->opening_transition->length = old_values.at(i);
} else {
c->closing_transition->length = old_values.at(i);
}
}
break;
case TA_DELETE_TRANSITION:
{
Clip* c = sequences.at(i)->get_clip(clips.at(i));
if (transition_types.at(i) == TA_OPENING_TRANSITION) {
c->opening_transition = create_transition(new_values.at(i), c);
c->opening_transition->length = old_values.at(i);
} else {
c->closing_transition = create_transition(new_values.at(i), c);
c->closing_transition->length = old_values.at(i);
}
}
break;
}
}
@@ -372,6 +426,44 @@ void TimelineAction::redo() {
c->effects.append(create_effect(new_values.at(i), c));
}
break;
case TA_ADD_TRANSITION:
{
Clip* c = sequences.at(i)->get_clip(clips.at(i));
if (transition_types.at(i) == TA_OPENING_TRANSITION) {
c->opening_transition = create_transition(new_values.at(i), c);
} else {
c->closing_transition = create_transition(new_values.at(i), c);
}
}
break;
case TA_MODIFY_TRANSITION:
{
Clip* c = sequences.at(i)->get_clip(clips.at(i));
if (transition_types.at(i) == TA_OPENING_TRANSITION) {
old_values[i] = c->opening_transition->length;
c->opening_transition->length = new_values.at(i);
} else {
old_values[i] = c->closing_transition->length;
c->closing_transition->length = new_values.at(i);
}
}
break;
case TA_DELETE_TRANSITION:
{
Clip* c = sequences.at(i)->get_clip(clips.at(i));
if (transition_types.at(i) == TA_OPENING_TRANSITION) {
new_values[i] = c->opening_transition->id;
old_values[i] = c->opening_transition->length;
delete c->opening_transition;
c->opening_transition = NULL;
} else {
new_values[i] = c->closing_transition->id;
old_values[i] = c->closing_transition->length;
delete c->closing_transition;
c->closing_transition = NULL;
}
}
break;
}
}
+13 -2
View File
@@ -3,6 +3,9 @@
class QTreeWidgetItem;
class QCheckBox;
class LabelSlider;
class Effect;
class SourceTable;
struct Clip;
struct Sequence;
struct Media;
@@ -11,6 +14,10 @@ struct Media;
#include <QUndoCommand>
#include <QVector>
#define TA_NO_TRANSITION 0
#define TA_OPENING_TRANSITION 1
#define TA_CLOSING_TRANSITION 2
extern QUndoStack undo_stack;
class TimelineAction : public QUndoCommand {
@@ -34,7 +41,10 @@ public:
void ripple(Sequence* s, long point, long length);
void ripple(Sequence* s, long point, long length, QVector<int> &ignore);
void set_in_out(Sequence* s, bool enabled, long in, long out);
void add_effect(Sequence* s, int clip, int effect);
void add_effect(Sequence* s, int clip, int effect);
void add_transition(Sequence* s, int clip, int transition, int type);
void modify_transition(Sequence* s, int clip, int type, long length);
void delete_transition(Sequence* s, int clip, int type);
void undo();
void redo();
private:
@@ -50,6 +60,7 @@ private:
QVector<Sequence*> sequences;
QVector<int> actions;
QVector<int> clips;
QVector<int> transition_types;
QVector<long> old_values;
QVector<long> new_values;
@@ -87,7 +98,7 @@ private:
long old_sequence_out;
long new_sequence_out;
void new_action(Sequence* s, int action, int clip, long old_val, long new_val);
void new_action(Sequence* s, int action, int clip, int transition_type, long old_val, long new_val);
void offset_links(QVector<Clip*>& clips, int offset);
bool old_project_changed;