forked from qt-creator/qt-creator
QmlDesigner: tweaking of pasting into the visual designer
This commit is contained in:
@@ -603,6 +603,37 @@ void DesignDocumentController::cutSelected()
|
|||||||
deleteSelected();
|
deleteSelected();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void scatterItem(ModelNode pastedNode, const ModelNode targetNode, int offset = -2000)
|
||||||
|
{
|
||||||
|
|
||||||
|
bool scatter = false;
|
||||||
|
foreach (const ModelNode &childNode, targetNode.allDirectSubModelNodes()) {
|
||||||
|
if ((childNode.variantProperty("x").value() == pastedNode.variantProperty("x").value()) &&
|
||||||
|
(childNode.variantProperty("y").value() == pastedNode.variantProperty("y").value()))
|
||||||
|
scatter = true;
|
||||||
|
}
|
||||||
|
if (!scatter)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (offset == -2000) {
|
||||||
|
double x = pastedNode.variantProperty("x").value().toDouble();
|
||||||
|
double y = pastedNode.variantProperty("y").value().toDouble();
|
||||||
|
double targetWidth = 20;
|
||||||
|
double targetHeight = 20;
|
||||||
|
x = x + double(qrand()) / RAND_MAX * targetWidth - targetWidth / 2;
|
||||||
|
y = y + double(qrand()) / RAND_MAX * targetHeight - targetHeight / 2;
|
||||||
|
pastedNode.variantProperty("x") = int(x);
|
||||||
|
pastedNode.variantProperty("y") = int(y);
|
||||||
|
} else {
|
||||||
|
double x = pastedNode.variantProperty("x").value().toDouble();
|
||||||
|
double y = pastedNode.variantProperty("y").value().toDouble();
|
||||||
|
x = x + offset;
|
||||||
|
y = y + offset;
|
||||||
|
pastedNode.variantProperty("x") = int(x);
|
||||||
|
pastedNode.variantProperty("y") = int(y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DesignDocumentController::paste()
|
void DesignDocumentController::paste()
|
||||||
{
|
{
|
||||||
QScopedPointer<Model> model(Model::create("empty"));
|
QScopedPointer<Model> model(Model::create("empty"));
|
||||||
@@ -633,16 +664,14 @@ void DesignDocumentController::paste()
|
|||||||
if (!view.selectedModelNodes().isEmpty())
|
if (!view.selectedModelNodes().isEmpty())
|
||||||
targetNode = view.selectedModelNodes().first();
|
targetNode = view.selectedModelNodes().first();
|
||||||
|
|
||||||
if (targetNode.isValid() && targetNode.parentProperty().isValid())
|
//In case we copy and paste a selection we paste in the parent item
|
||||||
|
if ((view.selectedModelNodes().count() == selectedNodes.count()) && targetNode.isValid() && targetNode.parentProperty().isValid()) {
|
||||||
targetNode = targetNode.parentProperty().parentModelNode();
|
targetNode = targetNode.parentProperty().parentModelNode();
|
||||||
|
}
|
||||||
|
|
||||||
if (!targetNode.isValid())
|
if (!targetNode.isValid())
|
||||||
targetNode = view.rootModelNode();
|
targetNode = view.rootModelNode();
|
||||||
|
|
||||||
|
|
||||||
if (targetNode.parentProperty().isValid())
|
|
||||||
targetNode = targetNode.parentProperty().parentModelNode();
|
|
||||||
|
|
||||||
foreach (const ModelNode &node, selectedNodes) {
|
foreach (const ModelNode &node, selectedNodes) {
|
||||||
foreach (const ModelNode &node2, selectedNodes) {
|
foreach (const ModelNode &node2, selectedNodes) {
|
||||||
if (node.isAncestorOf(node2))
|
if (node.isAncestorOf(node2))
|
||||||
@@ -654,10 +683,13 @@ void DesignDocumentController::paste()
|
|||||||
|
|
||||||
RewriterTransaction transaction(m_d->formEditorView.data());
|
RewriterTransaction transaction(m_d->formEditorView.data());
|
||||||
|
|
||||||
|
int offset = double(qrand()) / RAND_MAX * 20 - 10;
|
||||||
|
|
||||||
foreach (const ModelNode &node, selectedNodes) {
|
foreach (const ModelNode &node, selectedNodes) {
|
||||||
QString defaultProperty(targetNode.metaInfo().defaultProperty());
|
QString defaultProperty(targetNode.metaInfo().defaultProperty());
|
||||||
ModelNode pastedNode(view.insertModel(node));
|
ModelNode pastedNode(view.insertModel(node));
|
||||||
pastedNodeList.append(pastedNode);
|
pastedNodeList.append(pastedNode);
|
||||||
|
scatterItem(pastedNode, targetNode, offset);
|
||||||
targetNode.nodeListProperty(defaultProperty).reparentHere(pastedNode);
|
targetNode.nodeListProperty(defaultProperty).reparentHere(pastedNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -676,18 +708,16 @@ void DesignDocumentController::paste()
|
|||||||
if (!targetNode.isValid())
|
if (!targetNode.isValid())
|
||||||
targetNode = view.rootModelNode();
|
targetNode = view.rootModelNode();
|
||||||
|
|
||||||
if (targetNode.parentProperty().isValid())
|
if (targetNode.parentProperty().isValid() &&
|
||||||
|
(pastedNode.simplifiedTypeName() == targetNode.simplifiedTypeName()) &&
|
||||||
|
(pastedNode.variantProperty("width").value() == targetNode.variantProperty("width").value()) &&
|
||||||
|
(pastedNode.variantProperty("height").value() == targetNode.variantProperty("height").value()))
|
||||||
|
|
||||||
targetNode = targetNode.parentProperty().parentModelNode();
|
targetNode = targetNode.parentProperty().parentModelNode();
|
||||||
|
|
||||||
QString defaultProperty(targetNode.metaInfo().defaultProperty());
|
QString defaultProperty(targetNode.metaInfo().defaultProperty());
|
||||||
double x = pastedNode.variantProperty("x").value().toDouble();
|
|
||||||
double y = pastedNode.variantProperty("x").value().toDouble();
|
scatterItem(pastedNode, targetNode);
|
||||||
double width = targetNode.variantProperty("width").value().toDouble();
|
|
||||||
double height = targetNode.variantProperty("height").value().toDouble();
|
|
||||||
x = x + double(qrand()) / RAND_MAX * width / 4 - width / 8;
|
|
||||||
y = y + double(qrand()) / RAND_MAX * height / 4 - height / 8;
|
|
||||||
pastedNode.variantProperty("x") = int(x);
|
|
||||||
pastedNode.variantProperty("y") = int(y);
|
|
||||||
targetNode.nodeListProperty(defaultProperty).reparentHere(pastedNode);
|
targetNode.nodeListProperty(defaultProperty).reparentHere(pastedNode);
|
||||||
|
|
||||||
view.setSelectedModelNodes(QList<ModelNode>() << pastedNode);
|
view.setSelectedModelNodes(QList<ModelNode>() << pastedNode);
|
||||||
|
|||||||
Reference in New Issue
Block a user