qskConstrainedItemSize fixed

This commit is contained in:
Uwe Rathmann 2019-09-20 10:23:48 +02:00
parent e49228381e
commit 77c9809574
1 changed files with 26 additions and 11 deletions

View File

@ -429,14 +429,14 @@ static QSizeF qskBoundedConstraint( const QQuickItem* item,
if ( hintMax.width() >= 0.0 ) if ( hintMax.width() >= 0.0 )
size.rwidth() = qMin( constraint.width(), hintMax.width() ); size.rwidth() = qMin( constraint.width(), hintMax.width() );
size.rwidth() = qMax( constraint.width(), hintMin.width() ); size.rwidth() = qMax( size.width(), hintMin.width() );
} }
else else
{ {
if ( hintMax.height() >= 0.0 ) if ( hintMax.height() >= 0.0 )
size.rheight() = qMin( constraint.height(), hintMax.height() ); size.rheight() = qMin( constraint.height(), hintMax.height() );
size.rheight() = qMax( constraint.height(), hintMin.height() ); size.rheight() = qMax( size.height(), hintMin.height() );
} }
return size; return size;
@ -561,27 +561,44 @@ QSizeF qskSizeConstraint( const QQuickItem* item,
QSizeF qskConstrainedItemSize( const QQuickItem* item, const QSizeF& size ) 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 ); 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: 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; break;
} }
case QskSizePolicy::HeightForWidth: 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; 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 width = size.width();
qreal height = size.height(); qreal height = size.height();
@ -591,8 +608,6 @@ QSizeF qskConstrainedItemSize( const QQuickItem* item, const QSizeF& size )
if ( max.height() >= 0.0 ) if ( max.height() >= 0.0 )
height = qMin( height, max.height() ); height = qMin( height, max.height() );
const auto min = qskSizeConstraint( item, Qt::MinimumSize, constraint );
width = qMax( width, min.width() ); width = qMax( width, min.width() );
height = qMax( height, min.height() ); height = qMax( height, min.height() );