diff --git a/src/layouts/QskLayoutConstraint.cpp b/src/layouts/QskLayoutConstraint.cpp index dfe023b8..578c9431 100644 --- a/src/layouts/QskLayoutConstraint.cpp +++ b/src/layouts/QskLayoutConstraint.cpp @@ -6,6 +6,7 @@ #include "QskLayoutConstraint.h" #include "QskControl.h" #include "QskSizePolicy.h" +#include "QskFunctions.h" #include @@ -58,6 +59,42 @@ static inline qreal qskAdjustedValue( return value; } +static inline QSizeF qskExpandedSize( const QQuickItem* item, const QSizeF& constraint ) +{ + using namespace QskLayoutConstraint; + + const auto policy = sizePolicy( item ); + + QSizeF size = constraint; + + const bool vGrow = ( policy.policy( Qt::Vertical ) & QskSizePolicy::GrowFlag ); + const bool hGrow = ( policy.policy( Qt::Horizontal ) & QskSizePolicy::GrowFlag ); + + if ( !vGrow || !hGrow ) + { + const auto hint = sizeHint( item, Qt::PreferredSize, constraint ); + + if ( !vGrow ) + size.setHeight( hint.height() ); + + if ( !hGrow ) + size.setWidth( hint.width() ); + } + + if ( !size.isValid() ) + { + const auto hint = sizeHint( item, Qt::MaximumSize, size ); + + if ( size.width() == -1 ) + size.setWidth( hint.width() ); + + if ( size.height() == -1 ) + size.setHeight( hint.height() ); + } + + return size; +} + QskLayoutConstraint::Type QskLayoutConstraint::constraintType( const QQuickItem* item ) { Type constraintType = Unconstrained; @@ -267,7 +304,8 @@ QSizeF QskLayoutConstraint::boundedSize( const QQuickItem* item, const QSizeF& s return QSizeF( width, height ); } -QSizeF QskLayoutConstraint::adjustedSize( const QQuickItem* item, const QSizeF& targetSize ) +QSizeF QskLayoutConstraint::adjustedSize( + const QQuickItem* item, const QSizeF& targetSize ) { const auto policy = sizePolicy( item ); @@ -375,3 +413,34 @@ QSizeF QskLayoutConstraint::sizeHint( const QQuickItem* item, return hint; } + +QRectF QskLayoutConstraint::itemRect( const QQuickItem* item, + const QRectF& rect, Qt::Alignment alignment ) +{ + QSizeF size = qskExpandedSize( item, QSizeF( -1, -1 ) ); + + switch( constraintType( item ) ) + { + case HeightForWidth: + { + if ( size.width() > rect.width() ) + size = qskExpandedSize( item, QSizeF( rect.width(), -1 ) ); + + break; + } + case WidthForHeight: + { + if ( size.height() > rect.height() ) + size = qskExpandedSize( item, QSizeF( -1, rect.height() ) ); + + break; + } + default: + break; + } + + size = size.boundedTo( rect.size() ); + + return qskAlignedRectF( rect, size.width(), size.height(), alignment ); +} + diff --git a/src/layouts/QskLayoutConstraint.h b/src/layouts/QskLayoutConstraint.h index 13f3ce97..48d28d7b 100644 --- a/src/layouts/QskLayoutConstraint.h +++ b/src/layouts/QskLayoutConstraint.h @@ -15,6 +15,7 @@ class QskSizePolicy; class QskControl; class QQuickItem; class QSizeF; +class QRectF; namespace std { template< typename T > class function; } @@ -44,12 +45,14 @@ namespace QskLayoutConstraint // bounded by Qt::MinimumSize/Qt::MaximumSize QSK_EXPORT QSizeF boundedSize( const QQuickItem*, const QSizeF& ); - QSK_EXPORT QSizeF adjustedSize( const QQuickItem*, const QSizeF& ); QSK_EXPORT QSizeF sizeHint( const QQuickItem*, Qt::SizeHint, const QSizeF& constraint ); + QSK_EXPORT QRectF itemRect( + const QQuickItem*, const QRectF&, Qt::Alignment ); + // QGridLayoutEngine internally uses FLT_MAX const qreal unlimited = std::numeric_limits< float >::max(); }