code simplified

This commit is contained in:
Uwe Rathmann 2022-09-20 08:43:39 +02:00
parent 3a0796e085
commit 36e84e53b6
1 changed files with 41 additions and 37 deletions

View File

@ -565,75 +565,79 @@ void QskStackBoxAnimator4::setup()
void QskStackBoxAnimator4::advanceIndex( qreal value ) void QskStackBoxAnimator4::advanceIndex( qreal value )
{ {
if ( auto item = itemAt( 0 ) ) auto item1 = itemAt( 1 );
{ auto item2 = itemAt( 0 );
const auto transform = transformation( item, false, value );
auto rotation = qskFindTransform< QuickTransform >( item ); if ( isInverted() )
std::swap( item1, item2 );
const qreal posEdge = isInverted() ? value : 1.0 - value;
if ( item1 )
{
const auto transform = transformation( item1, false, posEdge );
auto rotation = qskFindTransform< QuickTransform >( item1 );
rotation->setTransform( transform ); rotation->setTransform( transform );
} }
if ( auto item = itemAt( 1 ) ) if ( item2 )
{ {
const auto transform = transformation( item, true, value ); const auto transform = transformation( item2, true, posEdge );
auto rotation = qskFindTransform< QuickTransform >( item ); auto rotation = qskFindTransform< QuickTransform >( item2 );
rotation->setTransform( transform ); rotation->setTransform( transform );
} }
} }
QTransform QskStackBoxAnimator4::transformation( QTransform QskStackBoxAnimator4::transformation(
const QQuickItem* item, bool increasing, qreal value ) const const QQuickItem* item, bool first, qreal posEdge ) const
{ {
const qreal v = increasing ? value : 1.0 - value; /*
first: left or top item
posEdge: position of the edge in the range of [0-1]
( left->right, top->bottom ).
*/
qreal radians = M_PI_2 * ( 1.0 - v ); const qreal radians = M_PI_2 * ( 1.0 - posEdge );
if ( increasing != isInverted() )
radians = -radians;
QTransform transform; QTransform transform;
if( orientation() == Qt::Horizontal ) if( orientation() == Qt::Horizontal )
{ {
qreal dx1, dx2; const qreal dx = posEdge * ( item->x() + item->width() );
const qreal dy = 0.5 * item->height();
if ( increasing == isInverted() ) if ( first )
{ {
dx1 = item->width() * v - item->x() * ( 1.0 - v ); transform.translate( -item->x() + dx, dy );
dx2 = -item->width(); transform.rotateRadians( radians, Qt::YAxis );
transform.translate( -item->width(), -dy );
} }
else else
{ {
dx1 = ( item->x() + item->width() ) * ( 1.0 - v ); transform.translate( dx, dy );
dx2 = 0.0; transform.rotateRadians( radians - M_PI_2, Qt::YAxis );
transform.translate( 0.0, -dy );
} }
const qreal h2 = 0.5 * item->height();
transform.translate( dx1, h2 );
transform.rotateRadians( radians, Qt::YAxis );
transform.translate( dx2, -h2 );
} }
else else
{ {
qreal dy1, dy2; const qreal dx = 0.5 * item->width();
const qreal dy = posEdge * ( item->y() + item->height() );
if ( increasing == isInverted() ) if ( first )
{ {
dy1 = item->height() * v - item->y() * ( 1.0 - v ); transform.translate( dx, -item->y() + dy );
dy2 = -item->height(); transform.rotateRadians( radians, Qt::XAxis );
transform.translate( -dx, -item->height() );
} }
else else
{ {
dy1 = ( item->y() + item->height() ) * ( 1.0 - v ); transform.translate( dx, dy );
dy2 = 0.0; transform.rotateRadians( radians - M_PI_2, Qt::XAxis );
transform.translate( -dx, 0.0 );
} }
const qreal w2 = 0.5 * item->width();
transform.translate( w2, dy1 );
transform.rotateRadians( radians, Qt::XAxis );
transform.translate( -w2, dy2 );
} }
return transform; return transform;