diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set (QT_MIN_VERSION "5.7.0") -set (KF5_MIN_VERSION "5.41.0") +set (KF5_MIN_VERSION "5.48.0") set (PA_MIN_VERSION "0.9.16") find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE) diff --git a/apps/kmix.cpp b/apps/kmix.cpp --- a/apps/kmix.cpp +++ b/apps/kmix.cpp @@ -267,8 +267,8 @@ // runs with 4 fixed Tabs. if (!Mixer::pulseaudioPresent()) { - QPixmap cornerNewPM = KIconLoader::global()->loadIcon("tab-new", KIconLoader::Toolbar, - IconSize(KIconLoader::Toolbar)); + QPixmap cornerNewPM = KIconLoader::global()->loadScaledIcon("tab-new", KIconLoader::Toolbar, + devicePixelRatioF(), IconSize(KIconLoader::Toolbar)); QPushButton* _cornerLabelNew = new QPushButton(); _cornerLabelNew->setIcon(cornerNewPM); _cornerLabelNew->setToolTip(i18n("Add new view")); diff --git a/apps/main.cpp b/apps/main.cpp --- a/apps/main.cpp +++ b/apps/main.cpp @@ -35,6 +35,8 @@ int main(int argc, char *argv[]) { + QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); + QApplication qapp(argc, argv); KLocalizedString::setApplicationDomain("kmix"); diff --git a/gui/dialogselectmaster.cpp b/gui/dialogselectmaster.cpp --- a/gui/dialogselectmaster.cpp +++ b/gui/dialogselectmaster.cpp @@ -174,7 +174,7 @@ if (msetCount > 0 && !mixer->isDynamic()) { QString mdName = i18n("Automatic (%1 recommendation)", mixer->getDriverName()); - QPixmap icon = KIconLoader::global()->loadIcon("audio-volume-high", KIconLoader::Small, IconSize(KIconLoader::Small)); + QPixmap icon = KIconLoader::global()->loadScaledIcon("audio-volume-high", KIconLoader::Small, devicePixelRatioF(), IconSize(KIconLoader::Small)); QListWidgetItem *item = new QListWidgetItem(icon, mdName, m_channelSelector); item->setData(Qt::UserRole, QString()); // ID here: see apply(), empty String => Automatic if (masterKey.isEmpty()) @@ -188,7 +188,7 @@ if ( md->playbackVolume().hasVolume() ) { QString mdName = md->readableName(); - QPixmap icon = KIconLoader::global()->loadIcon(md->iconName(), KIconLoader::Small, IconSize(KIconLoader::Small)); + QPixmap icon = KIconLoader::global()->loadScaledIcon(md->iconName(), KIconLoader::Small, devicePixelRatioF(), IconSize(KIconLoader::Small)); QListWidgetItem *item = new QListWidgetItem(icon, mdName, m_channelSelector); item->setData(Qt::UserRole, md->id()); // ID here: see apply() if ( md->id() == masterKey ) diff --git a/gui/dialogviewconfiguration.h b/gui/dialogviewconfiguration.h --- a/gui/dialogviewconfiguration.h +++ b/gui/dialogviewconfiguration.h @@ -43,8 +43,8 @@ class DialogViewConfigurationItem : public QListWidgetItem { public: - DialogViewConfigurationItem(QListWidget *parent, QDataStream &s); - DialogViewConfigurationItem(QListWidget *parent, const QString &id, bool shown, const QString &name, int splitted, const QString &iconName); + DialogViewConfigurationItem(QListWidget *parent, qreal devicePixelRatio, QDataStream &s); + DialogViewConfigurationItem(QListWidget *parent, qreal devicePixelRatio, const QString &id, bool shown, const QString &name, int splitted, const QString &iconName); ~DialogViewConfigurationItem() = default; private: @@ -63,6 +63,7 @@ QString _name; int _splitted; QString _iconName; + qreal _devicePixelRatio; }; class DialogViewConfigurationWidget : public QListWidget diff --git a/gui/dialogviewconfiguration.cpp b/gui/dialogviewconfiguration.cpp --- a/gui/dialogviewconfiguration.cpp +++ b/gui/dialogviewconfiguration.cpp @@ -40,17 +40,18 @@ /** * Standard constructor. */ -DialogViewConfigurationItem::DialogViewConfigurationItem(QListWidget *parent, const QString &id, bool shown, const QString &name, int splitted, const QString& iconName) : - QListWidgetItem(parent), _id(id), _shown(shown), _name(name), _splitted(splitted), _iconName(iconName) +DialogViewConfigurationItem::DialogViewConfigurationItem(QListWidget *parent, qreal devicePixelRatio, const QString &id, bool shown, const QString &name, int splitted, const QString& iconName) : + QListWidgetItem(parent), _id(id), _shown(shown), _name(name), _splitted(splitted), _iconName(iconName), _devicePixelRatio(devicePixelRatio) { refreshItem(); } /** * Deserializing constructor. Used for DnD. */ -DialogViewConfigurationItem::DialogViewConfigurationItem(QListWidget *parent, QDataStream &s) +DialogViewConfigurationItem::DialogViewConfigurationItem(QListWidget *parent, qreal devicePixelRatio, QDataStream &s) : QListWidgetItem(parent) + , _devicePixelRatio(devicePixelRatio) { s >> _id; s >> _shown; @@ -65,7 +66,7 @@ { setFlags((flags() | Qt::ItemIsDragEnabled) & ~Qt::ItemIsDropEnabled); setText(_name); - setIcon(KIconLoader::global()->loadIcon( _iconName, KIconLoader::Small, IconSize(KIconLoader::Toolbar) )); + setIcon(KIconLoader::global()->loadScaledIcon( _iconName, KIconLoader::Small, _devicePixelRatio, IconSize(KIconLoader::Toolbar) )); setData(Qt::ToolTipRole, _id); // a hack. I am giving up to do it right setData(Qt::DisplayRole, _name); } @@ -123,7 +124,7 @@ if (data.isEmpty()) return false; QDataStream stream(data); - DialogViewConfigurationItem* item = new DialogViewConfigurationItem(nullptr, stream); + DialogViewConfigurationItem* item = new DialogViewConfigurationItem(nullptr, devicePixelRatioF(), stream); emit dropped(this, index, item); return true; } @@ -266,7 +267,7 @@ } //qCDebug(KMIX_LOG) << "add DialogViewConfigurationItem: " << mdName << " visible=" << mdw->isVisible() << "splitted=" << splitted; - auto *item = new DialogViewConfigurationItem(nullptr, md->id(), true, mdName, splitted, mdw->mixDevice()->iconName()); + auto *item = new DialogViewConfigurationItem(nullptr, devicePixelRatioF(), md->id(), true, mdName, splitted, mdw->mixDevice()->iconName()); if (mdw->isVisible()) _qlwActive->addItem(item); else _qlwInactive->addItem(item); } // for all MDW's diff --git a/gui/toggletoolbutton.cpp b/gui/toggletoolbutton.cpp --- a/gui/toggletoolbutton.cpp +++ b/gui/toggletoolbutton.cpp @@ -50,12 +50,12 @@ // based on MDWSlider::setIcon() -QPixmap getPixmap(const QString &name, bool small = false) +QPixmap getPixmap(const QString &name, qreal devicePixelRatio, bool small) { - QPixmap pix = KIconLoader::global()->loadIcon(name, iconLoadGroup, IconSize(iconSizeGroup)); + QPixmap pix = KIconLoader::global()->loadScaledIcon(name, iconLoadGroup, devicePixelRatio, IconSize(iconSizeGroup)); if (!pix.isNull()) // load icon, check success { // if wanting small size, scale pixmap - if (small) pix = pix.scaled(iconSmallSize, iconSmallSize); + if (small) pix = pix.scaled(QSize(iconSmallSize, iconSmallSize) * devicePixelRatio); } else qCWarning(KMIX_LOG) << "failed to load" << name; @@ -76,7 +76,7 @@ { if (mActivePixmap.isNull()) // need pixmap for active state { // only if not already tried - if (!mActiveLoaded) mActivePixmap = getPixmap(mActiveIcon, mSmallSize); + if (!mActiveLoaded) mActivePixmap = getPixmap(mActiveIcon, devicePixelRatioF(), mSmallSize); mActiveLoaded = true; // note not to try again } @@ -88,11 +88,11 @@ { if (!mInactiveIcon.isEmpty()) // inactive icon is set { - if (!mInactiveLoaded) mInactivePixmap = getPixmap(mInactiveIcon, mSmallSize); + if (!mInactiveLoaded) mInactivePixmap = getPixmap(mInactiveIcon, devicePixelRatioF(), mSmallSize); } else { // need to derive from active state - if (!mActiveLoaded) mActivePixmap = getPixmap(mActiveIcon, mSmallSize); + if (!mActiveLoaded) mActivePixmap = getPixmap(mActiveIcon, devicePixelRatioF(), mSmallSize); mActiveLoaded = true; // only if not already tried if (mActivePixmap.isNull()) qCWarning(KMIX_LOG) << "want inactive but no active available"; else @@ -124,7 +124,7 @@ */ void ToggleToolButton::setIndicatorIcon(const QString &iconName, QWidget *label, bool small) { - QPixmap pix = getPixmap(iconName, small); + QPixmap pix = getPixmap(iconName, label->devicePixelRatioF(), small); if (pix.isNull()) { qCWarning(KMIX_LOG) << "Could not get pixmap for" << iconName;