From a4f24e22d3dc9887ab2707d87a6025893898a7c6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 14 Dec 2019 23:19:50 +1100 Subject: [PATCH] correct transition connections when a clip is split When a clip is split and has an out transition, the transition should be connected to the second clip rather than the original clip. --- app/widget/timelinewidget/undo/undo.cpp | 20 ++++++++++++++++++++ app/widget/timelinewidget/undo/undo.h | 3 +++ 2 files changed, 23 insertions(+) diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index 6f35be343..f0fd5a55a 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -21,6 +21,7 @@ #include "undo.h" #include "node/graph.h" +#include "node/block/transition/transition.h" Block* CreateSplitBlock(Block* block, rational point, QObject* parent = nullptr) { @@ -360,6 +361,15 @@ BlockSplitCommand::BlockSplitCommand(TrackOutput* track, Block *block, rational // Ensures that this block is deleted if this action is undone new_block_ = CreateSplitBlock(block_, point, &memory_manager_); + + // Determine if the block outputs to an "out" transition + foreach (NodeEdgePtr edge, block_->output()->edges()) { + if (edge->input()->parentNode()->IsBlock() + && static_cast(edge->input()->parentNode())->type() == Block::kTransition + && edge->input() == static_cast(edge->input()->parentNode())->out_block_input()) { + transitions_to_move_.append(edge->input()); + } + } } void BlockSplitCommand::redo() @@ -375,6 +385,11 @@ void BlockSplitCommand::redo() track_->InsertBlockAfter(new_block_, block_); track_->UnblockInvalidateCache(); + + foreach (NodeInput* transition, transitions_to_move_) { + NodeParam::DisconnectEdge(block_->output(), transition); + NodeParam::ConnectEdge(new_block_->output(), transition); + } } void BlockSplitCommand::undo() @@ -387,6 +402,11 @@ void BlockSplitCommand::undo() TakeNodeFromParentGraph(new_block_, &memory_manager_); track_->UnblockInvalidateCache(); + + foreach (NodeInput* transition, transitions_to_move_) { + NodeParam::DisconnectEdge(new_block_->output(), transition); + NodeParam::ConnectEdge(block_->output(), transition); + } } Block *BlockSplitCommand::new_block() diff --git a/app/widget/timelinewidget/undo/undo.h b/app/widget/timelinewidget/undo/undo.h index 6cba18bf3..2bcf09423 100644 --- a/app/widget/timelinewidget/undo/undo.h +++ b/app/widget/timelinewidget/undo/undo.h @@ -189,7 +189,10 @@ private: Block* new_block_; + QList transitions_to_move_; + QObject memory_manager_; + }; class TrackSplitAtTimeCommand : public QUndoCommand {