From da6e7c11dc9e387d8cf0009f91c966a3788a98d9 Mon Sep 17 00:00:00 2001 From: Rokas Kupstys Date: Sun, 1 Oct 2017 12:13:10 +0300 Subject: [PATCH] Fixes #50. On KDE desktop icon failed to appear because TrayIcon requested a zero-size rect. Implementing MsgCountComposedIcon::availableSizes() method fixes that. After icon became visible it was not transparent, and places that should have been transparent contained artifacts likely due to uninitialized memory. Implementing MsgCountComposedIcon::pixmap() which returns a pixmap with alpha channel fixes that. --- include/TrayIcon.h | 2 ++ src/TrayIcon.cc | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/TrayIcon.h b/include/TrayIcon.h index 2c9020c1..dec3063b 100644 --- a/include/TrayIcon.h +++ b/include/TrayIcon.h @@ -32,6 +32,8 @@ public: virtual void paint(QPainter *p, const QRect &rect, QIcon::Mode mode, QIcon::State state); virtual QIconEngine *clone() const; + virtual QList availableSizes(QIcon::Mode mode, QIcon::State state) const; + virtual QPixmap pixmap(const QSize& size, QIcon::Mode mode, QIcon::State state); int msgCount = 0; diff --git a/src/TrayIcon.cc b/src/TrayIcon.cc index a9e897d8..8d3dc99f 100644 --- a/src/TrayIcon.cc +++ b/src/TrayIcon.cc @@ -17,6 +17,7 @@ #include #include +#include #include "TrayIcon.h" @@ -72,6 +73,34 @@ MsgCountComposedIcon::clone() const return new MsgCountComposedIcon(*this); } +QList +MsgCountComposedIcon::availableSizes(QIcon::Mode mode, QIcon::State state) const +{ + Q_UNUSED(mode); + Q_UNUSED(state); + QList sizes; + sizes.append(QSize(24, 24)); + sizes.append(QSize(32, 32)); + sizes.append(QSize(48, 48)); + sizes.append(QSize(64, 64)); + sizes.append(QSize(128, 128)); + sizes.append(QSize(256, 256)); + return sizes; +} + +QPixmap +MsgCountComposedIcon::pixmap(const QSize& size, QIcon::Mode mode, QIcon::State state) +{ + QImage img(size, QImage::Format_ARGB32); + img.fill(qRgba(0, 0, 0, 0)); + QPixmap result = QPixmap::fromImage(img, Qt::NoFormatConversion); + { + QPainter painter(&result); + paint(&painter, QRect(QPoint(0, 0), size), mode, state); + } + return result; +} + TrayIcon::TrayIcon(const QString &filename, QWidget *parent) : QSystemTrayIcon(parent) {