528void QQuickWindowPrivate::syncSceneGraph()
532 const bool wasRtDirty = redirect.renderTargetDirty;
533 ensureCustomRenderTarget();
535 QRhiCommandBuffer *cb =
nullptr;
537 if (redirect.commandBuffer)
538 cb = redirect.commandBuffer;
540 cb = swapchain->currentFrameCommandBuffer();
542 context->prepareSync(q->effectiveDevicePixelRatio(), cb, graphicsConfig);
544 animationController->beforeNodeSync();
546 emit q->beforeSynchronizing();
547 runAndClearJobs(&beforeSynchronizingJobs);
549 if (pendingFontUpdate) {
551 invalidateFontData(contentItem);
552 context->invalidateGlyphCaches();
555 if (Q_UNLIKELY(!renderer)) {
556 forceUpdate(contentItem);
558 QSGRootNode *rootNode =
new QSGRootNode;
559 rootNode->appendChildNode(QQuickItemPrivate::get(contentItem)->itemNode());
560 const bool useDepth = graphicsConfig.isDepthBufferEnabledFor2D();
561 const QSGRendererInterface::RenderMode renderMode = useDepth ? QSGRendererInterface::RenderMode2D
562 : QSGRendererInterface::RenderMode2DNoDepthBuffer;
563 renderer = context->createRenderer(renderMode);
564 renderer->setRootNode(rootNode);
565 }
else if (Q_UNLIKELY(wasRtDirty)
566 && q->rendererInterface()->graphicsApi() == QSGRendererInterface::Software) {
567 auto softwareRenderer =
static_cast<QSGSoftwareRenderer *>(renderer);
568 softwareRenderer->markDirty();
573 animationController->afterNodeSync();
575 renderer->setClearColor(clearColor);
577 renderer->setVisualizationMode(visualizationMode);
579 if (pendingFontUpdate) {
580 context->flushGlyphCaches();
581 pendingFontUpdate =
false;
584 emit q->afterSynchronizing();
585 runAndClearJobs(&afterSynchronizingJobs);
624void QQuickWindowPrivate::renderSceneGraph()
630 ensureCustomRenderTarget();
632 QSGRenderTarget sgRenderTarget;
634 QRhiRenderTarget *rt;
635 QRhiRenderPassDescriptor *rp;
636 QRhiCommandBuffer *cb;
637 if (redirect.rt.rt.renderTarget) {
638 rt = redirect.rt.rt.renderTarget;
639 rp = rt->renderPassDescriptor();
641 qWarning(
"Custom render target is set but no renderpass descriptor has been provided.");
644 cb = redirect.commandBuffer;
646 qWarning(
"Custom render target is set but no command buffer has been provided.");
651 qWarning(
"QQuickWindow: No render target (neither swapchain nor custom target was provided)");
654 rt = swapchain->currentFrameRenderTarget();
655 rp = rpDescForSwapchain;
656 cb = swapchain->currentFrameCommandBuffer();
658 sgRenderTarget = QSGRenderTarget(rt, rp, cb);
659 sgRenderTarget.multiViewCount = multiViewCount();
661 sgRenderTarget = QSGRenderTarget(redirect.rt.sw.paintDevice);
664 context->beginNextFrame(renderer,
666 emitBeforeRenderPassRecording,
667 emitAfterRenderPassRecording,
670 animationController->advance();
671 emit q->beforeRendering();
672 runAndClearJobs(&beforeRenderingJobs);
674 const qreal devicePixelRatio = q->effectiveDevicePixelRatio();
676 if (QRhiRenderTarget *rt = redirect.rt.rt.renderTarget) {
677 pixelSize = rt->pixelSize();
683 if (rt->resourceType() == QRhiResource::TextureRenderTarget) {
684 if (QRhiShadingRateMap *srm =
static_cast<QRhiTextureRenderTarget *>(rt)->description().shadingRateMap()) {
685 const QSize logicalSize = srm->logicalSize();
686 if (logicalSize.isValid())
687 pixelSize = logicalSize;
690 }
else if (redirect.rt.sw.paintDevice) {
691 pixelSize = QSize(redirect.rt.sw.paintDevice->width(), redirect.rt.sw.paintDevice->height());
693 pixelSize = swapchain->currentPixelSize();
695 pixelSize = q->size() * devicePixelRatio;
698 renderer->setDevicePixelRatio(devicePixelRatio);
699 renderer->setDeviceRect(QRect(QPoint(0, 0), pixelSize));
700 renderer->setViewportRect(QRect(QPoint(0, 0), pixelSize));
702 QSGAbstractRenderer::MatrixTransformFlags matrixFlags;
703 bool flipY = rhi ? !rhi->isYUpInNDC() :
false;
704 if (!customRenderTarget.isNull() && customRenderTarget.mirrorVertically())
707 matrixFlags |= QSGAbstractRenderer::MatrixTransformFlipY;
709 const QRectF rect(QPointF(0, 0), pixelSize / devicePixelRatio);
710 renderer->setProjectionMatrixToRect(rect, matrixFlags, rhi && !rhi->isYUpInNDC());
712 context->renderNextFrame(renderer);
714 emit q->afterRendering();
715 runAndClearJobs(&afterRenderingJobs);
717 context->endNextFrame(renderer);
719 if (renderer && renderer->hasVisualizationModeWithContinuousUpdate()) {
723 QCoreApplication::postEvent(q,
new QEvent(QEvent::Type(FullUpdateRequest)));
798void QQuickWindowPrivate::init(QQuickWindow *c, QQuickRenderControl *control)
805 contentItem =
new QQuickRootItem;
806 contentItem->setObjectName(q->objectName());
807 QQml_setParent_noEvent(contentItem, c);
808 QQmlEngine::setObjectOwnership(contentItem, QQmlEngine::CppOwnership);
809 QQuickItemPrivate *contentItemPrivate = QQuickItemPrivate::get(contentItem);
810 contentItemPrivate->window = q;
811 contentItemPrivate->windowRefCount = 1;
812 contentItemPrivate->flags |= QQuickItem::ItemIsFocusScope;
813 contentItem->setSize(q->size());
814 deliveryAgent =
new QQuickDeliveryAgent(contentItem);
816 visualizationMode = qgetenv(
"QSG_VISUALIZE");
817 renderControl = control;
819 QQuickRenderControlPrivate::get(renderControl)->window = q;
822 windowManager = QSGRenderLoop::instance();
824 Q_ASSERT(windowManager || renderControl);
826 QObject::connect(
static_cast<QGuiApplication *>(QGuiApplication::instance()),
827 &QGuiApplication::fontDatabaseChanged,
829 &QQuickWindow::handleFontDatabaseChanged);
832 lastReportedItemDevicePixelRatio = q->effectiveDevicePixelRatio();
837 QQuickRenderControlPrivate *renderControlPriv = QQuickRenderControlPrivate::get(renderControl);
838 sg = renderControlPriv->sg;
839 context = renderControlPriv->rc;
841 windowManager->addWindow(q);
842 sg = windowManager->sceneGraphContext();
843 context = windowManager->createRenderContext(sg);
846 q->setSurfaceType(windowManager ? windowManager->windowSurfaceType() : QSurface::OpenGLSurface);
847 q->setFormat(sg->defaultSurfaceFormat());
853 animationController.reset(
new QQuickAnimatorController(q));
856 QObject::connect(context, &QSGRenderContext::initialized, q, &QQuickWindow::sceneGraphInitialized, Qt::DirectConnection),
857 QObject::connect(context, &QSGRenderContext::invalidated, q, &QQuickWindow::sceneGraphInvalidated, Qt::DirectConnection),
858 QObject::connect(context, &QSGRenderContext::invalidated, q, &QQuickWindow::cleanupSceneGraph, Qt::DirectConnection),
860 QObject::connect(q, &QQuickWindow::focusObjectChanged, q, &QQuickWindow::activeFocusItemChanged),
861 QObject::connect(q, &QQuickWindow::screenChanged, q, &QQuickWindow::handleScreenChanged),
862 QObject::connect(qApp, &QGuiApplication::applicationStateChanged, q, &QQuickWindow::handleApplicationStateChanged),
863 QObject::connect(q, &QQuickWindow::frameSwapped, q, &QQuickWindow::runJobsAfterSwap, Qt::DirectConnection),
866 if (QQmlInspectorService *service = QQmlDebugConnector::service<QQmlInspectorService>())
867 service->addWindow(q);
1250QQuickWindow::~QQuickWindow()
1253 d->inDestructor =
true;
1254 if (d->renderControl) {
1255 QQuickRenderControlPrivate::get(d->renderControl)->windowDestroyed();
1256 }
else if (d->windowManager) {
1257 d->windowManager->removeWindow(
this);
1258 d->windowManager->windowDestroyed(
this);
1261 disconnect(
this, &QQuickWindow::focusObjectChanged,
this, &QQuickWindow::activeFocusItemChanged);
1262 disconnect(
this, &QQuickWindow::screenChanged,
this, &QQuickWindow::handleScreenChanged);
1263 disconnect(qApp, &QGuiApplication::applicationStateChanged,
this, &QQuickWindow::handleApplicationStateChanged);
1264 disconnect(
this, &QQuickWindow::frameSwapped,
this, &QQuickWindow::runJobsAfterSwap);
1266 delete d->incubationController; d->incubationController =
nullptr;
1267 QQuickRootItem *root = d->contentItem;
1268 d->contentItem =
nullptr;
1269 root->setParent(
nullptr);
1271 d->deliveryAgent =
nullptr;
1275 const std::lock_guard locker(d->renderJobMutex);
1276 qDeleteAll(std::exchange(d->beforeSynchronizingJobs, {}));
1277 qDeleteAll(std::exchange(d->afterSynchronizingJobs, {}));
1278 qDeleteAll(std::exchange(d->beforeRenderingJobs, {}));
1279 qDeleteAll(std::exchange(d->afterRenderingJobs, {}));;
1280 qDeleteAll(std::exchange(d->afterSwapJobs, {}));
1288 QQuickPixmap::purgeCache();
1290 for (QMetaObject::Connection &connection : d->connections)
1291 disconnect(connection);
1489bool QQuickWindow::event(QEvent *event)
1494 QQuickDeliveryAgent *da = d->deliveryAgent;
1495 if (event->isPointerEvent()) {
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506 if (d->windowEventDispatch)
1509 const bool wasAccepted = event->isAccepted();
1510 QScopedValueRollback windowEventDispatchGuard(d->windowEventDispatch,
true);
1511 qCDebug(lcPtr) <<
"dispatching to window functions in case of override" << event;
1512 QWindow::event(event);
1513 if (event->isAccepted() && !wasAccepted)
1517
1518
1519
1520
1521
1522
1523 auto pe =
static_cast<QPointerEvent *>(event);
1524 if (QQuickDeliveryAgentPrivate::isTouchEvent(pe))
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541 if (pe->pointCount()) {
1542 const bool synthMouse = QQuickDeliveryAgentPrivate::isSynthMouse(pe);
1543 if (QQuickDeliveryAgentPrivate::subsceneAgentsExist) {
1547 QFlatMap<QQuickDeliveryAgent*, QList<QEventPoint>> deliveryAgentsNeedingPoints;
1548 QEventPoint::States eventStates;
1550 auto insert = [&](QQuickDeliveryAgent *ptda,
const QEventPoint &pt) {
1551 if (pt.state() == QEventPoint::Pressed && !synthMouse)
1552 pe->clearPassiveGrabbers(pt);
1553 auto &ptList = deliveryAgentsNeedingPoints[ptda];
1554 auto idEquals = [](
auto id) {
return [id] (
const auto &e) {
return e.id() == id; }; };
1555 if (std::none_of(ptList.cbegin(), ptList.cend(), idEquals(pt.id())))
1559 for (
const auto &pt : pe->points()) {
1560 eventStates |= pt.state();
1561 auto epd = QPointingDevicePrivate::get(
const_cast<QPointingDevice*>(pe->pointingDevice()))->queryPointById(pt.id());
1563 bool foundAgent =
false;
1564 if (!epd->exclusiveGrabber.isNull() && !epd->exclusiveGrabberContext.isNull()) {
1565 if (
auto ptda = qobject_cast<QQuickDeliveryAgent *>(epd->exclusiveGrabberContext.data())) {
1567 qCDebug(lcPtr) << pe->type() <<
"point" << pt.id() << pt.state()
1568 <<
"@" << pt.scenePosition() <<
"will be re-delivered via known grabbing agent" << ptda <<
"to" << epd->exclusiveGrabber.data();
1572 for (
const auto &pgda : std::as_const(epd->passiveGrabbersContext)) {
1573 if (
auto ptda = qobject_cast<QQuickDeliveryAgent *>(pgda.data())) {
1575 qCDebug(lcPtr) << pe->type() <<
"point" << pt.id() << pt.state()
1576 <<
"@" << pt.scenePosition() <<
"will be re-delivered via known passive-grabbing agent" << ptda;
1584 for (
auto daAndPoints : deliveryAgentsNeedingPoints) {
1585 if (pe->pointCount() > 1) {
1586 Q_ASSERT(QQuickDeliveryAgentPrivate::isTouchEvent(pe));
1588 QEvent::Type eventType = pe->type();
1589 switch (eventStates) {
1590 case QEventPoint::State::Pressed:
1591 eventType = QEvent::TouchBegin;
1593 case QEventPoint::State::Released:
1594 eventType = QEvent::TouchEnd;
1597 eventType = QEvent::TouchUpdate;
1601 QMutableTouchEvent te(eventType, pe->pointingDevice(), pe->modifiers(), daAndPoints.second);
1602 te.setTimestamp(pe->timestamp());
1604 qCDebug(lcTouch) << daAndPoints.first <<
"shall now receive" << &te;
1605 ret = daAndPoints.first->event(&te) || ret;
1607 qCDebug(lcPtr) << daAndPoints.first <<
"shall now receive" << pe;
1608 ret = daAndPoints.first->event(pe) || ret;
1613 d->deliveryAgentPrivate()->clearGrabbers(pe);
1616 }
else if (!synthMouse) {
1619 for (
const auto &pt : pe->points()) {
1620 if (pt.state() == QEventPoint::Pressed)
1621 pe->clearPassiveGrabbers(pt);
1630 qCDebug(lcHoverTrace) <<
this <<
"some sort of event" << event;
1631 bool ret = (da && da->event(event));
1645 if (pe->isPointerEvent() && !QQuickDeliveryAgentPrivate::isTabletEvent(pe) && d->isPopup()
1646 && std::any_of(std::cbegin(pe->points()), std::cend(pe->points()), [pe](
auto &p){
return pe->exclusiveGrabber(p);}))
1649 d->deliveryAgentPrivate()->clearGrabbers(pe);
1651 if (pe->type() == QEvent::MouseButtonPress || pe->type() == QEvent::MouseButtonRelease) {
1654 d->maybeSynthesizeContextMenuEvent(
static_cast<QMouseEvent *>(pe));
1657#if QT_CONFIG(tabletevent)
1664 if (type() == Qt::Popup && QQuickDeliveryAgentPrivate::isTabletEvent(pe) &&
1665 !QRect(QPoint(), size()).contains(pe->points().first().scenePosition().toPoint())) {
1673 }
else if (event->isInputEvent()) {
1674 if (da && da->event(event))
1678 switch (event->type()) {
1680 case QEvent::FocusAboutToChange:
1683 case QEvent::InputMethod:
1684 case QEvent::InputMethodQuery:
1685#if QT_CONFIG(quick_draganddrop)
1686 case QEvent::DragEnter:
1687 case QEvent::DragLeave:
1688 case QEvent::DragMove:
1691 if (d->inDestructor)
1693 if (da && da->event(event))
1696 case QEvent::LanguageChange:
1697 case QEvent::LocaleChange:
1699 QCoreApplication::sendEvent(d->contentItem, event);
1701 case QEvent::UpdateRequest:
1702 if (d->windowManager)
1703 d->windowManager->handleUpdateRequest(
this);
1705 case QEvent::PlatformSurface:
1706 if ((
static_cast<QPlatformSurfaceEvent *>(event))->surfaceEventType() == QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed) {
1709 if (d->windowManager)
1710 d->windowManager->hide(
this);
1713 case QEvent::WindowDeactivate:
1714 if (
auto da = d->deliveryAgentPrivate())
1715 da->handleWindowDeactivate(
this);
1717 case QEvent::WindowActivate:
1719 QCoreApplication::sendEvent(d->contentItem, event);
1721 case QEvent::ApplicationPaletteChange:
1722 d->inheritPalette(QGuiApplication::palette());
1724 QCoreApplication::sendEvent(d->contentItem, event);
1726 case QEvent::DevicePixelRatioChange:
1727 physicalDpiChanged();
1729 case QEvent::SafeAreaMarginsChange:
1730 QQuickSafeArea::updateSafeAreasRecursively(d->contentItem);
1732 case QEvent::ChildWindowAdded: {
1733 auto *childEvent =
static_cast<QChildWindowEvent*>(event);
1734 auto *childWindow = childEvent->child();
1735 qCDebug(lcQuickWindow) <<
"Child window" << childWindow <<
"added to" <<
this;
1736 if (childWindow->handle()) {
1742 d->updateChildWindowStackingOrder();
1744 qCDebug(lcQuickWindow) <<
"No platform window yet."
1745 <<
"Deferring child window stacking until surface creation";
1753 if (event->type() == QEvent::Type(QQuickWindowPrivate::FullUpdateRequest))
1755 else if (event->type() == QEvent::Type(QQuickWindowPrivate::TriggerContextCreationFailure))
1756 d->windowManager->handleContextCreationFailure(
this);
1758 if (event->isPointerEvent())
1761 return QWindow::event(event);
2237void QQuickWindowPrivate::updateDirtyNode(QQuickItem *item)
2239 QQuickItemPrivate *itemPriv = QQuickItemPrivate::get(item);
2240 quint32 dirty = itemPriv->dirtyAttributes;
2241 itemPriv->dirtyAttributes = 0;
2243 if ((dirty & QQuickItemPrivate::TransformUpdateMask) ||
2244 (dirty & QQuickItemPrivate::Size && itemPriv->origin() != QQuickItem::TopLeft &&
2245 (itemPriv->scale() != 1. || itemPriv->rotation() != 0.))) {
2249 if (itemPriv->x != 0. || itemPriv->y != 0.)
2250 matrix.translate(itemPriv->x, itemPriv->y);
2252 for (
int ii = itemPriv->transforms.size() - 1; ii >= 0; --ii)
2253 itemPriv->transforms.at(ii)->applyTo(&matrix);
2255 if (itemPriv->scale() != 1. || itemPriv->rotation() != 0.) {
2256 QPointF origin = item->transformOriginPoint();
2257 matrix.translate(origin.x(), origin.y());
2258 if (itemPriv->scale() != 1.)
2259 matrix.scale(itemPriv->scale(), itemPriv->scale());
2260 if (itemPriv->rotation() != 0.)
2261 matrix.rotate(itemPriv->rotation(), 0, 0, 1);
2262 matrix.translate(-origin.x(), -origin.y());
2265 itemPriv->itemNode()->setMatrix(matrix);
2268 const bool clipEffectivelyChanged = dirty & (QQuickItemPrivate::Clip | QQuickItemPrivate::Window);
2269 if (clipEffectivelyChanged) {
2270 QSGNode *parent = itemPriv->opacityNode() ? (QSGNode *)itemPriv->opacityNode()
2271 : (QSGNode *)itemPriv->itemNode();
2272 QSGNode *child = itemPriv->rootNode();
2274 if (
bool initializeClipNode = item->clip() && itemPriv->clipNode() ==
nullptr;
2275 initializeClipNode) {
2276 QQuickDefaultClipNode *clip =
new QQuickDefaultClipNode(item->clipRect());
2277 itemPriv->extra.value().clipNode = clip;
2281 parent->reparentChildNodesTo(clip);
2282 parent->appendChildNode(clip);
2284 parent->removeChildNode(child);
2285 clip->appendChildNode(child);
2286 parent->appendChildNode(clip);
2289 }
else if (
bool updateClipNode = item->clip() && itemPriv->clipNode() !=
nullptr;
2291 QQuickDefaultClipNode *clip = itemPriv->clipNode();
2292 clip->setClipRect(item->clipRect());
2294 }
else if (
bool removeClipNode = !item->clip() && itemPriv->clipNode() !=
nullptr;
2296 QQuickDefaultClipNode *clip = itemPriv->clipNode();
2297 parent->removeChildNode(clip);
2299 clip->removeChildNode(child);
2300 parent->appendChildNode(child);
2302 clip->reparentChildNodesTo(parent);
2305 delete itemPriv->clipNode();
2306 itemPriv->extra->clipNode =
nullptr;
2310 const int effectRefCount = itemPriv->extra.isAllocated() ? itemPriv->extra->effectRefCount : 0;
2311 const bool effectRefEffectivelyChanged =
2312 (dirty & (QQuickItemPrivate::EffectReference | QQuickItemPrivate::Window))
2313 && ((effectRefCount == 0) != (itemPriv->rootNode() ==
nullptr));
2314 if (effectRefEffectivelyChanged) {
2315 if (dirty & QQuickItemPrivate::ChildrenUpdateMask)
2316 itemPriv->childContainerNode()->removeAllChildNodes();
2318 QSGNode *parent = itemPriv->clipNode();
2320 parent = itemPriv->opacityNode();
2322 parent = itemPriv->itemNode();
2324 if (itemPriv->extra.isAllocated() && itemPriv->extra->effectRefCount) {
2325 Q_ASSERT(itemPriv->rootNode() ==
nullptr);
2326 QSGRootNode *root =
new QSGRootNode();
2327 itemPriv->extra->rootNode = root;
2328 parent->reparentChildNodesTo(root);
2329 parent->appendChildNode(root);
2331 Q_ASSERT(itemPriv->rootNode() !=
nullptr);
2332 QSGRootNode *root = itemPriv->rootNode();
2333 parent->removeChildNode(root);
2334 root->reparentChildNodesTo(parent);
2335 delete itemPriv->rootNode();
2336 itemPriv->extra->rootNode =
nullptr;
2340 if (dirty & QQuickItemPrivate::ChildrenUpdateMask) {
2342 bool fetchedPaintNode =
false;
2343 QList<QQuickItem *> orderedChildren = itemPriv->paintOrderChildItems();
2344 int desiredNodesSize = orderedChildren.size() + (itemPriv->paintNode ? 1 : 0);
2352 int desiredNodesProcessed = 0;
2357 QSGNode *groupNode = itemPriv->childContainerNode();
2358 QSGNode *currentNode = groupNode->firstChild();
2359 QSGNode *desiredNode =
nullptr;
2361 while (currentNode && (desiredNode = fetchNextNode(itemPriv, ii, fetchedPaintNode))) {
2362 if (currentNode != desiredNode) {
2365 if (currentNode->nextSibling() == desiredNode) {
2367 groupNode->removeChildNode(currentNode);
2372 if (desiredNode->parent()) {
2373 desiredNode->parent()->removeChildNode(desiredNode);
2375 groupNode->insertChildNodeBefore(desiredNode, currentNode);
2379 currentNode = desiredNode;
2382 currentNode = currentNode->nextSibling();
2383 desiredNodesProcessed++;
2389 if (desiredNodesProcessed < desiredNodesSize) {
2390 while ((desiredNode = fetchNextNode(itemPriv, ii, fetchedPaintNode))) {
2391 if (desiredNode->parent())
2392 desiredNode->parent()->removeChildNode(desiredNode);
2393 groupNode->appendChildNode(desiredNode);
2395 }
else if (currentNode) {
2399 while (currentNode) {
2400 QSGNode *node = currentNode->nextSibling();
2401 groupNode->removeChildNode(currentNode);
2407 if ((dirty & QQuickItemPrivate::Size) && itemPriv->clipNode()) {
2408 itemPriv->clipNode()->setRect(item->clipRect());
2409 itemPriv->clipNode()->update();
2412 if (dirty & (QQuickItemPrivate::OpacityValue | QQuickItemPrivate::Visible
2413 | QQuickItemPrivate::HideReference | QQuickItemPrivate::Window))
2415 qreal opacity = itemPriv->explicitVisible && (!itemPriv->extra.isAllocated() || itemPriv->extra->hideRefCount == 0)
2416 ? itemPriv->opacity() : qreal(0);
2418 if (opacity != 1 && !itemPriv->opacityNode()) {
2419 QSGOpacityNode *node =
new QSGOpacityNode;
2420 itemPriv->extra.value().opacityNode = node;
2422 QSGNode *parent = itemPriv->itemNode();
2423 QSGNode *child = itemPriv->clipNode();
2425 child = itemPriv->rootNode();
2428 parent->removeChildNode(child);
2429 node->appendChildNode(child);
2430 parent->appendChildNode(node);
2432 parent->reparentChildNodesTo(node);
2433 parent->appendChildNode(node);
2436 if (itemPriv->opacityNode())
2437 itemPriv->opacityNode()->setOpacity(opacity);
2440 if (dirty & QQuickItemPrivate::ContentUpdateMask) {
2442 if (itemPriv->flags & QQuickItem::ItemHasContents) {
2443 updatePaintNodeData.transformNode = itemPriv->itemNode();
2444 itemPriv->paintNode = item->updatePaintNode(itemPriv->paintNode, &updatePaintNodeData);
2446 Q_ASSERT(itemPriv->paintNode ==
nullptr ||
2447 itemPriv->paintNode->parent() ==
nullptr ||
2448 itemPriv->paintNode->parent() == itemPriv->childContainerNode());
2450 if (itemPriv->paintNode) {
2451 if (itemPriv->paintNode->parent() ==
nullptr) {
2452 QSGNode *before = qquickitem_before_paintNode(itemPriv);
2453 if (before && before->parent()) {
2454 Q_ASSERT(before->parent() == itemPriv->childContainerNode());
2455 itemPriv->childContainerNode()->insertChildNodeAfter(itemPriv->paintNode, before);
2457 itemPriv->childContainerNode()->prependChildNode(itemPriv->paintNode);
2464 if (itemPriv->extra.isAllocated() && itemPriv->extra->mutabilityGroupSet) {
2465 QSGNodePrivate::setMutabilityGroupOfSubtree(itemPriv->paintNode,
2466 itemPriv->extra->mutabilityGroup);
2470 }
else if (itemPriv->paintNode) {
2471 delete itemPriv->paintNode;
2472 itemPriv->paintNode =
nullptr;
2479 QList<QSGNode *> nodes;
2480 nodes << itemPriv->itemNodeInstance
2481 << itemPriv->opacityNode()
2482 << itemPriv->clipNode()
2483 << itemPriv->rootNode()
2484 << itemPriv->paintNode;
2485 nodes.removeAll(
nullptr);
2487 Q_ASSERT(nodes.constFirst() == itemPriv->itemNodeInstance);
2488 for (
int i=1; i<nodes.size(); ++i) {
2489 QSGNode *n = nodes.at(i);
2491 Q_ASSERT(n->parent() == nodes.at(i-1));
2493 Q_ASSERT(n == itemPriv->paintNode || n == itemPriv->childContainerNode() || n->childCount() == 1);