From 741af6a8a6f2bbca260e4a949c72443a24e15031 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 7 Apr 2022 17:19:59 +0200 Subject: [PATCH] hiding isTransparentForPositioner --- src/controls/QskControl.cpp | 10 ++-------- src/controls/QskQuick.cpp | 23 ++++++++++++++++++----- src/controls/QskQuick.h | 2 ++ src/controls/QskSubWindow.cpp | 2 +- src/controls/QskWindow.cpp | 4 ++-- 5 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/controls/QskControl.cpp b/src/controls/QskControl.cpp index a0aff322..276d78e9 100644 --- a/src/controls/QskControl.cpp +++ b/src/controls/QskControl.cpp @@ -804,7 +804,7 @@ void QskControl::itemChange( QQuickItem::ItemChange change, } case QQuickItem::ItemChildAddedChange: { - if ( autoLayoutChildren() && !qskIsTransparentForPositioner( value.item ) ) + if ( autoLayoutChildren() && qskIsAdjustableByLayout( value.item ) ) polish(); break; @@ -844,13 +844,7 @@ void QskControl::updateItemPolish() const auto children = childItems(); for ( auto child : children ) { - /* - We don't want to resize invisible children, but then - we would need to set up connections to know when a child - becomes visible. So we don't use qskIsVisibleToLayout here. - And what about using QskControl::LayoutOutWhenHidden ? - */ - if ( !qskIsTransparentForPositioner( child ) ) + if ( qskIsAdjustableByLayout( child ) ) { const auto r = qskConstrainedItemRect( child, rect ); qskSetItemGeometry( child, r ); diff --git a/src/controls/QskQuick.cpp b/src/controls/QskQuick.cpp index b44eef1b..3522c49d 100644 --- a/src/controls/QskQuick.cpp +++ b/src/controls/QskQuick.cpp @@ -133,14 +133,27 @@ bool qskIsTransparentForPositioner( const QQuickItem* item ) bool qskIsVisibleToLayout( const QQuickItem* item ) { - if ( item ) + if ( item == nullptr ) + return false; + + const auto d = QQuickItemPrivate::get( item ); + return !d->isTransparentForPositioner() + && ( d->explicitVisible || qskRetainSizeWhenHidden( item ) ); +} + +bool qskIsAdjustableByLayout( const QQuickItem* item ) +{ + if ( qskIsTransparentForPositioner( item ) ) + return false; + + bool adjustable = qskIsVisibleToParent( item ); + if ( !adjustable ) { - const auto d = QQuickItemPrivate::get( item ); - return !d->isTransparentForPositioner() - && ( d->explicitVisible || qskRetainSizeWhenHidden( item ) ); + if ( auto control = qskControlCast( item ) ) + adjustable = control->testLayoutHint( QskControl::LayoutWhenHidden ); } - return false; + return adjustable; } QskSizePolicy qskSizePolicy( const QQuickItem* item ) diff --git a/src/controls/QskQuick.h b/src/controls/QskQuick.h index bf35eb93..2883a798 100644 --- a/src/controls/QskQuick.h +++ b/src/controls/QskQuick.h @@ -32,7 +32,9 @@ QSK_EXPORT bool qskIsPolishScheduled( const QQuickItem* ); QSK_EXPORT void qskSetTransparentForPositioner( QQuickItem*, bool ); QSK_EXPORT bool qskIsTransparentForPositioner( const QQuickItem* ); + QSK_EXPORT bool qskIsVisibleToLayout( const QQuickItem* ); +QSK_EXPORT bool qskIsAdjustableByLayout( const QQuickItem* ); QSK_EXPORT QSizeF qskEffectiveSizeHint( const QQuickItem*, Qt::SizeHint, const QSizeF& constraint = QSizeF() ); diff --git a/src/controls/QskSubWindow.cpp b/src/controls/QskSubWindow.cpp index b6acca87..4a4c72a2 100644 --- a/src/controls/QskSubWindow.cpp +++ b/src/controls/QskSubWindow.cpp @@ -248,7 +248,7 @@ void QskSubWindow::itemChange( QQuickItem::ItemChange change, case QQuickItem::ItemChildAddedChange: case QQuickItem::ItemChildRemovedChange: { - if ( !qskIsTransparentForPositioner( value.item ) ) + if ( qskIsVisibleToLayout( value.item ) ) { resetImplicitSize(); polish(); diff --git a/src/controls/QskWindow.cpp b/src/controls/QskWindow.cpp index 7061dbb9..a49f5c48 100644 --- a/src/controls/QskWindow.cpp +++ b/src/controls/QskWindow.cpp @@ -489,7 +489,7 @@ QSize QskWindow::sizeConstraint() const const auto children = contentItem()->childItems(); for ( auto child : children ) { - if ( !qskIsTransparentForPositioner( child ) ) + if ( qskIsVisibleToLayout( child ) ) { const auto size = qskSizeConstraint( child, Qt::PreferredSize ); @@ -527,7 +527,7 @@ void QskWindow::layoutItems() const auto children = contentItem()->childItems(); for ( auto child : children ) { - if ( !qskIsTransparentForPositioner( child ) ) + if ( qskIsAdjustableByLayout( child ) ) { const auto r = qskConstrainedItemRect( child, rect ); qskSetItemGeometry( child, r );