diff --git a/mainwindow.cpp b/mainwindow.cpp
index 6fb8c3759..76bdbe5be 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -615,3 +615,8 @@ void MainWindow::on_actionScroll_Wheel_Zooms_triggered()
{
scroll_zooms = !scroll_zooms;
}
+
+void MainWindow::on_actionLink_Unlink_triggered()
+{
+ panel_timeline->toggle_links();
+}
diff --git a/mainwindow.h b/mainwindow.h
index de836e234..bccad6377 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -152,6 +152,8 @@ private slots:
void on_actionScroll_Wheel_Zooms_triggered();
+ void on_actionLink_Unlink_triggered();
+
private:
Ui::MainWindow *ui;
void setup_layout();
diff --git a/mainwindow.ui b/mainwindow.ui
index 6be17315d..0d74dc1fa 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -76,6 +76,7 @@
+
diff --git a/panels/timeline.cpp b/panels/timeline.cpp
index 394ba119e..f7aa1bd53 100644
--- a/panels/timeline.cpp
+++ b/panels/timeline.cpp
@@ -842,6 +842,23 @@ void Timeline::snap_to_clip(long* l, bool playhead_inclusive) {
}
}
+void Timeline::toggle_links() {
+ LinkCommand* command = new LinkCommand();
+ for (int i=0;iclip_count();i++) {
+ Clip* c = sequence->get_clip(i);
+ command->clips.append(c);
+ if (c->linked.size() > 0) {
+ command->link = false; // prioritize unlinking
+ }
+ }
+ if (command->clips.size() > 0) {
+ undo_stack.push(command);
+ redraw_all_clips(true);
+ } else {
+ delete command;
+ }
+}
+
void Timeline::increase_track_height() {
for (int i=0;i get_tracks_of_linked_clips(int i);
bool has_clip_been_split(int c);
+ void toggle_links();
int get_snap_range();
int getScreenPointFromFrame(long frame);
diff --git a/project/undo.cpp b/project/undo.cpp
index e2b8e2581..10e6c28da 100644
--- a/project/undo.cpp
+++ b/project/undo.cpp
@@ -310,3 +310,33 @@ void TimelineAction::redo() {
done = true;
}
+
+LinkCommand::LinkCommand() : link(true) {}
+
+void LinkCommand::undo() {
+ for (int i=0;ilinked.clear();
+ } else {
+ c->linked = old_links.at(i);
+ }
+ }
+}
+
+void LinkCommand::redo() {
+ old_links.clear();
+ for (int i=0;ilinked.append(j);
+ }
+ }
+ } else {
+ old_links.append(c->linked);
+ c->linked.clear();
+ }
+ }
+}
diff --git a/project/undo.h b/project/undo.h
index e6d301eda..86dcd8aee 100644
--- a/project/undo.h
+++ b/project/undo.h
@@ -59,4 +59,15 @@ private:
void offset_links(QVector& clips, int offset);
};
+class LinkCommand : public QUndoCommand {
+public:
+ LinkCommand();
+ void undo();
+ void redo();
+ QVector clips;
+ bool link;
+private:
+ QVector< QVector > old_links;
+};
+
#endif // UNDO_H
diff --git a/ui/scrollarea.cpp b/ui/scrollarea.cpp
index fcca7b08b..16a737549 100644
--- a/ui/scrollarea.cpp
+++ b/ui/scrollarea.cpp
@@ -12,7 +12,7 @@ ScrollArea::ScrollArea(QWidget* parent) : QScrollArea(parent) {}
void ScrollArea::wheelEvent(QWheelEvent *e) {
if (scroll_zooms) {
e->ignore();
- if (e->angleDelta().y() != 0) panel_timeline->set_zoom(e->angleDelta().y() < 0);
+ if (e->angleDelta().y() != 0) panel_timeline->set_zoom(e->angleDelta().y() > 0);
} else {
QScrollArea::wheelEvent(e);
}
diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp
index 9e1bf55cc..7d8317b2c 100644
--- a/ui/timelinewidget.cpp
+++ b/ui/timelinewidget.cpp
@@ -266,6 +266,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
}
Selection s;
+
s.in = clip->timeline_in;
s.out = clip->timeline_out;
s.track = clip->track;