QskBorderMetrics::toAbsolute ( = resolving Qt::RelativeSize metrics )

added
This commit is contained in:
Uwe Rathmann 2017-09-01 15:49:00 +02:00
parent 8d80b6acc1
commit b03ee5b11d
2 changed files with 56 additions and 0 deletions

View File

@ -20,6 +20,14 @@ static inline QSizeF qskInterpolatedSize(
return from + ( to - from ) * ratio;
}
static inline qreal qskAbsoluted( qreal length, qreal percentage )
{
// 100% means -> 0.5 of length
percentage = qBound( 0.0, percentage, 100.0 );
return percentage / 100.0 * 0.5 * length;
}
QskBorderMetrics::QskBorderMetrics( qreal width, qreal radiusX, qreal radiusY ):
m_widths( ( width >= 0.0 ) ? width : 0.0 ),
m_widthIsRelative( false ),
@ -98,6 +106,52 @@ void QskBorderMetrics::setRadius( Qt::Corner corner, qreal radiusX, qreal radius
}
}
QskBorderMetrics QskBorderMetrics::toAbsolute( const QSizeF& size ) const
{
if ( !( m_radiusIsRelative || m_widthIsRelative ) )
return *this;
QskBorderMetrics absoluted = *this;
if ( m_radiusIsRelative )
{
if ( size.isEmpty() )
{
for ( int i = 0; i < 4; i++ )
absoluted.m_radii[ i ] = QSizeF( 0.0, 0.0 );
}
else
{
for ( int i = 0; i < 4; i++ )
{
auto& radii = absoluted.m_radii[ i ];
radii.setWidth( qskAbsoluted( size.width(), radii.width() ) );
radii.setHeight( qskAbsoluted( size.height(), radii.height() ) );
}
}
}
if ( m_widthIsRelative )
{
auto& w = absoluted.m_widths;
if ( size.isEmpty() )
{
w = QskMargins();
}
else
{
w.setLeft( qskAbsoluted( size.width(), w.left() ) );
w.setTop( qskAbsoluted( size.height(), w.top() ) );
w.setRight( qskAbsoluted( size.width(), w.right() ) );
w.setBottom( qskAbsoluted( size.height(), w.bottom() ) );
}
}
return absoluted;
}
QskBorderMetrics QskBorderMetrics::interpolated(
const QskBorderMetrics& to, qreal ratio ) const
{

View File

@ -64,6 +64,7 @@ public:
Qt::SizeMode widthSizeMode() const;
QskBorderMetrics interpolated( const QskBorderMetrics&, qreal value ) const;
QskBorderMetrics toAbsolute ( const QSizeF& ) const;
static QVariant interpolate( const QskBorderMetrics&,
const QskBorderMetrics&, qreal progress );
@ -86,6 +87,7 @@ private:
};
inline QskBorderMetrics::QskBorderMetrics():
m_radii( { { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 } } ),
m_widthIsRelative( false ),
m_radiusIsRelative( false )
{