diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index 348b7a9cd..94028868b 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -298,11 +298,11 @@ void NodeView::Paste() QVector pasted_nodes = PasteNodesFromClipboard(graph_, command); - Core::instance()->undo_stack()->pushIfHasChildren(command); - if (!pasted_nodes.isEmpty()) { - AttachNodesToCursor(pasted_nodes); + command->add_child(new NodeViewAttachNodesToCursor(this, pasted_nodes)); } + + Core::instance()->undo_stack()->pushIfHasChildren(command); } void NodeView::Duplicate() @@ -321,9 +321,11 @@ void NodeView::Duplicate() QVector duplicated_nodes = Node::CopyDependencyGraph(selected, command); - Core::instance()->undo_stack()->pushIfHasChildren(command); + if (!duplicated_nodes.isEmpty()) { + command->add_child(new NodeViewAttachNodesToCursor(this, duplicated_nodes)); + } - AttachNodesToCursor(duplicated_nodes); + Core::instance()->undo_stack()->pushIfHasChildren(command); } void NodeView::SetColorLabel(int index) @@ -839,4 +841,26 @@ void NodeView::ZoomFromKeyboard(double multiplier) ZoomIntoCursorPosition(multiplier, cursor_pos); } +NodeView::NodeViewAttachNodesToCursor::NodeViewAttachNodesToCursor(NodeView *view, const QVector &nodes) : + view_(view), + nodes_(nodes) +{ +} + +void NodeView::NodeViewAttachNodesToCursor::redo() +{ + view_->AttachNodesToCursor(nodes_); +} + +void NodeView::NodeViewAttachNodesToCursor::undo() +{ + view_->DetachItemsFromCursor(); +} + +Project *NodeView::NodeViewAttachNodesToCursor::GetRelevantProject() const +{ + // Will either return a project or a nullptr which is also acceptable + return dynamic_cast(view_->graph_); +} + } diff --git a/app/widget/nodeview/nodeview.h b/app/widget/nodeview/nodeview.h index 67e13cc8c..792d697b2 100644 --- a/app/widget/nodeview/nodeview.h +++ b/app/widget/nodeview/nodeview.h @@ -110,6 +110,24 @@ private: void ZoomFromKeyboard(double multiplier); + class NodeViewAttachNodesToCursor : public UndoCommand + { + public: + NodeViewAttachNodesToCursor(NodeView* view, const QVector& nodes); + + virtual void redo() override; + + virtual void undo() override; + + virtual Project * GetRelevantProject() const override; + + private: + NodeView* view_; + + QVector nodes_; + + }; + NodeGraph* graph_; struct AttachedItem {