Qt: Show error if any package is corrupt before installation

This commit is contained in:
Megamouse
2026-04-09 08:54:36 +02:00
parent 1d85de6236
commit e9fb3572f9
+46 -24
View File
@@ -27,14 +27,22 @@ enum Roles
pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibility* compat, QWidget* parent) pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibility* compat, QWidget* parent)
: QDialog(parent) : QDialog(parent)
{ {
ensure(!paths.empty());
setWindowTitle(tr("PKG Installation"));
setObjectName("pkg_install_dialog");
m_dir_list = new QListWidget(this); m_dir_list = new QListWidget(this);
m_dir_list->setItemDelegate(new richtext_item_delegate(m_dir_list->itemDelegate())); m_dir_list->setItemDelegate(new richtext_item_delegate(m_dir_list->itemDelegate()));
QStringList corrupt_paths;
for (const QString& path : paths) for (const QString& path : paths)
{ {
const compat::package_info info = game_compatibility::GetPkgInfo(path, compat); const compat::package_info info = game_compatibility::GetPkgInfo(path, compat);
if (!info.is_valid) if (!info.is_valid)
{ {
corrupt_paths << path;
continue; continue;
} }
@@ -44,12 +52,14 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil
QString accumulated_info; QString accumulated_info;
QString tooltip; QString tooltip;
const auto append_comma = [&accumulated_info]() const auto append_info = [&accumulated_info](const QString& info)
{ {
if (!accumulated_info.isEmpty()) if (!accumulated_info.isEmpty())
{ {
accumulated_info += ", "; accumulated_info += ", ";
} }
accumulated_info += info;
}; };
if (!info.title_id.isEmpty()) if (!info.title_id.isEmpty())
@@ -59,27 +69,23 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil
if (info.type != compat::package_type::other) if (info.type != compat::package_type::other)
{ {
append_comma();
if (info.type == compat::package_type::dlc) if (info.type == compat::package_type::dlc)
{ {
accumulated_info += tr("DLC", "Package type info (DLC)"); append_info(tr("DLC", "Package type info (DLC)"));
} }
else else
{ {
accumulated_info += tr("Update", "Package type info (Update)"); append_info(tr("Update", "Package type info (Update)"));
} }
} }
else if (!info.local_cat.isEmpty()) else if (!info.local_cat.isEmpty())
{ {
append_comma(); append_info(info.local_cat);
accumulated_info += info.local_cat;
} }
if (!info.version.isEmpty()) if (!info.version.isEmpty())
{ {
append_comma(); append_info(tr("v.%0", "Version info").arg(info.version));
accumulated_info += tr("v.%0", "Version info").arg(info.version);
} }
if (info.changelog.isEmpty()) if (info.changelog.isEmpty())
@@ -91,8 +97,7 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil
tooltip = tr("Changelog:\n\n%0", "Changelog info").arg(info.changelog); tooltip = tr("Changelog:\n\n%0", "Changelog info").arg(info.changelog);
} }
append_comma(); append_info(file_info.fileName());
accumulated_info += file_info.fileName();
const QString text = tr("<b>%0</b> (%1) - %2", "Package text").arg(info.title.simplified()) const QString text = tr("<b>%0</b> (%1) - %2", "Package text").arg(info.title.simplified())
.arg(accumulated_info).arg(gui::utils::format_byte_size(info.data_size)); .arg(accumulated_info).arg(gui::utils::format_byte_size(info.data_size));
@@ -107,18 +112,8 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil
item->setToolTip(tooltip); item->setToolTip(tooltip);
} }
m_dir_list->sortItems();
m_dir_list->setCurrentRow(0);
m_dir_list->setMinimumWidth((m_dir_list->sizeHintForColumn(0) * 125) / 100);
// Create contextual label (updated in connect(m_dir_list, &QListWidget::itemChanged ...))
QLabel* installation_info = new QLabel();
installation_info->setTextFormat(Qt::RichText); // Support HTML tags
// Create buttons // Create buttons
QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); QDialogButtonBox* buttons = new QDialogButtonBox(corrupt_paths.isEmpty() ? (QDialogButtonBox::Cancel | QDialogButtonBox::Ok) : QDialogButtonBox::Cancel);
buttons->button(QDialogButtonBox::Ok)->setText(tr("Install"));
buttons->button(QDialogButtonBox::Ok)->setDefault(true);
connect(buttons, &QDialogButtonBox::clicked, this, [this, buttons](QAbstractButton* button) connect(buttons, &QDialogButtonBox::clicked, this, [this, buttons](QAbstractButton* button)
{ {
@@ -132,6 +127,35 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil
} }
}); });
if (!corrupt_paths.isEmpty())
{
m_dir_list->hide();
QString text = tr("Can not install packages. The following packages seem to be corrupt:") + "\n";
for (const QString& path : corrupt_paths)
{
text += "\n" + path;
}
QVBoxLayout* vbox = new QVBoxLayout;
vbox->addWidget(new QLabel(text));
vbox->addWidget(buttons);
setLayout(vbox);
return;
}
buttons->button(QDialogButtonBox::Ok)->setText(tr("Install"));
buttons->button(QDialogButtonBox::Ok)->setDefault(true);
m_dir_list->sortItems();
m_dir_list->setCurrentRow(0);
m_dir_list->setMinimumWidth((m_dir_list->sizeHintForColumn(0) * 125) / 100);
// Create contextual label (updated in connect(m_dir_list, &QListWidget::itemChanged ...))
QLabel* installation_info = new QLabel();
installation_info->setTextFormat(Qt::RichText); // Support HTML tags
QHBoxLayout* hbox = nullptr; QHBoxLayout* hbox = nullptr;
if (m_dir_list->count() > 1) if (m_dir_list->count() > 1)
{ {
@@ -210,8 +234,6 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil
vbox->addWidget(buttons); vbox->addWidget(buttons);
setLayout(vbox); setLayout(vbox);
setWindowTitle(tr("PKG Installation"));
setObjectName("pkg_install_dialog");
update_info(installation_info, buttons); // Just to show and check available and required size update_info(installation_info, buttons); // Just to show and check available and required size
} }