forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user