summaryrefslogtreecommitdiffstats
path: root/src/quick3d/quick3d/items/quick3dentityloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick3d/quick3d/items/quick3dentityloader.cpp')
-rw-r--r--src/quick3d/quick3d/items/quick3dentityloader.cpp49
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();