From b418141aa08fe038e3760450918e911bdcc1e552 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Mon, 19 Apr 2010 13:53:26 +0000 Subject: [PATCH] Show a tiny play or pause icon in the system tray --- data/data.qrc | 2 ++ data/tiny-pause.png | Bin 0 -> 367 bytes data/tiny-start.png | Bin 0 -> 429 bytes src/mainwindow.cpp | 9 +++++++++ src/systemtrayicon.cpp | 42 ++++++++++++++++++++++++++++++++++++++--- src/systemtrayicon.h | 10 ++++++++++ 6 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 data/tiny-pause.png create mode 100644 data/tiny-start.png diff --git a/data/data.qrc b/data/data.qrc index cda15b8b8..b6a0a0fa3 100644 --- a/data/data.qrc +++ b/data/data.qrc @@ -79,5 +79,7 @@ list-add.png document-save.png schema-7.sql + tiny-pause.png + tiny-start.png diff --git a/data/tiny-pause.png b/data/tiny-pause.png new file mode 100644 index 0000000000000000000000000000000000000000..4940bc20fecd47085f171eacbc1d7d9e352c35dc GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf67>k44ofy`glX(f`FeQ1ryD21s-(nHwRaP`|wKo9@efD&54AD3rdhT@Z zRR;mq3(4hMZ*OCm$nelXXNiMW3zMJ#o3)DA;^PKY+iuH?`5VoPx@Nm7`t0?^vo3b} z&)?4+Zzp$OE!3#%aCiD@m7n(A>gV~IEp)_I7sMRMGFm7ax^+d_Z^`pwn}0Lsgl%p; z-Fp08pHA7;q-iG8o7gkHBwf6*#_Tp{+3c)KQAhdr-w~DXQD2d!U-!Bv>HBs6$+Nes zSA05t_H1=~#uh7;x13UIuPK-;nke#8G{f}Jipee~s&@O?IZi5dixi7Y-=Hl%A@!)j zYnQN|GS}~1U(6N?yRNtTA|4RZ>>T7`Wc9&qr_IdXNgvMHFFg^_x9(|e6VUq%p00i_ I>zopr0QhE)KL7v# literal 0 HcmV?d00001 diff --git a/data/tiny-start.png b/data/tiny-start.png new file mode 100644 index 0000000000000000000000000000000000000000..de56e01f83164d3374fe012ed9539ad6bfcde905 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eK!2%>ZGQxU*6k~CayA#8@b22Z19Hu01cNd2L z?fqx=19_YU9+AZi46KGA%((rn2FL*R5>H=O_FF8%yowx72anzYnqcVZ;us=v*>{4i zw^O2o!}-ru`E{|ASq>_xbWF?0&}qu(>L}=1wm@~!G&_Y^Oq?-XIYNu}2e4ecrq7}H zfuDt!cbmzI()VAdy}ukVG2M2~(}K@iq?@(v0vvuG-qX`>cQ1B*pku(3_=w(RuUD&2 z7j9Pg>pH!`A%6S3X!h3yUcbXVZtm+|zp&=jbibL&jqGUxJ}w>_cKcYC<(YrUsTW(= zE^}*I$qxl5Ln{T(qO;wC1vN}gOiEK`XuOC{^e>h+O1HkW(79hkPEOM3Rpz}JdW?2< zim`SZS4c_bt?!XwpKg(PNu@xLYtn5?`KTN#y}~LB4ZXsyx3`@3T~zA!oN(l@@SetStopped(); #ifndef Q_OS_DARWIN tray_icon_->SetProgress(0); + tray_icon_->SetStopped(); #endif } @@ -503,6 +504,10 @@ void MainWindow::MediaPaused() { ui_.action_play_pause->setEnabled(true); track_position_timer_->stop(); + +#ifndef Q_OS_DARWIN + tray_icon_->SetPaused(); +#endif } void MainWindow::MediaPlaying() { @@ -524,6 +529,10 @@ void MainWindow::MediaPlaying() { track_position_timer_->start(); UpdateTrackPosition(); + +#ifndef Q_OS_DARWIN + tray_icon_->SetPlaying(); +#endif } void MainWindow::ScrobblingEnabledChanged(bool value) { diff --git a/src/systemtrayicon.cpp b/src/systemtrayicon.cpp index 4481f317e..7df18cb03 100644 --- a/src/systemtrayicon.cpp +++ b/src/systemtrayicon.cpp @@ -24,7 +24,10 @@ #include SystemTrayIcon::SystemTrayIcon(QObject* parent) - : QSystemTrayIcon(parent) + : QSystemTrayIcon(parent), + playing_icon_(":/tiny-start.png"), + paused_icon_(":/tiny-pause.png"), + percentage_(0) { } @@ -39,6 +42,11 @@ bool SystemTrayIcon::event(QEvent* event) { } void SystemTrayIcon::SetProgress(int percentage) { + percentage_ = percentage; + Update(); +} + +void SystemTrayIcon::Update() { if (icon_.isNull()) { icon_ = icon().pixmap(geometry().size(), QIcon::Normal); grey_icon_ = icon().pixmap(geometry().size(), QIcon::Disabled); @@ -51,7 +59,7 @@ void SystemTrayIcon::SetProgress(int percentage) { // The angle of the line that's used to cover the icon. // Centered on rect.topRight() - double angle = double(100 - percentage) / 100.0 * M_PI_2 + M_PI; + double angle = double(100 - percentage_) / 100.0 * M_PI_2 + M_PI; double length = sqrt(pow(rect.width(), 2.0) + pow(rect.height(), 2.0)); QPolygon mask; @@ -60,7 +68,7 @@ void SystemTrayIcon::SetProgress(int percentage) { length * sin(angle), - length * cos(angle)); - if (percentage > 50) + if (percentage_ > 50) mask << rect.bottomLeft(); mask << rect.topLeft(); @@ -68,9 +76,37 @@ void SystemTrayIcon::SetProgress(int percentage) { QPixmap icon(icon_); QPainter p(&icon); + + // Draw the grey bit over the orange icon p.setClipRegion(mask); p.drawPixmap(0, 0, grey_icon_); + p.setClipping(false); + + // Draw the playing or paused icon in the top-right + if (!current_state_icon_.isNull()) { + int height = rect.height() / 2; + QPixmap scaled(current_state_icon_.scaledToHeight(height, Qt::SmoothTransformation)); + + QRect state_rect(rect.width() - scaled.width(), 0, scaled.width(), scaled.height()); + p.drawPixmap(state_rect, scaled); + } + p.end(); setIcon(icon); } + +void SystemTrayIcon::SetPaused() { + current_state_icon_ = paused_icon_; + Update(); +} + +void SystemTrayIcon::SetPlaying() { + current_state_icon_ = playing_icon_; + Update(); +} + +void SystemTrayIcon::SetStopped() { + current_state_icon_ = QPixmap(); + Update(); +} diff --git a/src/systemtrayicon.h b/src/systemtrayicon.h index 91d8d37a9..47c1821e1 100644 --- a/src/systemtrayicon.h +++ b/src/systemtrayicon.h @@ -30,13 +30,23 @@ class SystemTrayIcon : public QSystemTrayIcon { public slots: void SetProgress(int percentage); + void SetPaused(); + void SetPlaying(); + void SetStopped(); signals: void WheelEvent(int delta); private: + void Update(); + QPixmap icon_; QPixmap grey_icon_; + QPixmap playing_icon_; + QPixmap paused_icon_; + + int percentage_; + QPixmap current_state_icon_; }; #endif // SYSTEMTRAYICON_H