24QQuick3DItem2D::QQuick3DItem2D(QQuickItem *item, QQuick3DNode *parent)
25 : QQuick3DNode(*(
new QQuick3DNodePrivate(QQuick3DNodePrivate::Type::Item2D)), parent)
27 m_contentItem =
new QQuickItem();
28 m_contentItem->setObjectName(QLatin1String(
"parent of ") + item->objectName());
30 QQuickItemPrivate::get(m_contentItem)->ensureSubsceneDeliveryAgent();
31 QQmlEngine::setObjectOwnership(m_contentItem, QQmlEngine::CppOwnership);
33 connect(m_contentItem, &QQuickItem::childrenChanged,
this, &QQuick3DObject::update);
42void QQuick3DItem2D::addChildItem(QQuickItem *item)
44 item->setParent(m_contentItem);
45 item->setParentItem(m_contentItem);
46 QQuickItemPrivate::get(item)->addItemChangeListener(
this, QQuickItemPrivate::ChangeType::Destroyed);
47 connect(item, &QQuickItem::enabledChanged,
this, &QQuick3DItem2D::updatePicking);
48 connect(item, &QQuickItem::visibleChanged,
this, &QQuick3DItem2D::updatePicking);
49 m_sourceItems.append(item);
52void QQuick3DItem2D::removeChildItem(QQuickItem *item)
54 m_sourceItems.removeOne(item);
56 QQuickItemPrivate::get(item)->removeItemChangeListener(
this, QQuickItemPrivate::ChangeType::Destroyed);
57 if (m_sourceItems.isEmpty())
58 emit allChildrenRemoved();
79QSSGRenderGraphObject *QQuick3DItem2D::updateSpatialNode(QSSGRenderGraphObject *node)
81 auto *sourceItemPrivate = QQuickItemPrivate::get(m_contentItem);
82 QQuickWindow *window = m_contentItem->window();
85 const auto &manager = QQuick3DObjectPrivate::get(
this)->sceneManager;
86 window = manager->window();
91 auto *backEndNode =
new QSSGRenderItem2D();
92 backEndNode->m_frontEndObject =
this;
96 QQuick3DNode::updateSpatialNode(node);
98 auto itemNode =
static_cast<QSSGRenderItem2D *>(node);
100 itemNode->m_rootNode = sourceItemPrivate->rootNode();
101 if (!itemNode->m_rootNode) {
102 QQuickWindowPrivate::get(window)->updateDirtyNode(m_contentItem);
103 itemNode->m_rootNode = sourceItemPrivate->rootNode();
104 if (!itemNode->m_rootNode) {
105 qWarning() <<
"Item2D is not initialized. It will not be shown.";
110 if (m_pickingDirty) {
111 m_pickingDirty =
false;
112 bool isPickable =
false;
113 for (
const auto &item : std::as_const(m_sourceItems)) {
115 if (item->isVisible() && item->isEnabled()) {
120 itemNode->setState(QSSGRenderNode::LocalState::Pickable, isPickable);
133void QQuick3DItem2D::preSync()
135 const auto &manager = QQuick3DObjectPrivate::get(
this)->sceneManager;
136 auto *sourcePrivate = QQuickItemPrivate::get(m_contentItem);
137 auto *window = manager->window();
138 if (m_window != window) {
141 disconnect(m_window, SIGNAL(destroyed(QObject*)),
this, SLOT(derefWindow(QObject*)));
142 sourcePrivate->derefWindow();
145 sourcePrivate->refWindow(window);
146 connect(window, SIGNAL(destroyed(QObject*)),
this, SLOT(derefWindow(QObject*)));
147 sourcePrivate->refFromEffectItem(
true);
153 auto *itemPriv = QQuickItemPrivate::get(item);
155 if (win == itemPriv->window) {
156 itemPriv->window =
nullptr;
157 itemPriv->windowRefCount = 0;
159 itemPriv->prevDirtyItem =
nullptr;
160 itemPriv->nextDirtyItem =
nullptr;
163 for (
auto *child: itemPriv->childItems)
164 detachWindow(child, win);