diff --git a/pcsx2-qt/CoverDownloadDialog.cpp b/pcsx2-qt/CoverDownloadDialog.cpp index ae456610c3..48a083d09c 100644 --- a/pcsx2-qt/CoverDownloadDialog.cpp +++ b/pcsx2-qt/CoverDownloadDialog.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-3.0+ #include "CoverDownloadDialog.h" +#include "QtUtils.h" #include "pcsx2/GameList.h" @@ -11,7 +12,7 @@ CoverDownloadDialog::CoverDownloadDialog(QWidget* parent /*= nullptr*/) : QDialog(parent) { m_ui.setupUi(this); - m_ui.coverIcon->setPixmap(QIcon::fromTheme("artboard-2-line").pixmap(32)); + QtUtils::SetScalableIcon(m_ui.coverIcon, QIcon::fromTheme(QStringLiteral("artboard-2-line")), QSize(32, 32)); updateEnabled(); connect(m_ui.start, &QPushButton::clicked, this, &CoverDownloadDialog::onStartClicked); diff --git a/pcsx2-qt/QtUtils.cpp b/pcsx2-qt/QtUtils.cpp index 9c7a83db3c..d5eb1f1267 100644 --- a/pcsx2-qt/QtUtils.cpp +++ b/pcsx2-qt/QtUtils.cpp @@ -374,4 +374,37 @@ namespace QtUtils return true; } + + class IconVariableDpiFilter : QObject + { + public: + explicit IconVariableDpiFilter(QLabel* lbl, const QIcon& icon, const QSize& size, QObject* parent = nullptr) + : QObject(parent) + , m_lbl{lbl} + , m_icn{icon} + , m_size{size} + { + lbl->installEventFilter(this); + m_lbl->setPixmap(m_icn.pixmap(m_size, m_lbl->devicePixelRatioF())); + } + + protected: + bool eventFilter(QObject* object, QEvent* event) override + { + if (object == m_lbl && event->type() == QEvent::DevicePixelRatioChange) + m_lbl->setPixmap(m_icn.pixmap(m_size, m_lbl->devicePixelRatioF())); + // Don't block the event + return false; + } + + private: + QLabel* m_lbl; + QIcon m_icn; + QSize m_size; + }; + + void SetScalableIcon(QLabel* lbl, const QIcon& icon, const QSize& size) + { + new IconVariableDpiFilter(lbl, icon, size, lbl); + } } // namespace QtUtils diff --git a/pcsx2-qt/QtUtils.h b/pcsx2-qt/QtUtils.h index fd590231d7..28485e6cdb 100644 --- a/pcsx2-qt/QtUtils.h +++ b/pcsx2-qt/QtUtils.h @@ -20,6 +20,7 @@ class QAction; class QComboBox; class QFileInfo; class QFrame; +class QIcon; class QLabel; class QKeyEvent; class QSlider; @@ -102,4 +103,8 @@ namespace QtUtils bool IsLightTheme(const QPalette& palette); bool IsCompositorManagerRunning(); + + /// Sets the scalable icon to a given label (svg icons, or icons with multiple size pixmaps) + /// The icon will then be reloaded on DPR changes using an event filter + void SetScalableIcon(QLabel* lbl, const QIcon& icon, const QSize& size); } // namespace QtUtils diff --git a/pcsx2-qt/Settings/AchievementLoginDialog.cpp b/pcsx2-qt/Settings/AchievementLoginDialog.cpp index 711be01d71..db4ba84a3d 100644 --- a/pcsx2-qt/Settings/AchievementLoginDialog.cpp +++ b/pcsx2-qt/Settings/AchievementLoginDialog.cpp @@ -3,6 +3,7 @@ #include "AchievementLoginDialog.h" #include "QtHost.h" +#include "QtUtils.h" #include "pcsx2/Achievements.h" @@ -15,7 +16,7 @@ AchievementLoginDialog::AchievementLoginDialog(QWidget* parent, Achievements::Lo , m_reason(reason) { m_ui.setupUi(this); - m_ui.loginIcon->setPixmap(QIcon::fromTheme("login-box-line").pixmap(32)); + QtUtils::SetScalableIcon(m_ui.loginIcon, QIcon::fromTheme(QStringLiteral("login-box-line")), QSize(32, 32)); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); // Adjust text if needed based on reason. @@ -116,7 +117,6 @@ void AchievementLoginDialog::processLoginResult(bool result, const QString& mess g_emu_thread->resetVM(); } } - } done(0); diff --git a/pcsx2-qt/Settings/AudioSettingsWidget.cpp b/pcsx2-qt/Settings/AudioSettingsWidget.cpp index bb12d20f54..24bd6b46e1 100644 --- a/pcsx2-qt/Settings/AudioSettingsWidget.cpp +++ b/pcsx2-qt/Settings/AudioSettingsWidget.cpp @@ -342,7 +342,7 @@ void AudioSettingsWidget::onExpansionSettingsClicked() QDialog dlg(QtUtils::GetRootWidget(this)); Ui::AudioExpansionSettingsDialog dlgui; dlgui.setupUi(&dlg); - dlgui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("volume-up-line")).pixmap(32, 32)); + QtUtils::SetScalableIcon(dlgui.icon, QIcon::fromTheme(QStringLiteral("volume-up-line")), QSize(32, 32)); SettingsInterface* sif = m_dialog->getSettingsInterface(); SettingWidgetBinder::BindWidgetToIntSetting(sif, dlgui.blockSize, "SPU2/Output", "ExpandBlockSize", @@ -431,7 +431,7 @@ void AudioSettingsWidget::onStretchSettingsClicked() QDialog dlg(QtUtils::GetRootWidget(this)); Ui::AudioStretchSettingsDialog dlgui; dlgui.setupUi(&dlg); - dlgui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("volume-up-line")).pixmap(32, 32)); + QtUtils::SetScalableIcon(dlgui.icon, QIcon::fromTheme(QStringLiteral("volume-up-line")), QSize(32, 32)); SettingsInterface* sif = m_dialog->getSettingsInterface(); SettingWidgetBinder::BindWidgetToIntSetting(sif, dlgui.sequenceLength, "SPU2/Output", "StretchSequenceLengthMS", diff --git a/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.cpp b/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.cpp index 8b1b3e10cf..1e81f7871d 100644 --- a/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.cpp +++ b/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.cpp @@ -170,7 +170,7 @@ ControllerMouseSettingsDialog::ControllerMouseSettingsDialog(QWidget* parent, Co SettingsInterface* sif = dialog->getProfileSettingsInterface(); - m_ui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("mouse-line")).pixmap(32, 32)); + QtUtils::SetScalableIcon(m_ui.icon, QIcon::fromTheme(QStringLiteral("mouse-line")), QSize(32, 32)); ControllerSettingWidgetBinder::BindWidgetToInputProfileFloat(sif, m_ui.pointerXSpeedSlider, "Pad", "PointerXSpeed", 40.0f); ControllerSettingWidgetBinder::BindWidgetToInputProfileFloat(sif, m_ui.pointerYSpeedSlider, "Pad", "PointerYSpeed", 40.0f); @@ -202,11 +202,10 @@ ControllerMappingSettingsDialog::ControllerMappingSettingsDialog(ControllerSetti SettingsInterface* sif = parent->getProfileSettingsInterface(); - m_ui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("settings-3-line")).pixmap(32, 32)); + QtUtils::SetScalableIcon(m_ui.icon, QIcon::fromTheme(QStringLiteral("settings-3-line")), QSize(32, 32)); ControllerSettingWidgetBinder::BindWidgetToInputProfileBool(sif, m_ui.ignoreInversion, "InputSources", "IgnoreInversion", false); connect(m_ui.buttonBox->button(QDialogButtonBox::Close), &QPushButton::clicked, this, &QDialog::accept); } - ControllerMappingSettingsDialog::~ControllerMappingSettingsDialog() = default; diff --git a/pcsx2-qt/Settings/MemoryCardCreateDialog.cpp b/pcsx2-qt/Settings/MemoryCardCreateDialog.cpp index 024295de56..2fe3452158 100644 --- a/pcsx2-qt/Settings/MemoryCardCreateDialog.cpp +++ b/pcsx2-qt/Settings/MemoryCardCreateDialog.cpp @@ -9,6 +9,7 @@ #include #include "Settings/MemoryCardCreateDialog.h" +#include "QtUtils.h" #include "pcsx2/SIO/Memcard/MemoryCardFile.h" @@ -16,7 +17,7 @@ MemoryCardCreateDialog::MemoryCardCreateDialog(QWidget* parent /* = nullptr */) : QDialog(parent) { m_ui.setupUi(this); - m_ui.icon->setPixmap(QIcon::fromTheme("memcard-line").pixmap(m_ui.icon->width())); + QtUtils::SetScalableIcon(m_ui.icon, QIcon::fromTheme(QStringLiteral("memcard-line")), QSize(m_ui.icon->width(), m_ui.icon->width())); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);