diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2018-07-09 13:34:24 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2018-07-10 08:03:15 +0000 |
commit | dd2243a416402fc6f087982397f40fccb09912d2 (patch) | |
tree | 1af078d3e97708a4909d48c13a050a8b80efbad8 | |
parent | f2e0780604f9db9608de4a813e50088cb52dc11a (diff) |
Start listening to slide list and slide object changes
Dynamically spawning objects will need acting on some of these.
Also fix a suboptimal iteration on the slide list.
Change-Id: I3e10375177b0aa81dda8d1476f5bb21d4841e0fe
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
-rw-r--r-- | src/runtime/q3dsscenemanager.cpp | 42 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager_p.h | 2 |
2 files changed, 37 insertions, 7 deletions
diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp index ee88346..457cf18 100644 --- a/src/runtime/q3dsscenemanager.cpp +++ b/src/runtime/q3dsscenemanager.cpp @@ -671,13 +671,16 @@ Q3DSSceneManager::Scene Q3DSSceneManager::buildScene(Q3DSUipPresentation *presen if (!m_flags.testFlag(SubPresentation)) Q3DSShaderManager::instance().setProfiler(m_profiler); - // Enter the first slide. (apply property changes from master+first) + if (!m_scene) { + qWarning("Q3DSSceneManager: No scene?"); + return Scene(); + } if (!m_masterSlide) { - qWarning("Q3DSSceneBuilder: No master slide?"); + qWarning("Q3DSSceneManager: No master slide?"); return Scene(); } if (!m_masterSlide->firstChild()) { - qWarning("Q3DSSceneBuilder: No slides?"); + qWarning("Q3DSSceneManager: No slides?"); return Scene(); } @@ -694,11 +697,17 @@ Q3DSSceneManager::Scene Q3DSSceneManager::buildScene(Q3DSUipPresentation *presen } }; - // Create the attached data object(s) + // Create the attached data object(s) and register for change notifications createSlideAttached(m_masterSlide, m_rootEntity); - const int count = m_masterSlide->childCount(); - for (int i = 0; i < count; ++i) - createSlideAttached(static_cast<Q3DSSlide *>(m_masterSlide->childAtIndex(i)), m_rootEntity); + m_masterSlide->addSlideObjectChangeObserver(std::bind(&Q3DSSceneManager::handleSlideObjectChange, + this, std::placeholders::_1, std::placeholders::_2)); + Q3DSSlide *subslide = static_cast<Q3DSSlide *>(m_masterSlide->firstChild()); + while (subslide) { + createSlideAttached(subslide, m_rootEntity); + subslide->addSlideObjectChangeObserver(std::bind(&Q3DSSceneManager::handleSlideObjectChange, + this, std::placeholders::_1, std::placeholders::_2)); + subslide = static_cast<Q3DSSlide *>(subslide->nextSibling()); + } Q3DSSlideDeck *slideDeck = new Q3DSSlideDeck(m_masterSlide); m_currentSlide = slideDeck->currentSlide(); @@ -834,6 +843,10 @@ Q3DSSceneManager::Scene Q3DSSceneManager::buildScene(Q3DSUipPresentation *presen m_scene->addSceneChangeObserver(std::bind(&Q3DSSceneManager::handleSceneChange, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + // And the "slide graph" (more like slide list). + m_masterSlide->addSlideGraphChangeObserver(std::bind(&Q3DSSceneManager::handleSlideGraphChange, + this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + // And for events too. m_scene->addEventHandler(QString(), std::bind(&Q3DSSceneManager::handleEvent, this, std::placeholders::_1)); @@ -8101,4 +8114,19 @@ void Q3DSSceneManager::removeLayerContent(Q3DSGraphObject *obj, Q3DSLayerNode *l markLayerAsContentChanged(layer3DS, Q3DSLayerNode::LayerContentSubTreeLightsChange); } +void Q3DSSceneManager::handleSlideGraphChange(Q3DSSlide *master, Q3DSGraphObject::DirtyFlag change, Q3DSSlide *slide) +{ + // called when a slide (a child of the master slide) is added or removed + + Q_UNUSED(master); + Q_UNUSED(change); + Q_UNUSED(slide); +} + +void Q3DSSceneManager::handleSlideObjectChange(Q3DSSlide *slide, const Q3DSSlide::SlideObjectChange &change) +{ + Q_UNUSED(slide); + Q_UNUSED(change); +} + QT_END_NAMESPACE diff --git a/src/runtime/q3dsscenemanager_p.h b/src/runtime/q3dsscenemanager_p.h index 2f1ccc9..95f2179 100644 --- a/src/runtime/q3dsscenemanager_p.h +++ b/src/runtime/q3dsscenemanager_p.h @@ -871,6 +871,8 @@ private: void handleSceneChange(Q3DSScene *scene, Q3DSGraphObject::DirtyFlag change, Q3DSGraphObject *obj); void addLayerContent(Q3DSGraphObject *obj, Q3DSGraphObject *parent, Q3DSLayerNode *layer3DS); void removeLayerContent(Q3DSGraphObject *obj, Q3DSLayerNode *layer3DS); + void handleSlideGraphChange(Q3DSSlide *master, Q3DSGraphObject::DirtyFlag change, Q3DSSlide *slide); + void handleSlideObjectChange(Q3DSSlide *slide, const Q3DSSlide::SlideObjectChange &change); void handleEvent(const Q3DSGraphObject::Event &e); void flushEventQueue(); |