From 4cdd3f69562f7a3162157cf40b7606c4b526646b Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 28 Jan 2011 17:40:42 -0500 Subject: [PATCH] add some animation goodness --- .../dynamic/widgets/CollapsibleControls.cpp | 55 ++++++++++++++++++- .../dynamic/widgets/CollapsibleControls.h | 8 +++ .../dynamic/widgets/DynamicWidget.cpp | 2 +- 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/libtomahawk/playlist/dynamic/widgets/CollapsibleControls.cpp b/src/libtomahawk/playlist/dynamic/widgets/CollapsibleControls.cpp index 1bd5274b3..d4e4703cc 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/CollapsibleControls.cpp +++ b/src/libtomahawk/playlist/dynamic/widgets/CollapsibleControls.cpp @@ -26,6 +26,8 @@ #include #include #include +#include +#include using namespace Tomahawk; @@ -51,6 +53,14 @@ Tomahawk::CollapsibleControls::~CollapsibleControls() void CollapsibleControls::init() { + m_timeline = new QTimeLine( 300, this ); + m_timeline->setUpdateInterval( 8 ); + m_timeline->setEasingCurve( QEasingCurve::OutBack ); + m_animHeight = -1; + + connect( m_timeline, SIGNAL( frameChanged( int ) ), this, SLOT( onAnimationStep( int ) ) ); + connect( m_timeline, SIGNAL( finished() ), this, SLOT( onAnimationFinished() ) ); + m_layout = new QStackedLayout; setContentsMargins( 0, 0, 0, 0 ); m_layout->setContentsMargins( 0, 0, 0, 0 ); @@ -62,8 +72,8 @@ CollapsibleControls::init() m_summaryWidget = new QWidget( this ); // TODO replace - // m_summaryWidget->setMinimumHeight( 24 ); - // m_summaryWidget->setMaximumHeight( 24 ); + m_summaryWidget->setMinimumHeight( 24 ); + m_summaryWidget->setMaximumHeight( 24 ); m_summaryWidget->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); QHBoxLayout* summaryLayout = new QHBoxLayout; m_summaryWidget->setLayout( summaryLayout ); @@ -107,10 +117,49 @@ CollapsibleControls::setControls( const dynplaylist_ptr& playlist, bool isLocal void CollapsibleControls::toggleCollapse() { + qDebug() << "TOGGLING SIZEHINTS:" << m_controls->height() << m_summaryWidget->sizeHint(); + m_timeline->setFrameRange( m_summaryWidget->sizeHint().height(), m_controls->height() ); if( m_layout->currentWidget() == m_controls ) { m_summary->setText( m_dynplaylist->generator()->sentenceSummary() ); - m_layout->setCurrentWidget( m_summaryWidget ); + m_controls->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored ); + + m_timeline->setDirection( QTimeLine::Backward ); + m_timeline->start(); + } else { + m_summaryWidget->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored ); m_layout->setCurrentWidget( m_controls ); + + m_timeline->setDirection( QTimeLine::Forward ); + m_timeline->start(); + + } +} + +void +CollapsibleControls::onAnimationStep( int step ) +{ + resize( width(), step ); + m_animHeight = step; + setMaximumHeight( m_animHeight ); +} + +void +CollapsibleControls::onAnimationFinished() +{ + setMaximumHeight( m_animHeight ); + m_animHeight = -1; + + if( m_layout->currentWidget() == m_controls && m_timeline->direction() == QTimeLine::Backward ) { + m_layout->setCurrentWidget( m_summaryWidget ); + } +} + +QSize CollapsibleControls::sizeHint() const +{ + if( m_animHeight >= 0 ) { + return QSize( QWidget::sizeHint().width(), m_animHeight ); + } else { + return QWidget::sizeHint(); } } diff --git a/src/libtomahawk/playlist/dynamic/widgets/CollapsibleControls.h b/src/libtomahawk/playlist/dynamic/widgets/CollapsibleControls.h index a65736ac3..558ca058f 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/CollapsibleControls.h +++ b/src/libtomahawk/playlist/dynamic/widgets/CollapsibleControls.h @@ -21,6 +21,7 @@ #include +class QTimeLine; class QToolButton; class QLabel; class QStackedLayout; @@ -41,12 +42,15 @@ public: void setControls( const dynplaylist_ptr& playlist, bool isLocal ); QList< DynamicControlWrapper* > controls() const; + virtual QSize sizeHint() const; signals: void controlsChanged(); void controlChanged( const Tomahawk::dyncontrol_ptr& control ); private slots: void toggleCollapse(); + void onAnimationStep( int ); + void onAnimationFinished(); private: void init(); @@ -58,6 +62,10 @@ private: QWidget* m_summaryWidget; QLabel* m_summary; QToolButton* m_summaryExpand; + + // animations! + QTimeLine* m_timeline; + int m_animHeight; }; } diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp index 131c563cf..219501665 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp @@ -90,7 +90,7 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget m_view = new DynamicView( this ); m_view->setModel( m_model ); m_view->setContentsMargins( 0, 0, 0, 0 ); - m_layout->addWidget( m_view ); + m_layout->addWidget( m_view, 1 ); loadDynamicPlaylist( playlist );