diff --git a/poincare/include/poincare/dynamic_layout_hierarchy.h b/poincare/include/poincare/dynamic_layout_hierarchy.h index 573e5be64..9d5830f11 100644 --- a/poincare/include/poincare/dynamic_layout_hierarchy.h +++ b/poincare/include/poincare/dynamic_layout_hierarchy.h @@ -35,6 +35,8 @@ public: protected: const ExpressionLayout ** m_children; int m_numberOfChildren; +private: + void removeDetachedChildren(); }; } diff --git a/poincare/src/layout/dynamic_layout_hierarchy.cpp b/poincare/src/layout/dynamic_layout_hierarchy.cpp index 409a0b2a3..ba55192b8 100644 --- a/poincare/src/layout/dynamic_layout_hierarchy.cpp +++ b/poincare/src/layout/dynamic_layout_hierarchy.cpp @@ -46,7 +46,7 @@ void DynamicLayoutHierarchy::mergeChildrenAtIndex(DynamicLayoutHierarchy * eL, i } } addChildrenAtIndex(eL->children(), eL->numberOfChildren(), indexForInsertion, removeEmptyChildren); - eL->detachChildren(); + eL->removeDetachedChildren(); delete eL; } @@ -160,4 +160,14 @@ void DynamicLayoutHierarchy::removeAndDeleteChildren() { m_numberOfChildren = 0; } +void DynamicLayoutHierarchy::removeDetachedChildren() { + int currentIndex = 0; + for (int i = 0; i < m_numberOfChildren; i++) { + if (m_children[i] != nullptr && m_children[i]->parent() == this) { + m_children[currentIndex++] = m_children[i]; + } + } + m_numberOfChildren = currentIndex; +} + }