forked from qt-creator/qt-creator
QmlDesigner: Add meta hint if item renders children directly
In some cases items render their children directly using an effect. In this case we do not want to hide the children when calling refFromEffectItem(). If the hint takesOverRenderingOfChildren is set in the .metainfo hints for a parent item we forward a flag to the puppet and refFromEffectItem() is not hiding this item, Change-Id: I37a8c0ad8a15bc914c220e03b1b744779431d655 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -44,9 +44,24 @@ InstanceContainer::InstanceContainer()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceContainer::InstanceContainer(qint32 instanceId, const TypeName &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &nodeSource, NodeSourceType nodeSourceType, NodeMetaType metaType)
|
InstanceContainer::InstanceContainer(qint32 instanceId,
|
||||||
: m_instanceId(instanceId), m_type(properDelemitingOfType(type)), m_majorNumber(majorNumber), m_minorNumber(minorNumber), m_componentPath(componentPath),
|
const TypeName &type,
|
||||||
m_nodeSource(nodeSource), m_nodeSourceType(nodeSourceType), m_metaType(metaType)
|
int majorNumber,
|
||||||
|
int minorNumber,
|
||||||
|
const QString &componentPath,
|
||||||
|
const QString &nodeSource,
|
||||||
|
NodeSourceType nodeSourceType,
|
||||||
|
NodeMetaType metaType,
|
||||||
|
NodeFlags metaFlags)
|
||||||
|
: m_instanceId(instanceId)
|
||||||
|
,m_type(properDelemitingOfType(type))
|
||||||
|
,m_majorNumber(majorNumber)
|
||||||
|
,m_minorNumber(minorNumber)
|
||||||
|
,m_componentPath(componentPath)
|
||||||
|
,m_nodeSource(nodeSource)
|
||||||
|
,m_nodeSourceType(nodeSourceType)
|
||||||
|
,m_metaType(metaType)
|
||||||
|
,m_metaFlags(metaFlags)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,6 +105,16 @@ InstanceContainer::NodeMetaType InstanceContainer::metaType() const
|
|||||||
return static_cast<NodeMetaType>(m_metaType);
|
return static_cast<NodeMetaType>(m_metaType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InstanceContainer::NodeFlags InstanceContainer::metaFlags() const
|
||||||
|
{
|
||||||
|
return m_metaFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InstanceContainer::checkFlag(NodeFlag flag) const
|
||||||
|
{
|
||||||
|
return NodeFlags(m_metaFlags).testFlag(flag);
|
||||||
|
}
|
||||||
|
|
||||||
QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
|
QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
|
||||||
{
|
{
|
||||||
out << container.instanceId();
|
out << container.instanceId();
|
||||||
@@ -100,6 +125,7 @@ QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
|
|||||||
out << container.nodeSource();
|
out << container.nodeSource();
|
||||||
out << qint32(container.nodeSourceType());
|
out << qint32(container.nodeSourceType());
|
||||||
out << qint32(container.metaType());
|
out << qint32(container.metaType());
|
||||||
|
out << qint32(container.metaFlags());
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
@@ -115,6 +141,7 @@ QDataStream &operator>>(QDataStream &in, InstanceContainer &container)
|
|||||||
in >> container.m_nodeSource;
|
in >> container.m_nodeSource;
|
||||||
in >> container.m_nodeSourceType;
|
in >> container.m_nodeSourceType;
|
||||||
in >> container.m_metaType;
|
in >> container.m_metaType;
|
||||||
|
in >> container.m_metaFlags;
|
||||||
|
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
@@ -54,8 +54,22 @@ public:
|
|||||||
ItemMetaType
|
ItemMetaType
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum NodeFlag {
|
||||||
|
ParentTakesOverRendering = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_FLAGS(NodeFlags, NodeFlag)
|
||||||
|
|
||||||
InstanceContainer();
|
InstanceContainer();
|
||||||
InstanceContainer(qint32 instanceId, const TypeName &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &nodeSource, NodeSourceType nodeSourceType, NodeMetaType metaType);
|
InstanceContainer(qint32 instanceId,
|
||||||
|
const TypeName &type,
|
||||||
|
int majorNumber,
|
||||||
|
int minorNumber,
|
||||||
|
const QString &componentPath,
|
||||||
|
const QString &nodeSource,
|
||||||
|
NodeSourceType nodeSourceType,
|
||||||
|
NodeMetaType metaType,
|
||||||
|
NodeFlags metaFlags);
|
||||||
|
|
||||||
qint32 instanceId() const;
|
qint32 instanceId() const;
|
||||||
TypeName type() const;
|
TypeName type() const;
|
||||||
@@ -65,6 +79,8 @@ public:
|
|||||||
QString nodeSource() const;
|
QString nodeSource() const;
|
||||||
NodeSourceType nodeSourceType() const;
|
NodeSourceType nodeSourceType() const;
|
||||||
NodeMetaType metaType() const;
|
NodeMetaType metaType() const;
|
||||||
|
bool checkFlag(NodeFlag flag) const;
|
||||||
|
NodeFlags metaFlags() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
qint32 m_instanceId = -1;
|
qint32 m_instanceId = -1;
|
||||||
@@ -75,6 +91,7 @@ private:
|
|||||||
QString m_nodeSource;
|
QString m_nodeSource;
|
||||||
qint32 m_nodeSourceType = 0;
|
qint32 m_nodeSourceType = 0;
|
||||||
qint32 m_metaType = 0;
|
qint32 m_metaType = 0;
|
||||||
|
qint32 m_metaFlags = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
QDebug operator <<(QDebug debug, const InstanceContainer &command);
|
QDebug operator <<(QDebug debug, const InstanceContainer &command);
|
||||||
@@ -82,3 +99,4 @@ QDebug operator <<(QDebug debug, const InstanceContainer &command);
|
|||||||
} // namespace QmlDesigner
|
} // namespace QmlDesigner
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(QmlDesigner::InstanceContainer)
|
Q_DECLARE_METATYPE(QmlDesigner::InstanceContainer)
|
||||||
|
Q_DECLARE_OPERATORS_FOR_FLAGS(QmlDesigner::InstanceContainer::NodeFlags)
|
||||||
|
@@ -126,7 +126,8 @@ void ObjectNodeInstance::initializePropertyWatcher(const ObjectNodeInstance::Poi
|
|||||||
m_signalSpy.setObjectNodeInstance(objectNodeInstance);
|
m_signalSpy.setObjectNodeInstance(objectNodeInstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance)
|
void ObjectNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance,
|
||||||
|
InstanceContainer::NodeFlags /*flags*/)
|
||||||
{
|
{
|
||||||
initializePropertyWatcher(objectNodeInstance);
|
initializePropertyWatcher(objectNodeInstance);
|
||||||
QmlPrivateGate::registerNodeInstanceMetaObject(objectNodeInstance->object(), objectNodeInstance->nodeInstanceServer()->engine());
|
QmlPrivateGate::registerNodeInstanceMetaObject(objectNodeInstance->object(), objectNodeInstance->nodeInstanceServer()->engine());
|
||||||
|
@@ -28,6 +28,8 @@
|
|||||||
#include "nodeinstanceserver.h"
|
#include "nodeinstanceserver.h"
|
||||||
#include "nodeinstancesignalspy.h"
|
#include "nodeinstancesignalspy.h"
|
||||||
|
|
||||||
|
#include "instancecontainer.h"
|
||||||
|
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QSharedPointer>
|
#include <QSharedPointer>
|
||||||
#include <QWeakPointer>
|
#include <QWeakPointer>
|
||||||
@@ -78,7 +80,7 @@ public:
|
|||||||
|
|
||||||
NodeInstanceServer *nodeInstanceServer() const;
|
NodeInstanceServer *nodeInstanceServer() const;
|
||||||
void setNodeInstanceServer(NodeInstanceServer *server);
|
void setNodeInstanceServer(NodeInstanceServer *server);
|
||||||
virtual void initialize(const Pointer &objectNodeInstance);
|
virtual void initialize(const Pointer &objectNodeInstance, InstanceContainer::NodeFlags flags);
|
||||||
virtual QImage renderImage() const;
|
virtual QImage renderImage() const;
|
||||||
virtual QImage renderPreviewImage(const QSize &previewImageSize) const;
|
virtual QImage renderPreviewImage(const QSize &previewImageSize) const;
|
||||||
|
|
||||||
|
@@ -156,7 +156,8 @@ void QuickItemNodeInstance::createEffectItem(bool createEffectItem)
|
|||||||
s_createEffectItem = createEffectItem;
|
s_createEffectItem = createEffectItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance)
|
void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance,
|
||||||
|
InstanceContainer::NodeFlags flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (instanceId() == 0) {
|
if (instanceId() == 0) {
|
||||||
@@ -167,10 +168,11 @@ void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &object
|
|||||||
|
|
||||||
if (quickItem()->window()) {
|
if (quickItem()->window()) {
|
||||||
if (s_createEffectItem || instanceId() == 0)
|
if (s_createEffectItem || instanceId() == 0)
|
||||||
designerSupport()->refFromEffectItem(quickItem());
|
designerSupport()->refFromEffectItem(quickItem(),
|
||||||
|
!flags.testFlag(InstanceContainer::ParentTakesOverRendering));
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectNodeInstance::initialize(objectNodeInstance);
|
ObjectNodeInstance::initialize(objectNodeInstance, flags);
|
||||||
quickItem()->update();
|
quickItem()->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -46,7 +46,8 @@ public:
|
|||||||
static Pointer create(QObject *objectToBeWrapped);
|
static Pointer create(QObject *objectToBeWrapped);
|
||||||
static void createEffectItem(bool createEffectItem);
|
static void createEffectItem(bool createEffectItem);
|
||||||
|
|
||||||
void initialize(const ObjectNodeInstance::Pointer &objectNodeInstance) override;
|
void initialize(const ObjectNodeInstance::Pointer &objectNodeInstance,
|
||||||
|
InstanceContainer::NodeFlags flags) override;
|
||||||
|
|
||||||
QQuickItem *contentItem() const override;
|
QQuickItem *contentItem() const override;
|
||||||
bool hasContent() const override;
|
bool hasContent() const override;
|
||||||
|
@@ -188,7 +188,9 @@ Internal::ObjectNodeInstance::Pointer ServerNodeInstance::createInstance(QObject
|
|||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceServer, const InstanceContainer &instanceContainer, ComponentWrap componentWrap)
|
ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceServer,
|
||||||
|
const InstanceContainer &instanceContainer,
|
||||||
|
ComponentWrap componentWrap)
|
||||||
{
|
{
|
||||||
Q_ASSERT(instanceContainer.instanceId() != -1);
|
Q_ASSERT(instanceContainer.instanceId() != -1);
|
||||||
Q_ASSERT(nodeInstanceServer);
|
Q_ASSERT(nodeInstanceServer);
|
||||||
@@ -229,7 +231,7 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe
|
|||||||
|
|
||||||
instance.internalInstance()->setInstanceId(instanceContainer.instanceId());
|
instance.internalInstance()->setInstanceId(instanceContainer.instanceId());
|
||||||
|
|
||||||
instance.internalInstance()->initialize(instance.m_nodeInstance);
|
instance.internalInstance()->initialize(instance.m_nodeInstance, instanceContainer.metaFlags());
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
@@ -64,6 +64,7 @@ public:
|
|||||||
bool isStackedContainer() const;
|
bool isStackedContainer() const;
|
||||||
bool canBeReparentedTo(const ModelNode &potenialParent);
|
bool canBeReparentedTo(const ModelNode &potenialParent);
|
||||||
QString indexPropertyForStackedContainer() const;
|
QString indexPropertyForStackedContainer() const;
|
||||||
|
bool takesOverRenderingOfChildren() const;
|
||||||
|
|
||||||
QHash<QString, QString> hints() const;
|
QHash<QString, QString> hints() const;
|
||||||
static NodeHints fromModelNode(const ModelNode &modelNode);
|
static NodeHints fromModelNode(const ModelNode &modelNode);
|
||||||
|
@@ -34,6 +34,7 @@
|
|||||||
#include <model.h>
|
#include <model.h>
|
||||||
#include <modelnode.h>
|
#include <modelnode.h>
|
||||||
#include <metainfo.h>
|
#include <metainfo.h>
|
||||||
|
#include <nodehints.h>
|
||||||
#include <rewriterview.h>
|
#include <rewriterview.h>
|
||||||
|
|
||||||
#include "abstractproperty.h"
|
#include "abstractproperty.h"
|
||||||
@@ -125,7 +126,7 @@ NodeInstanceView::~NodeInstanceView()
|
|||||||
|
|
||||||
//\{
|
//\{
|
||||||
|
|
||||||
bool isSkippedRootNode(const ModelNode &node)
|
bool static isSkippedRootNode(const ModelNode &node)
|
||||||
{
|
{
|
||||||
static const PropertyNameList skipList({"Qt.ListModel", "QtQuick.ListModel", "Qt.ListModel", "QtQuick.ListModel"});
|
static const PropertyNameList skipList({"Qt.ListModel", "QtQuick.ListModel", "Qt.ListModel", "QtQuick.ListModel"});
|
||||||
|
|
||||||
@@ -136,7 +137,7 @@ bool isSkippedRootNode(const ModelNode &node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool isSkippedNode(const ModelNode &node)
|
bool static isSkippedNode(const ModelNode &node)
|
||||||
{
|
{
|
||||||
static const PropertyNameList skipList({"QtQuick.XmlRole", "Qt.XmlRole", "QtQuick.ListElement", "Qt.ListElement"});
|
static const PropertyNameList skipList({"QtQuick.XmlRole", "Qt.XmlRole", "QtQuick.ListElement", "Qt.ListElement"});
|
||||||
|
|
||||||
@@ -146,6 +147,22 @@ bool isSkippedNode(const ModelNode &node)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool static parentTakesOverRendering(const ModelNode &modelNode)
|
||||||
|
{
|
||||||
|
if (!modelNode.isValid())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ModelNode currentNode = modelNode;
|
||||||
|
|
||||||
|
while (currentNode.hasParentProperty()) {
|
||||||
|
currentNode = currentNode.parentProperty().parentModelNode();
|
||||||
|
if (NodeHints::fromModelNode(currentNode).takesOverRenderingOfChildren())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Notifies the view that it was attached to \a model. For every model node in
|
Notifies the view that it was attached to \a model. For every model node in
|
||||||
the model, a NodeInstance will be created.
|
the model, a NodeInstance will be created.
|
||||||
@@ -817,6 +834,11 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
|||||||
if (instance.modelNode().metaInfo().isSubclassOf("QtQuick.Item"))
|
if (instance.modelNode().metaInfo().isSubclassOf("QtQuick.Item"))
|
||||||
nodeMetaType = InstanceContainer::ItemMetaType;
|
nodeMetaType = InstanceContainer::ItemMetaType;
|
||||||
|
|
||||||
|
InstanceContainer::NodeFlags nodeFlags;
|
||||||
|
|
||||||
|
if (parentTakesOverRendering(instance.modelNode()))
|
||||||
|
nodeFlags.setFlag(InstanceContainer::ParentTakesOverRendering);
|
||||||
|
|
||||||
InstanceContainer container(instance.instanceId(),
|
InstanceContainer container(instance.instanceId(),
|
||||||
instance.modelNode().type(),
|
instance.modelNode().type(),
|
||||||
instance.modelNode().majorVersion(),
|
instance.modelNode().majorVersion(),
|
||||||
@@ -824,8 +846,8 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
|||||||
instance.modelNode().metaInfo().componentFileName(),
|
instance.modelNode().metaInfo().componentFileName(),
|
||||||
instance.modelNode().nodeSource(),
|
instance.modelNode().nodeSource(),
|
||||||
nodeSourceType,
|
nodeSourceType,
|
||||||
nodeMetaType
|
nodeMetaType,
|
||||||
);
|
nodeFlags);
|
||||||
|
|
||||||
instanceContainerList.append(container);
|
instanceContainerList.append(container);
|
||||||
}
|
}
|
||||||
@@ -958,8 +980,20 @@ CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QLis
|
|||||||
if (instance.modelNode().metaInfo().isSubclassOf("QtQuick.Item"))
|
if (instance.modelNode().metaInfo().isSubclassOf("QtQuick.Item"))
|
||||||
nodeMetaType = InstanceContainer::ItemMetaType;
|
nodeMetaType = InstanceContainer::ItemMetaType;
|
||||||
|
|
||||||
InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), instance.modelNode().minorVersion(),
|
InstanceContainer::NodeFlags nodeFlags;
|
||||||
instance.modelNode().metaInfo().componentFileName(), instance.modelNode().nodeSource(), nodeSourceType, nodeMetaType);
|
|
||||||
|
if (parentTakesOverRendering(instance.modelNode()))
|
||||||
|
nodeFlags.setFlag(InstanceContainer::ParentTakesOverRendering);
|
||||||
|
|
||||||
|
InstanceContainer container(instance.instanceId(),
|
||||||
|
instance.modelNode().type(),
|
||||||
|
instance.modelNode().majorVersion(),
|
||||||
|
instance.modelNode().minorVersion(),
|
||||||
|
instance.modelNode().metaInfo().componentFileName(),
|
||||||
|
instance.modelNode().nodeSource(),
|
||||||
|
nodeSourceType,
|
||||||
|
nodeMetaType,
|
||||||
|
nodeFlags);
|
||||||
containerList.append(container);
|
containerList.append(container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -193,6 +193,14 @@ QString NodeHints::indexPropertyForStackedContainer() const
|
|||||||
return Internal::evaluateExpression(expression, modelNode(), ModelNode()).toString();
|
return Internal::evaluateExpression(expression, modelNode(), ModelNode()).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NodeHints::takesOverRenderingOfChildren() const
|
||||||
|
{
|
||||||
|
if (!isValid())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return evaluateBooleanExpression("takesOverRenderingOfChildren", false);
|
||||||
|
}
|
||||||
|
|
||||||
QHash<QString, QString> NodeHints::hints() const
|
QHash<QString, QString> NodeHints::hints() const
|
||||||
{
|
{
|
||||||
return m_hints;
|
return m_hints;
|
||||||
@@ -277,7 +285,7 @@ bool JSObject::potentialParentIsRoot() const
|
|||||||
|
|
||||||
bool JSObject::potentialChildIsRoot() const
|
bool JSObject::potentialChildIsRoot() const
|
||||||
{
|
{
|
||||||
return m_otherNode.isValid() && m_otherNode.isRootNode();
|
return m_otherNode.isValid() && m_otherNode.isRootNode();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JSObject::isSubclassOf(const QString &typeName)
|
bool JSObject::isSubclassOf(const QString &typeName)
|
||||||
@@ -303,7 +311,7 @@ bool JSObject::rootItemIsSubclassOf(const QString &typeName)
|
|||||||
bool JSObject::currentParentIsSubclassOf(const QString &typeName)
|
bool JSObject::currentParentIsSubclassOf(const QString &typeName)
|
||||||
{
|
{
|
||||||
if (m_modelNode.hasParentProperty()
|
if (m_modelNode.hasParentProperty()
|
||||||
&& m_modelNode.parentProperty().isValid()) {
|
&& m_modelNode.parentProperty().isValid()) {
|
||||||
NodeMetaInfo metaInfo = m_modelNode.parentProperty().parentModelNode().metaInfo();
|
NodeMetaInfo metaInfo = m_modelNode.parentProperty().parentModelNode().metaInfo();
|
||||||
if (metaInfo.isValid())
|
if (metaInfo.isValid())
|
||||||
return metaInfo.isSubclassOf(typeName.toUtf8());
|
return metaInfo.isSubclassOf(typeName.toUtf8());
|
||||||
|
Reference in New Issue
Block a user