From b3385094f9ffb3e27b75070da81c5ffbfea8e3fc Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 16 Nov 2025 00:31:43 +1000 Subject: [PATCH] Qt: Provide a central point for getting the app logo And ensure it's using high DPI. --- src/duckstation-qt/aboutdialog.cpp | 2 ++ src/duckstation-qt/aboutdialog.ui | 19 ++++++------------ src/duckstation-qt/achievementlogindialog.cpp | 2 +- src/duckstation-qt/gamelistwidget.cpp | 11 +++++----- src/duckstation-qt/gamesummarywidget.ui | 9 +-------- src/duckstation-qt/logwindow.cpp | 4 +--- src/duckstation-qt/mainwindow.cpp | 2 ++ src/duckstation-qt/mainwindow.ui | 11 ---------- src/duckstation-qt/qthost.cpp | 14 ++++++++++++- src/duckstation-qt/qthost.h | 4 ++++ src/duckstation-qt/qtutils.cpp | 18 ++++++++--------- .../resources/duckstation-qt.qrc | 3 --- src/duckstation-qt/resources/icons/duck.png | Bin 14021 -> 0 bytes .../resources/icons/duck_128.png | Bin 8478 -> 0 bytes .../resources/icons/duck_64.png | Bin 3896 -> 0 bytes src/duckstation-qt/setupwizarddialog.cpp | 8 ++------ src/duckstation-qt/setupwizarddialog.ui | 5 ----- 17 files changed, 45 insertions(+), 67 deletions(-) delete mode 100644 src/duckstation-qt/resources/icons/duck.png delete mode 100644 src/duckstation-qt/resources/icons/duck_128.png delete mode 100644 src/duckstation-qt/resources/icons/duck_64.png diff --git a/src/duckstation-qt/aboutdialog.cpp b/src/duckstation-qt/aboutdialog.cpp index b6ecc8dbf..c02102817 100644 --- a/src/duckstation-qt/aboutdialog.cpp +++ b/src/duckstation-qt/aboutdialog.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: CC-BY-NC-ND-4.0 #include "aboutdialog.h" +#include "qthost.h" #include "qtutils.h" #include "core/settings.h" @@ -22,6 +23,7 @@ AboutDialog::AboutDialog(QWidget* parent /* = nullptr */) : QDialog(parent) { m_ui.setupUi(this); + m_ui.icon->setPixmap(QtHost::GetAppLogo()); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setFixedSize(geometry().width(), geometry().height()); diff --git a/src/duckstation-qt/aboutdialog.ui b/src/duckstation-qt/aboutdialog.ui index 925b639fa..36f238058 100644 --- a/src/duckstation-qt/aboutdialog.ui +++ b/src/duckstation-qt/aboutdialog.ui @@ -13,16 +13,12 @@ About DuckStation - - - :/icons/duck.png:/icons/duck.png - - QLayout::SetDefaultConstraint + QLayout::SizeConstraint::SetDefaultConstraint 1 @@ -47,18 +43,18 @@ - - :/icons/duck.png + + true - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter - Qt::Vertical + Qt::Orientation::Vertical @@ -93,7 +89,6 @@ 14 - 50 false @@ -120,8 +115,6 @@ - - - + diff --git a/src/duckstation-qt/achievementlogindialog.cpp b/src/duckstation-qt/achievementlogindialog.cpp index 62c5ab4bc..f2aeae7db 100644 --- a/src/duckstation-qt/achievementlogindialog.cpp +++ b/src/duckstation-qt/achievementlogindialog.cpp @@ -14,7 +14,7 @@ AchievementLoginDialog::AchievementLoginDialog(QWidget* parent, Achievements::Lo : QDialog(parent), m_reason(reason) { m_ui.setupUi(this); - m_ui.iconLabel->setPixmap(QPixmap(QString::fromStdString(QtHost::GetResourcePath("images/ra-icon.webp", true)))); + m_ui.iconLabel->setPixmap(QPixmap(QtHost::GetResourceQPath("images/ra-icon.webp", true))); QFont title_font(m_ui.titleLabel->font()); title_font.setBold(true); title_font.setPixelSize(20); diff --git a/src/duckstation-qt/gamelistwidget.cpp b/src/duckstation-qt/gamelistwidget.cpp index 5e02d5d21..26d439bb4 100644 --- a/src/duckstation-qt/gamelistwidget.cpp +++ b/src/duckstation-qt/gamelistwidget.cpp @@ -643,7 +643,7 @@ const QPixmap& GameListModel::getFlagPixmapForEntry(const GameList::Entry* ge) c if (it != m_flag_pixmap_cache.end()) return it->second; - const QIcon icon(QString::fromStdString(QtHost::GetResourcePath(ge->GetLanguageIconName(), true))); + const QIcon icon(QtHost::GetResourceQPath(ge->GetLanguageIconName(), true)); it = m_flag_pixmap_cache.emplace(name, icon.pixmap(FLAG_PIXMAP_SIZE, m_device_pixel_ratio)).first; return it->second; } @@ -1267,13 +1267,12 @@ void GameListModel::loadCommonImages() .pixmap(COMPATIBILITY_PIXMAP_SIZE, m_device_pixel_ratio); } - m_no_achievements_pixmap = QIcon(QString::fromStdString(QtHost::GetResourcePath("images/trophy-icon-gray.svg", true))) + m_no_achievements_pixmap = QIcon(QtHost::GetResourceQPath("images/trophy-icon-gray.svg", true)) .pixmap(ACHIEVEMENT_PIXMAP_SIZE, m_device_pixel_ratio); - m_has_achievements_pixmap = QIcon(QString::fromStdString(QtHost::GetResourcePath("images/trophy-icon.svg", true))) + m_has_achievements_pixmap = QIcon(QtHost::GetResourceQPath("images/trophy-icon.svg", true)) .pixmap(ACHIEVEMENT_PIXMAP_SIZE, m_device_pixel_ratio); - m_mastered_achievements_pixmap = - QIcon(QString::fromStdString(QtHost::GetResourcePath("images/trophy-icon-star.svg", true))) - .pixmap(ACHIEVEMENT_PIXMAP_SIZE, m_device_pixel_ratio); + m_mastered_achievements_pixmap = QIcon(QtHost::GetResourceQPath("images/trophy-icon-star.svg", true)) + .pixmap(ACHIEVEMENT_PIXMAP_SIZE, m_device_pixel_ratio); } class GameListSortModel final : public QSortFilterProxyModel diff --git a/src/duckstation-qt/gamesummarywidget.ui b/src/duckstation-qt/gamesummarywidget.ui index fcd2c4c15..df529b1ab 100644 --- a/src/duckstation-qt/gamesummarywidget.ui +++ b/src/duckstation-qt/gamesummarywidget.ui @@ -10,13 +10,6 @@ 562 - - Dialog - - - - :/icons/duck.png:/icons/duck.png - 0 @@ -52,7 +45,7 @@ - + diff --git a/src/duckstation-qt/logwindow.cpp b/src/duckstation-qt/logwindow.cpp index fec2350bd..1a0aeffde 100644 --- a/src/duckstation-qt/logwindow.cpp +++ b/src/duckstation-qt/logwindow.cpp @@ -110,9 +110,7 @@ void LogWindow::updateWindowTitle() void LogWindow::createUi() { - QIcon icon; - icon.addFile(QString::fromUtf8(":/icons/duck.png"), QSize(), QIcon::Normal, QIcon::Off); - setWindowIcon(icon); + setWindowIcon(QIcon::fromTheme(QStringLiteral("file-list-line"))); setWindowFlag(Qt::CustomizeWindowHint, true); setWindowFlag(Qt::WindowCloseButtonHint, false); updateWindowTitle(); diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp index f4bd4fd87..a00ab968e 100644 --- a/src/duckstation-qt/mainwindow.cpp +++ b/src/duckstation-qt/mainwindow.cpp @@ -1893,6 +1893,8 @@ void MainWindow::setupAdditionalUi() m_status_vps_widget->setFixedSize(150, 16); m_status_vps_widget->hide(); + m_ui.actionAbout->setIcon(QtHost::GetAppIcon()); + m_settings_toolbar_menu = new QMenu(m_ui.toolBar); QtUtils::StylePopupMenu(m_settings_toolbar_menu); m_settings_toolbar_menu->addAction(m_ui.actionSettings); diff --git a/src/duckstation-qt/mainwindow.ui b/src/duckstation-qt/mainwindow.ui index 7933b7989..c9a115553 100644 --- a/src/duckstation-qt/mainwindow.ui +++ b/src/duckstation-qt/mainwindow.ui @@ -13,13 +13,6 @@ true - - DuckStation - - - - :/icons/duck.png:/icons/duck.png - true @@ -581,10 +574,6 @@ - - - :/icons/duck_64.png:/icons/duck_64.png - &About DuckStation... diff --git a/src/duckstation-qt/qthost.cpp b/src/duckstation-qt/qthost.cpp index 0008bd0ee..2992272ed 100644 --- a/src/duckstation-qt/qthost.cpp +++ b/src/duckstation-qt/qthost.cpp @@ -412,6 +412,13 @@ const QIcon& QtHost::GetAppIcon() return s_state.app_icon; } +QPixmap QtHost::GetAppLogo() +{ + QPixmap pm(GetResourceQPath("images/duck.png", true)); + pm.setDevicePixelRatio(qApp->devicePixelRatio()); + return pm; +} + std::optional QtHost::DownloadFile(QWidget* parent, const QString& title, std::string url, std::vector* data) { static constexpr u32 HTTP_POLL_INTERVAL = 10; @@ -637,7 +644,7 @@ bool QtHost::SetDataDirectory() void QtHost::LoadResources() { - s_state.app_icon = QIcon(QStringLiteral(":/icons/duck.png")); + s_state.app_icon = QIcon(GetResourceQPath("images/duck.png", true)); } void Host::LoadSettings(const SettingsInterface& si, std::unique_lock& lock) @@ -2761,6 +2768,11 @@ std::string QtHost::GetResourcePath(std::string_view filename, bool allow_overri Path::Combine(EmuFolders::Resources, filename); } +QString QtHost::GetResourceQPath(std::string_view name, bool allow_override) +{ + return QString::fromStdString(GetResourcePath(name, allow_override)); +} + const QStringList& QtHost::GetRobotoFontFamilies() { std::call_once(s_state.roboto_font_once_flag, []() { diff --git a/src/duckstation-qt/qthost.h b/src/duckstation-qt/qthost.h index b59cb3815..53e5270ee 100644 --- a/src/duckstation-qt/qthost.h +++ b/src/duckstation-qt/qthost.h @@ -384,11 +384,15 @@ QString GetAppConfigSuffix(); /// Returns the main application icon. const QIcon& GetAppIcon(); +/// Returns a higher resolution logo for the application. +QPixmap GetAppLogo(); + /// Returns the base path for resources. This may be : prefixed, if we're using embedded resources. QString GetResourcesBasePath(); /// Returns the path to the specified resource. std::string GetResourcePath(std::string_view name, bool allow_override); +QString GetResourceQPath(std::string_view name, bool allow_override); /// Returns the font family for the bundled Roboto font. const QStringList& GetRobotoFontFamilies(); diff --git a/src/duckstation-qt/qtutils.cpp b/src/duckstation-qt/qtutils.cpp index b86ce98fc..eb0375899 100644 --- a/src/duckstation-qt/qtutils.cpp +++ b/src/duckstation-qt/qtutils.cpp @@ -386,13 +386,13 @@ QIcon QtUtils::GetIconForRegion(ConsoleRegion region) switch (region) { case ConsoleRegion::NTSC_J: - return QIcon(QString::fromStdString(QtHost::GetResourcePath("images/flags/NTSC-J.svg", true))); + return QIcon(QtHost::GetResourceQPath("images/flags/NTSC-J.svg", true)); case ConsoleRegion::NTSC_U: - return QIcon(QString::fromStdString(QtHost::GetResourcePath("images/flags/NTSC-U.svg", true))); + return QIcon(QtHost::GetResourceQPath("images/flags/NTSC-U.svg", true)); case ConsoleRegion::PAL: - return QIcon(QString::fromStdString(QtHost::GetResourcePath("images/flags/PAL.svg", true))); + return QIcon(QtHost::GetResourceQPath("images/flags/PAL.svg", true)); case ConsoleRegion::Auto: return QIcon(QStringLiteral(":/icons/system-search.png")); @@ -407,13 +407,13 @@ QIcon QtUtils::GetIconForRegion(DiscRegion region) switch (region) { case DiscRegion::NTSC_J: - return QIcon(QString::fromStdString(QtHost::GetResourcePath("images/flags/NTSC-J.svg", true))); + return QIcon(QtHost::GetResourceQPath("images/flags/NTSC-J.svg", true)); case DiscRegion::NTSC_U: - return QIcon(QString::fromStdString(QtHost::GetResourcePath("images/flags/NTSC-U.svg", true))); + return QIcon(QtHost::GetResourceQPath("images/flags/NTSC-U.svg", true)); case DiscRegion::PAL: - return QIcon(QString::fromStdString(QtHost::GetResourcePath("images/flags/PAL.svg", true))); + return QIcon(QtHost::GetResourceQPath("images/flags/PAL.svg", true)); case DiscRegion::Other: case DiscRegion::NonPS1: @@ -442,14 +442,12 @@ QIcon QtUtils::GetIconForEntryType(GameList::EntryType type) QIcon QtUtils::GetIconForCompatibility(GameDatabase::CompatibilityRating rating) { - return QIcon(QString::fromStdString( - QtHost::GetResourcePath(TinyString::from_format("images/star-{}.svg", static_cast(rating)), true))); + return QIcon(QtHost::GetResourceQPath(TinyString::from_format("images/star-{}.svg", static_cast(rating)), true)); } QIcon QtUtils::GetIconForLanguage(std::string_view language_name) { - return QIcon( - QString::fromStdString(QtHost::GetResourcePath(GameDatabase::GetLanguageFlagResourceName(language_name), true))); + return QIcon(QtHost::GetResourceQPath(GameDatabase::GetLanguageFlagResourceName(language_name), true)); } template diff --git a/src/duckstation-qt/resources/duckstation-qt.qrc b/src/duckstation-qt/resources/duckstation-qt.qrc index 76e75a987..059e14087 100644 --- a/src/duckstation-qt/resources/duckstation-qt.qrc +++ b/src/duckstation-qt/resources/duckstation-qt.qrc @@ -153,9 +153,6 @@ icons/drive-optical@2x.png icons/drive-removable-media.png icons/drive-removable-media@2x.png - icons/duck.png - icons/duck_128.png - icons/duck_64.png icons/edit-clear-16.png icons/edit-clear-16@2x.png icons/edit-find.png diff --git a/src/duckstation-qt/resources/icons/duck.png b/src/duckstation-qt/resources/icons/duck.png deleted file mode 100644 index c78869e43d6c980ea7e051ff9bed5a1ea5190591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14021 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 - QPixmap(QString::fromUtf8(Path::Combine(EmuFolders::Resources, "images" FS_OSPATH_SEPARATOR_STR "duck.png")))); - + m_ui.logo->setPixmap(QtHost::GetAppLogo()); m_ui.pages->setCurrentIndex(0); m_page_labels[Page_Language] = m_ui.labelLanguage; @@ -569,8 +566,7 @@ void SetupWizardDialog::setupAchievementsPage(bool initial) { if (initial) { - m_ui.achievementsIconLabel->setPixmap( - QPixmap(QString::fromStdString(QtHost::GetResourcePath("images/ra-icon.webp", true)))); + m_ui.achievementsIconLabel->setPixmap(QPixmap(QtHost::GetResourceQPath("images/ra-icon.webp", true))); QFont title_font(m_ui.achievementsTitleLabel->font()); title_font.setBold(true); title_font.setPixelSize(20); diff --git a/src/duckstation-qt/setupwizarddialog.ui b/src/duckstation-qt/setupwizarddialog.ui index 865ab8c10..47ec24da1 100644 --- a/src/duckstation-qt/setupwizarddialog.ui +++ b/src/duckstation-qt/setupwizarddialog.ui @@ -13,11 +13,6 @@ DuckStation Setup Wizard - - - :/icons/duck.png - - 10