diff --git a/app/panel/node/node.cpp b/app/panel/node/node.cpp index cbeef8d2a..892b0c32f 100644 --- a/app/panel/node/node.cpp +++ b/app/panel/node/node.cpp @@ -73,6 +73,11 @@ void NodePanel::Paste() node_view_->Paste(); } +void NodePanel::Duplicate() +{ + node_view_->Duplicate(); +} + void NodePanel::Select(const QList &nodes) { node_view_->Select(nodes); diff --git a/app/panel/node/node.h b/app/panel/node/node.h index c2f07a482..9dc9533b8 100644 --- a/app/panel/node/node.h +++ b/app/panel/node/node.h @@ -47,6 +47,8 @@ public: virtual void Paste() override; + virtual void Duplicate() override; + public slots: void Select(const QList& nodes); void SelectWithDependencies(const QList& nodes); diff --git a/app/widget/menu/menushared.cpp b/app/widget/menu/menushared.cpp index 2d68e3a3d..563630fb7 100644 --- a/app/widget/menu/menushared.cpp +++ b/app/widget/menu/menushared.cpp @@ -188,7 +188,7 @@ void MenuShared::PasteInsertTriggered() void MenuShared::DuplicateTriggered() { - qDebug() << "FIXME: Stub"; + PanelManager::instance()->CurrentlyFocused()->Duplicate(); } void MenuShared::EnableDisableTriggered() diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index ae48de055..d6582cff9 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -184,13 +184,61 @@ void NodeView::Paste() Core::instance()->undo_stack()->pushIfHasChildren(command); if (!pasted_nodes.isEmpty()) { - QList items; + AttachNodesToCursor(pasted_nodes); + } +} - foreach (Node* p, pasted_nodes) { - items.append(scene_.NodeToUIObject(p)); +void NodeView::Duplicate() +{ + if (!graph_) { + return; + } + + QList selected = scene_.GetSelectedNodes(); + + if (selected.isEmpty()) { + return; + } + + QUndoCommand* command = new QUndoCommand(); + + QList duplicated_nodes; + + foreach (Node* n, selected) { + Node* copy = n->copy(); + + Node::CopyInputs(n, copy, false); + copy->SetPosition(n->GetPosition()); + + duplicated_nodes.append(copy); + + new NodeAddCommand(graph_, copy, command); + } + + for (int i=0;ioutput()->edges()) { + if (edge->input()->parentNode() == dst) { + new NodeEdgeAddCommand(duplicated_nodes.at(i)->output(), + duplicated_nodes.at(j)->GetInputWithID(edge->input()->id()), + command); + } + } } + } - AttachItemToCursor(items); + Core::instance()->undo_stack()->pushIfHasChildren(command); + + if (!duplicated_nodes.isEmpty()) { + AttachNodesToCursor(duplicated_nodes); } } @@ -208,7 +256,7 @@ void NodeView::keyPressEvent(QKeyEvent *event) super::keyPressEvent(event); if (event->key() == Qt::Key_Escape && !attached_items_.isEmpty()) { - DetachItemFromCursor(); + DetachItemsFromCursor(); // We undo the last action which SHOULD be adding the node // FIXME: Possible danger of this not being the case? @@ -221,7 +269,7 @@ void NodeView::mousePressEvent(QMouseEvent *event) if (HandPress(event)) return; if (!attached_items_.isEmpty()) { - DetachItemFromCursor(); + DetachItemsFromCursor(); if (attached_items_.size() == 1) { Node* dropping_node = attached_items_.first().item->GetNode(); @@ -396,7 +444,7 @@ void NodeView::CreateNodeSlot(QAction *action) Core::instance()->undo_stack()->push(new NodeAddCommand(graph_, new_node)); NodeViewItem* item = scene_.NodeToUIObject(new_node); - AttachItemToCursor({item}); + AttachItemsToCursor({item}); } } @@ -548,9 +596,20 @@ void NodeView::PlaceNode(NodeViewItem *n, const QPointF &pos) } } -void NodeView::AttachItemToCursor(const QList& items) +void NodeView::AttachNodesToCursor(const QList &nodes) { - DetachItemFromCursor(); + QList items; + + foreach (Node* p, nodes) { + items.append(scene_.NodeToUIObject(p)); + } + + AttachItemsToCursor(items); +} + +void NodeView::AttachItemsToCursor(const QList& items) +{ + DetachItemsFromCursor(); if (!items.isEmpty()) { foreach (NodeViewItem* i, items) { @@ -563,7 +622,7 @@ void NodeView::AttachItemToCursor(const QList& items) } } -void NodeView::DetachItemFromCursor() +void NodeView::DetachItemsFromCursor() { attached_items_.clear(); setMouseTracking(false); diff --git a/app/widget/nodeview/nodeview.h b/app/widget/nodeview/nodeview.h index 0454e6943..c8ae334a0 100644 --- a/app/widget/nodeview/nodeview.h +++ b/app/widget/nodeview/nodeview.h @@ -64,6 +64,8 @@ public: void CopySelected(bool cut); void Paste(); + void Duplicate(); + signals: /** * @brief Signal emitted when the selected nodes have changed @@ -82,9 +84,11 @@ protected: private: void PlaceNode(NodeViewItem* n, const QPointF& pos); - void AttachItemToCursor(const QList& item); + void AttachNodesToCursor(const QList& nodes); - void DetachItemFromCursor(); + void AttachItemsToCursor(const QList& items); + + void DetachItemsFromCursor(); void SetFlowDirection(NodeViewCommon::FlowDirection dir); diff --git a/app/widget/panel/panel.h b/app/widget/panel/panel.h index a0008faf0..1d25f5eba 100644 --- a/app/widget/panel/panel.h +++ b/app/widget/panel/panel.h @@ -165,6 +165,8 @@ public: virtual void ToggleSelectedEnabled(){} + virtual void Duplicate(){} + signals: void CloseRequested();