diff --git a/src/waveform/renderers/allshader/waveformrendermark.cpp b/src/waveform/renderers/allshader/waveformrendermark.cpp index a09f4584335f..a6c1d1e81284 100644 --- a/src/waveform/renderers/allshader/waveformrendermark.cpp +++ b/src/waveform/renderers/allshader/waveformrendermark.cpp @@ -97,18 +97,30 @@ allshader::WaveformRenderMark::WaveformRenderMark( m_isSlipRenderer(type == ::WaveformRendererAbstract::Slip), m_playPosHeight(0.f), m_playPosDevicePixelRatio(0.f) { - appendChildNode(std::make_unique()); - m_pRangeNodesParent = lastChild(); + { + auto pNode = std::make_unique(); + m_pRangeNodesParent = pNode.get(); + appendChildNode(std::move(pNode)); + } - appendChildNode(std::make_unique()); - m_pMarkNodesParent = lastChild(); + { + auto pNode = std::make_unique(); + m_pMarkNodesParent = pNode.get(); + appendChildNode(std::move(pNode)); + } - appendChildNode(std::make_unique()); - m_pDigitsRenderNode = static_cast(lastChild()); + { + auto pNode = std::make_unique(); + m_pDigitsRenderNode = pNode.get(); + appendChildNode(std::move(pNode)); + } - appendChildNode(std::make_unique()); - m_pPlayPosNode = static_cast(lastChild()); - m_pPlayPosNode->initForRectangles(1); + { + auto pNode = std::make_unique(); + m_pPlayPosNode = pNode.get(); + m_pPlayPosNode->initForRectangles(1); + appendChildNode(std::move(pNode)); + } } void allshader::WaveformRenderMark::draw(QPainter* painter, QPaintEvent* event) { @@ -151,6 +163,16 @@ bool allshader::WaveformRenderMark::isSubtreeBlocked() const { return m_isSlipRenderer && !m_waveformRenderer->isSlipActive(); } +namespace { +template +std::unique_ptr castToUniquePtr(std::unique_ptr&& pNode) { + if (dynamic_cast(pNode.get())) { + return std::unique_ptr(dynamic_cast(pNode.release())); + } + return std::unique_ptr(); +} +} // namespace + void allshader::WaveformRenderMark::update() { if (isSubtreeBlocked()) { return; @@ -166,14 +188,12 @@ void allshader::WaveformRenderMark::update() { // (transferring ownership). Later in this function we move the // visible nodes back to m_pMarkNodesParent children. while (auto pChild = m_pMarkNodesParent->firstChild()) { - // Pop child from front of m_pMarkNodesParent - auto pRemoved = m_pMarkNodesParent->removeChildNode(pChild); + auto pNode = castToUniquePtr(m_pMarkNodesParent->detachChildNode(pChild)); // Determine its WaveformMark - auto pMarkNode = static_cast(pRemoved.get()); - auto pMark = pMarkNode->m_pOwner; + auto pMark = pNode->m_pOwner; auto pGraphics = static_cast(pMark->m_pGraphics.get()); // Store the node with the WaveformMark - pGraphics->setNode(std::move(pRemoved)); + pGraphics->setNode(std::move(pNode)); } auto positionType = m_isSlipRenderer ? ::WaveformRendererAbstract::Slip @@ -271,12 +291,12 @@ void allshader::WaveformRenderMark::update() { // Reuse, or create new when needed if (!pRangeChild) { auto pNode = std::make_unique(); + pNode->initForRectangles(2); pRangeChild = pNode.get(); - pRangeChild->initForRectangles(2); m_pRangeNodesParent->appendChildNode(std::move(pNode)); } - updateRangeNode(static_cast(pRangeChild), + updateRangeNode(pRangeChild, QRectF(QPointF(currentMarkPoint, 0), QPointF(currentMarkEndPoint, m_waveformRenderer->getBreadth())), @@ -295,11 +315,10 @@ void allshader::WaveformRenderMark::update() { } // Remove unused nodes - // while (pRangeChild) { - // auto pNext = static_cast(pRangeChild->nextSibling()); - // m_pRangeNodesParent->removeChildNode(pRangeChild); - // pRangeChild = pNext; - //} + while (pRangeChild) { + auto pNode = m_pRangeNodesParent->detachChildNode(pRangeChild); + pRangeChild = static_cast(pRangeChild->nextSibling()); + } m_waveformRenderer->setMarkPositions(marksOnScreen); diff --git a/src/waveform/renderers/allshader/waveformrendermark.h b/src/waveform/renderers/allshader/waveformrendermark.h index ad8ac716d560..02e57834af9a 100644 --- a/src/waveform/renderers/allshader/waveformrendermark.h +++ b/src/waveform/renderers/allshader/waveformrendermark.h @@ -2,7 +2,6 @@ #include -#include "rendergraph/geometrynode.h" #include "rendergraph/node.h" #include "waveform/renderers/waveformrendermarkbase.h" @@ -71,8 +70,8 @@ class allshader::WaveformRenderMark : public ::WaveformRenderMarkBase, bool m_isSlipRenderer; - rendergraph::TreeNode* m_pRangeNodesParent{}; - rendergraph::TreeNode* m_pMarkNodesParent{}; + rendergraph::Node* m_pRangeNodesParent{}; + rendergraph::Node* m_pMarkNodesParent{}; rendergraph::GeometryNode* m_pPlayPosNode; float m_playPosHeight; diff --git a/src/waveform/renderers/allshader/waveformrendermarkrange.cpp b/src/waveform/renderers/allshader/waveformrendermarkrange.cpp index 4b2dd13c20fa..1de0c3c88afa 100644 --- a/src/waveform/renderers/allshader/waveformrendermarkrange.cpp +++ b/src/waveform/renderers/allshader/waveformrendermarkrange.cpp @@ -12,7 +12,7 @@ using namespace rendergraph; namespace allshader { WaveformRenderMarkRange::WaveformRenderMarkRange(WaveformWidgetRenderer* waveformWidget) - : ::WaveformRendererAbstract(waveformWidget) { + : ::WaveformRendererAbstract(waveformWidget) { } void WaveformRenderMarkRange::setup(const QDomNode& node, const SkinContext& skinContext) { @@ -88,9 +88,8 @@ void WaveformRenderMarkRange::update() { pChild = static_cast(pChild->nextSibling()); } while (pChild) { - auto pNext = static_cast(pChild->nextSibling()); - removeChildNode(pChild); - pChild = pNext; + auto pNode = detachChildNode(pChild); + pChild = static_cast(pChild->nextSibling()); } }