forked from qt-creator/qt-creator
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:
@@ -2,6 +2,7 @@
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
||||
|
||||
#include "edit3dwidget.h"
|
||||
#include "designdocumentview.h"
|
||||
#include "edit3dactions.h"
|
||||
#include "edit3dcanvas.h"
|
||||
#include "edit3dview.h"
|
||||
@@ -11,6 +12,7 @@
|
||||
#include "qmldesignerconstants.h"
|
||||
#include "qmldesignerplugin.h"
|
||||
#include "qmlvisualnode.h"
|
||||
#include "timelineactions.h"
|
||||
#include "viewmanager.h"
|
||||
|
||||
#include <auxiliarydataproperties.h>
|
||||
@@ -185,6 +187,10 @@ void Edit3DWidget::createContextMenu()
|
||||
QmlDesignerPlugin::instance()->currentDesignDocument()->copySelected();
|
||||
});
|
||||
|
||||
m_pasteAction = m_contextMenu->addAction(tr("Paste"), [&] {
|
||||
QmlDesignerPlugin::instance()->currentDesignDocument()->paste();
|
||||
});
|
||||
|
||||
m_deleteAction = m_contextMenu->addAction(tr("Delete"), [&] {
|
||||
view()->executeInTransaction("Edit3DWidget::createContextMenu", [&] {
|
||||
for (ModelNode &node : m_view->selectedModelNodes())
|
||||
@@ -192,7 +198,6 @@ void Edit3DWidget::createContextMenu()
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
m_contextMenu->addSeparator();
|
||||
|
||||
m_alignCameraAction = m_contextMenu->addAction(tr("Align Camera to View"), [&] {
|
||||
@@ -206,6 +211,38 @@ void Edit3DWidget::createContextMenu()
|
||||
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.
|
||||
void Edit3DWidget::updateCreateSubMenu(const QStringList &keys,
|
||||
const QHash<QString, QList<ItemLibraryEntry>> &entriesMap)
|
||||
@@ -333,8 +370,9 @@ void Edit3DWidget::showContextMenu(const QPoint &pos, const ModelNode &modelNode
|
||||
|
||||
m_editComponentAction->setEnabled(isSingleComponent);
|
||||
m_editMaterialAction->setEnabled(isModel);
|
||||
m_deleteAction->setEnabled(isNotRoot);
|
||||
m_copyAction->setEnabled(isNotRoot);
|
||||
m_pasteAction->setEnabled(isPasteAvailable());
|
||||
m_deleteAction->setEnabled(isNotRoot);
|
||||
m_alignCameraAction->setEnabled(isCamera);
|
||||
m_alignViewAction->setEnabled(isCamera);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user