From 49eb15da83d6182e56194cdf3b52456c99780b43 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 3 Dec 2019 17:21:56 +0100 Subject: [PATCH] removeItem fixed --- src/layouts/QskIndexedLayoutBox.cpp | 24 ++++++++++++++++++------ src/layouts/QskIndexedLayoutBox.h | 2 ++ src/layouts/QskLinearBox.cpp | 13 +++++-------- src/layouts/QskLinearBox.h | 2 +- src/layouts/QskStackBox.cpp | 11 ++++------- src/layouts/QskStackBox.h | 2 +- 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/layouts/QskIndexedLayoutBox.cpp b/src/layouts/QskIndexedLayoutBox.cpp index de8119d3..bf6e23f9 100644 --- a/src/layouts/QskIndexedLayoutBox.cpp +++ b/src/layouts/QskIndexedLayoutBox.cpp @@ -11,12 +11,12 @@ class QskIndexedLayoutBox::PrivateData public: PrivateData() : autoAddChildren( true ) - , blockChildAdded( false ) + , blockChildAddedRemoved( false ) { } bool autoAddChildren : 1; - bool blockChildAdded : 1; + bool blockChildAddedRemoved : 1; }; QskIndexedLayoutBox::QskIndexedLayoutBox( QQuickItem* parent ) @@ -51,7 +51,7 @@ void QskIndexedLayoutBox::itemChange( { case QQuickItem::ItemChildAddedChange: { - if ( m_data->autoAddChildren && !m_data->blockChildAdded ) + if ( m_data->autoAddChildren && !m_data->blockChildAddedRemoved ) { if ( !qskIsTransparentForPositioner( value.item ) ) autoAddItem( value.item ); @@ -61,7 +61,9 @@ void QskIndexedLayoutBox::itemChange( } case QQuickItem::ItemChildRemovedChange: { - autoRemoveItem( value.item ); + if ( !m_data->blockChildAddedRemoved ) + autoRemoveItem( value.item ); + break; } #if 1 @@ -91,9 +93,19 @@ void QskIndexedLayoutBox::reparentItem( QQuickItem* item ) if ( item->parentItem() != this ) { - m_data->blockChildAdded = true; + m_data->blockChildAddedRemoved = true; item->setParentItem( this ); - m_data->blockChildAdded = false; + m_data->blockChildAddedRemoved = false; + } +} + +void QskIndexedLayoutBox::unparentItem( QQuickItem* item ) +{ + if ( item->parentItem() == this ) + { + m_data->blockChildAddedRemoved = true; + item->setParentItem( nullptr ); + m_data->blockChildAddedRemoved = false; } } diff --git a/src/layouts/QskIndexedLayoutBox.h b/src/layouts/QskIndexedLayoutBox.h index 4f97f700..0da654d9 100644 --- a/src/layouts/QskIndexedLayoutBox.h +++ b/src/layouts/QskIndexedLayoutBox.h @@ -29,7 +29,9 @@ class QSK_EXPORT QskIndexedLayoutBox : public QskBox protected: void itemChange( ItemChange, const ItemChangeData& ) override; + void reparentItem( QQuickItem* ); + void unparentItem( QQuickItem* ); private: virtual void autoAddItem( QQuickItem* ) = 0; diff --git a/src/layouts/QskLinearBox.cpp b/src/layouts/QskLinearBox.cpp index 6480d82e..2b5e4409 100644 --- a/src/layouts/QskLinearBox.cpp +++ b/src/layouts/QskLinearBox.cpp @@ -97,7 +97,7 @@ int QskLinearBox::indexOf( const QQuickItem* item ) const void QskLinearBox::removeAt( int index ) { - removeItemInternal( index, false ); + removeItemInternal( index, true ); } void QskLinearBox::removeItemInternal( int index, bool unparent ) @@ -114,11 +114,8 @@ void QskLinearBox::removeItemInternal( int index, bool unparent ) { setItemActive( item, false ); - if ( !unparent ) - { - if ( item->parentItem() == this ) - item->setParentItem( nullptr ); - } + if ( unparent ) + unparentItem( item ); } resetImplicitSize(); @@ -149,7 +146,7 @@ void QskLinearBox::clear( bool autoDelete ) if( autoDelete && ( item->parent() == this ) ) delete item; else - item->setParentItem( nullptr ); + unparentItem( item ); } } @@ -164,7 +161,7 @@ void QskLinearBox::autoAddItem( QQuickItem* item ) void QskLinearBox::autoRemoveItem( QQuickItem* item ) { - removeItemInternal( indexOf( item ), true ); + removeItemInternal( indexOf( item ), false ); } void QskLinearBox::activate() diff --git a/src/layouts/QskLinearBox.h b/src/layouts/QskLinearBox.h index 389a6f75..900f72c5 100644 --- a/src/layouts/QskLinearBox.h +++ b/src/layouts/QskLinearBox.h @@ -117,7 +117,7 @@ class QSK_EXPORT QskLinearBox : public QskIndexedLayoutBox void autoRemoveItem( QQuickItem* ) override final; void setItemActive( QQuickItem*, bool ); - void removeItemInternal( int index, bool autoDelete ); + void removeItemInternal( int index, bool unparent ); class PrivateData; std::unique_ptr< PrivateData > m_data; diff --git a/src/layouts/QskStackBox.cpp b/src/layouts/QskStackBox.cpp index ae0c0478..76ffdcec 100644 --- a/src/layouts/QskStackBox.cpp +++ b/src/layouts/QskStackBox.cpp @@ -253,7 +253,7 @@ void QskStackBox::insertItem( void QskStackBox::removeAt( int index ) { - removeItemInternal( index, false ); + removeItemInternal( index, true ); } void QskStackBox::removeItemInternal( int index, bool unparent ) @@ -261,13 +261,10 @@ void QskStackBox::removeItemInternal( int index, bool unparent ) if ( index < 0 || index >= m_data->items.count() ) return; - if ( !unparent ) + if ( unparent ) { if ( auto item = m_data->items[ index ] ) - { - if ( item->parentItem() == this ) - item->setParentItem( nullptr ); - } + unparentItem( item ); } m_data->items.removeAt( index ); @@ -291,7 +288,7 @@ void QskStackBox::autoAddItem( QQuickItem* item ) void QskStackBox::autoRemoveItem( QQuickItem* item ) { - removeItemInternal( indexOf( item ), true ); + removeItemInternal( indexOf( item ), false ); } void QskStackBox::clear( bool autoDelete ) diff --git a/src/layouts/QskStackBox.h b/src/layouts/QskStackBox.h index 1cf9e4c9..9b59f520 100644 --- a/src/layouts/QskStackBox.h +++ b/src/layouts/QskStackBox.h @@ -81,7 +81,7 @@ class QSK_EXPORT QskStackBox : public QskIndexedLayoutBox void autoAddItem( QQuickItem* ) override final; void autoRemoveItem( QQuickItem* ) override final; - void removeItemInternal( int index, bool autoDelete ); + void removeItemInternal( int index, bool unparent ); class PrivateData; std::unique_ptr< PrivateData > m_data;