From 77c98095746c9bb476b416abeee63901b8204567 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 20 Sep 2019 10:23:48 +0200 Subject: [PATCH] qskConstrainedItemSize fixed --- src/controls/QskQuick.cpp | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/controls/QskQuick.cpp b/src/controls/QskQuick.cpp index db669460..f85b8d2e 100644 --- a/src/controls/QskQuick.cpp +++ b/src/controls/QskQuick.cpp @@ -429,14 +429,14 @@ static QSizeF qskBoundedConstraint( const QQuickItem* item, if ( hintMax.width() >= 0.0 ) size.rwidth() = qMin( constraint.width(), hintMax.width() ); - size.rwidth() = qMax( constraint.width(), hintMin.width() ); + size.rwidth() = qMax( size.width(), hintMin.width() ); } else { if ( hintMax.height() >= 0.0 ) size.rheight() = qMin( constraint.height(), hintMax.height() ); - size.rheight() = qMax( constraint.height(), hintMin.height() ); + size.rheight() = qMax( size.height(), hintMin.height() ); } return size; @@ -561,27 +561,44 @@ QSizeF qskSizeConstraint( const QQuickItem* item, QSizeF qskConstrainedItemSize( const QQuickItem* item, const QSizeF& size ) { - if ( size.width() <= 0.0 && size.height() <= 0.0 ) + if ( item == nullptr || ( size.width() <= 0.0 && size.height() <= 0.0 ) ) return QSizeF( 0.0, 0.0 ); - QSizeF constraint; + QSizeF min, max; - switch( static_cast< int >( qskSizePolicy( item ).constraintType() ) ) + const auto policy = qskSizePolicy( item ); + + switch( policy.constraintType() ) { case QskSizePolicy::WidthForHeight: { - constraint.setHeight( size.height() ); + const auto constraint = qskBoundedConstraint( item, + QSizeF( -1.0, size.height() ), policy ); + + min = qskSizeConstraint( item, Qt::MinimumSize, constraint ); + max = qskSizeConstraint( item, Qt::MaximumSize, constraint ); + + min.rheight() = max.rheight() = constraint.height(); break; } case QskSizePolicy::HeightForWidth: { - constraint.setWidth( size.width() ); + const auto constraint = qskBoundedConstraint( item, + QSizeF( size.width(), -1.0 ), policy ); + + min = qskSizeConstraint( item, Qt::MinimumSize, constraint ); + max = qskSizeConstraint( item, Qt::MaximumSize, constraint ); + + min.rwidth() = max.rwidth() = constraint.width(); break; } + default: + { + min = qskSizeConstraint( item, Qt::MinimumSize, QSizeF() ); + max = qskSizeConstraint( item, Qt::MaximumSize, QSizeF() ); + } } - const auto max = qskSizeConstraint( item, Qt::MaximumSize, constraint ); - qreal width = size.width(); qreal height = size.height(); @@ -591,8 +608,6 @@ QSizeF qskConstrainedItemSize( const QQuickItem* item, const QSizeF& size ) if ( max.height() >= 0.0 ) height = qMin( height, max.height() ); - const auto min = qskSizeConstraint( item, Qt::MinimumSize, constraint ); - width = qMax( width, min.width() ); height = qMax( height, min.height() );