[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/multimedia/amarok/src
From:       Kevin Funk <krf () gmx ! de>
Date:       2009-01-12 13:47:39
Message-ID: 1231768059.334263.5246.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 909945 by kfunk:

Show play/pause indicator on system tray icon

 M  +42 -4     Systray.cpp  
 M  +3 -1      Systray.h  


--- trunk/extragear/multimedia/amarok/src/Systray.cpp #909944:909945
@@ -35,6 +35,7 @@
 
 #include <KAction>
 #include <KApplication>
+#include <KIcon>
 #include <KIconEffect>
 #include <KLocale>
 #include <KMenu>
@@ -48,6 +49,19 @@
 #include <QTextDocument> // for Qt::escape()
 #include <QToolTip>
 
+namespace Amarok
+{
+    static QPixmap
+    loadOverlay( const QString &iconName )
+    {
+        KIcon icon = KIcon( iconName );
+        if ( !icon.isNull() )
+            return icon.pixmap( 10, 10 ); // overlay size, adjust here
+
+        return 0;
+    }
+}
+
 Amarok::TrayIcon::TrayIcon( QWidget *playerWidget )
         : KSystemTrayIcon( playerWidget )
         , EngineObserver( The::engineController() )
@@ -69,6 +83,9 @@
     contextMenu()->addAction( ac->action( "stop"       ) );
     contextMenu()->addAction( ac->action( "next"       ) );
 
+    m_playOverlay = loadOverlay( "media-playback-start" );
+    m_pauseOverlay = loadOverlay( "media-playback-pause" );
+
     PERF_LOG( "Adding system tray icon" );
     paintIcon();
 
@@ -243,6 +260,7 @@
         case Phonon::PlayingState:
             m_track = The::engineController()->currentTrack();
             m_trackLength = m_track->length();
+
             paintIcon();
             setupMenu();
             break;
@@ -254,6 +272,10 @@
             break;
 
         case Phonon::PausedState:
+            paintIcon();
+            blendOverlay( m_pauseOverlay );
+            break;
+
         case Phonon::LoadingState:
         case Phonon::ErrorState:
         case Phonon::BufferingState:
@@ -314,8 +336,8 @@
     if( m_baseIcon.isNull() )
     {
         QIcon icon = KSystemTrayIcon::loadIcon( "amarok" );
+        m_baseIcon = icon.pixmap( geometry().size() );
         setIcon( icon ); // show icon
-        m_baseIcon = icon.pixmap( geometry().size() );
         return; // return because m_baseIcon is still null after first startup
     }
 
@@ -340,16 +362,32 @@
         return;
 
     // draw m_baseIcon on top of the gray version
-    QPixmap pixmap = m_grayedIcon; // copies object
-    QPainter p( &pixmap );
+    m_icon = m_grayedIcon; // copies object
+    QPainter p( &m_icon );
     p.drawPixmap( 0, 0, m_baseIcon, 0, 0, 0, geometry().height() - mergePos );
+    p.end();
 
     oldMergePos = mergePos;
 
-    setIcon( pixmap );
+    blendOverlay( m_playOverlay );
 }
 
 void
+Amarok::TrayIcon::blendOverlay( const QPixmap &overlay )
+{
+    if ( !overlay.isNull() )
+    {
+        // draw overlay at bottom right
+        const int x = geometry().size().width() - overlay.size().width();
+        const int y = geometry().size().height() - overlay.size().width();
+        QPainter p( &m_icon );
+        p.drawPixmap( x, y, overlay );
+        p.end();
+        setIcon( m_icon );
+    }
+}
+
+void
 Amarok::TrayIcon::setupMenu()
 {
     if( !m_track )
--- trunk/extragear/multimedia/amarok/src/Systray.h #909944:909945
@@ -60,11 +60,13 @@
     void setupToolTip();
 
     void paintIcon( long trackPosition = -1 );
+    void blendOverlay( const QPixmap &overlay );
 
     Meta::TrackPtr m_track;
     long m_trackLength;
 
-    QPixmap m_baseIcon, m_grayedIcon;
+    QPixmap m_baseIcon, m_grayedIcon, m_icon;
+    QPixmap m_playOverlay, m_pauseOverlay;
     QList<PopupDropperAction *> m_extraActions;
 };
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic