QmlDesigner: Add Paste to 3d Context Menu

Paste action is added to the context menu of the Edit3DWidget.

Task-number: QDS-8063
Change-Id: Ic4e4a58b51ca297536c72f15400f3c6ecd87d84a
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Ali Kianian
2022-10-31 18:47:24 +02:00
parent f113b05530
commit 08f5a92bac
2 changed files with 44 additions and 3 deletions

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#include "edit3dwidget.h" #include "edit3dwidget.h"
#include "designdocumentview.h"
#include "edit3dactions.h" #include "edit3dactions.h"
#include "edit3dcanvas.h" #include "edit3dcanvas.h"
#include "edit3dview.h" #include "edit3dview.h"
@@ -11,6 +12,7 @@
#include "qmldesignerconstants.h" #include "qmldesignerconstants.h"
#include "qmldesignerplugin.h" #include "qmldesignerplugin.h"
#include "qmlvisualnode.h" #include "qmlvisualnode.h"
#include "timelineactions.h"
#include "viewmanager.h" #include "viewmanager.h"
#include <auxiliarydataproperties.h> #include <auxiliarydataproperties.h>
@@ -185,6 +187,10 @@ void Edit3DWidget::createContextMenu()
QmlDesignerPlugin::instance()->currentDesignDocument()->copySelected(); QmlDesignerPlugin::instance()->currentDesignDocument()->copySelected();
}); });
m_pasteAction = m_contextMenu->addAction(tr("Paste"), [&] {
QmlDesignerPlugin::instance()->currentDesignDocument()->paste();
});
m_deleteAction = m_contextMenu->addAction(tr("Delete"), [&] { m_deleteAction = m_contextMenu->addAction(tr("Delete"), [&] {
view()->executeInTransaction("Edit3DWidget::createContextMenu", [&] { view()->executeInTransaction("Edit3DWidget::createContextMenu", [&] {
for (ModelNode &node : m_view->selectedModelNodes()) for (ModelNode &node : m_view->selectedModelNodes())
@@ -192,7 +198,6 @@ void Edit3DWidget::createContextMenu()
}); });
}); });
m_contextMenu->addSeparator(); m_contextMenu->addSeparator();
m_alignCameraAction = m_contextMenu->addAction(tr("Align Camera to View"), [&] { m_alignCameraAction = m_contextMenu->addAction(tr("Align Camera to View"), [&] {
@@ -206,6 +211,38 @@ void Edit3DWidget::createContextMenu()
m_contextMenu->addSeparator(); m_contextMenu->addSeparator();
} }
bool Edit3DWidget::isPasteAvailable() const
{
if (TimelineActions::clipboardContainsKeyframes())
return false;
auto pasteModel(DesignDocumentView::pasteToModel(view()->externalDependencies()));
if (!pasteModel)
return false;
DesignDocumentView docView{view()->externalDependencies()};
pasteModel->attachView(&docView);
auto rootNode = docView.rootModelNode();
if (rootNode.type() == "empty")
return false;
QList<ModelNode> allNodes;
if (rootNode.id() == "__multi__selection__")
allNodes << rootNode.directSubModelNodes();
else
allNodes << rootNode;
bool hasNon3DNode = std::any_of(allNodes.begin(), allNodes.end(), [](const ModelNode &node) {
return !node.metaInfo().isQtQuick3DNode();
});
if (hasNon3DNode)
return false;
return true;
}
// Called by the view to update the "create" sub-menu when the Quick3D entries are ready. // Called by the view to update the "create" sub-menu when the Quick3D entries are ready.
void Edit3DWidget::updateCreateSubMenu(const QStringList &keys, void Edit3DWidget::updateCreateSubMenu(const QStringList &keys,
const QHash<QString, QList<ItemLibraryEntry>> &entriesMap) const QHash<QString, QList<ItemLibraryEntry>> &entriesMap)
@@ -333,8 +370,9 @@ void Edit3DWidget::showContextMenu(const QPoint &pos, const ModelNode &modelNode
m_editComponentAction->setEnabled(isSingleComponent); m_editComponentAction->setEnabled(isSingleComponent);
m_editMaterialAction->setEnabled(isModel); m_editMaterialAction->setEnabled(isModel);
m_deleteAction->setEnabled(isNotRoot);
m_copyAction->setEnabled(isNotRoot); m_copyAction->setEnabled(isNotRoot);
m_pasteAction->setEnabled(isPasteAvailable());
m_deleteAction->setEnabled(isNotRoot);
m_alignCameraAction->setEnabled(isCamera); m_alignCameraAction->setEnabled(isCamera);
m_alignViewAction->setEnabled(isCamera); m_alignViewAction->setEnabled(isCamera);

View File

@@ -51,6 +51,8 @@ private:
void linkActivated(const QString &link); void linkActivated(const QString &link);
void createContextMenu(); void createContextMenu();
bool isPasteAvailable() const;
QPointer<Edit3DView> m_edit3DView; QPointer<Edit3DView> m_edit3DView;
QPointer<Edit3DView> m_view; QPointer<Edit3DView> m_view;
QPointer<Edit3DCanvas> m_canvas; QPointer<Edit3DCanvas> m_canvas;
@@ -62,8 +64,9 @@ private:
QPointer<QMenu> m_contextMenu; QPointer<QMenu> m_contextMenu;
QPointer<QAction> m_editComponentAction; QPointer<QAction> m_editComponentAction;
QPointer<QAction> m_editMaterialAction; QPointer<QAction> m_editMaterialAction;
QPointer<QAction> m_deleteAction;
QPointer<QAction> m_copyAction; QPointer<QAction> m_copyAction;
QPointer<QAction> m_pasteAction;
QPointer<QAction> m_deleteAction;
QPointer<QAction> m_alignCameraAction; QPointer<QAction> m_alignCameraAction;
QPointer<QAction> m_alignViewAction; QPointer<QAction> m_alignViewAction;
QPointer<QMenu> m_createSubMenu; QPointer<QMenu> m_createSubMenu;