/src/libtomahawk/ActionCollection.cpp

http://github.com/tomahawk-player/tomahawk · C++ · 361 lines · 272 code · 54 blank · 35 comment · 11 complexity · b977b00b610e77d38624a8b067934569 MD5 · raw file

  1. /* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
  2. *
  3. * Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
  4. * Copyright 2010-2012, Jeff Mitchell <jeff@tomahawk-player.org>
  5. * Copyright 2012, Leo Franchi <lfranchi@kde.org>
  6. * Copyright 2012, Teo Mrnjavac <teo@kde.org>
  7. *
  8. * Tomahawk is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * Tomahawk is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
  20. */
  21. #include "ActionCollection.h"
  22. #include "TomahawkSettings.h"
  23. #include "Source.h"
  24. #include "audio/AudioEngine.h"
  25. #include "utils/ImageRegistry.h"
  26. #include "utils/TomahawkUtils.h"
  27. #include "utils/Logger.h"
  28. #include <QCoreApplication>
  29. ActionCollection* ActionCollection::s_instance = 0;
  30. ActionCollection* ActionCollection::instance()
  31. {
  32. return s_instance;
  33. }
  34. ActionCollection::ActionCollection( QObject* parent )
  35. : QObject( parent )
  36. {
  37. s_instance = this;
  38. initActions();
  39. }
  40. ActionCollection::~ActionCollection()
  41. {
  42. s_instance = 0;
  43. foreach( QString key, m_actionCollection.keys() )
  44. delete m_actionCollection[ key ];
  45. }
  46. void
  47. ActionCollection::initActions()
  48. {
  49. // ATTENTION: Don't set ApplicationSpecificRole for submenu actions: they won't show up on OS X (Qt 5.5)
  50. QAction *latchOn = new QAction( tr( "&Listen Along" ), this );
  51. latchOn->setIcon( ImageRegistry::instance()->icon( RESPATH "images/headphones.svg" ) );
  52. m_actionCollection[ "latchOn" ] = latchOn;
  53. QAction *latchOff = new QAction( tr( "Stop &Listening Along" ), this );
  54. latchOff->setIcon( ImageRegistry::instance()->icon( RESPATH "images/headphones-off.svg" ) );
  55. m_actionCollection[ "latchOff" ] = latchOff;
  56. QAction *realtimeFollowingAlong = new QAction( tr( "&Follow in Real-Time" ), this );
  57. realtimeFollowingAlong->setCheckable( true );
  58. m_actionCollection[ "realtimeFollowingAlong" ] = realtimeFollowingAlong;
  59. bool isPublic = TomahawkSettings::instance()->privateListeningMode() == TomahawkSettings::PublicListening;
  60. m_actionCollection[ "togglePrivacy" ] = new QAction( tr( "&Listen Privately" ) , this );
  61. m_actionCollection[ "togglePrivacy" ]->setCheckable( true );
  62. m_actionCollection[ "togglePrivacy" ]->setChecked( !isPublic );
  63. connect( m_actionCollection[ "togglePrivacy" ], SIGNAL( triggered() ), SLOT( togglePrivateListeningMode() ), Qt::UniqueConnection );
  64. m_actionCollection[ "loadPlaylist" ] = new QAction( tr( "&Load Playlist" ), this );
  65. m_actionCollection[ "loadStation" ] = new QAction( tr( "&Load Station" ), this );
  66. m_actionCollection[ "renamePlaylist" ] = new QAction( tr( "&Rename Playlist" ), this );
  67. m_actionCollection[ "renameStation" ] = new QAction( tr( "&Rename Station" ), this );
  68. m_actionCollection[ "copyPlaylist" ] = new QAction( tr( "&Copy Playlist Link" ), this );
  69. m_actionCollection[ "playPause" ] = new QAction( tr( "&Play" ), this );
  70. m_actionCollection[ "playPause" ]->setIcon( ImageRegistry::instance()->icon( RESPATH "images/play.svg" ) );
  71. m_actionCollection[ "playPause" ]->setShortcut( Qt::Key_Space );
  72. m_actionCollection[ "playPause" ]->setShortcutContext( Qt::ApplicationShortcut );
  73. m_actionCollection[ "stop" ] = new QAction( tr( "&Stop" ), this );
  74. m_actionCollection[ "previousTrack" ] = new QAction( tr( "&Previous Track" ), this );
  75. m_actionCollection[ "previousTrack" ]->setIcon( ImageRegistry::instance()->icon( RESPATH "images/back.svg" ) );
  76. // m_actionCollection[ "previousTrack" ]->setShortcut( QKeySequence( "Left" ) );
  77. m_actionCollection[ "nextTrack" ] = new QAction( tr( "&Next Track" ), this );
  78. m_actionCollection[ "nextTrack" ]->setIcon( ImageRegistry::instance()->icon( RESPATH "images/forward.svg" ) );
  79. // m_actionCollection[ "nextTrack" ]->setShortcut( QKeySequence( "Right" ) );
  80. m_actionCollection[ "quit" ] = new QAction( tr( "&Quit" ), this );
  81. m_actionCollection[ "quit" ]->setShortcut( QKeySequence::Quit );
  82. m_actionCollection[ "quit" ]->setShortcutContext( Qt::ApplicationShortcut );
  83. m_actionCollection[ "quit" ]->setMenuRole( QAction::QuitRole );
  84. // connect actions to AudioEngine
  85. AudioEngine *ae = AudioEngine::instance();
  86. connect( m_actionCollection[ "playPause" ], SIGNAL( triggered() ), ae, SLOT( playPause() ), Qt::UniqueConnection );
  87. connect( m_actionCollection[ "stop" ], SIGNAL( triggered() ), ae, SLOT( stop() ), Qt::UniqueConnection );
  88. connect( m_actionCollection[ "previousTrack" ], SIGNAL( triggered() ), ae, SLOT( previous() ), Qt::UniqueConnection );
  89. connect( m_actionCollection[ "nextTrack" ], SIGNAL( triggered() ), ae, SLOT( next() ), Qt::UniqueConnection );
  90. // main menu actions
  91. m_actionCollection[ "importPlaylist" ] = new QAction( tr( "Import Playlist..." ), this );
  92. m_actionCollection[ "updateCollection" ] = new QAction( tr( "U&pdate Collection" ), this );
  93. m_actionCollection[ "rescanCollection" ] = new QAction( tr( "Fully &Rescan Collection" ), this );
  94. m_actionCollection[ "showOfflineSources" ] = new QAction( tr( "Show Offline Friends" ), this );
  95. m_actionCollection[ "showOfflineSources" ]->setCheckable( true );
  96. m_actionCollection[ "preferences" ] = new QAction( tr( "&Configure %applicationName..." ), this );
  97. m_actionCollection[ "preferences" ]->setMenuRole( QAction::PreferencesRole );
  98. m_actionCollection[ "createPlaylist" ] = new QAction( tr( "Create Playlist" ), this );
  99. m_actionCollection[ "createPlaylist" ]->setShortcut( QKeySequence( "Ctrl+N" ) );
  100. m_actionCollection[ "createPlaylist" ]->setShortcutContext( Qt::ApplicationShortcut );
  101. // echonest is dead, disable stations
  102. /*
  103. m_actionCollection[ "createStation" ] = new QAction( tr( "Create Station" ), this );
  104. m_actionCollection[ "createStation" ]->setShortcut( QKeySequence( "Ctrl+S" ) );
  105. m_actionCollection[ "createStation" ]->setShortcutContext( Qt::ApplicationShortcut );
  106. */
  107. #ifdef Q_OS_MAC
  108. m_actionCollection[ "minimize" ] = new QAction( tr( "Minimize" ), this );
  109. m_actionCollection[ "minimize" ]->setShortcut( QKeySequence( "Ctrl+M" ) );
  110. m_actionCollection[ "zoom" ] = new QAction( tr( "Zoom" ), this );
  111. m_actionCollection[ "zoom" ]->setShortcut( QKeySequence( "Meta+Ctrl+Z" ) );
  112. m_actionCollection[ "fullscreen" ] = new QAction( tr( "Enter Full Screen" ), this );
  113. m_actionCollection[ "fullscreen" ]->setShortcut( QKeySequence( "Meta+Ctrl+F" ) );
  114. #else
  115. m_actionCollection[ "toggleMenuBar" ] = new QAction( tr( "Hide Menu Bar" ), this );
  116. m_actionCollection[ "toggleMenuBar" ]->setShortcut( QKeySequence( "Ctrl+M" ) );
  117. m_actionCollection[ "toggleMenuBar" ]->setShortcutContext( Qt::ApplicationShortcut );
  118. #endif
  119. m_actionCollection[ "diagnostics" ] = new QAction( tr( "Diagnostics..." ), this );
  120. m_actionCollection[ "diagnostics" ]->setMenuRole( QAction::ApplicationSpecificRole );
  121. m_actionCollection[ "aboutTomahawk" ] = new QAction( tr( "About &%applicationName..." ), this );
  122. m_actionCollection[ "aboutTomahawk" ]->setMenuRole( QAction::AboutRole );
  123. m_actionCollection[ "legalInfo" ] = new QAction( tr( "&Legal Information..." ), this );
  124. m_actionCollection[ "legalInfo" ]->setMenuRole( QAction::ApplicationSpecificRole );
  125. m_actionCollection[ "openLogfile" ] = new QAction( tr( "&View Logfile" ), this );
  126. m_actionCollection[ "openLogfile" ]->setMenuRole( QAction::ApplicationSpecificRole );
  127. #if defined( Q_OS_MAC ) && defined( HAVE_SPARKLE ) || defined( Q_OS_WIN )
  128. m_actionCollection[ "checkForUpdates" ] = new QAction( tr( "Check For Updates..." ), this );
  129. m_actionCollection[ "checkForUpdates" ]->setMenuRole( QAction::ApplicationSpecificRole );
  130. #endif
  131. m_actionCollection[ "crashNow" ] = new QAction( "Crash now...", this );
  132. m_actionCollection[ "whatsnew_0_8" ] = new QAction( tr( "%applicationName 0.8" ) , this );
  133. m_actionCollection[ "reportBug" ] = new QAction( tr( "Report a Bug" ) , this );
  134. m_actionCollection[ "getSupport" ] = new QAction( tr( "Get Support" ) , this );
  135. m_actionCollection[ "helpTranslate" ] = new QAction( tr( "Help Us Translate" ) , this );
  136. }
  137. QMenuBar*
  138. ActionCollection::createMenuBar( QWidget *parent )
  139. {
  140. QMenuBar* menuBar = new QMenuBar( parent );
  141. menuBar->setFont( TomahawkUtils::systemFont() );
  142. QMenu* controlsMenu = new QMenu( tr( "&Controls" ), menuBar );
  143. controlsMenu->setFont( TomahawkUtils::systemFont() );
  144. controlsMenu->addAction( m_actionCollection[ "playPause" ] );
  145. controlsMenu->addAction( m_actionCollection[ "previousTrack" ] );
  146. controlsMenu->addAction( m_actionCollection[ "nextTrack" ] );
  147. controlsMenu->addSeparator();
  148. controlsMenu->addAction( m_actionCollection[ "togglePrivacy" ] );
  149. controlsMenu->addAction( m_actionCollection[ "showOfflineSources" ] );
  150. controlsMenu->addSeparator();
  151. controlsMenu->addAction( m_actionCollection[ "createPlaylist" ] );
  152. // echonest is dead, disable stations
  153. // controlsMenu->addAction( m_actionCollection[ "createStation" ] );
  154. controlsMenu->addAction( m_actionCollection[ "importPlaylist" ] );
  155. controlsMenu->addAction( m_actionCollection[ "updateCollection" ] );
  156. controlsMenu->addAction( m_actionCollection[ "rescanCollection" ] );
  157. controlsMenu->addSeparator();
  158. controlsMenu->addAction( m_actionCollection[ "quit" ] );
  159. QMenu* settingsMenu = new QMenu( tr( "&Settings" ), menuBar );
  160. settingsMenu->setFont( TomahawkUtils::systemFont() );
  161. #ifndef Q_OS_MAC
  162. settingsMenu->addAction( m_actionCollection[ "toggleMenuBar" ] );
  163. #endif
  164. settingsMenu->addAction( m_actionCollection[ "preferences" ] );
  165. QMenu* helpMenu = new QMenu( tr( "&Help" ), menuBar );
  166. helpMenu->setFont( TomahawkUtils::systemFont() );
  167. helpMenu->addAction( m_actionCollection[ "diagnostics" ] );
  168. helpMenu->addAction( m_actionCollection[ "openLogfile" ] );
  169. helpMenu->addAction( m_actionCollection[ "legalInfo" ] );
  170. helpMenu->addAction( m_actionCollection["getSupport"] );
  171. helpMenu->addAction( m_actionCollection["reportBug"] );
  172. helpMenu->addAction( m_actionCollection["helpTranslate"] );
  173. helpMenu->addSeparator();
  174. QMenu* whatsNew = helpMenu->addMenu( ImageRegistry::instance()->icon( RESPATH "images/whatsnew.svg" ), tr( "What's New in ..." ) );
  175. whatsNew->setFont( TomahawkUtils::systemFont() );
  176. whatsNew->addAction( m_actionCollection[ "whatsnew_0_8" ] );
  177. helpMenu->addAction( m_actionCollection[ "aboutTomahawk" ] );
  178. // Setup update check
  179. #ifndef Q_OS_MAC
  180. helpMenu->insertSeparator( m_actionCollection[ "legalInfo" ] );
  181. #endif
  182. #if defined( Q_OS_MAC ) && defined( HAVE_SPARKLE )
  183. helpMenu->addAction( m_actionCollection[ "checkForUpdates" ] );
  184. #elif defined( Q_OS_WIN )
  185. helpMenu->addSeparator();
  186. helpMenu->addAction( m_actionCollection[ "checkForUpdates" ] );
  187. #endif
  188. if ( qApp->arguments().contains( "--debug" ) )
  189. {
  190. helpMenu->addSeparator();
  191. helpMenu->addAction( m_actionCollection[ "crashNow" ] );
  192. }
  193. menuBar->addMenu( controlsMenu );
  194. menuBar->addMenu( settingsMenu );
  195. #if defined( Q_OS_MAC )
  196. QMenu* windowMenu = new QMenu( tr( "&Window" ), menuBar );
  197. windowMenu->setFont( TomahawkUtils::systemFont() );
  198. windowMenu->addAction( m_actionCollection[ "minimize" ] );
  199. windowMenu->addAction( m_actionCollection[ "zoom" ] );
  200. windowMenu->addAction( m_actionCollection[ "fullscreen" ] );
  201. menuBar->addMenu( windowMenu );
  202. #endif
  203. menuBar->addMenu( helpMenu );
  204. return menuBar;
  205. }
  206. QMenu*
  207. ActionCollection::createCompactMenu( QWidget* parent )
  208. {
  209. QMenu* compactMenu = new QMenu( tr( "Main Menu" ), parent );
  210. compactMenu->setFont( TomahawkUtils::systemFont() );
  211. compactMenu->addAction( m_actionCollection[ "playPause" ] );
  212. compactMenu->addAction( m_actionCollection[ "previousTrack" ] );
  213. compactMenu->addAction( m_actionCollection[ "nextTrack" ] );
  214. compactMenu->addSeparator();
  215. compactMenu->addAction( m_actionCollection[ "togglePrivacy" ] );
  216. compactMenu->addAction( m_actionCollection[ "showOfflineSources" ] );
  217. compactMenu->addSeparator();
  218. compactMenu->addAction( m_actionCollection[ "importPlaylist" ] );
  219. compactMenu->addAction( m_actionCollection[ "updateCollection" ] );
  220. compactMenu->addAction( m_actionCollection[ "rescanCollection" ] );
  221. compactMenu->addSeparator();
  222. #ifdef Q_OS_MAC // This should never happen anyway
  223. compactMenu->addAction( m_actionCollection[ "minimize" ] );
  224. compactMenu->addAction( m_actionCollection[ "zoom" ] );
  225. #else
  226. compactMenu->addAction( m_actionCollection[ "toggleMenuBar" ] );
  227. #endif
  228. compactMenu->addAction( m_actionCollection[ "preferences" ] );
  229. compactMenu->addSeparator();
  230. compactMenu->addAction( m_actionCollection[ "diagnostics" ] );
  231. compactMenu->addAction( m_actionCollection[ "openLogfile" ] );
  232. compactMenu->addAction( m_actionCollection[ "legalInfo" ] );
  233. QMenu* whatsNew = compactMenu->addMenu( ImageRegistry::instance()->icon( RESPATH "images/whatsnew.svg" ), tr( "What's New in ..." ) );
  234. whatsNew->addAction( m_actionCollection[ "whatsnew_0_8" ] );
  235. compactMenu->addAction( m_actionCollection[ "aboutTomahawk" ] );
  236. // Setup update check
  237. #ifndef Q_OS_MAC
  238. compactMenu->insertSeparator( m_actionCollection[ "legalInfo" ] );
  239. #endif
  240. #if defined( Q_OS_MAC ) && defined( HAVE_SPARKLE )
  241. compactMenu->addAction( m_actionCollection[ "checkForUpdates" ] );
  242. #elif defined( Q_OS_WIN )
  243. compactMenu->addSeparator();
  244. compactMenu->addAction( m_actionCollection[ "checkForUpdates" ] );
  245. #endif
  246. if ( qApp->arguments().contains( "--debug" ) )
  247. {
  248. compactMenu->addSeparator();
  249. compactMenu->addAction( m_actionCollection[ "crashNow" ] );
  250. }
  251. compactMenu->addSeparator();
  252. compactMenu->addAction( m_actionCollection["getSupport"] );
  253. compactMenu->addAction( m_actionCollection["reportBug"] );
  254. compactMenu->addAction( m_actionCollection["helpTranslate"] );
  255. compactMenu->addSeparator();
  256. compactMenu->addAction( m_actionCollection[ "quit" ] );
  257. return compactMenu;
  258. }
  259. void
  260. ActionCollection::addAction( ActionCollection::ActionDestination category, QAction* action, QObject* notify )
  261. {
  262. QList< QAction* > actions = m_categoryActions.value( category );
  263. actions.append( action );
  264. m_categoryActions[ category ] = actions;
  265. if ( notify )
  266. m_actionNotifiers[ action ] = notify;
  267. }
  268. QAction*
  269. ActionCollection::getAction( const QString& name )
  270. {
  271. return m_actionCollection.value( name, 0 );
  272. }
  273. QObject*
  274. ActionCollection::actionNotifier( QAction* action )
  275. {
  276. return m_actionNotifiers.value( action, 0 );
  277. }
  278. QList< QAction* >
  279. ActionCollection::getAction( ActionCollection::ActionDestination category )
  280. {
  281. return m_categoryActions.value( category );
  282. }
  283. void
  284. ActionCollection::removeAction( QAction* action )
  285. {
  286. removeAction( action, LocalPlaylists );
  287. }
  288. void
  289. ActionCollection::removeAction( QAction* action, ActionCollection::ActionDestination category )
  290. {
  291. QList< QAction* > actions = m_categoryActions.value( category );
  292. actions.removeAll( action );
  293. m_categoryActions[ category ] = actions;
  294. m_actionNotifiers.remove( action );
  295. }
  296. void
  297. ActionCollection::togglePrivateListeningMode()
  298. {
  299. tDebug() << Q_FUNC_INFO;
  300. if ( TomahawkSettings::instance()->privateListeningMode() == TomahawkSettings::PublicListening )
  301. TomahawkSettings::instance()->setPrivateListeningMode( TomahawkSettings::FullyPrivate );
  302. else
  303. TomahawkSettings::instance()->setPrivateListeningMode( TomahawkSettings::PublicListening );
  304. bool isPublic = TomahawkSettings::instance()->privateListeningMode() == TomahawkSettings::PublicListening;
  305. m_actionCollection[ "togglePrivacy" ]->setChecked( !isPublic );
  306. emit privacyModeChanged();
  307. }