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 @@ + @@ -612,6 +613,14 @@ Scroll Wheel Zooms + + + Link/Unlink + + + Ctrl+L + + 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;