diff --git a/src/TomahawkTrayIcon.cpp b/src/TomahawkTrayIcon.cpp index 31df4e67d..4e46f7a41 100644 --- a/src/TomahawkTrayIcon.cpp +++ b/src/TomahawkTrayIcon.cpp @@ -26,6 +26,7 @@ #include "audio/AudioEngine.h" #include "TomahawkApp.h" #include "TomahawkWindow.h" +#include "Query.h" #include "utils/Logger.h" #include @@ -35,6 +36,7 @@ TomahawkTrayIcon::TomahawkTrayIcon( QObject* parent ) : QSystemTrayIcon( parent ) , m_currentAnimationFrame( 0 ) , m_showWindowAction( 0 ) + , m_stopContinueAfterTrackAction( 0 ) { QIcon icon( RESPATH "icons/tomahawk-icon-128x128-grayscale.png" ); setIcon( icon ); @@ -43,15 +45,20 @@ TomahawkTrayIcon::TomahawkTrayIcon( QObject* parent ) m_contextMenu = new QMenu(); setContextMenu( m_contextMenu ); + + m_stopContinueAfterTrackAction = new QAction( tr( "&Stop Playback after current Track" ), this ); ActionCollection *ac = ActionCollection::instance(); m_contextMenu->addAction( ac->getAction( "playPause" ) ); m_contextMenu->addAction( ac->getAction( "stop" ) ); + m_contextMenu->addAction( m_stopContinueAfterTrackAction ); m_contextMenu->addSeparator(); m_contextMenu->addAction( ac->getAction( "previousTrack" ) ); m_contextMenu->addAction( ac->getAction( "nextTrack" ) ); m_contextMenu->addSeparator(); m_contextMenu->addAction( ActionCollection::instance()->getAction( "togglePrivacy" ) ); + + connect( m_stopContinueAfterTrackAction, SIGNAL( triggered(bool) ), this, SLOT( stopContinueAfterTrackActionTriggered() ) ); #ifdef Q_WS_MAC // On mac you can close the windows while leaving the app open. We then need a way to show the main window again @@ -67,10 +74,11 @@ TomahawkTrayIcon::TomahawkTrayIcon( QObject* parent ) m_contextMenu->addAction( ac->getAction( "quit" ) ); connect( AudioEngine::instance(), SIGNAL( loading( Tomahawk::result_ptr ) ), SLOT( setResult( Tomahawk::result_ptr ) ) ); - connect( AudioEngine::instance(), SIGNAL( started( Tomahawk::result_ptr ) ), SLOT( enablePause() ) ); - connect( AudioEngine::instance(), SIGNAL( resumed() ), this, SLOT( enablePause() ) ); - connect( AudioEngine::instance(), SIGNAL( stopped() ), this, SLOT( enablePlay() ) ); - connect( AudioEngine::instance(), SIGNAL( paused() ), this, SLOT( enablePlay() ) ); + connect( AudioEngine::instance(), SIGNAL( started( Tomahawk::result_ptr ) ), SLOT( onPlay() ) ); + connect( AudioEngine::instance(), SIGNAL( resumed() ), this, SLOT( onResume() ) ); + connect( AudioEngine::instance(), SIGNAL( stopped() ), this, SLOT( onStop() ) ); + connect( AudioEngine::instance(), SIGNAL( paused() ), this, SLOT( onPause() ) ); + connect( AudioEngine::instance(), SIGNAL( stopAfterTrack_changed() ) , this, SLOT( stopContinueAfterTrack_StatusChanged() ) ); connect( &m_animationTimer, SIGNAL( timeout() ), SLOT( onAnimationTimer() ) ); connect( this, SIGNAL( activated( QSystemTrayIcon::ActivationReason ) ), SLOT( onActivated( QSystemTrayIcon::ActivationReason ) ) ); @@ -214,19 +222,61 @@ TomahawkTrayIcon::onActivated( QSystemTrayIcon::ActivationReason reason ) void -TomahawkTrayIcon::enablePlay() +TomahawkTrayIcon::onPause() { ActionCollection::instance()->getAction( "playPause" )->setText( tr( "Play" ) ); } void -TomahawkTrayIcon::enablePause() +TomahawkTrayIcon::onPlay() +{ + m_stopContinueAfterTrackAction->setEnabled( true ); + onResume(); + stopContinueAfterTrack_StatusChanged(); +} + + +void +TomahawkTrayIcon::onStop() +{ + m_stopContinueAfterTrackAction->setEnabled( false ); + onPause(); +} + + +void +TomahawkTrayIcon::onResume() { ActionCollection::instance()->getAction( "playPause" )->setText( tr( "Pause" ) ); } +void +TomahawkTrayIcon::stopContinueAfterTrack_StatusChanged() +{ + if ( !AudioEngine::instance()->currentTrack().isNull() ) + { + if ( AudioEngine::instance()->currentTrack()->toQuery()->equals( AudioEngine::instance()->stopAfterTrack() ) ) + m_stopContinueAfterTrackAction->setText( tr( "&Continue Playback after current Track" ) ); + else + m_stopContinueAfterTrackAction->setText( tr( "&Stop Playback after current Track" ) ); + } +} + + +void TomahawkTrayIcon::stopContinueAfterTrackActionTriggered() +{ + if ( !AudioEngine::instance()->currentTrack().isNull() ) + { + if ( !AudioEngine::instance()->currentTrack()->toQuery()->equals( AudioEngine::instance()->stopAfterTrack() ) ) + AudioEngine::instance()->setStopAfterTrack( AudioEngine::instance()->currentTrack()->toQuery() ); + else + AudioEngine::instance()->setStopAfterTrack( Tomahawk::query_ptr() ); + } +} + + bool TomahawkTrayIcon::event( QEvent* e ) { diff --git a/src/TomahawkTrayIcon.h b/src/TomahawkTrayIcon.h index ecd4d8e24..d1504e835 100644 --- a/src/TomahawkTrayIcon.h +++ b/src/TomahawkTrayIcon.h @@ -44,8 +44,14 @@ private slots: void onActivated( QSystemTrayIcon::ActivationReason reason ); void showWindow(); - void enablePlay(); - void enablePause(); + void onPause(); + void onPlay(); + void onStop(); + void onResume(); + + void stopContinueAfterTrack_StatusChanged(); + + void stopContinueAfterTrackActionTriggered(); void menuAboutToShow(); private: @@ -61,6 +67,7 @@ private: QMenu* m_contextMenu; QAction* m_showWindowAction; + QAction* m_stopContinueAfterTrackAction; }; #endif // TOMAHAWK_TRAYICON_H diff --git a/src/libtomahawk/Result.h b/src/libtomahawk/Result.h index 54527aa52..be86e0157 100644 --- a/src/libtomahawk/Result.h +++ b/src/libtomahawk/Result.h @@ -120,7 +120,7 @@ signals: private slots: void onOffline(); void onOnline(); - + private: // private constructor explicit Result( const QString& url ); diff --git a/src/libtomahawk/audio/AudioEngine.cpp b/src/libtomahawk/audio/AudioEngine.cpp index 08420d878..26be43e3b 100644 --- a/src/libtomahawk/audio/AudioEngine.cpp +++ b/src/libtomahawk/audio/AudioEngine.cpp @@ -714,6 +714,17 @@ AudioEngine::setPlaylist( Tomahawk::playlistinterface_ptr playlist ) } +void +AudioEngine::setStopAfterTrack( const query_ptr& query ) +{ + if ( m_stopAfterTrack != query ) + { + m_stopAfterTrack = query; + emit stopAfterTrack_changed(); + } +} + + void AudioEngine::setCurrentTrack( const Tomahawk::result_ptr& result ) { diff --git a/src/libtomahawk/audio/AudioEngine.h b/src/libtomahawk/audio/AudioEngine.h index 5abdc207a..ab65fb522 100644 --- a/src/libtomahawk/audio/AudioEngine.h +++ b/src/libtomahawk/audio/AudioEngine.h @@ -96,7 +96,7 @@ public slots: void setPlaylist( Tomahawk::playlistinterface_ptr playlist ); void setQueue( Tomahawk::playlistinterface_ptr queue ) { m_queue = queue; } - void setStopAfterTrack( const Tomahawk::query_ptr& query ) { m_stopAfterTrack = query; } + void setStopAfterTrack( const Tomahawk::query_ptr& query ); signals: void loading( const Tomahawk::result_ptr& track ); @@ -105,6 +105,8 @@ signals: void stopped(); void paused(); void resumed(); + + void stopAfterTrack_changed(); void seeked( qint64 ms );