aboutsummaryrefslogtreecommitdiffstats
path: root/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp')
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp84
1 files changed, 73 insertions, 11 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp
index 6e67d58b92..1f54bffdbd 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp
@@ -41,6 +41,7 @@ namespace QmlDesigner {
namespace Internal {
bool QuickItemNodeInstance::s_createEffectItem = false;
+bool QuickItemNodeInstance::s_unifiedRenderPath = false;
QuickItemNodeInstance::QuickItemNodeInstance(QQuickItem *item)
: ObjectNodeInstance(item),
@@ -58,7 +59,7 @@ QuickItemNodeInstance::QuickItemNodeInstance(QQuickItem *item)
QuickItemNodeInstance::~QuickItemNodeInstance()
{
- if (quickItem())
+ if (quickItem() && checkIfRefFromEffect(instanceId()))
designerSupport()->derefFromEffectItem(quickItem());
}
@@ -156,6 +157,19 @@ void QuickItemNodeInstance::createEffectItem(bool createEffectItem)
s_createEffectItem = createEffectItem;
}
+void QuickItemNodeInstance::enableUnifiedRenderPath(bool unifiedRenderPath)
+{
+ s_unifiedRenderPath = unifiedRenderPath;
+}
+
+bool QuickItemNodeInstance::checkIfRefFromEffect(qint32 id)
+{
+ if (s_unifiedRenderPath)
+ return false;
+
+ return (s_createEffectItem || id == 0);
+}
+
void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance,
InstanceContainer::NodeFlags flags)
{
@@ -166,10 +180,10 @@ void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &object
quickItem()->setParentItem(qobject_cast<QQuickItem*>(nodeInstanceServer()->quickView()->rootObject()));
}
- if (quickItem()->window()) {
- if (s_createEffectItem || instanceId() == 0)
- designerSupport()->refFromEffectItem(quickItem(),
- !flags.testFlag(InstanceContainer::ParentTakesOverRendering));
+ if (quickItem()->window() && checkIfRefFromEffect(instanceId())) {
+ designerSupport()->refFromEffectItem(quickItem(),
+ !flags.testFlag(
+ InstanceContainer::ParentTakesOverRendering));
}
ObjectNodeInstance::initialize(objectNodeInstance, flags);
@@ -246,6 +260,20 @@ QStringList QuickItemNodeInstance::allStates() const
return list;
}
+void QuickItemNodeInstance::updateDirtyNode(QQuickItem *item)
+{
+ if (s_unifiedRenderPath) {
+ item->update();
+ return;
+ }
+ DesignerSupport::updateDirtyNode(item);
+}
+
+bool QuickItemNodeInstance::unifiedRenderPath()
+{
+ return s_unifiedRenderPath;
+}
+
QRectF QuickItemNodeInstance::contentItemBoundingBox() const
{
if (contentItem()) {
@@ -378,6 +406,9 @@ double QuickItemNodeInstance::y() const
QImage QuickItemNodeInstance::renderImage() const
{
+ if (s_unifiedRenderPath && !isRootNodeInstance())
+ return {};
+
updateDirtyNodesRecursive(quickItem());
QRectF renderBoundingRect = boundingRect();
@@ -390,7 +421,16 @@ QImage QuickItemNodeInstance::renderImage() const
nodeInstanceServer()->quickView()->beforeSynchronizing();
nodeInstanceServer()->quickView()->beforeRendering();
- QImage renderImage = designerSupport()->renderImageForItem(quickItem(), renderBoundingRect, size);
+ QImage renderImage;
+
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ if (s_unifiedRenderPath)
+ renderImage = nodeInstanceServer()->quickView()->grabWindow();
+ else
+ renderImage = designerSupport()->renderImageForItem(quickItem(), renderBoundingRect, size);
+#else
+ renderImage = nodeInstanceServer()->quickView()->grabWindow();
+#endif
nodeInstanceServer()->quickView()->afterRendering();
@@ -411,7 +451,20 @@ QImage QuickItemNodeInstance::renderPreviewImage(const QSize &previewImageSize)
nodeInstanceServer()->quickView()->beforeSynchronizing();
nodeInstanceServer()->quickView()->beforeRendering();
- QImage image = designerSupport()->renderImageForItem(quickItem(), previewItemBoundingRect, size);
+ QImage image;
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ if (s_unifiedRenderPath)
+ image = nodeInstanceServer()->quickView()->grabWindow();
+ else
+ image = designerSupport()->renderImageForItem(quickItem(),
+ previewItemBoundingRect,
+ size);
+
+#else
+ image = nodeInstanceServer()->quickView()->grabWindow();
+#endif
+
+ image = image.scaledToWidth(size.width());
nodeInstanceServer()->quickView()->afterRendering();
@@ -426,6 +479,11 @@ QImage QuickItemNodeInstance::renderPreviewImage(const QSize &previewImageSize)
return QImage();
}
+QSharedPointer<QQuickItemGrabResult> QuickItemNodeInstance::createGrabResult() const
+{
+ return quickItem()->grabToImage(size().toSize());
+}
+
void QuickItemNodeInstance::updateAllDirtyNodesRecursive()
{
updateAllDirtyNodesRecursive(quickItem());
@@ -490,10 +548,11 @@ void QuickItemNodeInstance::updateDirtyNodesRecursive(QQuickItem *parentItem) co
void QuickItemNodeInstance::updateAllDirtyNodesRecursive(QQuickItem *parentItem) const
{
- foreach (QQuickItem *childItem, parentItem->childItems())
- updateAllDirtyNodesRecursive(childItem);
+ const QList<QQuickItem *> children = parentItem->childItems();
+ for (QQuickItem *childItem : children)
+ updateAllDirtyNodesRecursive(childItem);
- DesignerSupport::updateDirtyNode(parentItem);
+ updateDirtyNode(parentItem);
}
static inline bool isRectangleSane(const QRectF &rect)
@@ -507,7 +566,7 @@ QRectF QuickItemNodeInstance::boundingRectWithStepChilds(QQuickItem *parentItem)
boundingRect = boundingRect.united(QRectF(QPointF(0, 0), size()));
- foreach (QQuickItem *childItem, parentItem->childItems()) {
+ for (QQuickItem *childItem : parentItem->childItems()) {
if (!nodeInstanceServer()->hasInstanceForObject(childItem)) {
QRectF transformedRect = childItem->mapRectToItem(parentItem, boundingRectWithStepChilds(childItem));
if (isRectangleSane(transformedRect))
@@ -515,6 +574,9 @@ QRectF QuickItemNodeInstance::boundingRectWithStepChilds(QQuickItem *parentItem)
}
}
+ if (boundingRect.isEmpty())
+ QRectF{0, 0, 640, 480};
+
return boundingRect;
}