QmlDesigner: Add container item support in node instances

Change-Id: I30e0d11346b8c63188d052b46656e7ede179e55d
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
This commit is contained in:
Marco Bubke
2013-05-28 14:14:07 +02:00
parent 21c821806d
commit b97422b710
21 changed files with 235 additions and 36 deletions
@@ -887,8 +887,10 @@ static QVector<InformationContainer> createInformationVector(const QList<ServerN
informationVector.append(InformationContainer(instance.instanceId(), SceneTransform, instance.sceneTransform()));
informationVector.append(InformationContainer(instance.instanceId(), Size, instance.size()));
informationVector.append(InformationContainer(instance.instanceId(), BoundingRect, instance.boundingRect()));
informationVector.append(InformationContainer(instance.instanceId(), ContentItemBoundingRect, instance.contentItemBoundingRect()));
informationVector.append(InformationContainer(instance.instanceId(), Transform, instance.transform()));
informationVector.append(InformationContainer(instance.instanceId(), ContentTransform, instance.contentTransform()));
informationVector.append(InformationContainer(instance.instanceId(), ContentItemTransform, instance.contentItemTransform()));
informationVector.append(InformationContainer(instance.instanceId(), HasContent, instance.hasContent()));
informationVector.append(InformationContainer(instance.instanceId(), IsMovable, instance.isMovable()));
informationVector.append(InformationContainer(instance.instanceId(), IsResizable, instance.isResizable()));
@@ -255,6 +255,11 @@ QTransform ObjectNodeInstance::customTransform() const
return QTransform();
}
QTransform ObjectNodeInstance::contentItemTransform() const
{
return QTransform();
}
QTransform ObjectNodeInstance::sceneTransform() const
{
return QTransform();
@@ -1064,6 +1069,11 @@ QObject *ObjectNodeInstance::object() const
return 0;
}
QQuickItem *ObjectNodeInstance::contentItem() const
{
return 0;
}
bool ObjectNodeInstance::hasContent() const
{
return false;
@@ -1210,7 +1220,12 @@ ObjectNodeInstance::Pointer ObjectNodeInstance::parentInstance() const
QRectF ObjectNodeInstance::boundingRect() const
{
return QRect();
return QRectF();
}
QRectF ObjectNodeInstance::contentItemBoundingBox() const
{
return QRectF();
}
QPointF ObjectNodeInstance::position() const
@@ -44,6 +44,7 @@ class QQmlContext;
class QQmlEngine;
class QQmlProperty;
class QQmlAbstractBinding;
class QQuickItem;
QT_END_NAMESPACE
namespace QmlDesigner {
@@ -104,12 +105,14 @@ public:
virtual bool equalGraphicsItem(QGraphicsItem *item) const;
virtual QRectF boundingRect() const;
virtual QRectF contentItemBoundingBox() const;
virtual QPointF position() const;
virtual QSizeF size() const;
virtual QTransform transform() const;
virtual QTransform contentTransform() const;
virtual QTransform customTransform() const;
virtual QTransform contentItemTransform() const;
virtual QTransform sceneTransform() const;
virtual double opacity() const;
@@ -153,6 +156,7 @@ public:
void setResetValue(const PropertyName &propertyName, const QVariant &value);
QObject *object() const;
virtual QQuickItem *contentItem() const;
virtual bool hasContent() const;
virtual bool isResizable() const;
@@ -56,11 +56,24 @@ QuickItemNodeInstance::~QuickItemNodeInstance()
{
}
static bool isContentItem(QQuickItem *item, NodeInstanceServer *nodeInstanceServer)
{
return item->parentItem()
&& nodeInstanceServer->hasInstanceForObject(item->parentItem())
&& nodeInstanceServer->instanceForObject(item->parentItem()).internalInstance()->contentItem() == item;
}
static QTransform transformForItem(QQuickItem *item, NodeInstanceServer *nodeInstanceServer)
{
if (isContentItem(item, nodeInstanceServer))
return QTransform();
QTransform toParentTransform = DesignerSupport::parentTransform(item);
if (item->parentItem() && !nodeInstanceServer->hasInstanceForObject(item->parentItem()))
if (item->parentItem() && !nodeInstanceServer->hasInstanceForObject(item->parentItem())) {
return transformForItem(item->parentItem(), nodeInstanceServer) * toParentTransform;
}
return toParentTransform;
}
@@ -109,6 +122,35 @@ QuickItemNodeInstance::Pointer QuickItemNodeInstance::create(QObject *object)
return instance;
}
QQuickItem *QuickItemNodeInstance::contentItem() const
{
return m_contentItem.data();
}
void QuickItemNodeInstance::doComponentComplete()
{
GraphicalNodeInstance::doComponentComplete();
QQmlProperty contentItemProperty(quickItem(), "contentItem", engine());
if (contentItemProperty.isValid())
m_contentItem = contentItemProperty.read().value<QQuickItem*>();
}
QRectF QuickItemNodeInstance::contentItemBoundingBox() const
{
if (contentItem()) {
QTransform contentItemTransform = DesignerSupport::parentTransform(contentItem());
return contentItemTransform.mapRect(contentItem()->boundingRect());
}
return QRectF();
}
QTransform QuickItemNodeInstance::contentItemTransform() const
{
return DesignerSupport::parentTransform(contentItem());
}
bool QuickItemNodeInstance::isQuickItem() const
{
@@ -50,7 +50,12 @@ public:
static Pointer create(QObject *objectToBeWrapped);
virtual QQuickItem *contentItem() const;
QRectF contentItemBoundingBox() const Q_DECL_OVERRIDE;
QTransform transform() const Q_DECL_OVERRIDE;
QTransform contentItemTransform() const Q_DECL_OVERRIDE;
QObject *parent() const Q_DECL_OVERRIDE;
@@ -61,6 +66,8 @@ public:
bool isMovable() const Q_DECL_OVERRIDE;
bool isQuickItem() const Q_DECL_OVERRIDE;
void doComponentComplete();
protected:
QuickItemNodeInstance(QQuickItem*);
QQuickItem *quickItem() const;
@@ -68,6 +75,7 @@ protected:
void setResizable(bool resizable);
private: //variables
QPointer<QQuickItem> m_contentItem;
bool m_isResizable;
bool m_isMovable;
};
@@ -88,7 +88,6 @@ QuickWindowNodeInstance::Pointer QuickWindowNodeInstance::create(QObject *object
QQuickItemPrivate *privateItem = static_cast<QQuickItemPrivate*>(QObjectPrivate::get(quickWindow->contentItem()));
if (privateItem->window) {
qDebug() << "removing from window";
if (!privateItem->parentItem)
QQuickWindowPrivate::get(privateItem->window)->parentlessItems.remove(quickWindow->contentItem());
privateItem->derefWindow();
@@ -315,6 +315,11 @@ QRectF ServerNodeInstance::boundingRect() const
return boundingRect;
}
QRectF ServerNodeInstance::contentItemBoundingRect() const
{
return m_nodeInstance->contentItemBoundingBox();
}
void ServerNodeInstance::setPropertyVariant(const PropertyName &name, const QVariant &value)
{
m_nodeInstance->setPropertyVariant(name, value);
@@ -515,6 +520,11 @@ QTransform ServerNodeInstance::contentTransform() const
return m_nodeInstance->contentTransform();
}
QTransform ServerNodeInstance::contentItemTransform() const
{
return m_nodeInstance->contentItemTransform();
}
double ServerNodeInstance::rotation() const
{
return m_nodeInstance->rotation();
@@ -631,11 +641,6 @@ qint32 ServerNodeInstance::instanceId() const
}
}
QObject* ServerNodeInstance::testHandle() const
{
return internalObject();
}
QList<ServerNodeInstance> ServerNodeInstance::stateInstances() const
{
return m_nodeInstance->stateInstances();
@@ -105,12 +105,14 @@ public:
bool equalGraphicsItem(QGraphicsItem *item) const;
QRectF boundingRect() const;
QRectF contentItemBoundingRect() const;
QPointF position() const;
QSizeF size() const;
QTransform transform() const;
QTransform customTransform() const;
QTransform sceneTransform() const;
QTransform contentTransform() const;
QTransform contentItemTransform() const;
double rotation() const;
double scale() const;
QList<QGraphicsTransform *> transformations() const;
@@ -156,7 +158,6 @@ public:
QString id() const;
qint32 instanceId() const;
QObject* testHandle() const;
QSharedPointer<Internal::ObjectNodeInstance> internalInstance() const;
QList<ServerNodeInstance> stateInstances() const;