diff --git a/app/node/block/block.cpp b/app/node/block/block.cpp index a48ecd2cc..9f7c09cd6 100644 --- a/app/node/block/block.cpp +++ b/app/node/block/block.cpp @@ -45,7 +45,7 @@ Block::Block() : AddInput(media_out_input_); // A block's length must be greater than 0 - set_length(1); + set_length_and_media_out(1); } QString Block::Category() const diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index 3640416d3..b050b4e89 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -23,15 +23,6 @@ #include "node/graph.h" #include "node/block/transition/transition.h" -Block* CreateSplitBlock(Block* block, rational point, QObject* parent = nullptr) -{ - Block* copy = static_cast(block->copy()); - copy->set_length_and_media_in(block->length() - (point - block->in())); - copy->setParent(parent); - - return copy; -} - Node* TakeNodeFromParentGraph(Node* n, QObject* new_parent = nullptr) { static_cast(n->parent())->TakeNode(n, new_parent); @@ -219,13 +210,14 @@ void TrackRippleRemoveAreaCommand::redo() if (splice_ != nullptr) { // Split the block here - Block* copy = CreateSplitBlock(splice_, out_); + Block* copy = static_cast(splice_->copy()); splice_original_length_ = splice_->length(); splice_->set_length_and_media_out(out_ - splice_->in()); static_cast(track_->parent())->AddNode(copy); Node::CopyInputs(splice_, copy); + copy->set_length_and_media_in(splice_->length() - (out_ - splice_->in())); track_->InsertBlockAfter(copy, splice_); @@ -391,12 +383,14 @@ BlockSplitCommand::BlockSplitCommand(TrackOutput* track, Block *block, rational track_(track), block_(block), new_length_(point - block->in()), - old_length_(block->length()) + old_length_(block->length()), + point_(point) { Q_ASSERT(point > block_->in() && point < block_->out()); // Ensures that this block is deleted if this action is undone - new_block_ = CreateSplitBlock(block_, point, &memory_manager_); + new_block_ = static_cast(block_->copy()); + new_block_->setParent(&memory_manager_); // Determine if the block outputs to an "out" transition foreach (NodeEdgePtr edge, block_->output()->edges()) { @@ -412,11 +406,18 @@ void BlockSplitCommand::redo() { track_->BlockInvalidateCache(); - block_->set_length_and_media_out(new_length_); - static_cast(block_->parent())->AddNode(new_block_); Node::CopyInputs(block_, new_block_); + rational new_part_length = block_->length() - (point_ - block_->in()); + rational original_media_out = block_->media_out(); + + block_->set_length_and_media_out(new_length_); + + new_block_->set_length(new_part_length); + new_block_->set_media_in(block_->media_out()); + new_block_->set_media_out(original_media_out); + // Will re-parent new_block_ to the track's graph track_->InsertBlockAfter(new_block_, block_); diff --git a/app/widget/timelinewidget/undo/undo.h b/app/widget/timelinewidget/undo/undo.h index dd01183a8..3a6f3097c 100644 --- a/app/widget/timelinewidget/undo/undo.h +++ b/app/widget/timelinewidget/undo/undo.h @@ -212,6 +212,7 @@ private: rational new_length_; rational old_length_; + rational point_; Block* new_block_;