From f36b95fe6b85b20cc7cf914589e693bef49e1f58 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Thu, 21 Jul 2011 16:21:45 -0400 Subject: [PATCH] OSX: Don't quit on window close, to conform to OSX expectations. Add Show/Hide action to tray icon. --- src/libtomahawk/utils/tomahawkutils_mac.mm | 1 - src/tomahawkapp.cpp | 2 ++ src/tomahawkapp.h | 2 +- src/tomahawktrayicon.cpp | 37 ++++++++++++++++++++++ src/tomahawktrayicon.h | 7 ++++ src/tomahawkwindow.cpp | 2 ++ 6 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/libtomahawk/utils/tomahawkutils_mac.mm b/src/libtomahawk/utils/tomahawkutils_mac.mm index 9a9079147..d7e710237 100644 --- a/src/libtomahawk/utils/tomahawkutils_mac.mm +++ b/src/libtomahawk/utils/tomahawkutils_mac.mm @@ -7,7 +7,6 @@ namespace TomahawkUtils void bringToFront() { - qDebug() << "foo"; [NSApp activateIgnoringOtherApps:YES]; } diff --git a/src/tomahawkapp.cpp b/src/tomahawkapp.cpp index 1b8f3c61d..88cb21e27 100644 --- a/src/tomahawkapp.cpp +++ b/src/tomahawkapp.cpp @@ -250,6 +250,8 @@ TomahawkApp::init() Tomahawk::setApplicationHandler( this ); increaseMaxFileDescriptors(); + + setQuitOnLastWindowClosed( false ); #endif // Connect up shortcuts diff --git a/src/tomahawkapp.h b/src/tomahawkapp.h index 69b78fe3e..ea13702e7 100644 --- a/src/tomahawkapp.h +++ b/src/tomahawkapp.h @@ -95,10 +95,10 @@ public: Tomahawk::ExternalResolver* resolverForPath( const QString& scriptPath ); // PlatformInterface - virtual void activate(); virtual bool loadUrl( const QString& url ); public slots: + virtual void activate(); void instanceStarted( KDSingleApplicationGuard::Instance ); private slots: diff --git a/src/tomahawktrayicon.cpp b/src/tomahawktrayicon.cpp index 88615f6c3..2b0405004 100644 --- a/src/tomahawktrayicon.cpp +++ b/src/tomahawktrayicon.cpp @@ -30,6 +30,7 @@ TomahawkTrayIcon::TomahawkTrayIcon( QObject* parent ) : QSystemTrayIcon( parent ) , m_currentAnimationFrame( 0 ) + , m_showWindowAction( 0 ) { QIcon icon( RESPATH "icons/tomahawk-icon-128x128.png" ); setIcon( icon ); @@ -45,6 +46,15 @@ TomahawkTrayIcon::TomahawkTrayIcon( QObject* parent ) m_contextMenu->addSeparator(); m_prevAction = m_contextMenu->addAction( tr( "Previous Track" ) ); m_nextAction = m_contextMenu->addAction( tr( "Next Track" ) ); + +#ifdef Q_OS_MAC + // On mac you can close the windows while leaving the app open. We then need a way to show the main window again + m_contextMenu->addSeparator(); + m_showWindowAction = m_contextMenu->addAction( tr( "Hide Tomahawk Window" ) ); + m_showWindowAction->setData( true ); + connect( m_showWindowAction, SIGNAL( triggered() ), this, SLOT( showWindow() ) ); +#endif + m_contextMenu->addSeparator(); m_quitAction = m_contextMenu->addAction( tr( "Quit" ) ); @@ -69,6 +79,33 @@ TomahawkTrayIcon::~TomahawkTrayIcon() delete m_contextMenu; } +void +TomahawkTrayIcon::setShowHideWindow( bool show ) +{ + if ( show ) + { + m_showWindowAction->setText( tr( "Hide Tomahawk Window" ) ); + m_showWindowAction->setData( show ); + } else { + m_showWindowAction->setText( tr( "Show Tomahawk Window" ) ); + } + m_showWindowAction->setData( show ); +} + +void +TomahawkTrayIcon::showWindow() +{ + if( !m_showWindowAction->data().toBool() ) + { + APP->mainWindow()->show(); + APP->mainWindow()->raise(); + + setShowHideWindow( true ); + } else { + APP->mainWindow()->hide(); + setShowHideWindow( false ); + } +} void TomahawkTrayIcon::setResult( const Tomahawk::result_ptr& result ) diff --git a/src/tomahawktrayicon.h b/src/tomahawktrayicon.h index 2cef11872..96859a5c9 100644 --- a/src/tomahawktrayicon.h +++ b/src/tomahawktrayicon.h @@ -33,12 +33,15 @@ public: TomahawkTrayIcon( QObject* parent ); virtual bool event( QEvent* e ); + void setShowHideWindow( bool show = true ); + public slots: void setResult( const Tomahawk::result_ptr& result ); private slots: void onAnimationTimer(); void onActivated( QSystemTrayIcon::ActivationReason reason ); + void showWindow(); private: void refreshToolTip(); @@ -57,6 +60,10 @@ private: QAction* m_prevAction; QAction* m_nextAction; QAction* m_quitAction; + +#ifdef Q_OS_MAC + QAction* m_showWindowAction; +#endif }; #endif // TOMAHAWK_TRAYICON_H diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp index fe4547b83..07b2207e6 100644 --- a/src/tomahawkwindow.cpp +++ b/src/tomahawkwindow.cpp @@ -362,6 +362,8 @@ TomahawkWindow::closeEvent( QCloseEvent* e ) e->ignore(); return; } +#else + m_trayIcon->setShowHideWindow( false ); #endif e->accept();