forked from qt-creator/qt-creator
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:
@@ -33,6 +33,7 @@
|
|||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QRectF>
|
#include <QRectF>
|
||||||
#include <QTransform>
|
#include <QTransform>
|
||||||
|
#include <QVector3D>
|
||||||
|
|
||||||
namespace QmlDesigner {
|
namespace QmlDesigner {
|
||||||
|
|
||||||
@@ -44,6 +45,26 @@ class QMLDESIGNERCORE_EXPORT QmlVisualNode : public QmlObjectNode
|
|||||||
{
|
{
|
||||||
friend class QmlAnchors;
|
friend class QmlAnchors;
|
||||||
public:
|
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() : QmlObjectNode() {}
|
||||||
QmlVisualNode(const ModelNode &modelNode) : QmlObjectNode(modelNode) {}
|
QmlVisualNode(const ModelNode &modelNode) : QmlObjectNode(modelNode) {}
|
||||||
bool isValid() const override;
|
bool isValid() const override;
|
||||||
@@ -64,16 +85,24 @@ public:
|
|||||||
void setVisibilityOverride(bool visible);
|
void setVisibilityOverride(bool visible);
|
||||||
bool visibilityOverride() const;
|
bool visibilityOverride() const;
|
||||||
|
|
||||||
|
void initializePosition(const Position &position);
|
||||||
|
|
||||||
static bool isItemOr3DNode(const ModelNode &modelNode);
|
static bool isItemOr3DNode(const ModelNode &modelNode);
|
||||||
|
|
||||||
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
const QPointF &position,
|
const Position &position,
|
||||||
QmlVisualNode parentQmlItemNode);
|
QmlVisualNode parentQmlItemNode);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
const QPointF &position,
|
const Position &position,
|
||||||
NodeAbstractProperty parentproperty);
|
NodeAbstractProperty parentproperty);
|
||||||
|
private:
|
||||||
|
void setDoubleProperty(const PropertyName &name, double value);
|
||||||
};
|
};
|
||||||
|
|
||||||
QMLDESIGNERCORE_EXPORT uint qHash(const QmlItemNode &node);
|
QMLDESIGNERCORE_EXPORT uint qHash(const QmlItemNode &node);
|
||||||
|
@@ -74,7 +74,6 @@ bool QmlVisualNode::isRootNode() const
|
|||||||
return modelNode().isValid() && modelNode().isRootNode();
|
return modelNode().isValid() && modelNode().isRootNode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QList<QmlVisualNode> QmlVisualNode::children() const
|
QList<QmlVisualNode> QmlVisualNode::children() const
|
||||||
{
|
{
|
||||||
QList<ModelNode> childrenList;
|
QList<ModelNode> childrenList;
|
||||||
@@ -166,6 +165,23 @@ bool QmlVisualNode::visibilityOverride() const
|
|||||||
return false;
|
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
|
QmlModelStateGroup QmlVisualNode::states() const
|
||||||
{
|
{
|
||||||
if (isValid())
|
if (isValid())
|
||||||
@@ -176,7 +192,7 @@ QmlModelStateGroup QmlVisualNode::states() const
|
|||||||
|
|
||||||
QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
const QPointF &position,
|
const Position &position,
|
||||||
QmlVisualNode parentQmlItemNode)
|
QmlVisualNode parentQmlItemNode)
|
||||||
{
|
{
|
||||||
if (!parentQmlItemNode.isValid())
|
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()));
|
QScopedPointer<Model> inputModel(Model::create("QtQuick.Item", 1, 0, view->model()));
|
||||||
inputModel->setFileUrl(view->model()->fileUrl());
|
inputModel->setFileUrl(view->model()->fileUrl());
|
||||||
@@ -207,10 +225,7 @@ static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, const QSt
|
|||||||
if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) {
|
if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) {
|
||||||
ModelNode rootModelNode = rewriterView->rootModelNode();
|
ModelNode rootModelNode = rewriterView->rootModelNode();
|
||||||
inputModel->detachView(rewriterView.data());
|
inputModel->detachView(rewriterView.data());
|
||||||
|
QmlVisualNode(rootModelNode).initializePosition(position);
|
||||||
rootModelNode.variantProperty("x").setValue(qRound(position.x()));
|
|
||||||
rootModelNode.variantProperty("y").setValue(qRound(position.y()));
|
|
||||||
|
|
||||||
ModelMerger merger(view);
|
ModelMerger merger(view);
|
||||||
return merger.insertModel(rootModelNode);
|
return merger.insertModel(rootModelNode);
|
||||||
}
|
}
|
||||||
@@ -220,7 +235,7 @@ static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, const QSt
|
|||||||
|
|
||||||
QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
const QPointF &position,
|
const Position &position,
|
||||||
NodeAbstractProperty parentproperty)
|
NodeAbstractProperty parentproperty)
|
||||||
{
|
{
|
||||||
QmlObjectNode newQmlObjectNode;
|
QmlObjectNode newQmlObjectNode;
|
||||||
@@ -235,11 +250,7 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
|||||||
QList<PropertyBindingEntry> propertyBindingList;
|
QList<PropertyBindingEntry> propertyBindingList;
|
||||||
QList<PropertyBindingEntry> propertyEnumList;
|
QList<PropertyBindingEntry> propertyEnumList;
|
||||||
if (itemLibraryEntry.qmlSource().isEmpty()) {
|
if (itemLibraryEntry.qmlSource().isEmpty()) {
|
||||||
QList<QPair<PropertyName, QVariant> > propertyPairList;
|
QList<QPair<PropertyName, QVariant> > propertyPairList = position.propertyPairList();
|
||||||
if (!position.isNull()) {
|
|
||||||
propertyPairList.append({"x", QVariant(qRound(position.x()))});
|
|
||||||
propertyPairList.append({"y", QVariant(qRound(position.y()))});
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto &property : itemLibraryEntry.properties()) {
|
for (const auto &property : itemLibraryEntry.properties()) {
|
||||||
if (property.type() == "binding") {
|
if (property.type() == "binding") {
|
||||||
@@ -367,4 +378,20 @@ QmlModelState QmlModelStateGroup::state(const QString &name) const
|
|||||||
return QmlModelState();
|
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
|
} //QmlDesigner
|
||||||
|
Reference in New Issue
Block a user