From 3902a7df54dee05e4f73aa81be889a532386fdc3 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 17 Nov 2018 09:46:16 +1100 Subject: [PATCH] added paste insert --- mainwindow.cpp | 8 +++++- mainwindow.h | 2 ++ mainwindow.ui | 9 +++++++ panels/timeline.cpp | 58 +++++++++++++++++++++++++++---------------- panels/timeline.h | 3 ++- ui/timelinewidget.cpp | 7 ++++-- 6 files changed, 62 insertions(+), 25 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 1547cf736..bfb29e6a7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -393,7 +393,7 @@ void MainWindow::copy() { void MainWindow::paste() { if (panel_timeline->focused() && sequence != NULL) { - panel_timeline->paste(); + panel_timeline->paste(false); } } @@ -985,3 +985,9 @@ void MainWindow::on_actionEnable_Drop_on_Media_to_Replace_triggered() { void MainWindow::on_actionFootage_Viewer_triggered() { panel_footage_viewer->setVisible(!panel_footage_viewer->isVisible()); } + +void MainWindow::on_actionPasteInsert_triggered() { + if (panel_timeline->focused() && sequence != NULL) { + panel_timeline->paste(true); + } +} diff --git a/mainwindow.h b/mainwindow.h index 2f0bed97f..be4b941d2 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -204,6 +204,8 @@ private slots: void on_actionFootage_Viewer_triggered(); + void on_actionPasteInsert_triggered(); + private: Ui::MainWindow *ui; void setup_layout(bool reset); diff --git a/mainwindow.ui b/mainwindow.ui index 499e6d1f3..0fe17ee90 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -76,6 +76,7 @@ + @@ -288,6 +289,14 @@ Ctrl+V + + + Paste Insert + + + Ctrl+Shift+V + + Delete diff --git a/panels/timeline.cpp b/panels/timeline.cpp index a39a9054c..8589179e9 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -842,14 +842,15 @@ void Timeline::relink_clips_using_ids(QVector& old_clips, QVector& n } } -void Timeline::paste() { +void Timeline::paste(bool insert) { if (clip_clipboard.size() > 0) { ComboAction* ca = new ComboAction(); // create copies and delete areas that we'll be pasting to QVector delete_areas; QVector pasted_clips; - long paste_end = 0; + long paste_start = LONG_MAX; + long paste_end = LONG_MIN; for (int i=0;itimeline_in += sequence->playhead; cc->timeline_out += sequence->playhead; cc->track = c->track; - if (cc->timeline_out > paste_end) paste_end = cc->timeline_out; - cc->sequence = sequence; + + paste_start = qMin(paste_start, cc->timeline_in); + paste_end = qMax(paste_end, cc->timeline_out); + pasted_clips.append(cc); - Selection s; - s.in = cc->timeline_in; - s.out = cc->timeline_out; - s.track = c->track; - delete_areas.append(s); + if (!insert) { + Selection s; + s.in = cc->timeline_in; + s.out = cc->timeline_out; + s.track = c->track; + delete_areas.append(s); + } + } + if (insert) { + split_cache.clear(); + split_all_clips_at_point(ca, sequence->playhead); + ca->append(new RippleCommand(sequence, paste_start, paste_end - paste_start)); + } else { + delete_areas_and_relink(ca, delete_areas); } - delete_areas_and_relink(ca, delete_areas); - // ADAPT + // correct linked clips for (int i=0;iappend(new AddClipCommand(sequence, pasted_clips)); @@ -1056,6 +1066,20 @@ bool Timeline::split_selection(ComboAction* ca) { return false; } +bool Timeline::split_all_clips_at_point(ComboAction* ca, long point) { + bool split = false; + for (int j=0;jclips.size();j++) { + Clip* c = sequence->clips.at(j); + if (c != NULL) { + // always relinks + if (split_clip_and_relink(ca, j, point, true)) { + split = true; + } + } + } + return split; +} + void Timeline::split_at_playhead() { ComboAction* ca = new ComboAction(); bool split_selected = false; @@ -1089,15 +1113,7 @@ void Timeline::split_at_playhead() { // if nothing was selected or no selections fell within playhead, simply split at playhead if (!split_selected) { - for (int j=0;jclips.size();j++) { - Clip* c = sequence->clips.at(j); - if (c != NULL) { - // always relinks - if (split_clip_and_relink(ca, j, sequence->playhead, true)) { - split_selected = true; - } - } - } + split_selected = split_all_clips_at_point(ca, sequence->playhead); } if (split_selected) { diff --git a/panels/timeline.h b/panels/timeline.h index 68acbb46f..4ff8548ef 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -74,12 +74,13 @@ public: bool focused(); void set_zoom(bool in); void copy(bool del); - void paste(); + void paste(bool insert); void deselect(); Clip* split_clip(ComboAction* ca, int p, long frame); Clip* split_clip(ComboAction* ca, int p, long frame, long post_in); bool split_selection(ComboAction* ca); void split_at_playhead(); + bool split_all_clips_at_point(ComboAction *ca, long point); 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); diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index c0365289d..04c8895e3 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -398,10 +398,13 @@ void insert_clips(ComboAction* ca) { if (g.clip >= 0) { ignore_clips.append(sequence->clips.at(g.clip)); } else { + // don't try to close old gap if importing ripple_old_point = false; } } + panel_timeline->split_cache.clear(); + for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); if (c != NULL) { @@ -417,6 +420,8 @@ void insert_clips(ComboAction* ca) { if (c->timeline_in < earliest_new_point && c->timeline_out > earliest_new_point) { panel_timeline->split_clip_and_relink(ca, i, earliest_new_point, true); } + + // determine if we should close the gap the old clips left behind if (ripple_old_point && !((c->timeline_in < earliest_old_point && c->timeline_out <= earliest_old_point) || (c->timeline_in >= latest_old_point && c->timeline_out > latest_old_point)) && !ignore_clips.contains(c)) { @@ -426,8 +431,6 @@ void insert_clips(ComboAction* ca) { } } - panel_timeline->split_cache.clear(); - long ripple_length = (latest_new_point - earliest_new_point); RippleCommand* rc = new RippleCommand(sequence, earliest_new_point, ripple_length);