diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 3dc92a8e8..da0368d30 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -67,10 +67,10 @@ void EffectControls::menu_select(QAction* q) { const EffectMeta* meta = reinterpret_cast(q->data().value()); if (transition_menu) { if (c->get_opening_transition() == NULL) { - ca->append(new AddTransitionCommand(c, meta, TA_OPENING_TRANSITION, 30)); + ca->append(new AddTransitionCommand(c, NULL, meta, TA_OPENING_TRANSITION, 30)); } if (c->get_closing_transition() == NULL) { - ca->append(new AddTransitionCommand(c, meta, TA_CLOSING_TRANSITION, 30)); + ca->append(new AddTransitionCommand(c, NULL, meta, TA_CLOSING_TRANSITION, 30)); } } else { ca->append(new AddEffectCommand(c, meta)); diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 08f790676..06d53deb9 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -355,11 +355,11 @@ void Timeline::add_transition() { Clip* c = sequence->clips.at(i); if (c != NULL && is_clip_selected(c, true)) { if (c->get_opening_transition() == NULL) { - ca->append(new AddTransitionCommand(c, get_internal_meta(TRANSITION_INTERNAL_LINEARFADE), TA_OPENING_TRANSITION, 30)); + ca->append(new AddTransitionCommand(c, NULL, get_internal_meta(TRANSITION_INTERNAL_LINEARFADE), TA_OPENING_TRANSITION, 30)); adding = true; } if (c->get_closing_transition() == NULL) { - ca->append(new AddTransitionCommand(c, get_internal_meta(TRANSITION_INTERNAL_LINEARFADE), TA_OPENING_TRANSITION, 30)); + ca->append(new AddTransitionCommand(c, NULL, get_internal_meta(TRANSITION_INTERNAL_LINEARFADE), TA_OPENING_TRANSITION, 30)); adding = true; } } diff --git a/project/undo.cpp b/project/undo.cpp index 25ab515de..7bc728018 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -224,8 +224,9 @@ void AddEffectCommand::redo() { mainWindow->setWindowModified(true); } -AddTransitionCommand::AddTransitionCommand(Clip* c, const EffectMeta *itransition, int itype, int ilength) : +AddTransitionCommand::AddTransitionCommand(Clip* c, Clip *s, const EffectMeta *itransition, int itype, int ilength) : clip(c), + secondary(s), transition(itransition), type(itype), length(ilength), @@ -234,15 +235,18 @@ AddTransitionCommand::AddTransitionCommand(Clip* c, const EffectMeta *itransitio void AddTransitionCommand::undo() { clip->sequence->hard_delete_transition(clip, type); + if (secondary != NULL) secondary->sequence->hard_delete_transition(secondary, (type == TA_OPENING_TRANSITION) ? TA_CLOSING_TRANSITION : TA_OPENING_TRANSITION); mainWindow->setWindowModified(old_project_changed); } void AddTransitionCommand::redo() { if (type == TA_OPENING_TRANSITION) { clip->opening_transition = create_transition(clip, transition); + if (secondary != NULL) secondary->closing_transition = clip->opening_transition; if (length > 0) clip->get_opening_transition()->length = length; } else { clip->closing_transition = create_transition(clip, transition); + if (secondary != NULL) secondary->opening_transition = clip->closing_transition; if (length > 0) clip->get_closing_transition()->length = length; } mainWindow->setWindowModified(true); diff --git a/project/undo.h b/project/undo.h index 80b177176..cb35e3d13 100644 --- a/project/undo.h +++ b/project/undo.h @@ -101,11 +101,12 @@ private: class AddTransitionCommand : public QUndoCommand { public: - AddTransitionCommand(Clip* c, const EffectMeta* itransition, int itype, int ilength); + AddTransitionCommand(Clip* c, Clip* s, const EffectMeta* itransition, int itype, int ilength); void undo(); void redo(); private: Clip* clip; + Clip* secondary; const EffectMeta* transition; int type; int length; diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index e599cf5ab..de018a958 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -1015,8 +1015,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { pre = post; post = temp; } - ca->append(new AddTransitionCommand(pre, panel_timeline->transition_tool_meta, panel_timeline->transition_tool_type, transition_end - pre->timeline_in)); - ca->append(new AddTransitionCommand(post, panel_timeline->transition_tool_meta, opposite_type, post->timeline_out - transition_start)); + ca->append(new AddTransitionCommand(pre, post, panel_timeline->transition_tool_meta, panel_timeline->transition_tool_type, transition_end - pre->timeline_in)); } else { if (transition_start < c->timeline_in || transition_end > c->timeline_out) { // delete shit over there and extend timeline in @@ -1036,7 +1035,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { ca->append(new MoveClipAction(c, qMin(transition_start, c->timeline_in), qMax(transition_end, c->timeline_out), c->clip_in, c->track)); } - ca->append(new AddTransitionCommand(c, panel_timeline->transition_tool_meta, panel_timeline->transition_tool_type, transition_end - transition_start)); + ca->append(new AddTransitionCommand(c, NULL, panel_timeline->transition_tool_meta, panel_timeline->transition_tool_type, transition_end - transition_start)); } push_undo = true;