From e5f6f40289ce496fa47c36c533f346904cd0ca58 Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Sun, 28 Aug 2011 04:16:18 -0400 Subject: [PATCH] Initial work on the sleeker slider --- src/audiocontrols.cpp | 40 ++++++++++++++++++++++---- src/audiocontrols.h | 4 +++ src/libtomahawk/widgets/SeekSlider.cpp | 24 ++++++++++++++++ src/libtomahawk/widgets/SeekSlider.h | 14 +++++++++ 4 files changed, 77 insertions(+), 5 deletions(-) diff --git a/src/audiocontrols.cpp b/src/audiocontrols.cpp index ca161106c..d9f9c2d9f 100644 --- a/src/audiocontrols.cpp +++ b/src/audiocontrols.cpp @@ -90,11 +90,16 @@ AudioControls::AudioControls( QWidget* parent ) ui->ownerLabel->setForegroundRole( QPalette::Dark ); ui->metaDataArea->setStyleSheet( "QWidget#metaDataArea {\nborder-width: 4px;\nborder-image: url(" RESPATH "images/now-playing-panel.png) 4 4 4 4 stretch stretch; }" ); - + ui->seekSlider->setEnabled( true ); ui->volumeSlider->setRange( 0, 100 ); ui->volumeSlider->setValue( AudioEngine::instance()->volume() ); + m_sliderTimeLine.setCurveShape( QTimeLine::LinearCurve ); + ui->seekSlider->setTimeLine( &m_sliderTimeLine ); + + connect( &m_sliderTimeLine, SIGNAL( frameChanged( int ) ), ui->seekSlider, SLOT( setValue( int ) ) ); + connect( ui->seekSlider, SIGNAL( valueChanged( int ) ), AudioEngine::instance(), SLOT( seek( int ) ) ); connect( ui->volumeSlider, SIGNAL( valueChanged( int ) ), AudioEngine::instance(), SLOT( setVolume( int ) ) ); connect( ui->prevButton, SIGNAL( clicked() ), AudioEngine::instance(), SLOT( previous() ) ); @@ -179,7 +184,7 @@ AudioControls::onVolumeChanged( int volume ) void AudioControls::onPlaybackStarted( const Tomahawk::result_ptr& result ) { - tDebug( LOGEXTRA ) << Q_FUNC_INFO; + tDebug() << Q_FUNC_INFO; onPlaybackLoading( result ); @@ -242,7 +247,7 @@ AudioControls::infoSystemFinished( QString target ) void AudioControls::onPlaybackLoading( const Tomahawk::result_ptr& result ) { - tDebug( LOGEXTRA ) << Q_FUNC_INFO; + tDebug() << Q_FUNC_INFO; m_currentTrack = result; @@ -254,8 +259,16 @@ AudioControls::onPlaybackLoading( const Tomahawk::result_ptr& result ) ui->timeLabel->setText( TomahawkUtils::timeToString( 0 ) ); ui->timeLeftLabel->setText( "-" + TomahawkUtils::timeToString( result->duration() ) ); - ui->seekSlider->setRange( 0, m_currentTrack->duration() * 1000 ); + ui->seekSlider->setRange( 0, result->duration() * 1000 ); ui->seekSlider->setValue( 0 ); + + tLog() << Q_FUNC_INFO << " setting sliderTimeLine duration to " << (result->duration() * 1000); + tLog() << Q_FUNC_INFO << " setting sliderTimeLine frames to " << (result->duration() * 1000); + + m_sliderTimeLine.setDuration( result->duration() * 1000 ); + m_sliderTimeLine.setFrameRange( 0, result->duration() * 1000 ); + m_sliderTimeLine.setCurrentTime( 0 ); + ui->seekSlider->setVisible( true ); ui->stackedLayout->setCurrentWidget( ui->pauseButton ); @@ -293,20 +306,26 @@ AudioControls::socialActionsLoaded() void AudioControls::onPlaybackPaused() { + tDebug() << Q_FUNC_INFO; ui->stackedLayout->setCurrentWidget( ui->playPauseButton ); + m_sliderTimeLine.setPaused( true ); } void AudioControls::onPlaybackResumed() { + tDebug() << Q_FUNC_INFO; ui->stackedLayout->setCurrentWidget( ui->pauseButton ); ui->loveButton->setVisible( true ); + ui->seekSlider->setNeedsUpdate( true ); + m_sliderTimeLine.resume(); } void AudioControls::onPlaybackStopped() { + tDebug() << Q_FUNC_INFO; m_currentTrack.clear(); ui->artistTrackLabel->setText( "" ); @@ -316,6 +335,8 @@ AudioControls::onPlaybackStopped() ui->timeLeftLabel->setText( "" ); ui->coverImage->setPixmap( QPixmap() ); ui->seekSlider->setVisible( false ); + m_sliderTimeLine.stop(); + m_sliderTimeLine.setCurrentTime( 0 ); ui->stackedLayout->setCurrentWidget( ui->playPauseButton ); ui->loveButton->setEnabled( false ); @@ -326,6 +347,7 @@ AudioControls::onPlaybackStopped() void AudioControls::onPlaybackTimer( qint64 msElapsed ) { + tDebug() << Q_FUNC_INFO; if ( m_currentTrack.isNull() ) return; @@ -334,7 +356,15 @@ AudioControls::onPlaybackTimer( qint64 msElapsed ) const int seconds = msElapsed / 1000; ui->timeLabel->setText( TomahawkUtils::timeToString( seconds ) ); ui->timeLeftLabel->setText( "-" + TomahawkUtils::timeToString( m_currentTrack->duration() - seconds ) ); - ui->seekSlider->setValue( msElapsed ); + tLog() << Q_FUNC_INFO << " setting sliderTimeLine elapsed time to " << msElapsed; + + if ( ui->seekSlider->needsUpdate() ) + { + m_sliderTimeLine.setCurrentTime( msElapsed ); + ui->seekSlider->setNeedsUpdate( false ); + } + else if ( m_sliderTimeLine.state() == QTimeLine::NotRunning ) + m_sliderTimeLine.start(); ui->seekSlider->blockSignals( false ); } diff --git a/src/audiocontrols.h b/src/audiocontrols.h index c4e8cfe27..476e97e79 100644 --- a/src/audiocontrols.h +++ b/src/audiocontrols.h @@ -20,6 +20,7 @@ #define AUDIOCONTROLS_H #include +#include #include "result.h" #include "playlistinterface.h" @@ -79,6 +80,7 @@ private slots: void droppedTracks( QList ); void socialActionsLoaded(); + private: Ui::AudioControls *ui; @@ -87,6 +89,8 @@ private: Tomahawk::result_ptr m_currentTrack; Tomahawk::PlaylistInterface::RepeatMode m_repeatMode; bool m_shuffled; + + QTimeLine m_sliderTimeLine; }; #endif // AUDIOCONTROLS_H diff --git a/src/libtomahawk/widgets/SeekSlider.cpp b/src/libtomahawk/widgets/SeekSlider.cpp index 007c18bef..abed4b9e2 100644 --- a/src/libtomahawk/widgets/SeekSlider.cpp +++ b/src/libtomahawk/widgets/SeekSlider.cpp @@ -19,6 +19,7 @@ #include "SeekSlider.h" #include +#include #include "utils/tomahawkutils.h" #include "utils/logger.h" @@ -26,6 +27,8 @@ SeekSlider::SeekSlider( QWidget* parent ) : QSlider( parent ) + , m_timeLine( 0 ) + , m_needsUpdate( false ) { setFixedHeight( 20 ); setStyleSheet( "QSlider::groove::horizontal {" @@ -64,3 +67,24 @@ SeekSlider::mousePressEvent( QMouseEvent* event ) else QSlider::mousePressEvent( event ); } + + +void +SeekSlider::setValue( int value ) +{ + int newVal = value; + if ( value > maximum() ) + newVal = maximum(); + if ( value < minimum() ) + newVal = minimum(); + + if ( !m_timeLine || sender() != m_timeLine ) + { + QSlider::setValue( newVal ); + return; + } + + blockSignals( true ); + QSlider::setValue( newVal ); + blockSignals( false ); +} diff --git a/src/libtomahawk/widgets/SeekSlider.h b/src/libtomahawk/widgets/SeekSlider.h index 42392b202..9ea33d5f1 100644 --- a/src/libtomahawk/widgets/SeekSlider.h +++ b/src/libtomahawk/widgets/SeekSlider.h @@ -23,6 +23,8 @@ #include "dllmacro.h" +class QTimeLine; + class DLLEXPORT SeekSlider : public QSlider { Q_OBJECT @@ -31,8 +33,20 @@ public: SeekSlider( QWidget* parent = 0 ); ~SeekSlider(); + void setTimeLine( QTimeLine* timeline ) { m_timeLine = timeline; } + + void setNeedsUpdate( bool needsUpdate ) { m_needsUpdate = needsUpdate; } + bool needsUpdate() { return m_needsUpdate; } + +public slots: + void setValue( int value ); + protected: void mousePressEvent( QMouseEvent* event ); + +private: + QTimeLine* m_timeLine; + bool m_needsUpdate; }; #endif // SEEKSLIDER_H