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 <miikka.heikkinen@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Thomas Hartmann
2019-11-08 14:53:30 +01:00
parent 25fec203bc
commit 9af46e5114
2 changed files with 71 additions and 15 deletions

View File

@@ -33,6 +33,7 @@
#include <QStringList>
#include <QRectF>
#include <QTransform>
#include <QVector3D>
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<QPair<PropertyName, QVariant>> 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);

View File

@@ -74,7 +74,6 @@ bool QmlVisualNode::isRootNode() const
return modelNode().isValid() && modelNode().isRootNode();
}
QList<QmlVisualNode> QmlVisualNode::children() const
{
QList<ModelNode> 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<Model> 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<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()))});
}
QList<QPair<PropertyName, QVariant> > 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<QPair<PropertyName, QVariant> > QmlVisualNode::Position::propertyPairList() const
{
QList<QPair<PropertyName, QVariant> > 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