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);