void QNodePrivate::propertyChanged(int propertyIndex) { // Bail out early if we can to avoid the cost below if (m_blockNotifications) return; Q_Q(QNode); const QMetaProperty property = q->metaObject()->property(propertyIndex); const QVariant data = property.read(q); if (data.canConvert<QNode*>()) { QNode *node = data.value<QNode*>(); // Ensure the node has issued a node creation change. We can end // up here if a newly created node with a parent is immediately set // as a property on another node. In this case the deferred call to // _q_postConstructorInit() will not have happened yet as the event // loop will still be blocked. So force it here and we catch this // eventuality in the _q_postConstructorInit() function so that we // do not repeat the creation and new child scene change events. if (node) QNodePrivate::get(node)->_q_postConstructorInit(); const QNodeId id = node ? node->id() : QNodeId(); notifyPropertyChange(property.name(), QVariant::fromValue(id)); } else { notifyPropertyChange(property.name(), data); } }
void RenderMaterial::sceneChangeEvent(const QSceneChangePtr &e) { QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); switch (e->type()) { case NodeUpdated: { if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) m_enabled = propertyChange->value().toBool(); break; } // Check for shader parameter case NodeAdded: { if (propertyChange->propertyName() == QByteArrayLiteral("parameter")) m_parameterPack.appendParameter(propertyChange->value().value<QNodeId>()); else if (propertyChange->propertyName() == QByteArrayLiteral("effect")) m_effectUuid = propertyChange->value().value<QNodeId>(); break; } case NodeRemoved: { if (propertyChange->propertyName() == QByteArrayLiteral("parameter")) m_parameterPack.removeParameter(propertyChange->value().value<QNodeId>()); else if (propertyChange->propertyName() == QByteArrayLiteral("effect")) m_effectUuid = QNodeId(); break; } default: break; } }
/*! * \internal * * Called by _q_setParentHelper on the main thread. */ void QNodePrivate::_q_removeChild(QNode *childNode) { Q_ASSERT(childNode); Q_ASSERT_X(childNode->parent() == q_func(), Q_FUNC_INFO, "not a child of this node"); QNodePrivate::get(childNode)->m_parentId = QNodeId(); // We notify the backend that we lost a child if (m_changeArbiter != nullptr) { const auto change = QPropertyNodeRemovedChangePtr::create(m_id, childNode); change->setPropertyName("children"); notifyObservers(change); } }