From 4bafeb34fd9d4686c6fa21b8bfcb54c25071c8eb Mon Sep 17 00:00:00 2001
From: Jeff Mitchell <tomahawk@jefferai.org>
Date: Mon, 7 Nov 2011 18:45:05 -0500
Subject: [PATCH] Insert private listening actions into Tomahawk menu and tray
 icon menu. Some visual feedback would be nice.

---
 src/libtomahawk/LatchManager.cpp      |  1 +
 src/libtomahawk/actioncollection.cpp  |  3 +++
 src/libtomahawk/actioncollection.h    |  2 +-
 src/libtomahawk/audio/audioengine.cpp | 28 ++++++++++++++++++++++++++-
 src/libtomahawk/audio/audioengine.h   |  2 ++
 src/tomahawktrayicon.cpp              |  3 +++
 src/tomahawkwindow.cpp                |  4 ++++
 7 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/src/libtomahawk/LatchManager.cpp b/src/libtomahawk/LatchManager.cpp
index c47482a88..f596f009e 100644
--- a/src/libtomahawk/LatchManager.cpp
+++ b/src/libtomahawk/LatchManager.cpp
@@ -131,6 +131,7 @@ LatchManager::catchUpRequest()
 void
 LatchManager::unlatchRequest( const source_ptr& source )
 {
+    Q_UNUSED( source );
     AudioEngine::instance()->stop();
     AudioEngine::instance()->setPlaylist( 0 );
 
diff --git a/src/libtomahawk/actioncollection.cpp b/src/libtomahawk/actioncollection.cpp
index 42fbb59e3..db1bd78bd 100644
--- a/src/libtomahawk/actioncollection.cpp
+++ b/src/libtomahawk/actioncollection.cpp
@@ -17,6 +17,7 @@
  */
 
 #include "actioncollection.h"
+#include "tomahawksettings.h"
 
 ActionCollection* ActionCollection::s_instance = 0;
 ActionCollection* ActionCollection::instance()
@@ -38,6 +39,8 @@ ActionCollection::initActions()
 {
     m_actionCollection[ "latchOn" ] = new QAction( tr( "&Listen Along" ), this );
     m_actionCollection[ "latchOff" ] = new QAction( tr( "&Stop Listening Along" ), this );
+    m_actionCollection[ "togglePrivacy" ] = new QAction( tr( QString( TomahawkSettings::instance()->privateListeningMode() == TomahawkSettings::PublicListening ?
+                "&Listen Privately" : "&Listen Publicly" ).toAscii().constData() ), this );
 }
 
 
diff --git a/src/libtomahawk/actioncollection.h b/src/libtomahawk/actioncollection.h
index 336796c1c..e53e24a4d 100644
--- a/src/libtomahawk/actioncollection.h
+++ b/src/libtomahawk/actioncollection.h
@@ -21,7 +21,7 @@
 
 #include "dllmacro.h"
 
-#include <QAction>
+#include <QtGui/QAction>
 
 
 class DLLEXPORT ActionCollection : public QObject
diff --git a/src/libtomahawk/audio/audioengine.cpp b/src/libtomahawk/audio/audioengine.cpp
index 6cc461757..5e815e33c 100644
--- a/src/libtomahawk/audio/audioengine.cpp
+++ b/src/libtomahawk/audio/audioengine.cpp
@@ -24,16 +24,18 @@
 #include "playlistinterface.h"
 #include "sourceplaylistinterface.h"
 #include "tomahawksettings.h"
-
+#include "actioncollection.h"
 #include "database/database.h"
 #include "database/databasecommand_logplayback.h"
 #include "network/servent.h"
 #include "utils/qnr_iodevicestream.h"
+#include "headlesscheck.h"
 
 #include "album.h"
 
 #include "utils/logger.h"
 
+
 using namespace Tomahawk;
 
 AudioEngine* AudioEngine::s_instance = 0;
@@ -75,6 +77,11 @@ AudioEngine::AudioEngine()
 
     connect( m_audioOutput, SIGNAL( volumeChanged( qreal ) ), this, SLOT( onVolumeChanged( qreal ) ) );
 
+#ifndef TOMAHAWK_HEADLESS
+    tDebug() << Q_FUNC_INFO << "Connecting privacy toggle";
+    connect( ActionCollection::instance()->getAction( "togglePrivacy" ), SIGNAL( triggered( bool ) ), this, SLOT( togglePrivateListeningMode() ) );
+#endif
+    
     onVolumeChanged( m_audioOutput->volume() );
 
 #ifndef Q_WS_X11
@@ -394,6 +401,25 @@ AudioEngine::infoSystemFinished( QString caller )
 }
 
 
+void
+AudioEngine::togglePrivateListeningMode()
+{
+    tDebug() << Q_FUNC_INFO;
+    if ( TomahawkSettings::instance()->privateListeningMode() == TomahawkSettings::PublicListening )
+        TomahawkSettings::instance()->setPrivateListeningMode( TomahawkSettings::FullyPrivate );
+    else
+        TomahawkSettings::instance()->setPrivateListeningMode( TomahawkSettings::PublicListening );
+
+#ifndef TOMAHAWK_HEADLESS
+    ActionCollection::instance()->getAction( "togglePrivacy" )->setText(
+        tr( QString( TomahawkSettings::instance()->privateListeningMode() == TomahawkSettings::PublicListening ?
+            "&Listen Privately" : "&Listen Publicly" ).toAscii().constData() )
+        );
+#endif
+}
+
+
+
 bool
 AudioEngine::loadTrack( const Tomahawk::result_ptr& result )
 {
diff --git a/src/libtomahawk/audio/audioengine.h b/src/libtomahawk/audio/audioengine.h
index f888ce42c..6a516cb46 100644
--- a/src/libtomahawk/audio/audioengine.h
+++ b/src/libtomahawk/audio/audioengine.h
@@ -103,6 +103,8 @@ public slots:
     void infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestData, QVariant output );
     void infoSystemFinished( QString caller );
 
+    void togglePrivateListeningMode();
+
 signals:
     void loading( const Tomahawk::result_ptr& track );
     void started( const Tomahawk::result_ptr& track );
diff --git a/src/tomahawktrayicon.cpp b/src/tomahawktrayicon.cpp
index bd6dad0f8..38495a481 100644
--- a/src/tomahawktrayicon.cpp
+++ b/src/tomahawktrayicon.cpp
@@ -27,6 +27,7 @@
 #include "tomahawkwindow.h"
 
 #include "utils/logger.h"
+#include <actioncollection.h>
 
 
 TomahawkTrayIcon::TomahawkTrayIcon( QObject* parent )
@@ -48,6 +49,8 @@ TomahawkTrayIcon::TomahawkTrayIcon( QObject* parent )
     m_contextMenu->addSeparator();
     m_prevAction = m_contextMenu->addAction( tr( "Previous Track" ) );
     m_nextAction = m_contextMenu->addAction( tr( "Next Track" ) );
+    m_contextMenu->addSeparator();
+    m_contextMenu->addAction( ActionCollection::instance()->getAction( "togglePrivacy" ) );
 
 #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
diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp
index 44931115d..2e90e2ffe 100644
--- a/src/tomahawkwindow.cpp
+++ b/src/tomahawkwindow.cpp
@@ -70,6 +70,7 @@
 #include "utils/logger.h"
 #include "jobview/JobStatusModel.h"
 #include "LoadXSPFDialog.h"
+#include <actioncollection.h>
 
 using namespace Tomahawk;
 
@@ -105,6 +106,9 @@ TomahawkWindow::TomahawkWindow( QWidget* parent )
         ui->menu_Help->addSeparator();
         ui->menu_Help->addAction( "Crash now...", this, SLOT( crashNow() ) );
     }
+    
+    ui->menuApp->insertAction( ui->actionCreatePlaylist, ActionCollection::instance()->getAction( "togglePrivacy" ) );
+    ui->menuApp->insertSeparator( ui->actionCreatePlaylist );
 
     // set initial state
     onSipDisconnected();