diff --git a/app/widget/nodeview/nodeviewundo.cpp b/app/widget/nodeview/nodeviewundo.cpp index 4c05dd303..032cd0bcd 100644 --- a/app/widget/nodeview/nodeviewundo.cpp +++ b/app/widget/nodeview/nodeviewundo.cpp @@ -158,10 +158,9 @@ void NodeRemoveCommand::redo_internal() if (n->IsBlock()) { Block *b = static_cast(n); if (b->HasLinks()) { - linked_blocks_.insert(b, b->linked_clips().toList()); - foreach(Block * link, b->linked_clips()) { - b->Unlink(b, link); - } + BlockUnlinkAllCommand *unlink_command = new BlockUnlinkAllCommand(b); + unlink_command->redo(); + block_unlink_commands_.append(unlink_command); } } graph_->TakeNode(n, &memory_manager_); @@ -173,13 +172,12 @@ void NodeRemoveCommand::undo_internal() // Re-add nodes to graph foreach (Node* n, nodes_) { graph_->AddNode(n); - // If the node is a block re-link any previous links - if (n->IsBlock()) { - Block *b = static_cast(n); - foreach(Block * link, linked_blocks_[b]) { - b->Link(b, link); - } - } + } + + // Relink any blocks that were unlinked + foreach(BlockUnlinkAllCommand* command, block_unlink_commands_) { + command->undo(); + delete command; } // Re-connect edges @@ -188,7 +186,7 @@ void NodeRemoveCommand::undo_internal() } edges_.clear(); - linked_blocks_.clear(); + block_unlink_commands_.clear(); } Project *NodeRemoveCommand::GetRelevantProject() const diff --git a/app/widget/nodeview/nodeviewundo.h b/app/widget/nodeview/nodeviewundo.h index 181b0e34b..85230c803 100644 --- a/app/widget/nodeview/nodeviewundo.h +++ b/app/widget/nodeview/nodeviewundo.h @@ -27,6 +27,7 @@ #include "node/node.h" #include "nodeviewitem.h" #include "undo/undocommand.h" +#include "widget/timelinewidget/undo/undo.h" OLIVE_NAMESPACE_ENTER @@ -112,7 +113,7 @@ private: NodeGraph* graph_; QList nodes_; QList edges_; - QMap> linked_blocks_; + QList block_unlink_commands_; }; class NodeRemoveWithExclusiveDeps : public UndoCommand { diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index f8b9cb73d..076af1cd1 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -494,8 +494,6 @@ void TimelineWidget::ReplaceBlocksWithGaps(const QList &blocks, new TrackReplaceBlockWithGapCommand(original_track, b, command); if (remove_from_graph) { - new BlockUnlinkAllCommand(b, command); - new NodeRemoveWithExclusiveDeps(static_cast(b->parent()), b, command); } } diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index 36ab7a6bd..9732ffa08 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -243,10 +243,6 @@ void TrackRippleRemoveAreaCommand::redo_internal() foreach (Block* remove_block, removed_blocks_) { track_->RippleRemoveBlock(remove_block); - BlockUnlinkAllCommand* unlink_command = new BlockUnlinkAllCommand(remove_block); - unlink_command->redo(); - remove_block_commands_.append(unlink_command); - NodeRemoveWithExclusiveDeps* remove_command = new NodeRemoveWithExclusiveDeps(static_cast(remove_block->parent()), remove_block); remove_command->redo(); remove_block_commands_.append(remove_command);