From 8d599b60e4520d82820b406ee1fe52f0061ee546 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 19 Nov 2019 22:16:08 +0900 Subject: [PATCH] reimplemented split at playhead functionality Reimplemented an older but very useful timeline function for splitting blocks at the current playhead. --- app/panel/timeline/timeline.cpp | 5 ++ app/panel/timeline/timeline.h | 2 + app/widget/menu/menushared.cpp | 13 +++++- app/widget/menu/menushared.h | 5 ++ app/widget/timelinewidget/timelinewidget.cpp | 49 ++++++++++++++++++++ app/widget/timelinewidget/timelinewidget.h | 4 +- 6 files changed, 75 insertions(+), 3 deletions(-) diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp index 284aa89ca..d35399fa3 100644 --- a/app/panel/timeline/timeline.cpp +++ b/app/panel/timeline/timeline.cpp @@ -59,6 +59,11 @@ void TimelinePanel::DisconnectTimelineNode() timeline_widget_->DisconnectTimelineNode(); } +void TimelinePanel::SplitAtPlayhead() +{ + timeline_widget_->SplitAtPlayhead(); +} + void TimelinePanel::ZoomIn() { timeline_widget_->ZoomIn(); diff --git a/app/panel/timeline/timeline.h b/app/panel/timeline/timeline.h index b117c16d9..f5dce2aa5 100644 --- a/app/panel/timeline/timeline.h +++ b/app/panel/timeline/timeline.h @@ -40,6 +40,8 @@ public: void DisconnectTimelineNode(); + void SplitAtPlayhead(); + virtual void ZoomIn() override; virtual void ZoomOut() override; diff --git a/app/widget/menu/menushared.cpp b/app/widget/menu/menushared.cpp index 04d3ad7b5..59d271271 100644 --- a/app/widget/menu/menushared.cpp +++ b/app/widget/menu/menushared.cpp @@ -21,6 +21,8 @@ #include "menushared.h" #include "core.h" +#include "panel/panelmanager.h" +#include "panel/timeline/timeline.h" MenuShared olive::menu_shared; @@ -43,7 +45,7 @@ void MenuShared::Initialize() edit_duplicate_item_ = Menu::CreateItem(this, "duplicate", nullptr, nullptr, "Ctrl+D"); edit_delete_item_ = Menu::CreateItem(this, "delete", nullptr, nullptr, "Del"); edit_ripple_delete_item_ = Menu::CreateItem(this, "rippledelete", nullptr, nullptr, "Shift+Del"); - edit_split_item_ = Menu::CreateItem(this, "split", nullptr, nullptr, "Ctrl+K"); + edit_split_item_ = Menu::CreateItem(this, "split", this, SLOT(SplitAtPlayhead()), "Ctrl+K"); // "In/Out" menu shared items inout_set_in_item_ = Menu::CreateItem(this, "setinpoint", nullptr, nullptr, "I"); @@ -99,6 +101,15 @@ void MenuShared::AddItemsForClipEditMenu(Menu *m) m->addAction(clip_nest_item_); } +void MenuShared::SplitAtPlayhead() +{ + TimelinePanel* timeline = olive::panel_manager->MostRecentlyFocused(); + + if (timeline != nullptr) { + timeline->SplitAtPlayhead(); + } +} + void MenuShared::Retranslate() { // "New" menu shared items diff --git a/app/widget/menu/menushared.h b/app/widget/menu/menushared.h index 0acc7ba56..4e91f7cc2 100644 --- a/app/widget/menu/menushared.h +++ b/app/widget/menu/menushared.h @@ -27,6 +27,7 @@ * @brief A static object that provides various "stock" menus for use throughout the application */ class MenuShared : public QObject { + Q_OBJECT public: MenuShared(); @@ -66,6 +67,10 @@ private: QAction* clip_link_unlink_item_; QAction* clip_enable_disable_item_; QAction* clip_nest_item_; + +private slots: + void SplitAtPlayhead(); + }; namespace olive { diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 87e8ab492..602467c5c 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -300,6 +300,55 @@ void TimelineWidget::GoToNextCut() } } +void TimelineWidget::SplitAtPlayhead() +{ + rational playhead_time = olive::timestamp_to_time(playhead_, timebase()); + + QList selected_blocks = GetSelectedBlocks(); + + // Prioritize blocks that are selected and overlap the playhead + QVector blocks_to_split; + QVector block_is_selected; + + bool some_blocks_are_selected = false; + + // Get all blocks at the playhead + foreach (TrackOutput* track, timeline_node_->Tracks()) { + Block* b = track->BlockContainingTime(playhead_time); + + if (b != nullptr) { + bool selected = false; + + // See if this block is selected + foreach (TimelineViewBlockItem* item, selected_blocks) { + if (item->block() == b) { + some_blocks_are_selected = true; + selected = true; + break; + } + } + + blocks_to_split.append(b); + block_is_selected.append(selected); + } + } + + // If some blocks are selected, we prioritize those and don't split the blocks that aren't + if (some_blocks_are_selected) { + for (int i=0;i TimelineWidget::GetSelectedBlocks() { QList list; diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index be3c9a5ab..dd4b6a6fc 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -48,6 +48,8 @@ public: void GoToNextCut(); + void SplitAtPlayhead(); + QList GetSelectedBlocks(); public slots: @@ -318,8 +320,6 @@ private: void RippleEditTo(olive::timeline::MovementMode mode, bool insert_gaps); - void SplitBlocksPreservingLinks(const QVector& blocks, const QList ×); - void SetTimeAndSignal(const int64_t& t); TrackOutput* GetTrackFromReference(const TrackReference& ref);