diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 84a9663c6..08d06edb5 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -515,7 +515,7 @@ void Timeline::delete_in_out(bool ripple) { areas.append(s); } ComboAction* ca = new ComboAction(); - delete_areas_and_relink(ca, areas); + delete_areas_and_relink(ca, areas, true); if (ripple) ripple_clips(ca, sequence, sequence->workarea_in, sequence->workarea_in - sequence->workarea_out); ca->append(new SetTimelineInOutCommand(sequence, false, 0, 0)); undo_stack.push(ca); @@ -529,7 +529,7 @@ void Timeline::delete_selection(QVector& selections, bool ripple_dele ComboAction* ca = new ComboAction(); - delete_areas_and_relink(ca, selections); + delete_areas_and_relink(ca, selections, true); if (ripple_delete) { long ripple_point = selections.at(0).in; @@ -807,7 +807,7 @@ bool selection_contains_transition(const Selection& s, Clip* c, int type) { } } -void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& areas) { +void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& areas, bool deselect_areas) { clean_up_selections(areas); panel_effect_controls->clear_effects(true); @@ -864,10 +864,12 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& area } // deselect selected clip areas - QVector area_copy = areas; - for (int i=0;i area_copy = areas; + for (int i=0;iplayhead); ripple_clips(ca, sequence, paste_start, paste_end - paste_start); } else { - delete_areas_and_relink(ca, delete_areas); + delete_areas_and_relink(ca, delete_areas, false); } // correct linked clips @@ -1160,7 +1162,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { } // trim and move clips around the in point - delete_areas_and_relink(ca, areas); + delete_areas_and_relink(ca, areas, true); if (ripple) ripple_clips(ca, sequence, in_point, -1); } else { @@ -1185,7 +1187,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { } // trim and move clips around the in point - delete_areas_and_relink(ca, areas); + delete_areas_and_relink(ca, areas, true); if (ripple) ripple_clips(ca, sequence, s.in, s.in - s.out); } } @@ -1225,6 +1227,11 @@ bool Timeline::split_selection(ComboAction* ca) { pre_splits.append(j); post_splits.append(post_a); secondary_post_splits.append(post_b); + + if (post_a != nullptr) { + post_a->timeline_out = qMin(post_a->timeline_out, s.out); + } + split = true; } } @@ -1236,9 +1243,6 @@ bool Timeline::split_selection(ComboAction* ca) { relink_clips_using_ids(pre_splits, post_splits); relink_clips_using_ids(pre_splits, secondary_post_splits); - post_splits.removeAll(nullptr); - secondary_post_splits.removeAll(nullptr); - ca->append(new AddClipCommand(sequence, post_splits)); ca->append(new AddClipCommand(sequence, secondary_post_splits)); diff --git a/panels/timeline.h b/panels/timeline.h index 3e1248fcc..3cce9a136 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -85,7 +85,7 @@ public: bool split_clip_and_relink(ComboAction* ca, int clip, long frame, bool relink); void clean_up_selections(QVector& areas); void deselect_area(long in, long out, int track); - void delete_areas_and_relink(ComboAction *ca, QVector& areas); + void delete_areas_and_relink(ComboAction *ca, QVector& areas, bool deselect_areas); void relink_clips_using_ids(QVector& old_clips, QVector& new_clips); void update_sequence(); void increase_track_height(); diff --git a/project/undo.cpp b/project/undo.cpp index d16b481c4..89f3458b2 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -513,14 +513,18 @@ void AddClipCommand::redo() { int linkOffset = seq->clips.size(); for (int i=0;icopy(seq); - copy->linked.resize(original->linked.size()); - for (int j=0;jlinked.size();j++) { - copy->linked[j] = original->linked.at(j) + linkOffset; + if (original != nullptr) { + Clip* copy = original->copy(seq); + copy->linked.resize(original->linked.size()); + for (int j=0;jlinked.size();j++) { + copy->linked[j] = original->linked.at(j) + linkOffset; + } + if (original->opening_transition > -1) copy->opening_transition = original->get_opening_transition()->copy(copy, nullptr); + if (original->closing_transition > -1) copy->closing_transition = original->get_closing_transition()->copy(copy, nullptr); + seq->clips.append(copy); + } else { + seq->clips.append(nullptr); } - if (original->opening_transition > -1) copy->opening_transition = original->get_opening_transition()->copy(copy, nullptr); - if (original->closing_transition > -1) copy->closing_transition = original->get_closing_transition()->copy(copy, nullptr); - seq->clips.append(copy); } } mainWindow->setWindowModified(true); diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index a989fa8f6..bacc19133 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -425,7 +425,7 @@ void delete_area_under_ghosts(ComboAction* ca) { sel.track = g.track; delete_areas.append(sel); } - panel_timeline->delete_areas_and_relink(ca, delete_areas); + panel_timeline->delete_areas_and_relink(ca, delete_areas, false); } void insert_clips(ComboAction* ca) { @@ -825,7 +825,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { s.track = c->track; QVector areas; areas.append(s); - panel_timeline->delete_areas_and_relink(ca, areas); + panel_timeline->delete_areas_and_relink(ca, areas, false); } QVector add; @@ -880,7 +880,17 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { } } } else if (panel_timeline->moving_proc) { - if (panel_timeline->ghosts.size() > 0) { + bool process_moving = false; + + for (int i=0;ighosts.size();i++) { + const Ghost& g = panel_timeline->ghosts.at(i); + if (g.in != g.old_in || g.out != g.old_out || g.clip_in != g.old_clip_in) { + process_moving = true; + break; + } + } + + if (process_moving) { const Ghost& first_ghost = panel_timeline->ghosts.at(0); // if we were RIPPLING, move all the clips @@ -949,7 +959,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { } } if (new_clips.size() > 0) { - panel_timeline->delete_areas_and_relink(ca, delete_areas); + panel_timeline->delete_areas_and_relink(ca, delete_areas, false); // relink duplicated clips panel_timeline->relink_clips_using_ids(old_clips, new_clips); @@ -979,7 +989,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { s.track = g.track; delete_areas.append(s); } - panel_timeline->delete_areas_and_relink(ca, delete_areas); + panel_timeline->delete_areas_and_relink(ca, delete_areas, false); for (int i=0;ighosts.size();i++) { const Ghost& g = panel_timeline->ghosts.at(i); sequence->clips.at(g.clip)->undeletable = false; @@ -1112,7 +1122,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { move_pre = true; } - panel_timeline->delete_areas_and_relink(ca, areas); + panel_timeline->delete_areas_and_relink(ca, areas, false); if (move_post) move_clip(ca, post, qMin(transition_start, post->timeline_in), post->timeline_out, post->clip_in - (post->timeline_in - transition_start), post->track); if (move_pre) move_clip(ca, pre, pre->timeline_in, qMax(transition_end, pre->timeline_out), pre->clip_in, pre->track);