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>
This commit is contained in:
Thomas Hartmann
2017-12-19 14:10:12 +01:00
parent 9e2908df41
commit 63cd9cd780
4 changed files with 107 additions and 64 deletions

View File

@@ -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;