diff --git a/src/iconprovider.cpp b/src/iconprovider.cpp index cd068ea39..9e85547e5 100644 --- a/src/iconprovider.cpp +++ b/src/iconprovider.cpp @@ -58,8 +58,11 @@ void IconProvider::drop() QIcon IconProvider::getIcon(const QString &iconId) { #if defined(Q_WS_X11) && (QT_VERSION >= QT_VERSION_CHECK(4,6,0)) - if(m_useSystemTheme) - return QIcon::fromTheme(iconId, QIcon(":/Icons/oxygen/"+iconId+".png")); + if(m_useSystemTheme) { + QIcon icon = QIcon::fromTheme(iconId, QIcon(":/Icons/oxygen/"+iconId+".png")); + icon = generateDifferentSizes(icon); + return icon; + } #endif return QIcon(":/Icons/oxygen/"+iconId+".png"); } @@ -69,6 +72,31 @@ void IconProvider::useSystemIconTheme(bool enable) { m_useSystemTheme = enable; } + +QIcon IconProvider::generateDifferentSizes(const QIcon &icon) +{ + QIcon new_icon; + QList required_sizes; + required_sizes << QSize(16, 16) << QSize(24, 24); + QList modes; + modes << QIcon::Normal << QIcon::Active << QIcon::Selected << QIcon::Disabled; + foreach(const QSize& size, required_sizes) { + foreach(QIcon::Mode mode, modes) { + QPixmap pixoff = icon.pixmap(size, mode, QIcon::Off); + if(pixoff.height() > size.height()) + pixoff = pixoff.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); + new_icon.addPixmap(pixoff, mode, QIcon::Off); + Q_ASSERT(pixoff.height() <= size.height()); + QPixmap pixon = icon.pixmap(size, mode, QIcon::On); + if(pixon.height() > size.height()) + pixon = pixoff.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); + new_icon.addPixmap(pixon, mode, QIcon::On); + Q_ASSERT(pixon.height() <= size.height()); + } + Q_ASSERT(new_icon.availableSizes().contains(size)); + } + return new_icon; +} #endif QString IconProvider::getIconPath(const QString &iconId) diff --git a/src/iconprovider.h b/src/iconprovider.h index c897b6eb8..eec415330 100644 --- a/src/iconprovider.h +++ b/src/iconprovider.h @@ -52,6 +52,9 @@ public: public: void useSystemIconTheme(bool enable); +private: + QIcon generateDifferentSizes(const QIcon& icon); + private: bool m_useSystemTheme; #endif