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:
Thomas Hartmann
2018-03-02 15:29:26 +01:00
parent 98889e1a38
commit 8a8b8c4602
10 changed files with 116 additions and 20 deletions

View File

@@ -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)
: 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)
InstanceContainer::InstanceContainer(qint32 instanceId,
const TypeName &type,
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);
}
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)
{
out << container.instanceId();
@@ -100,6 +125,7 @@ QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
out << container.nodeSource();
out << qint32(container.nodeSourceType());
out << qint32(container.metaType());
out << qint32(container.metaFlags());
return out;
}
@@ -115,6 +141,7 @@ QDataStream &operator>>(QDataStream &in, InstanceContainer &container)
in >> container.m_nodeSource;
in >> container.m_nodeSourceType;
in >> container.m_metaType;
in >> container.m_metaFlags;
return in;
}

View File

@@ -54,8 +54,22 @@ public:
ItemMetaType
};
enum NodeFlag {
ParentTakesOverRendering = 1
};
Q_DECLARE_FLAGS(NodeFlags, NodeFlag)
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;
TypeName type() const;
@@ -65,6 +79,8 @@ public:
QString nodeSource() const;
NodeSourceType nodeSourceType() const;
NodeMetaType metaType() const;
bool checkFlag(NodeFlag flag) const;
NodeFlags metaFlags() const;
private:
qint32 m_instanceId = -1;
@@ -75,6 +91,7 @@ private:
QString m_nodeSource;
qint32 m_nodeSourceType = 0;
qint32 m_metaType = 0;
qint32 m_metaFlags = 0;
};
QDebug operator <<(QDebug debug, const InstanceContainer &command);
@@ -82,3 +99,4 @@ QDebug operator <<(QDebug debug, const InstanceContainer &command);
} // namespace QmlDesigner
Q_DECLARE_METATYPE(QmlDesigner::InstanceContainer)
Q_DECLARE_OPERATORS_FOR_FLAGS(QmlDesigner::InstanceContainer::NodeFlags)

View File

@@ -126,7 +126,8 @@ void ObjectNodeInstance::initializePropertyWatcher(const ObjectNodeInstance::Poi
m_signalSpy.setObjectNodeInstance(objectNodeInstance);
}
void ObjectNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance)
void ObjectNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance,
InstanceContainer::NodeFlags /*flags*/)
{
initializePropertyWatcher(objectNodeInstance);
QmlPrivateGate::registerNodeInstanceMetaObject(objectNodeInstance->object(), objectNodeInstance->nodeInstanceServer()->engine());

View File

@@ -28,6 +28,8 @@
#include "nodeinstanceserver.h"
#include "nodeinstancesignalspy.h"
#include "instancecontainer.h"
#include <QPainter>
#include <QSharedPointer>
#include <QWeakPointer>
@@ -78,7 +80,7 @@ public:
NodeInstanceServer *nodeInstanceServer() const;
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 renderPreviewImage(const QSize &previewImageSize) const;

View File

@@ -156,7 +156,8 @@ void QuickItemNodeInstance::createEffectItem(bool createEffectItem)
s_createEffectItem = createEffectItem;
}
void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance)
void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance,
InstanceContainer::NodeFlags flags)
{
if (instanceId() == 0) {
@@ -167,10 +168,11 @@ void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &object
if (quickItem()->window()) {
if (s_createEffectItem || instanceId() == 0)
designerSupport()->refFromEffectItem(quickItem());
designerSupport()->refFromEffectItem(quickItem(),
!flags.testFlag(InstanceContainer::ParentTakesOverRendering));
}
ObjectNodeInstance::initialize(objectNodeInstance);
ObjectNodeInstance::initialize(objectNodeInstance, flags);
quickItem()->update();
}

View File

@@ -46,7 +46,8 @@ public:
static Pointer create(QObject *objectToBeWrapped);
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;
bool hasContent() const override;

View File

@@ -188,7 +188,9 @@ Internal::ObjectNodeInstance::Pointer ServerNodeInstance::createInstance(QObject
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(nodeInstanceServer);
@@ -229,7 +231,7 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe
instance.internalInstance()->setInstanceId(instanceContainer.instanceId());
instance.internalInstance()->initialize(instance.m_nodeInstance);
instance.internalInstance()->initialize(instance.m_nodeInstance, instanceContainer.metaFlags());
return instance;
}

View File

@@ -64,6 +64,7 @@ public:
bool isStackedContainer() const;
bool canBeReparentedTo(const ModelNode &potenialParent);
QString indexPropertyForStackedContainer() const;
bool takesOverRenderingOfChildren() const;
QHash<QString, QString> hints() const;
static NodeHints fromModelNode(const ModelNode &modelNode);

View File

@@ -34,6 +34,7 @@
#include <model.h>
#include <modelnode.h>
#include <metainfo.h>
#include <nodehints.h>
#include <rewriterview.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"});
@@ -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"});
@@ -146,6 +147,22 @@ bool isSkippedNode(const ModelNode &node)
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
the model, a NodeInstance will be created.
@@ -817,6 +834,11 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
if (instance.modelNode().metaInfo().isSubclassOf("QtQuick.Item"))
nodeMetaType = InstanceContainer::ItemMetaType;
InstanceContainer::NodeFlags nodeFlags;
if (parentTakesOverRendering(instance.modelNode()))
nodeFlags.setFlag(InstanceContainer::ParentTakesOverRendering);
InstanceContainer container(instance.instanceId(),
instance.modelNode().type(),
instance.modelNode().majorVersion(),
@@ -824,8 +846,8 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
instance.modelNode().metaInfo().componentFileName(),
instance.modelNode().nodeSource(),
nodeSourceType,
nodeMetaType
);
nodeMetaType,
nodeFlags);
instanceContainerList.append(container);
}
@@ -958,8 +980,20 @@ CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QLis
if (instance.modelNode().metaInfo().isSubclassOf("QtQuick.Item"))
nodeMetaType = InstanceContainer::ItemMetaType;
InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), instance.modelNode().minorVersion(),
instance.modelNode().metaInfo().componentFileName(), instance.modelNode().nodeSource(), nodeSourceType, nodeMetaType);
InstanceContainer::NodeFlags nodeFlags;
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);
}

View File

@@ -193,6 +193,14 @@ QString NodeHints::indexPropertyForStackedContainer() const
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
{
return m_hints;