diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index 7f62b107ef0..a29dc51565d 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -174,12 +174,21 @@ void Edit3DWidget::createContextMenu() ModelNodeOperations::editMaterial(selCtx); }); + m_contextMenu->addSeparator(); + + m_copyAction = m_contextMenu->addAction(tr("Copy"), [&] { + QmlDesignerPlugin::instance()->currentDesignDocument()->copySelected(); + }); + m_deleteAction = m_contextMenu->addAction(tr("Delete"), [&] { view()->executeInTransaction("Edit3DWidget::createContextMenu", [&] { for (ModelNode &node : m_view->selectedModelNodes()) node.destroy(); }); }); + + + m_contextMenu->addSeparator(); } // Called by the view to update the "create" sub-menu when the Quick3D entries are ready. @@ -303,8 +312,11 @@ void Edit3DWidget::showContextMenu(const QPoint &pos, const ModelNode &modelNode const bool isValid = modelNode.isValid(); const bool isModel = modelNode.metaInfo().isQtQuick3DModel(); + const bool isValidNotRoot = isValid && !modelNode.isRootNode(); + m_editMaterialAction->setEnabled(isModel); - m_deleteAction->setEnabled(isValid && !modelNode.isRootNode()); + m_deleteAction->setEnabled(isValidNotRoot); + m_copyAction->setEnabled(isValidNotRoot); m_contextMenu->popup(mapToGlobal(pos)); } diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h index 24c702617d0..59493281c1e 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h @@ -62,6 +62,7 @@ private: QPointer m_contextMenu; QPointer m_editMaterialAction; QPointer m_deleteAction; + QPointer m_copyAction; QPointer m_createSubMenu; ModelNode m_contextMenuTarget; QVector3D m_contextMenuPos3d;