using the scene root node

This commit is contained in:
Uwe Rathmann 2023-12-12 10:55:30 +01:00
parent 7615cffdd4
commit 048e76d021
2 changed files with 19 additions and 12 deletions

View File

@ -8,6 +8,8 @@
#include "SceneTexture.h" #include "SceneTexture.h"
#include <private/qquickitem_p.h> #include <private/qquickitem_p.h>
#include <private/qquickwindow_p.h>
#include <private/qsgrenderer_p.h>
#include <private/qquickitemchangelistener_p.h> #include <private/qquickitemchangelistener_p.h>
#include <qpointer.h> #include <qpointer.h>
@ -63,12 +65,16 @@ class OverlayPrivate final : public QQuickItemPrivate, public QQuickItemChangeLi
QSGRootNode* grabbedNode() QSGRootNode* grabbedNode()
{ {
return grabbedItem ? get( grabbedItem )->rootNode() : nullptr; if ( grabbedItem )
} return grabbedItem ? get( grabbedItem )->rootNode() : nullptr;
QSGTransformNode* grabbedItemNode() if ( auto window = q_func()->window() )
{ {
return grabbedItem ? get( grabbedItem )->itemNode() : nullptr; if ( auto renderer = QQuickWindowPrivate::get( window )->renderer )
return renderer->rootNode();
}
return nullptr;
} }
QPointer< QQuickItem > grabbedItem; QPointer< QQuickItem > grabbedItem;
@ -110,16 +116,19 @@ void Overlay::geometryChange(
const QRectF& newGeometry, const QRectF& oldGeometry ) const QRectF& newGeometry, const QRectF& oldGeometry )
{ {
Inherited::geometryChange( newGeometry, oldGeometry ); Inherited::geometryChange( newGeometry, oldGeometry );
update();
if ( d_func()->grabbedItem )
update();
} }
QSGNode* Overlay::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* ) QSGNode* Overlay::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* )
{ {
Q_D( Overlay ); Q_D( Overlay );
if ( d->grabbedItemNode() == nullptr || size().isEmpty() ) auto grabbedNode = d->grabbedNode();
if ( grabbedNode == nullptr )
QMetaObject::invokeMethod( this, &QQuickItem::update );
if ( grabbedNode == nullptr || size().isEmpty() )
{ {
delete oldNode; delete oldNode;
return nullptr; return nullptr;
@ -146,7 +155,7 @@ QSGNode* Overlay::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* )
auto texture = static_cast< SceneTexture* >( node->texture() ); auto texture = static_cast< SceneTexture* >( node->texture() );
texture->setFiltering( smooth() ? QSGTexture::Linear : QSGTexture::Nearest ); texture->setFiltering( smooth() ? QSGTexture::Linear : QSGTexture::Nearest );
texture->render( d->grabbedNode(), itemNode, texture->render( grabbedNode, itemNode,
QRectF( x(), y(), width(), height() ) ); QRectF( x(), y(), width(), height() ) );
itemNode->isBlocked = false; itemNode->isBlocked = false;

View File

@ -50,8 +50,6 @@ class OverlayBox : public Overlay
OverlayBox( QQuickItem* parent = nullptr ) OverlayBox( QQuickItem* parent = nullptr )
: Inherited( parent ) : Inherited( parent )
{ {
if ( parent )
setGrabbedItem( parent );
} }
protected: protected: