aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/components/integration
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2017-12-19 14:10:12 +0100
committerThomas Hartmann <thomas.hartmann@qt.io>2018-01-10 15:15:44 +0000
commit63cd9cd7801e3d18dc962b71293df9eaec81a415 (patch)
tree6c0ae2b5a15706a56782ee0955db7513d58a6655 /src/plugins/qmldesigner/components/integration
parent9e2908df41c2b881738044addcd57c5ab3f6d22b (diff)
QmlDesigner: Refactor DesignDocument and DesignDocumentView
We want to be able to reuse the copy and paste code in other parts. Therefore we move most of the code to DesignDocumentView. Change-Id: Ia0de109e92b128aef4c18255621767280e0dcfef Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src/plugins/qmldesigner/components/integration')
-rw-r--r--src/plugins/qmldesigner/components/integration/designdocument.cpp67
-rw-r--r--src/plugins/qmldesigner/components/integration/designdocumentview.cpp97
-rw-r--r--src/plugins/qmldesigner/components/integration/designdocumentview.h5
3 files changed, 106 insertions, 63 deletions
diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp
index 0e78864c140..2235e984a1d 100644
--- a/src/plugins/qmldesigner/components/integration/designdocument.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp
@@ -382,60 +382,11 @@ void DesignDocument::deleteSelected()
void DesignDocument::copySelected()
{
- QScopedPointer<Model> copyModel(Model::create("QtQuick.Rectangle", 1, 0, currentModel()));
- copyModel->setFileUrl(currentModel()->fileUrl());
- copyModel->changeImports(currentModel()->imports(), {});
-
- Q_ASSERT(copyModel);
-
DesignDocumentView view;
currentModel()->attachView(&view);
- if (view.selectedModelNodes().isEmpty())
- return;
-
- QList<ModelNode> selectedNodes(view.selectedModelNodes());
-
- foreach (const ModelNode &node, selectedNodes) {
- foreach (const ModelNode &node2, selectedNodes) {
- if (node.isAncestorOf(node2))
- selectedNodes.removeAll(node2);
- }
- }
-
- if (selectedNodes.count() == 1) {
- ModelNode selectedNode(selectedNodes.first());
-
- if (!selectedNode.isValid())
- return;
-
- currentModel()->detachView(&view);
-
- copyModel->attachView(&view);
- view.replaceModel(selectedNode);
-
- Q_ASSERT(view.rootModelNode().isValid());
- Q_ASSERT(view.rootModelNode().type() != "empty");
-
- view.toClipboard();
- } else { //multi items selected
- currentModel()->detachView(&view);
- copyModel->attachView(&view);
-
- foreach (ModelNode node, view.rootModelNode().directSubModelNodes()) {
- node.destroy();
- }
- view.changeRootNodeType("QtQuick.Rectangle", 1, 0);
- view.rootModelNode().setIdWithRefactoring(QLatin1String("designer__Selection"));
-
- foreach (const ModelNode &selectedNode, selectedNodes) {
- ModelNode newNode(view.insertModel(selectedNode));
- view.rootModelNode().nodeListProperty("data").reparentHere(newNode);
- }
-
- view.toClipboard();
- }
+ DesignDocumentView::copyModelNodes(view.selectedModelNodes());
}
void DesignDocument::cutSelected()
@@ -479,28 +430,21 @@ static void scatterItem(const ModelNode &pastedNode, const ModelNode &targetNode
void DesignDocument::paste()
{
- QScopedPointer<Model> pasteModel(Model::create("empty", 1, 0, currentModel()));
- pasteModel->setFileUrl(currentModel()->fileUrl());
- pasteModel->changeImports(currentModel()->imports(), {});
-
- Q_ASSERT(pasteModel);
+ QScopedPointer<Model> pasteModel(DesignDocumentView::pasteToModel());
if (!pasteModel)
return;
DesignDocumentView view;
pasteModel->attachView(&view);
-
- view.fromClipboard();
-
ModelNode rootNode(view.rootModelNode());
+ QList<ModelNode> selectedNodes = rootNode.directSubModelNodes();
+ pasteModel->detachView(&view);
if (rootNode.type() == "empty")
return;
- if (rootNode.id() == QLatin1String("designer__Selection")) {
- QList<ModelNode> selectedNodes = rootNode.directSubModelNodes();
- pasteModel->detachView(&view);
+ if (rootNode.id() == "designer__Selection") {
currentModel()->attachView(&view);
ModelNode targetNode;
@@ -546,7 +490,6 @@ void DesignDocument::paste()
try {
RewriterTransaction transaction(rewriterView(), QByteArrayLiteral("DesignDocument::paste2"));
- pasteModel->detachView(&view);
currentModel()->attachView(&view);
ModelNode pastedNode(view.insertModel(rootNode));
ModelNode targetNode;
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp
index a4178e615cc..b371fe3fe6e 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp
@@ -28,12 +28,18 @@
#include <basetexteditmodifier.h>
#include <modelmerger.h>
+#include "designdocument.h"
+#include <qmldesignerplugin.h>
+#include <nodelistproperty.h>
+
#include <QApplication>
#include <QPlainTextEdit>
#include <QClipboard>
#include <QMimeData>
#include <QDebug>
+#include <utils/qtcassert.h>
+
namespace QmlDesigner {
DesignDocumentView::DesignDocumentView(QObject *parent)
@@ -151,4 +157,95 @@ void DesignDocumentView::fromText(QString text)
}
}
+static Model *currentModel()
+{
+ DesignDocument *document = QmlDesignerPlugin::instance()->viewManager().currentDesignDocument();
+ if (document)
+ return document->currentModel();
+
+ return 0;
+}
+
+Model *DesignDocumentView::pasteToModel()
+{
+ Model *parentModel = currentModel();
+
+ QTC_ASSERT(parentModel, return 0);
+
+ Model *pasteModel(Model::create("empty", 1, 0, parentModel));
+
+ pasteModel->setFileUrl(parentModel->fileUrl());
+ pasteModel->changeImports(parentModel->imports(), {});
+
+ Q_ASSERT(pasteModel);
+
+ if (!pasteModel)
+ return 0;
+
+ DesignDocumentView view;
+ pasteModel->attachView(&view);
+
+ view.fromClipboard();
+
+ return pasteModel;
+}
+
+void DesignDocumentView::copyModelNodes(const QList<ModelNode> &nodesToCopy)
+{
+ Model *parentModel = currentModel();
+
+ QTC_ASSERT(parentModel, return);
+
+ QScopedPointer<Model> copyModel(Model::create("QtQuick.Rectangle", 1, 0, parentModel));
+
+ copyModel->setFileUrl(parentModel->fileUrl());
+ copyModel->changeImports(parentModel->imports(), {});
+
+ Q_ASSERT(copyModel);
+
+ QList<ModelNode> selectedNodes = nodesToCopy;
+
+ if (selectedNodes.isEmpty())
+ return;
+
+ foreach (const ModelNode &node, selectedNodes) {
+ foreach (const ModelNode &node2, selectedNodes) {
+ if (node.isAncestorOf(node2))
+ selectedNodes.removeAll(node2);
+ }
+ }
+
+ DesignDocumentView view;
+ copyModel->attachView(&view);
+
+ if (selectedNodes.count() == 1) {
+ ModelNode selectedNode(selectedNodes.first());
+
+ if (!selectedNode.isValid())
+ return;
+
+ view.replaceModel(selectedNode);
+
+ Q_ASSERT(view.rootModelNode().isValid());
+ Q_ASSERT(view.rootModelNode().type() != "empty");
+
+ view.toClipboard();
+ } else { //multi items selected
+
+ foreach (ModelNode node, view.rootModelNode().directSubModelNodes()) {
+ node.destroy();
+ }
+ view.changeRootNodeType("QtQuick.Rectangle", 2, 0);
+ view.rootModelNode().setIdWithRefactoring("designer__Selection");
+
+ foreach (const ModelNode &selectedNode, selectedNodes) {
+ ModelNode newNode(view.insertModel(selectedNode));
+ view.rootModelNode().nodeListProperty("data").reparentHere(newNode);
+ }
+
+ view.toClipboard();
+ }
+
+}
+
}// namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.h b/src/plugins/qmldesigner/components/integration/designdocumentview.h
index 41fbfd5626e..6abc92df09b 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentview.h
+++ b/src/plugins/qmldesigner/components/integration/designdocumentview.h
@@ -33,7 +33,7 @@ namespace QmlDesigner {
class ModelMerger;
-class DesignDocumentView : public AbstractView
+class QMLDESIGNERCORE_EXPORT DesignDocumentView : public AbstractView
{
Q_OBJECT
public:
@@ -49,6 +49,9 @@ public:
QString toText() const;
void fromText(QString text);
+ static Model *pasteToModel();
+ static void copyModelNodes(const QList<ModelNode> &nodesToCopy);
+
private:
std::unique_ptr<ModelMerger> m_modelMerger;
};