diff options
Diffstat (limited to 'src/quick3d/quick3d/items/quick3dentityloader.cpp')
-rw-r--r-- | src/quick3d/quick3d/items/quick3dentityloader.cpp | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/src/quick3d/quick3d/items/quick3dentityloader.cpp b/src/quick3d/quick3d/items/quick3dentityloader.cpp index 48f2af658..61801e8df 100644 --- a/src/quick3d/quick3d/items/quick3dentityloader.cpp +++ b/src/quick3d/quick3d/items/quick3dentityloader.cpp @@ -192,6 +192,24 @@ void Quick3DEntityLoader::setSource(const QUrl &url) d->loadFromSource(); } +QQmlComponent *Quick3DEntityLoader::sourceComponent() const +{ + Q_D(const Quick3DEntityLoader); + return d->m_sourceComponent; +} + +void Quick3DEntityLoader::setSourceComponent(QQmlComponent *component) +{ + Q_D(Quick3DEntityLoader); + if (d->m_sourceComponent == component) + return; + + d->clear(); + d->m_sourceComponent = component; + emit sourceComponentChanged(); + d->loadComponent(d->m_sourceComponent); +} + /*! \qmlproperty Status Qt3DCore::EntityLoader::status @@ -214,6 +232,7 @@ Quick3DEntityLoaderPrivate::Quick3DEntityLoaderPrivate() m_incubator(nullptr), m_context(nullptr), m_component(nullptr), + m_sourceComponent(nullptr), m_entity(nullptr), m_status(Quick3DEntityLoader::Null) { @@ -233,10 +252,11 @@ void Quick3DEntityLoaderPrivate::clear() m_entity = nullptr; } - if (m_component) { + // Only delete m_component if we were loading from a URL otherwise it means + // m_component = m_sourceComponent which we don't own. + if (m_component && m_component != m_sourceComponent) delete m_component; - m_component = nullptr; - } + m_component = nullptr; if (m_context) { delete m_context; @@ -271,17 +291,36 @@ void Quick3DEntityLoaderPrivate::loadComponent(const QUrl &source) m_component->loadUrl(source, QQmlComponent::Asynchronous); } +void Quick3DEntityLoaderPrivate::loadComponent(QQmlComponent *component) +{ + Q_Q(Quick3DEntityLoader); + + Q_ASSERT(m_entity == nullptr); + Q_ASSERT(m_component == nullptr); + Q_ASSERT(m_context == nullptr); + + m_component = component; + _q_componentStatusChanged(m_component ? m_component->status() : QQmlComponent::Null); +} + void Quick3DEntityLoaderPrivate::_q_componentStatusChanged(QQmlComponent::Status status) { Q_Q(Quick3DEntityLoader); Q_ASSERT(m_entity == nullptr); - Q_ASSERT(m_component != nullptr); Q_ASSERT(m_context == nullptr); Q_ASSERT(m_incubator == nullptr); - auto owner = _q_findQmlOwner(q); + qDebug() << Q_FUNC_INFO << status; + + if (!m_component) { + clear(); + emit q->entityChanged(); + return; + } + + auto owner = _q_findQmlOwner(q); if (!m_component->errors().isEmpty()) { QQmlEnginePrivate::warning(owner.engine, m_component->errors()); clear(); |