From 02d7f0030496e5eb8e5bb209222f6292c89e871b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 30 Dec 2018 23:09:26 +1100 Subject: [PATCH] fixed ripple to point regression --- panels/timeline.cpp | 9 +++++---- panels/timeline.h | 2 +- project/undo.cpp | 33 ++++++++++++++++++++++++--------- project/undo.h | 4 +++- ui/timelinewidget.cpp | 10 +++++----- 5 files changed, 38 insertions(+), 20 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index a7075989c..4e78bbb5c 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -150,7 +150,7 @@ void ripple_clips(ComboAction* ca, Sequence *s, long point, long length, const Q Clip* c = s->clips.at(i); if (c != NULL) { if (c->timeline_in >= point) { - move_clip(ca, c, c->timeline_in + length, c->timeline_out + length, c->clip_in, c->track, true); + move_clip(ca, c, length, length, 0, 0, true, true); } } } @@ -1108,7 +1108,8 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { // trim and move clips around the in point delete_areas_and_relink(ca, areas); - if (ripple) ripple_clips(ca, sequence, in_point+1, -1); + + if (ripple) ripple_clips(ca, sequence, in_point, -1); } else { push_undo = false; } @@ -1785,8 +1786,8 @@ void Timeline::setup_ui() { setWidget(dockWidgetContents); } -void move_clip(ComboAction* ca, Clip *c, long iin, long iout, long iclip_in, int itrack, bool verify_transitions) { - ca->append(new MoveClipAction(c, iin, iout, iclip_in, itrack)); +void move_clip(ComboAction* ca, Clip *c, long iin, long iout, long iclip_in, int itrack, bool verify_transitions, bool relative) { + ca->append(new MoveClipAction(c, iin, iout, iclip_in, itrack, relative)); if (verify_transitions) { if (c->get_opening_transition() != NULL && c->get_opening_transition()->secondary_clip != NULL && c->get_opening_transition()->secondary_clip->timeline_out != iin) { diff --git a/panels/timeline.h b/panels/timeline.h index 9ebd96cf4..a76adc3a9 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -40,7 +40,7 @@ int getScreenPointFromFrame(double zoom, long frame); long getFrameFromScreenPoint(double zoom, int x); void draw_selection_rectangle(QPainter& painter, const QRect& rect); bool selection_contains_transition(const Selection& s, Clip* c, int type); -void move_clip(ComboAction *ca, Clip *c, long iin, long iout, long iclip_in, int itrack, bool verify_transitions = true); +void move_clip(ComboAction *ca, Clip *c, long iin, long iout, long iclip_in, int itrack, bool verify_transitions = true, bool relative = false); void ripple_clips(ComboAction *ca, Sequence* s, long point, long length, const QVector& ignore = QVector()); struct Ghost { diff --git a/project/undo.cpp b/project/undo.cpp index c8b50917a..ba111ee18 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -61,7 +61,7 @@ void ComboAction::appendPost(QUndoCommand* u) { post_commands.append(u); } -MoveClipAction::MoveClipAction(Clip *c, long iin, long iout, long iclip_in, int itrack) : +MoveClipAction::MoveClipAction(Clip *c, long iin, long iout, long iclip_in, int itrack, bool irelative) : clip(c), old_in(c->timeline_in), old_out(c->timeline_out), @@ -71,23 +71,38 @@ MoveClipAction::MoveClipAction(Clip *c, long iin, long iout, long iclip_in, int new_out(iout), new_clip_in(iclip_in), new_track(itrack), + relative(irelative), old_project_changed(mainWindow->isWindowModified()) {} void MoveClipAction::undo() { - clip->timeline_in = old_in; - clip->timeline_out = old_out; - clip->clip_in = old_clip_in; - clip->track = old_track; + if (relative) { + clip->timeline_in -= new_in; + clip->timeline_out -= new_out; + clip->clip_in -= new_clip_in; + clip->track -= new_track; + } else { + clip->timeline_in = old_in; + clip->timeline_out = old_out; + clip->clip_in = old_clip_in; + clip->track = old_track; + } mainWindow->setWindowModified(old_project_changed); } void MoveClipAction::redo() { - clip->timeline_in = new_in; - clip->timeline_out = new_out; - clip->clip_in = new_clip_in; - clip->track = new_track; + if (relative) { + clip->timeline_in += new_in; + clip->timeline_out += new_out; + clip->clip_in += new_clip_in; + clip->track += new_track; + } else { + clip->timeline_in = new_in; + clip->timeline_out = new_out; + clip->clip_in = new_clip_in; + clip->track = new_track; + } mainWindow->setWindowModified(true); } diff --git a/project/undo.h b/project/undo.h index 759d5acb7..b25c7669d 100644 --- a/project/undo.h +++ b/project/undo.h @@ -41,7 +41,7 @@ private: class MoveClipAction : public QUndoCommand { public: - MoveClipAction(Clip* c, long iin, long iout, long iclip_in, int itrack); + MoveClipAction(Clip* c, long iin, long iout, long iclip_in, int itrack, bool irelative); void undo(); void redo(); private: @@ -57,6 +57,8 @@ private: long new_clip_in; int new_track; + bool relative; + bool old_project_changed; }; diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 734487b45..ad845174b 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -975,7 +975,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { // step 3 - move clips Clip* c = sequence->clips.at(g.clip); if (g.transition == NULL) { - move_clip(ca, c, c->timeline_in + (g.in - g.old_in), c->timeline_out + (g.out - g.old_out), c->clip_in + (g.clip_in - g.old_clip_in), c->track + (g.track - g.old_track)); + move_clip(ca, c, (g.in - g.old_in), (g.out - g.old_out), (g.clip_in - g.old_clip_in), (g.track - g.old_track), true, true); // adjust transitions if we need to long new_clip_length = (g.out - g.in); @@ -1012,13 +1012,13 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { if (g.transition->secondary_clip != NULL) { if (g.in != g.old_in && !g.trimming) { long movement = g.in - g.old_in; - move_clip(ca, g.transition->parent_clip, g.transition->parent_clip->timeline_in + movement, g.transition->parent_clip->timeline_out, g.transition->parent_clip->clip_in + movement, g.transition->parent_clip->track, false); - move_clip(ca, g.transition->secondary_clip, g.transition->secondary_clip->timeline_in, g.transition->secondary_clip->timeline_out + movement, g.transition->secondary_clip->clip_in, g.transition->secondary_clip->track, false); + move_clip(ca, g.transition->parent_clip, movement, 0, movement, 0, false, true); + move_clip(ca, g.transition->secondary_clip, 0, movement, 0, 0, false, true); } } else if (is_opening_transition) { if (g.in != g.old_in) { // if transition is going to make the clip bigger, make the clip bigger - move_clip(ca, c, c->timeline_in + (g.in - g.old_in), c->timeline_out, c->clip_in + (g.clip_in - g.old_clip_in), c->track); + move_clip(ca, c, (g.in - g.old_in), 0, (g.clip_in - g.old_clip_in), 0, true, true); clip_length -= (g.in - g.old_in); } @@ -1026,7 +1026,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { } else { if (g.out != g.old_out) { // if transition is going to make the clip bigger, make the clip bigger - move_clip(ca, c, c->timeline_in, c->timeline_out + (g.out - g.old_out), c->clip_in, c->track); + move_clip(ca, c, 0, (g.out - g.old_out), 0, 0, true, true); clip_length += (g.out - g.old_out); }