Qt: fix appicon for ISO

This commit is contained in:
Megamouse 2026-01-10 07:40:35 +01:00
parent 6bd4f52173
commit 98e64d7821
2 changed files with 49 additions and 21 deletions

View file

@ -393,27 +393,46 @@ namespace gui
std::string icon_path = fs::get_config_dir() + "/Icons/game_icons/" + title_id + "/ICON0.PNG";
bool found_file = fs::is_file(icon_path);
std::unique_ptr<QPixmap> pixmap;
if (!found_file)
{
// Get Icon for the gs_frame from path. this handles presumably all possible use cases
const QString qpath = QString::fromStdString(path);
const std::string path_list[] = { path, qpath.section("/", 0, -2, QString::SectionIncludeTrailingSep).toStdString(),
qpath.section("/", 0, -3, QString::SectionIncludeTrailingSep).toStdString() };
std::vector<std::string> path_list;
for (const std::string& pth : path_list)
const bool is_archive = is_file_iso(path);
if (is_archive)
{
if (!fs::is_dir(pth))
icon_path = "PS3_GAME/ICON0.PNG";
QPixmap px;
if (load_iso_icon(px, icon_path, path))
{
continue;
found_file = true;
pixmap = std::make_unique<QPixmap>(std::move(px));
}
}
else
{
const QString qpath = QString::fromStdString(path);
path_list = { path, qpath.section("/", 0, -2, QString::SectionIncludeTrailingSep).toStdString(),
qpath.section("/", 0, -3, QString::SectionIncludeTrailingSep).toStdString() };
const std::string sfo_dir = rpcs3::utils::get_sfo_dir_from_game_path(pth, title_id);
icon_path = sfo_dir + "/ICON0.PNG";
found_file = fs::is_file(icon_path);
if (found_file)
for (const std::string& pth : path_list)
{
break;
if (!fs::is_dir(pth))
{
continue;
}
const std::string sfo_dir = rpcs3::utils::get_sfo_dir_from_game_path(pth, title_id);
icon_path = sfo_dir + "/ICON0.PNG";
found_file = fs::is_file(icon_path);
if (found_file)
{
break;
}
}
}
}
@ -421,7 +440,7 @@ namespace gui
if (found_file)
{
// load the image from path. It will most likely be a rectangle
const QImage source = QImage(QString::fromStdString(icon_path));
const QImage source = pixmap ? pixmap->toImage() : QImage(QString::fromStdString(icon_path));
const int edge_max = std::max(source.width(), source.height());
// create a new transparent image with square size and same format as source (maybe handle other formats than RGB32 as well?)
@ -683,15 +702,9 @@ namespace gui
return QString("%1 days ago %2").arg(current_date - exctrated_date).arg(date.toString(fmt_relative));
}
bool load_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path)
bool load_iso_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path)
{
if (icon_path.empty()) return false;
if (archive_path.empty())
{
return icon.load(QString::fromStdString(icon_path));
}
if (icon_path.empty() || archive_path.empty()) return false;
if (!is_file_iso(archive_path)) return false;
iso_archive archive(archive_path);
@ -707,6 +720,18 @@ namespace gui
return icon.loadFromData(data);
}
bool load_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path)
{
if (icon_path.empty()) return false;
if (archive_path.empty())
{
return icon.load(QString::fromStdString(icon_path));
}
return load_iso_icon(icon, icon_path, archive_path);
}
QString format_timestamp(s64 time, const QString& fmt)
{
return format_datetime(datetime(time), fmt);

View file

@ -179,6 +179,9 @@ namespace gui
}
// Loads an icon from an (ISO) archive file.
bool load_iso_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path);
// Loads an icon (optionally from an (ISO) archive file).
bool load_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path);
template <typename T>