forked from qt-creator/qt-creator
QmlDesigner: Move createQmlObjectNode to QmlVisualNode
Change-Id: I6de1f84b54b0ee2489002c6d6e572c826de761ef Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -57,14 +57,7 @@ public:
|
|||||||
const QPointF &position,
|
const QPointF &position,
|
||||||
QmlItemNode parentQmlItemNode);
|
QmlItemNode parentQmlItemNode);
|
||||||
|
|
||||||
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
|
||||||
const QPointF &position,
|
|
||||||
QmlItemNode parentQmlItemNode);
|
|
||||||
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
|
||||||
const QPointF &position,
|
|
||||||
NodeAbstractProperty parentproperty);
|
|
||||||
static QmlItemNode createQmlItemNodeFromImage(AbstractView *view,
|
static QmlItemNode createQmlItemNodeFromImage(AbstractView *view,
|
||||||
const QString &imageName,
|
const QString &imageName,
|
||||||
const QPointF &position,
|
const QPointF &position,
|
||||||
|
@@ -65,6 +65,15 @@ public:
|
|||||||
bool visibilityOverride() const;
|
bool visibilityOverride() const;
|
||||||
|
|
||||||
static bool isItemOr3DNode(const ModelNode &modelNode);
|
static bool isItemOr3DNode(const ModelNode &modelNode);
|
||||||
|
|
||||||
|
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
||||||
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
|
const QPointF &position,
|
||||||
|
QmlItemNode parentQmlItemNode);
|
||||||
|
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
||||||
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
|
const QPointF &position,
|
||||||
|
NodeAbstractProperty parentproperty);
|
||||||
};
|
};
|
||||||
|
|
||||||
QMLDESIGNERCORE_EXPORT uint qHash(const QmlItemNode &node);
|
QMLDESIGNERCORE_EXPORT uint qHash(const QmlItemNode &node);
|
||||||
|
@@ -93,75 +93,6 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view,
|
|||||||
return QmlItemNode(createQmlObjectNode(view, itemLibraryEntry, position, parentQmlItemNode));
|
return QmlItemNode(createQmlObjectNode(view, itemLibraryEntry, position, parentQmlItemNode));
|
||||||
}
|
}
|
||||||
|
|
||||||
QmlObjectNode QmlItemNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, QmlItemNode parentQmlItemNode)
|
|
||||||
{
|
|
||||||
if (!parentQmlItemNode.isValid())
|
|
||||||
parentQmlItemNode = QmlItemNode(view->rootModelNode());
|
|
||||||
|
|
||||||
Q_ASSERT(parentQmlItemNode.isValid());
|
|
||||||
|
|
||||||
NodeAbstractProperty parentProperty = parentQmlItemNode.defaultNodeAbstractProperty();
|
|
||||||
|
|
||||||
return QmlItemNode::createQmlObjectNode(view, itemLibraryEntry, position, parentProperty);
|
|
||||||
}
|
|
||||||
|
|
||||||
QmlObjectNode QmlItemNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, NodeAbstractProperty parentproperty)
|
|
||||||
{
|
|
||||||
QmlObjectNode newQmlObjectNode;
|
|
||||||
|
|
||||||
view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlObjectNode, &parentproperty](){
|
|
||||||
NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName());
|
|
||||||
|
|
||||||
int minorVersion = metaInfo.minorVersion();
|
|
||||||
int majorVersion = metaInfo.majorVersion();
|
|
||||||
|
|
||||||
using PropertyBindingEntry = QPair<PropertyName, QString>;
|
|
||||||
QList<PropertyBindingEntry> propertyBindingList;
|
|
||||||
QList<PropertyBindingEntry> propertyEnumList;
|
|
||||||
if (itemLibraryEntry.qmlSource().isEmpty()) {
|
|
||||||
QList<QPair<PropertyName, QVariant> > propertyPairList;
|
|
||||||
if (!position.isNull()) {
|
|
||||||
propertyPairList.append({PropertyName("x"), QVariant(qRound(position.x()))});
|
|
||||||
propertyPairList.append({PropertyName("y"), QVariant(qRound(position.y()))});
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto &property : itemLibraryEntry.properties()) {
|
|
||||||
if (property.type() == QStringLiteral("binding")) {
|
|
||||||
propertyBindingList.append(PropertyBindingEntry(property.name(), property.value().toString()));
|
|
||||||
} else if (property.type() == QStringLiteral("enum")) {
|
|
||||||
propertyEnumList.append(PropertyBindingEntry(property.name(), property.value().toString()));
|
|
||||||
} else {
|
|
||||||
propertyPairList.append({property.name(), property.value()});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
newQmlObjectNode = QmlItemNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList));
|
|
||||||
} else {
|
|
||||||
newQmlObjectNode = createQmlItemNodeFromSource(view, itemLibraryEntry.qmlSource(), position);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parentproperty.isValid())
|
|
||||||
parentproperty.reparentHere(newQmlObjectNode);
|
|
||||||
|
|
||||||
if (!newQmlObjectNode.isValid())
|
|
||||||
return;
|
|
||||||
|
|
||||||
newQmlObjectNode.setId(view->generateNewId(itemLibraryEntry.name()));
|
|
||||||
|
|
||||||
for (const auto &propertyBindingEntry : propertyBindingList)
|
|
||||||
newQmlObjectNode.modelNode().bindingProperty(propertyBindingEntry.first).setExpression(propertyBindingEntry.second);
|
|
||||||
|
|
||||||
for (const auto &propertyBindingEntry : propertyEnumList)
|
|
||||||
newQmlObjectNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8());
|
|
||||||
|
|
||||||
Q_ASSERT(newQmlObjectNode.isValid());
|
|
||||||
});
|
|
||||||
|
|
||||||
Q_ASSERT(newQmlObjectNode.isValid());
|
|
||||||
|
|
||||||
return newQmlObjectNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
QmlItemNode QmlItemNode::createQmlItemNodeFromImage(AbstractView *view, const QString &imageName, const QPointF &position, QmlItemNode parentQmlItemNode)
|
QmlItemNode QmlItemNode::createQmlItemNodeFromImage(AbstractView *view, const QString &imageName, const QPointF &position, QmlItemNode parentQmlItemNode)
|
||||||
{
|
{
|
||||||
if (!parentQmlItemNode.isValid())
|
if (!parentQmlItemNode.isValid())
|
||||||
|
@@ -174,6 +174,110 @@ QmlModelStateGroup QmlVisualNode::states() const
|
|||||||
return QmlModelStateGroup();
|
return QmlModelStateGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
||||||
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
|
const QPointF &position,
|
||||||
|
QmlItemNode parentQmlItemNode)
|
||||||
|
{
|
||||||
|
if (!parentQmlItemNode.isValid())
|
||||||
|
parentQmlItemNode = QmlItemNode(view->rootModelNode());
|
||||||
|
|
||||||
|
Q_ASSERT(parentQmlItemNode.isValid());
|
||||||
|
|
||||||
|
NodeAbstractProperty parentProperty = parentQmlItemNode.defaultNodeAbstractProperty();
|
||||||
|
|
||||||
|
return QmlItemNode::createQmlObjectNode(view, itemLibraryEntry, position, parentProperty);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, const QString &source, const QPointF &position)
|
||||||
|
{
|
||||||
|
QScopedPointer<Model> inputModel(Model::create("QtQuick.Item", 1, 0, view->model()));
|
||||||
|
inputModel->setFileUrl(view->model()->fileUrl());
|
||||||
|
QPlainTextEdit textEdit;
|
||||||
|
|
||||||
|
textEdit.setPlainText(source);
|
||||||
|
NotIndentingTextEditModifier modifier(&textEdit);
|
||||||
|
|
||||||
|
QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, nullptr));
|
||||||
|
rewriterView->setCheckSemanticErrors(false);
|
||||||
|
rewriterView->setTextModifier(&modifier);
|
||||||
|
inputModel->setRewriterView(rewriterView.data());
|
||||||
|
|
||||||
|
if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) {
|
||||||
|
ModelNode rootModelNode = rewriterView->rootModelNode();
|
||||||
|
inputModel->detachView(rewriterView.data());
|
||||||
|
|
||||||
|
rootModelNode.variantProperty("x").setValue(qRound(position.x()));
|
||||||
|
rootModelNode.variantProperty("y").setValue(qRound(position.y()));
|
||||||
|
|
||||||
|
ModelMerger merger(view);
|
||||||
|
return merger.insertModel(rootModelNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
||||||
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
|
const QPointF &position,
|
||||||
|
NodeAbstractProperty parentproperty)
|
||||||
|
{
|
||||||
|
QmlObjectNode newQmlObjectNode;
|
||||||
|
|
||||||
|
view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlObjectNode, &parentproperty](){
|
||||||
|
NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName());
|
||||||
|
|
||||||
|
int minorVersion = metaInfo.minorVersion();
|
||||||
|
int majorVersion = metaInfo.majorVersion();
|
||||||
|
|
||||||
|
using PropertyBindingEntry = QPair<PropertyName, QString>;
|
||||||
|
QList<PropertyBindingEntry> propertyBindingList;
|
||||||
|
QList<PropertyBindingEntry> propertyEnumList;
|
||||||
|
if (itemLibraryEntry.qmlSource().isEmpty()) {
|
||||||
|
QList<QPair<PropertyName, QVariant> > propertyPairList;
|
||||||
|
if (!position.isNull()) {
|
||||||
|
propertyPairList.append({"x", QVariant(qRound(position.x()))});
|
||||||
|
propertyPairList.append({"y", QVariant(qRound(position.y()))});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &property : itemLibraryEntry.properties()) {
|
||||||
|
if (property.type() == "binding") {
|
||||||
|
propertyBindingList.append(PropertyBindingEntry(property.name(), property.value().toString()));
|
||||||
|
} else if (property.type() == "enum") {
|
||||||
|
propertyEnumList.append(PropertyBindingEntry(property.name(), property.value().toString()));
|
||||||
|
} else {
|
||||||
|
propertyPairList.append({property.name(), property.value()});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newQmlObjectNode = QmlObjectNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList));
|
||||||
|
} else {
|
||||||
|
newQmlObjectNode = createQmlObjectNodeFromSource(view, itemLibraryEntry.qmlSource(), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parentproperty.isValid())
|
||||||
|
parentproperty.reparentHere(newQmlObjectNode);
|
||||||
|
|
||||||
|
if (!newQmlObjectNode.isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
newQmlObjectNode.setId(view->generateNewId(itemLibraryEntry.name()));
|
||||||
|
|
||||||
|
for (const auto &propertyBindingEntry : propertyBindingList)
|
||||||
|
newQmlObjectNode.modelNode().bindingProperty(propertyBindingEntry.first).setExpression(propertyBindingEntry.second);
|
||||||
|
|
||||||
|
for (const auto &propertyBindingEntry : propertyEnumList)
|
||||||
|
newQmlObjectNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8());
|
||||||
|
|
||||||
|
Q_ASSERT(newQmlObjectNode.isValid());
|
||||||
|
});
|
||||||
|
|
||||||
|
Q_ASSERT(newQmlObjectNode.isValid());
|
||||||
|
|
||||||
|
return newQmlObjectNode;
|
||||||
|
}
|
||||||
|
|
||||||
QList<ModelNode> toModelNodeList(const QList<QmlVisualNode> &qmlVisualNodeList)
|
QList<ModelNode> toModelNodeList(const QList<QmlVisualNode> &qmlVisualNodeList)
|
||||||
{
|
{
|
||||||
QList<ModelNode> modelNodeList;
|
QList<ModelNode> modelNodeList;
|
||||||
|
Reference in New Issue
Block a user