22QQuick3DItem2D::QQuick3DItem2D(QQuickItem *item, QQuick3DNode *parent)
23 : QQuick3DNode(*(
new QQuick3DNodePrivate(QQuick3DNodePrivate::Type::Item2D)), parent)
25 m_contentItem =
new QQuickItem();
26 m_contentItem->setObjectName(QLatin1String(
"parent of ") + item->objectName());
28 QQuickItemPrivate::get(m_contentItem)->ensureSubsceneDeliveryAgent();
29 QQmlEngine::setObjectOwnership(m_contentItem, QQmlEngine::CppOwnership);
31 connect(m_contentItem, &QQuickItem::childrenChanged,
this, &QQuick3DObject::update);
40void QQuick3DItem2D::addChildItem(QQuickItem *item)
42 item->setParent(m_contentItem);
43 item->setParentItem(m_contentItem);
44 QQuickItemPrivate::get(item)->addItemChangeListener(
this, QQuickItemPrivate::ChangeType::Destroyed);
45 connect(item, &QQuickItem::enabledChanged,
this, &QQuick3DItem2D::updatePicking);
46 connect(item, &QQuickItem::visibleChanged,
this, &QQuick3DItem2D::updatePicking);
47 m_sourceItems.append(item);
50void QQuick3DItem2D::removeChildItem(QQuickItem *item)
52 m_sourceItems.removeOne(item);
54 QQuickItemPrivate::get(item)->removeItemChangeListener(
this, QQuickItemPrivate::ChangeType::Destroyed);
55 if (m_sourceItems.isEmpty())
56 emit allChildrenRemoved();
77QSSGRenderGraphObject *QQuick3DItem2D::updateSpatialNode(QSSGRenderGraphObject *node)
79 auto *sourceItemPrivate = QQuickItemPrivate::get(m_contentItem);
80 QQuickWindow *window = m_contentItem->window();
83 const auto &manager = QQuick3DObjectPrivate::get(
this)->sceneManager;
84 window = manager->window();
89 auto *backEndNode =
new QSSGRenderItem2D();
90 backEndNode->m_frontEndObject =
this;
94 QQuick3DNode::updateSpatialNode(node);
96 auto itemNode =
static_cast<QSSGRenderItem2D *>(node);
98 itemNode->m_rootNode = sourceItemPrivate->rootNode();
99 if (!itemNode->m_rootNode) {
100 QQuickWindowPrivate::get(window)->updateDirtyNode(m_contentItem);
101 itemNode->m_rootNode = sourceItemPrivate->rootNode();
102 if (!itemNode->m_rootNode) {
103 qWarning() <<
"Item2D is not initialized. It will not be shown.";
108 if (m_pickingDirty) {
109 m_pickingDirty =
false;
110 bool isPickable =
false;
111 for (
const auto &item : std::as_const(m_sourceItems)) {
113 if (item->isVisible() && item->isEnabled()) {
118 itemNode->setState(QSSGRenderNode::LocalState::Pickable, isPickable);
131void QQuick3DItem2D::preSync()
133 const auto &manager = QQuick3DObjectPrivate::get(
this)->sceneManager;
134 auto *sourcePrivate = QQuickItemPrivate::get(m_contentItem);
135 auto *window = manager->window();
136 if (m_window != window) {
139 disconnect(m_window, SIGNAL(destroyed(QObject*)),
this, SLOT(derefWindow(QObject*)));
140 sourcePrivate->derefWindow();
143 sourcePrivate->refWindow(window);
144 connect(window, SIGNAL(destroyed(QObject*)),
this, SLOT(derefWindow(QObject*)));
145 sourcePrivate->refFromEffectItem(
true);
151 auto *itemPriv = QQuickItemPrivate::get(item);
153 if (win == itemPriv->window) {
154 itemPriv->window =
nullptr;
155 itemPriv->windowRefCount = 0;
157 itemPriv->prevDirtyItem =
nullptr;
158 itemPriv->nextDirtyItem =
nullptr;
161 for (
auto *child: itemPriv->childItems)
162 detachWindow(child, win);