From aa13816fefd659691797cbd34873a9d879af5972 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 6 Apr 2019 21:32:33 +1100 Subject: [PATCH] split selection works again --- timeline/sequence.cpp | 59 +++++++++++++++++++++++++++++++++---------- timeline/sequence.h | 2 +- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/timeline/sequence.cpp b/timeline/sequence.cpp index 5ac286673..bb72dc772 100644 --- a/timeline/sequence.cpp +++ b/timeline/sequence.cpp @@ -578,8 +578,9 @@ void Sequence::ToggleLinksOnSelected() void Sequence::Split() { ComboAction* ca = new ComboAction(); - bool split_selected = false; + bool split_occurred = false; + // See if there are any selected clips at the current playhead to split QVector selected_clips = SelectedClips(true); if (selected_clips.size() > 0) { // see if whole clips are selected @@ -594,31 +595,62 @@ void Sequence::Split() if (s != nullptr) { pre_clips.append(c); post_clips.append(s); - split_selected = true; + split_occurred = true; } } - if (split_selected) { + if (split_occurred) { // relink clips if we split olive::timeline::RelinkClips(pre_clips, post_clips); ca->append(new AddClipCommand(post_clips)); - } else { + } + } - // split a selection if not - // FIXME reimplement split selection - //split_selected = split_selection(ca); + // If we weren't able to split any selected clips above, see if there are arbitrary selections to split + if (!split_occurred) { + TrackList* track_list; + Track* track; + + foreach (track_list, track_lists_) { + + QVector tracks = track_list->tracks(); + foreach (track, tracks) { + + QVector track_selections = track->Selections(); + QVector split_positions; + + for (int j=0;jClipCount();i++) { + Clip* c = track->GetClip(i).get(); + + if (SplitClipAtPositions(ca, c, split_positions, false)) { + split_occurred = true; + } + } + } } } // if nothing was selected or no selections fell within playhead, simply split at playhead - if (!split_selected) { - split_selected = SplitAllClipsAtPoint(ca, playhead); + if (!split_occurred) { + split_occurred = SplitAllClipsAtPoint(ca, playhead); } - if (split_selected) { + if (split_occurred) { olive::undo_stack.push(ca); update_ui(true); } else { @@ -734,7 +766,7 @@ bool Sequence::SplitAllClipsAtPoint(ComboAction *ca, long point) return split; } -bool Sequence::SplitClipAtPositions(ComboAction *ca, Clip* clip, QVector positions, bool relink) +bool Sequence::SplitClipAtPositions(ComboAction *ca, Clip* clip, QVector positions, bool also_split_links) { // Add the clip and each of its links to the pre_splits array @@ -743,7 +775,7 @@ bool Sequence::SplitClipAtPositions(ComboAction *ca, Clip* clip, QVector p QVector pre_splits; pre_splits.append(clip); - if (relink) { + if (also_split_links) { for (int i=0;ilinked.size();i++) { pre_splits.append(clip->linked.at(i)); } @@ -772,7 +804,8 @@ bool Sequence::SplitClipAtPositions(ComboAction *ca, Clip* clip, QVector p split_occurred = true; if (i + 1 < positions.size()) { - post_splits[i][j]->set_timeline_out(positions.at(i+1)); + post_splits[i][j]->set_timeline_out(qMin(post_splits[i][j]->timeline_out(), + positions.at(i+1))); } } } diff --git a/timeline/sequence.h b/timeline/sequence.h index 95c7ec65a..41c2cfbb7 100644 --- a/timeline/sequence.h +++ b/timeline/sequence.h @@ -92,7 +92,7 @@ public: void Split(); bool SplitAllClipsAtPoint(ComboAction *ca, long point); - bool SplitClipAtPositions(ComboAction* ca, Clip *clip, QVector positions, bool relink = true); + bool SplitClipAtPositions(ComboAction* ca, Clip *clip, QVector positions, bool also_split_links = true); void RippleDeleteEmptySpace(ComboAction *ca, Track *track, long point); void RippleDeleteArea(ComboAction* ca, long ripple_point, long ripple_length);