effectiveSizeHint added

This commit is contained in:
Uwe Rathmann 2019-07-17 17:52:15 +02:00
parent 86fa9f9479
commit fae80c3107
2 changed files with 68 additions and 17 deletions

View File

@ -1349,7 +1349,8 @@ void QskControl::setExplicitSizeHint( Qt::SizeHint whichHint, const QSizeF& size
} }
} }
void QskControl::setExplicitSizeHint( Qt::SizeHint whichHint, qreal width, qreal height ) void QskControl::setExplicitSizeHint(
Qt::SizeHint whichHint, qreal width, qreal height )
{ {
setExplicitSizeHint( whichHint, QSizeF( width, height ) ); setExplicitSizeHint( whichHint, QSizeF( width, height ) );
} }
@ -1362,28 +1363,76 @@ QSizeF QskControl::explicitSizeHint( Qt::SizeHint whichHint ) const
return QSizeF( -1, -1 ); return QSizeF( -1, -1 );
} }
QSizeF QskControl::effectiveSizeHint( Qt::SizeHint whichHint ) const QSizeF QskControl::implicitSizeHint(
Qt::SizeHint whichHint, const QSizeF& constraint ) const
{
if ( whichHint < Qt::MinimumSize || whichHint > Qt::MaximumSize )
return QSizeF( -1, -1 );
if ( constraint.isValid() )
{
// having constraints in both directions does not make sense
return constraint;
}
QSizeF hint( -1, -1 );
if ( whichHint == Qt::PreferredSize )
{
if ( constraint.width() >= 0 )
{
hint.setWidth( constraint.width() );
hint.setHeight( heightForWidth( constraint.width() ) );
}
else if ( constraint.height() >= 0 )
{
hint.setWidth( widthForHeight( constraint.height() ) );
hint.setHeight( constraint.height() );
}
else
{
hint = implicitSize();
}
}
else
{
// TODO ...
}
return hint;
}
QSizeF QskControl::effectiveSizeHint(
Qt::SizeHint whichHint, const QSizeF& constraint ) const
{ {
if ( whichHint < Qt::MinimumSize || whichHint > Qt::MaximumSize ) if ( whichHint < Qt::MinimumSize || whichHint > Qt::MaximumSize )
return QSizeF( 0, 0 ); return QSizeF( 0, 0 );
d_func()->blockLayoutRequestEvents = false; d_func()->blockLayoutRequestEvents = false;
QSizeF size = explicitSizeHint( whichHint ); QSizeF hint;
if ( whichHint == Qt::PreferredSize && !size.isValid() ) if ( ( constraint.width() < 0 ) && ( constraint.height() < 0 ) )
{ {
// in most cases we don't have a preferred width/height hint = explicitSizeHint( whichHint );
// and fall back to the implicit size.
if ( size.width() < 0 ) if ( !hint.isValid() )
size.setWidth( implicitWidth() ); {
const auto implicit = implicitSizeHint( whichHint, constraint );
if ( size.height() < 0 ) if ( hint.width() < 0 )
size.setHeight( implicitHeight() ); hint.setWidth( implicit.width() );
if ( hint.height() < 0 )
hint.setHeight( implicit.height() );
}
}
else
{
hint = implicitSizeHint( whichHint, constraint );
} }
return size; return hint;
} }
void QskControl::resetImplicitSize() void QskControl::resetImplicitSize()
@ -1848,8 +1897,8 @@ void QskControl::layoutConstraintChanged()
qskSendEventTo( item, QEvent::LayoutRequest ); qskSendEventTo( item, QEvent::LayoutRequest );
/* /*
We don't send further LayoutRequest events until someone has requested We don't send further LayoutRequest events until someone
a layout relevant information actively requests a layout relevant information
*/ */
d->blockLayoutRequestEvents = true; d->blockLayoutRequestEvents = true;
} }

View File

@ -184,9 +184,11 @@ class QSK_EXPORT QskControl : public QQuickItem, public QskSkinnable
QSizeF preferredSize() const; QSizeF preferredSize() const;
QSizeF explicitSizeHint( Qt::SizeHint ) const; QSizeF explicitSizeHint( Qt::SizeHint ) const;
QSizeF implicitSizeHint( Qt::SizeHint, const QSizeF& constraint ) const;
QSizeF sizeHint() const; QSizeF sizeHint() const;
QSizeF effectiveSizeHint( Qt::SizeHint ) const; QSizeF effectiveSizeHint( Qt::SizeHint,
const QSizeF& constraint = QSizeF( -1.0, -1.0 ) ) const;
virtual qreal heightForWidth( qreal width ) const; virtual qreal heightForWidth( qreal width ) const;
virtual qreal widthForHeight( qreal height ) const; virtual qreal widthForHeight( qreal height ) const;
@ -311,17 +313,17 @@ inline QSizeF QskControl::sizeHint() const
inline QSizeF QskControl::minimumSize() const inline QSizeF QskControl::minimumSize() const
{ {
return explicitSizeHint( Qt::MinimumSize ); return effectiveSizeHint( Qt::MinimumSize );
} }
inline QSizeF QskControl::maximumSize() const inline QSizeF QskControl::maximumSize() const
{ {
return explicitSizeHint( Qt::MaximumSize ); return effectiveSizeHint( Qt::MaximumSize );
} }
inline QSizeF QskControl::preferredSize() const inline QSizeF QskControl::preferredSize() const
{ {
return explicitSizeHint( Qt::PreferredSize ); return effectiveSizeHint( Qt::PreferredSize );
} }
inline QskControl* qskControlCast( QObject* object ) inline QskControl* qskControlCast( QObject* object )