From 9af46e51145d9eb09683d0fce98e4cacb0881c6b Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 8 Nov 2019 14:53:30 +0100 Subject: [PATCH] QmlDesigner: Allow setting 3D position in QmlVisualNode We use the implicit constructor of QmlVisualNode::Position to overload the position parameter. As a result createQmlObjectNode() can be called with QPoint or QVector3D. Change-Id: I15b57810c0604c22172fa3a9ea7040e6977eaa00 Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../designercore/include/qmlvisualnode.h | 33 +++++++++++- .../designercore/model/qmlvisualnode.cpp | 53 ++++++++++++++----- 2 files changed, 71 insertions(+), 15 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index 6b80a52c760..95af9fdfd30 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -33,6 +33,7 @@ #include #include #include +#include namespace QmlDesigner { @@ -44,6 +45,26 @@ class QMLDESIGNERCORE_EXPORT QmlVisualNode : public QmlObjectNode { friend class QmlAnchors; public: + + class Position + { + friend class QmlVisualNode; + public: + Position() {} + Position(const QPointF &position) : + m_2dPos(position) + {} + Position(const QVector3D &position) : + m_3dPos(position) + {} + + QList> propertyPairList() const; + + private: + QPointF m_2dPos; + QVector3D m_3dPos; + }; + QmlVisualNode() : QmlObjectNode() {} QmlVisualNode(const ModelNode &modelNode) : QmlObjectNode(modelNode) {} bool isValid() const override; @@ -64,16 +85,24 @@ public: void setVisibilityOverride(bool visible); bool visibilityOverride() const; + void initializePosition(const Position &position); + static bool isItemOr3DNode(const ModelNode &modelNode); static QmlObjectNode createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, - const QPointF &position, + const Position &position, QmlVisualNode parentQmlItemNode); + + + + static QmlObjectNode createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, - const QPointF &position, + const Position &position, NodeAbstractProperty parentproperty); +private: + void setDoubleProperty(const PropertyName &name, double value); }; QMLDESIGNERCORE_EXPORT uint qHash(const QmlItemNode &node); diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index 04cdcaabe4e..15226fa32b8 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -74,7 +74,6 @@ bool QmlVisualNode::isRootNode() const return modelNode().isValid() && modelNode().isRootNode(); } - QList QmlVisualNode::children() const { QList childrenList; @@ -166,6 +165,23 @@ bool QmlVisualNode::visibilityOverride() const return false; } +void QmlVisualNode::setDoubleProperty(const PropertyName &name, double value) +{ + modelNode().variantProperty(name).setValue(value); +} + +void QmlVisualNode::initializePosition(const QmlVisualNode::Position &position) +{ + if (!position.m_2dPos.isNull()) { + setDoubleProperty("x", qRound(position.m_2dPos.x())); + setDoubleProperty("y", qRound(position.m_2dPos.y())); + } else if (!position.m_3dPos.isNull()) { + setDoubleProperty("x", position.m_3dPos.x()); + setDoubleProperty("y", position.m_3dPos.y()); + setDoubleProperty("z", position.m_3dPos.z()); + } +} + QmlModelStateGroup QmlVisualNode::states() const { if (isValid()) @@ -176,7 +192,7 @@ QmlModelStateGroup QmlVisualNode::states() const QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, - const QPointF &position, + const Position &position, QmlVisualNode parentQmlItemNode) { if (!parentQmlItemNode.isValid()) @@ -190,7 +206,9 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, } -static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, const QString &source, const QPointF &position) +static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, + const QString &source, + const QmlVisualNode::Position &position) { QScopedPointer inputModel(Model::create("QtQuick.Item", 1, 0, view->model())); inputModel->setFileUrl(view->model()->fileUrl()); @@ -207,10 +225,7 @@ static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, const QSt 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())); - + QmlVisualNode(rootModelNode).initializePosition(position); ModelMerger merger(view); return merger.insertModel(rootModelNode); } @@ -220,7 +235,7 @@ static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, const QSt QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, - const QPointF &position, + const Position &position, NodeAbstractProperty parentproperty) { QmlObjectNode newQmlObjectNode; @@ -235,11 +250,7 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, QList propertyBindingList; QList propertyEnumList; if (itemLibraryEntry.qmlSource().isEmpty()) { - QList > propertyPairList; - if (!position.isNull()) { - propertyPairList.append({"x", QVariant(qRound(position.x()))}); - propertyPairList.append({"y", QVariant(qRound(position.y()))}); - } + QList > propertyPairList = position.propertyPairList(); for (const auto &property : itemLibraryEntry.properties()) { if (property.type() == "binding") { @@ -367,4 +378,20 @@ QmlModelState QmlModelStateGroup::state(const QString &name) const return QmlModelState(); } +QList > QmlVisualNode::Position::propertyPairList() const +{ + QList > propertyPairList; + + if (!m_2dPos.isNull()) { + propertyPairList.append({"x", QVariant(qRound(m_2dPos.x()))}); + propertyPairList.append({"y", QVariant(qRound(m_2dPos.y()))}); + } else if (!m_3dPos.isNull()) { + propertyPairList.append({"x", QVariant(m_3dPos.x())}); + propertyPairList.append({"y", QVariant(m_3dPos.y())}); + propertyPairList.append({"z", QVariant(m_3dPos.z())}); + } + + return propertyPairList; +} + } //QmlDesigner