summaryrefslogtreecommitdiff
path: root/src/plugins/qmldesigner/components
diff options
context:
space:
mode:
authorMahmoud Badri <mahmoud.badri@qt.io>2020-03-12 15:55:30 +0200
committerMahmoud Badri <mahmoud.badri@qt.io>2020-03-13 13:25:58 +0000
commit11bd2f8debc512cc263b03ccce2186435048f3ba (patch)
treedb8ca287d877009a74e5cc4284aca5f579229676 /src/plugins/qmldesigner/components
parent38458c3e401d5fcafca6fa5b97fae7dd7c1865f4 (diff)
downloadqt-creator-11bd2f8debc512cc263b03ccce2186435048f3ba.tar.gz
Enable Copy, Cut, and Paste in the Editor 3D
Task-number: QDS-1563 Change-Id: I22c3017b8c158d8bc084f050baef89fa8fffd365 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Diffstat (limited to 'src/plugins/qmldesigner/components')
-rw-r--r--src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp5
-rw-r--r--src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h2
-rw-r--r--src/plugins/qmldesigner/components/edit3d/edit3dview.cpp12
-rw-r--r--src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp14
-rw-r--r--src/plugins/qmldesigner/components/edit3d/edit3dwidget.h3
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp1
-rw-r--r--src/plugins/qmldesigner/components/integration/designdocument.cpp46
7 files changed, 69 insertions, 14 deletions
diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp
index eeaa5c48f8..3687ba362d 100644
--- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp
+++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp
@@ -112,16 +112,17 @@ void DesignerActionManager::polishActions() const
[](ActionInterface *action) { return action->type() != ActionInterface::ContextMenu; });
Core::Context qmlDesignerFormEditorContext(Constants::C_QMLFORMEDITOR);
+ Core::Context qmlDesignerEditor3DContext(Constants::C_QMLEDITOR3D);
Core::Context qmlDesignerNavigatorContext(Constants::C_QMLNAVIGATOR);
Core::Context qmlDesignerUIContext;
qmlDesignerUIContext.add(qmlDesignerFormEditorContext);
+ qmlDesignerUIContext.add(qmlDesignerEditor3DContext);
qmlDesignerUIContext.add(qmlDesignerNavigatorContext);
for (auto *action : actions) {
if (!action->menuId().isEmpty()) {
- const QString id =
- QString("QmlDesigner.%1").arg(QString::fromLatin1(action->menuId()));
+ const QString id = QString("QmlDesigner.%1").arg(QString::fromLatin1(action->menuId()));
Core::Command *cmd = Core::ActionManager::registerAction(action->action(), id.toLatin1().constData(), qmlDesignerUIContext);
diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h
index 2243a466dd..df9ab26be8 100644
--- a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h
+++ b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h
@@ -45,6 +45,8 @@ public:
void updateRenderImage(const QImage &img);
void updateActiveScene(qint32 activeScene);
+ qint32 activeScene() const { return m_activeScene; }
+
protected:
void mousePressEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp
index 34bb770be0..5e203026d3 100644
--- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp
+++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp
@@ -37,6 +37,8 @@
#include <viewmanager.h>
#include <qmldesignericons.h>
#include <utils/utilsicons.h>
+#include <coreplugin/icore.h>
+#include <designmodecontext.h>
#include <QDebug>
@@ -55,6 +57,9 @@ void Edit3DView::createEdit3DWidget()
{
createEdit3DActions();
m_edit3DWidget = new Edit3DWidget(this);
+
+ auto editor3DContext = new Internal::Editor3DContext(m_edit3DWidget.data());
+ Core::ICore::addContextObject(editor3DContext);
}
WidgetInfo Edit3DView::widgetInfo()
@@ -88,8 +93,11 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState)
const QString orientationKey = QStringLiteral("globalOrientation");
const QString editLightKey = QStringLiteral("showEditLight");
- if (sceneState.contains(sceneKey))
- edit3DWidget()->canvas()->updateActiveScene(sceneState[sceneKey].value<qint32>());
+ if (sceneState.contains(sceneKey)) {
+ qint32 newActiveScene = sceneState[sceneKey].value<qint32>();
+ edit3DWidget()->canvas()->updateActiveScene(newActiveScene);
+ rootModelNode().setAuxiliaryData("3d-active-scene", newActiveScene);
+ }
if (sceneState.contains(selectKey))
m_selectionModeAction->action()->setChecked(sceneState[selectKey].toInt() == 0);
diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp
index b21bb3d46e..461613e476 100644
--- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp
+++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp
@@ -33,6 +33,7 @@
#include "qmldesignerconstants.h"
#include "viewmanager.h"
+#include <coreplugin/icore.h>
#include <toolbox.h>
#include <utils/utilsicons.h>
#include <QVBoxLayout>
@@ -42,6 +43,11 @@ namespace QmlDesigner {
Edit3DWidget::Edit3DWidget(Edit3DView *view) :
m_view(view)
{
+ Core::Context context(Constants::C_QMLEDITOR3D);
+ m_context = new Core::IContext(this);
+ m_context->setContext(context);
+ m_context->setWidget(this);
+
setMouseTracking(true);
setFocusPolicy(Qt::WheelFocus);
@@ -93,6 +99,14 @@ Edit3DWidget::Edit3DWidget(Edit3DView *view) :
fillLayout->addWidget(m_canvas.data());
}
+void Edit3DWidget::contextHelp(const Core::IContext::HelpCallback &callback) const
+{
+ if (m_view)
+ m_view->contextHelp(callback);
+
+ callback({});
+}
+
Edit3DCanvas *Edit3DWidget::canvas() const
{
return m_canvas.data();
diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h
index 967713930e..c5cea8836c 100644
--- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h
+++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h
@@ -26,6 +26,7 @@
#include <QtWidgets/qwidget.h>
#include <QtCore/qpointer.h>
+#include <coreplugin/icontext.h>
namespace QmlDesigner {
@@ -42,12 +43,14 @@ public:
Edit3DCanvas *canvas() const;
Edit3DView *view() const;
+ void contextHelp(const Core::IContext::HelpCallback &callback) const;
private:
QPointer<Edit3DView> m_edit3DView;
QPointer<Edit3DView> m_view;
QPointer<Edit3DCanvas> m_canvas;
QPointer<ToolBox> m_toolBox;
+ Core::IContext *m_context = nullptr;
};
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
index 7cdae618b7..c9a98580a7 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
@@ -342,7 +342,6 @@ double FormEditorWidget::containerPadding() const
return DesignerSettings::getValue(DesignerSettingsKey::CONTAINERPADDING).toDouble();
}
-
void FormEditorWidget::contextHelp(const Core::IContext::HelpCallback &callback) const
{
if (m_formEditorView)
diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp
index 75b45fedb8..e5d7e8978d 100644
--- a/src/plugins/qmldesigner/components/integration/designdocument.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp
@@ -35,6 +35,8 @@
#include <qmldesignerplugin.h>
#include <viewmanager.h>
#include <nodeinstanceview.h>
+#include "qmldesignerconstants.h"
+#include "qmlvisualnode.h"
#include <projectexplorer/projecttree.h>
#include <projectexplorer/project.h>
@@ -44,6 +46,7 @@
#include <qtsupport/qtkitinformation.h>
#include <qtsupport/qtsupportconstants.h>
#include <qtsupport/qtversionmanager.h>
+#include <coreplugin/icore.h>
#include <coreplugin/idocument.h>
#include <coreplugin/editormanager/editormanager.h>
@@ -449,7 +452,7 @@ void DesignDocument::paste()
if (rootNode.type() == "empty")
return;
- if (rootNode.id() == "designer__Selection") {
+ if (rootNode.id() == "designer__Selection") { // pasting multiple objects
currentModel()->attachView(&view);
ModelNode targetNode;
@@ -458,8 +461,22 @@ void DesignDocument::paste()
targetNode = view.selectedModelNodes().constFirst();
//In case we copy and paste a selection we paste in the parent item
- if ((view.selectedModelNodes().count() == selectedNodes.count()) && targetNode.isValid() && targetNode.hasParentProperty())
+ if ((view.selectedModelNodes().count() == selectedNodes.count()) && targetNode.isValid() && targetNode.hasParentProperty()) {
targetNode = targetNode.parentProperty().parentModelNode();
+ } else {
+ // if selection is empty and copied nodes are all 3D nodes, paste them under the active scene
+ bool all3DNodes = std::find_if(selectedNodes.begin(), selectedNodes.end(),
+ [](const ModelNode &node) { return !node.isSubclassOf("QtQuick3D.Node"); })
+ == selectedNodes.end();
+ if (all3DNodes) {
+ int activeSceneId = rootModelNode().auxiliaryData("3d-active-scene").toInt();
+ if (activeSceneId != -1) {
+ NodeListProperty sceneNodeProperty
+ = QmlVisualNode::findSceneNodeProperty(rootModelNode().view(), activeSceneId);
+ targetNode = sceneNodeProperty.parentModelNode();
+ }
+ }
+ }
if (!targetNode.isValid())
targetNode = view.rootModelNode();
@@ -487,24 +504,35 @@ void DesignDocument::paste()
view.setSelectedModelNodes(pastedNodeList);
});
- } else {
- rewriterView()->executeInTransaction("DesignDocument::paste1", [this, &view, selectedNodes, rootNode](){
+ } else { // pasting single object
+ rewriterView()->executeInTransaction("DesignDocument::paste1", [this, &view, selectedNodes, rootNode]() {
currentModel()->attachView(&view);
ModelNode pastedNode(view.insertModel(rootNode));
ModelNode targetNode;
- if (!view.selectedModelNodes().isEmpty())
+ if (!view.selectedModelNodes().isEmpty()) {
targetNode = view.selectedModelNodes().constFirst();
+ } else {
+ // if selection is empty and this is a 3D Node, paste it under the active scene
+ if (pastedNode.isSubclassOf("QtQuick3D.Node")) {
+ int activeSceneId = rootModelNode().auxiliaryData("3d-active-scene").toInt();
+ if (activeSceneId != -1) {
+ NodeListProperty sceneNodeProperty
+ = QmlVisualNode::findSceneNodeProperty(rootModelNode().view(), activeSceneId);
+ targetNode = sceneNodeProperty.parentModelNode();
+ }
+ }
+ }
if (!targetNode.isValid())
targetNode = view.rootModelNode();
if (targetNode.hasParentProperty() &&
- (pastedNode.simplifiedTypeName() == targetNode.simplifiedTypeName()) &&
- (pastedNode.variantProperty("width").value() == targetNode.variantProperty("width").value()) &&
- (pastedNode.variantProperty("height").value() == targetNode.variantProperty("height").value()))
-
+ pastedNode.simplifiedTypeName() == targetNode.simplifiedTypeName() &&
+ pastedNode.variantProperty("width").value() == targetNode.variantProperty("width").value() &&
+ pastedNode.variantProperty("height").value() == targetNode.variantProperty("height").value()) {
targetNode = targetNode.parentProperty().parentModelNode();
+ }
PropertyName defaultProperty(targetNode.metaInfo().defaultPropertyName());