hiding isTransparentForPositioner

This commit is contained in:
Uwe Rathmann 2022-04-07 17:19:59 +02:00
parent c17e3defd3
commit 741af6a8a6
5 changed files with 25 additions and 16 deletions

View File

@ -804,7 +804,7 @@ void QskControl::itemChange( QQuickItem::ItemChange change,
} }
case QQuickItem::ItemChildAddedChange: case QQuickItem::ItemChildAddedChange:
{ {
if ( autoLayoutChildren() && !qskIsTransparentForPositioner( value.item ) ) if ( autoLayoutChildren() && qskIsAdjustableByLayout( value.item ) )
polish(); polish();
break; break;
@ -844,13 +844,7 @@ void QskControl::updateItemPolish()
const auto children = childItems(); const auto children = childItems();
for ( auto child : children ) for ( auto child : children )
{ {
/* if ( qskIsAdjustableByLayout( child ) )
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 ) )
{ {
const auto r = qskConstrainedItemRect( child, rect ); const auto r = qskConstrainedItemRect( child, rect );
qskSetItemGeometry( child, r ); qskSetItemGeometry( child, r );

View File

@ -133,14 +133,27 @@ bool qskIsTransparentForPositioner( const QQuickItem* item )
bool qskIsVisibleToLayout( 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 ); if ( auto control = qskControlCast( item ) )
return !d->isTransparentForPositioner() adjustable = control->testLayoutHint( QskControl::LayoutWhenHidden );
&& ( d->explicitVisible || qskRetainSizeWhenHidden( item ) );
} }
return false; return adjustable;
} }
QskSizePolicy qskSizePolicy( const QQuickItem* item ) QskSizePolicy qskSizePolicy( const QQuickItem* item )

View File

@ -32,7 +32,9 @@ QSK_EXPORT bool qskIsPolishScheduled( const QQuickItem* );
QSK_EXPORT void qskSetTransparentForPositioner( QQuickItem*, bool ); QSK_EXPORT void qskSetTransparentForPositioner( QQuickItem*, bool );
QSK_EXPORT bool qskIsTransparentForPositioner( const QQuickItem* ); QSK_EXPORT bool qskIsTransparentForPositioner( const QQuickItem* );
QSK_EXPORT bool qskIsVisibleToLayout( const QQuickItem* ); QSK_EXPORT bool qskIsVisibleToLayout( const QQuickItem* );
QSK_EXPORT bool qskIsAdjustableByLayout( const QQuickItem* );
QSK_EXPORT QSizeF qskEffectiveSizeHint( const QQuickItem*, QSK_EXPORT QSizeF qskEffectiveSizeHint( const QQuickItem*,
Qt::SizeHint, const QSizeF& constraint = QSizeF() ); Qt::SizeHint, const QSizeF& constraint = QSizeF() );

View File

@ -248,7 +248,7 @@ void QskSubWindow::itemChange( QQuickItem::ItemChange change,
case QQuickItem::ItemChildAddedChange: case QQuickItem::ItemChildAddedChange:
case QQuickItem::ItemChildRemovedChange: case QQuickItem::ItemChildRemovedChange:
{ {
if ( !qskIsTransparentForPositioner( value.item ) ) if ( qskIsVisibleToLayout( value.item ) )
{ {
resetImplicitSize(); resetImplicitSize();
polish(); polish();

View File

@ -489,7 +489,7 @@ QSize QskWindow::sizeConstraint() const
const auto children = contentItem()->childItems(); const auto children = contentItem()->childItems();
for ( auto child : children ) for ( auto child : children )
{ {
if ( !qskIsTransparentForPositioner( child ) ) if ( qskIsVisibleToLayout( child ) )
{ {
const auto size = qskSizeConstraint( child, Qt::PreferredSize ); const auto size = qskSizeConstraint( child, Qt::PreferredSize );
@ -527,7 +527,7 @@ void QskWindow::layoutItems()
const auto children = contentItem()->childItems(); const auto children = contentItem()->childItems();
for ( auto child : children ) for ( auto child : children )
{ {
if ( !qskIsTransparentForPositioner( child ) ) if ( qskIsAdjustableByLayout( child ) )
{ {
const auto r = qskConstrainedItemRect( child, rect ); const auto r = qskConstrainedItemRect( child, rect );
qskSetItemGeometry( child, r ); qskSetItemGeometry( child, r );