diff --git a/examples/layouts/StackLayoutPage.cpp b/examples/layouts/StackLayoutPage.cpp index 6627e096..0a62ef52 100644 --- a/examples/layouts/StackLayoutPage.cpp +++ b/examples/layouts/StackLayoutPage.cpp @@ -9,15 +9,20 @@ #include #include +#include #include #include #include #include +#include + namespace { class StackBox : public QskStackBox { + Q_OBJECT + public: StackBox( QQuickItem* parent = nullptr ) : QskStackBox( parent ) @@ -27,8 +32,6 @@ namespace setBackgroundColor( Qt::white ); setDefaultAlignment( Qt::AlignCenter ); - setMargins( 30 ); - addRectangle( "Gold" ); addRectangle( "SeaGreen" ); addRectangle( "SlateBlue" ); @@ -41,7 +44,6 @@ namespace } } - public: void incrementFading( int offset ) { auto animator = dynamic_cast< QskStackBoxAnimator3* >( this->animator() ); @@ -55,6 +57,8 @@ namespace setAnimator( animator ); setCurrentIndex( incrementedIndex( offset ) ); + + Q_EMIT transitionStarted( animator->duration() ); } void incrementScrolling( Qt::Orientation orientation, int offset ) @@ -71,8 +75,13 @@ namespace setAnimator( animator ); setCurrentIndex( incrementedIndex( offset ) ); + + Q_EMIT transitionStarted( animator->duration() ); } + Q_SIGNALS: + void transitionStarted( int ms ); + private: void addRectangle( const char* colorName ) { @@ -94,6 +103,55 @@ namespace return newIndex; } }; + + class ProgressBar : public QskProgressBar + { + public: + ProgressBar( QQuickItem* parent = nullptr ) + : QskProgressBar( parent ) + { + setValue( 0.0 ); + setMaximumWidth( 200 ); + } + + void startProgressing( int ms ) + { + reset(); + + if ( ms > 0 ) + { + m_duration = ms; + m_elapsed.start(); + m_timerId = startTimer( 5 ); + } + } + + protected: + + void timerEvent( QTimerEvent* ) override + { + if ( m_elapsed.elapsed() >= m_duration ) + reset(); + else + setValue( m_elapsed.elapsed() / m_duration * 100.0 ); + } + + private: + void reset() + { + if ( m_timerId ) + { + killTimer( m_timerId ); + m_timerId = 0; + } + setValue( 0.0 ); + m_duration = 0.0; + } + + int m_timerId = 0; + qreal m_duration = 0.0; + QElapsedTimer m_elapsed; + }; } StackLayoutPage::StackLayoutPage( QQuickItem* parent ) @@ -104,9 +162,9 @@ StackLayoutPage::StackLayoutPage( QQuickItem* parent ) setMargins( 10 ); setBackgroundColor( QskRgbValue::LightSteelBlue ); - auto* box = new StackBox(); + auto box = new StackBox(); - auto* buttonBox = new ButtonBox(); + auto buttonBox = new ButtonBox(); buttonBox->setLayoutAlignmentHint( Qt::AlignTop | Qt::AlignLeft ); buttonBox->addButton( "<<", [ box ]() { box->incrementScrolling( Qt::Horizontal, +1 ); } ); @@ -115,15 +173,28 @@ StackLayoutPage::StackLayoutPage( QQuickItem* parent ) buttonBox->addButton( "v", [ box ]() { box->incrementScrolling( Qt::Vertical, +1 ); } ); buttonBox->addButton( "Fading", [ box ]() { box->incrementFading( +1 ); } ); + // page indicator + auto pageIndicator = new QskPageIndicator(); pageIndicator->setCount( box->itemCount() ); pageIndicator->setCurrentIndex( box->currentIndex() ); pageIndicator->setLayoutAlignmentHint( Qt::AlignCenter ); + // progress bar + auto progressBar = new ProgressBar(); + progressBar->setMargins( QMarginsF( 0, 0, 10, 0 ) ); + + addItem( buttonBox ); addItem( pageIndicator ); addItem( box ); + addItem( progressBar, Qt::AlignRight ); connect( box, &QskStackBox::currentIndexChanged, pageIndicator, &QskPageIndicator::setCurrentIndex ); + + connect( box, &StackBox::transitionStarted, + progressBar, &ProgressBar::startProgressing ); } + +#include "StackLayoutPage.moc"