From 8ab578ff199206a6839743d53bf23a30dabc26da Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 4 Jan 2022 13:50:40 +0100 Subject: [PATCH] QskStackBox::transientindex introduced --- src/layouts/QskStackBox.cpp | 11 ++++++ src/layouts/QskStackBox.h | 6 ++++ src/layouts/QskStackBoxAnimator.cpp | 54 +++++++++++++++++++++++++++-- src/layouts/QskStackBoxAnimator.h | 11 ++++-- 4 files changed, 77 insertions(+), 5 deletions(-) diff --git a/src/layouts/QskStackBox.cpp b/src/layouts/QskStackBox.cpp index c4fdbee9..e2054d1e 100644 --- a/src/layouts/QskStackBox.cpp +++ b/src/layouts/QskStackBox.cpp @@ -168,6 +168,17 @@ void QskStackBox::setCurrentIndex( int index ) Q_EMIT currentIndexChanged( m_data->currentIndex ); } +qreal QskStackBox::transientIndex() const +{ + if ( auto animator = m_data->animator ) + { + if ( animator->isRunning() ) + return animator->transientIndex(); + } + + return currentIndex(); +} + void QskStackBox::setCurrentItem( const QQuickItem* item ) { setCurrentIndex( indexOf( item ) ); diff --git a/src/layouts/QskStackBox.h b/src/layouts/QskStackBox.h index c6cc5cc9..40704c8f 100644 --- a/src/layouts/QskStackBox.h +++ b/src/layouts/QskStackBox.h @@ -17,6 +17,9 @@ class QSK_EXPORT QskStackBox : public QskIndexedLayoutBox Q_PROPERTY( int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged ) + Q_PROPERTY( qreal transientIndex READ transientIndex + NOTIFY transientIndexChanged ) + Q_PROPERTY( QQuickItem* currentItem READ currentItem WRITE setCurrentItem NOTIFY currentItemChanged ) @@ -46,6 +49,8 @@ class QSK_EXPORT QskStackBox : public QskIndexedLayoutBox QQuickItem* currentItem() const; int currentIndex() const; + qreal transientIndex() const; + void setDefaultAlignment( Qt::Alignment ); Qt::Alignment defaultAlignment() const; @@ -67,6 +72,7 @@ class QSK_EXPORT QskStackBox : public QskIndexedLayoutBox Q_SIGNALS: void currentIndexChanged( int index ); + void transientIndexChanged( qreal index ); void currentItemChanged( QQuickItem* ); protected: diff --git a/src/layouts/QskStackBoxAnimator.cpp b/src/layouts/QskStackBoxAnimator.cpp index 235eada5..979b690d 100644 --- a/src/layouts/QskStackBoxAnimator.cpp +++ b/src/layouts/QskStackBoxAnimator.cpp @@ -7,6 +7,7 @@ #include "QskStackBox.h" #include "QskEvent.h" #include "QskQuick.h" +#include "QskFunctions.h" static Qsk::Direction qskDirection( Qt::Orientation orientation, int from, int to, int itemCount ) @@ -68,7 +69,7 @@ QskStackBoxAnimator::~QskStackBoxAnimator() void QskStackBoxAnimator::setStartIndex( int index ) { - m_startIndex = index; + m_transientIndex = m_startIndex = index; } void QskStackBoxAnimator::setEndIndex( int index ) @@ -97,6 +98,53 @@ QQuickItem* QskStackBoxAnimator::itemAt( int index ) const ( index == 0 ) ? m_startIndex : m_endIndex ); } +qreal QskStackBoxAnimator::transientIndex() const +{ + return m_transientIndex; +} + +void QskStackBoxAnimator::advance( qreal progress ) +{ + qreal transientIndex; + + if ( qFuzzyIsNull( progress ) ) + { + transientIndex = m_startIndex; + } + else if ( qFuzzyCompare( progress, 1.0 ) ) + { + transientIndex = m_endIndex; + } + else + { + const auto box = stackBox(); + + auto startIndex = m_startIndex; + auto endIndex = m_endIndex; + + if ( startIndex == 0 ) + { + if ( endIndex == box->itemCount() - 1 ) + startIndex += box->itemCount(); + } + else if ( startIndex == box->itemCount() - 1 ) + { + if ( endIndex == 0 ) + endIndex += box->itemCount(); + } + + transientIndex = startIndex + ( endIndex - startIndex ) * progress; + } + + if ( !qskFuzzyCompare( m_transientIndex, transientIndex ) ) + { + m_transientIndex = transientIndex; + advanceIndex( progress ); + + Q_EMIT stackBox()->transientIndexChanged( m_transientIndex ); + } +} + QskStackBoxAnimator1::QskStackBoxAnimator1( QskStackBox* parent ) : QskStackBoxAnimator( parent ) , m_orientation( Qt::Horizontal ) @@ -141,7 +189,7 @@ void QskStackBoxAnimator1::setup() m_isDirty = true; } -void QskStackBoxAnimator1::advance( qreal value ) +void QskStackBoxAnimator1::advanceIndex( qreal value ) { auto stackBox = this->stackBox(); const bool isHorizontal = m_orientation == Qt::Horizontal; @@ -243,7 +291,7 @@ void QskStackBoxAnimator3::setup() } } -void QskStackBoxAnimator3::advance( qreal value ) +void QskStackBoxAnimator3::advanceIndex( qreal value ) { if ( auto item1 = itemAt( 0 ) ) item1->setOpacity( 1.0 - value ); diff --git a/src/layouts/QskStackBoxAnimator.h b/src/layouts/QskStackBoxAnimator.h index 286b3278..5538b55b 100644 --- a/src/layouts/QskStackBoxAnimator.h +++ b/src/layouts/QskStackBoxAnimator.h @@ -28,13 +28,20 @@ class QSK_EXPORT QskStackBoxAnimator : public QObject, public QskAnimator int startIndex() const; int endIndex() const; + qreal transientIndex() const; + protected: QskStackBox* stackBox() const; QQuickItem* itemAt( int index ) const; private: + void advance( qreal value ) override final; + virtual void advanceIndex( qreal value ) = 0; + int m_startIndex; int m_endIndex; + + qreal m_transientIndex; }; class QSK_EXPORT QskStackBoxAnimator1 : public QskStackBoxAnimator @@ -52,7 +59,7 @@ class QSK_EXPORT QskStackBoxAnimator1 : public QskStackBoxAnimator bool eventFilter( QObject*, QEvent* ) override; void setup() override; - void advance( qreal value ) override; + void advanceIndex( qreal value ) override; void done() override; private: @@ -74,7 +81,7 @@ class QSK_EXPORT QskStackBoxAnimator3 : public QskStackBoxAnimator protected: void setup() override; - void advance( qreal value ) override; + void advanceIndex( qreal value ) override; void done() override; };