// Copyright 2022 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "DolphinQt/NANDRepairDialog.h" #include #include #include #include #include #include #include #include #include #include #include #include "Common/StringUtil.h" #include "Core/ConfigManager.h" #include "Core/TitleDatabase.h" #include "Core/WiiUtils.h" #include "DiscIO/WiiSaveBanner.h" #include "DolphinQt/Resources.h" NANDRepairDialog::NANDRepairDialog(const WiiUtils::NANDCheckResult& result, QWidget* parent) : QDialog(parent) { setWindowTitle(tr("NAND Check")); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowIcon(Resources::GetAppIcon()); QVBoxLayout* main_layout = new QVBoxLayout(); QLabel* damaged_label = new QLabel(tr("The emulated NAND is damaged. System titles such as the Wii Menu and " "the Wii Shop Channel may not work correctly.")); damaged_label->setWordWrap(true); main_layout->addWidget(damaged_label); if (!result.titles_to_remove.empty()) { QLabel* warning_label = new QLabel(tr("WARNING: Fixing this NAND requires the deletion of titles that have " "incomplete data on the NAND, including all associated save data. " "By continuing, the following title(s) will be removed:")); warning_label->setWordWrap(true); main_layout->addWidget(warning_label); std::string title_listings; Core::TitleDatabase title_db; const DiscIO::Language language = SConfig::GetInstance().GetCurrentLanguage(true); for (const u64 title_id : result.titles_to_remove) { title_listings += fmt::format("{:016x}", title_id); const std::string database_name = title_db.GetChannelName(title_id, language); if (!database_name.empty()) { title_listings += " - " + database_name; } else { DiscIO::WiiSaveBanner banner(title_id); if (banner.IsValid()) { title_listings += " - " + banner.GetName(); const std::string description = banner.GetDescription(); if (!StripWhitespace(description).empty()) title_listings += " - " + description; } } title_listings += "\n"; } QPlainTextEdit* title_box = new QPlainTextEdit(QString::fromStdString(title_listings)); title_box->setReadOnly(true); main_layout->addWidget(title_box); QLabel* maybe_fix_label = new QLabel(tr("Launching these titles may also fix the issues.")); maybe_fix_label->setWordWrap(true); main_layout->addWidget(maybe_fix_label); } QLabel* question_label = new QLabel(tr("Do you want to try to repair the NAND?")); question_label->setWordWrap(true); main_layout->addWidget(question_label); QDialogButtonBox* button_box = new QDialogButtonBox(QDialogButtonBox::Yes | QDialogButtonBox::No); main_layout->addWidget(button_box); QHBoxLayout* top_layout = new QHBoxLayout(); QIcon icon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxWarning); QLabel* icon_label = new QLabel; icon_label->setPixmap(icon.pixmap(100)); icon_label->setAlignment(Qt::AlignTop); top_layout->addWidget(icon_label); top_layout->addSpacing(10); top_layout->addLayout(main_layout); setLayout(top_layout); resize(600, 400); connect(button_box->button(QDialogButtonBox::Yes), &QPushButton::clicked, this, &QDialog::accept); connect(button_box->button(QDialogButtonBox::No), &QPushButton::clicked, this, &QDialog::reject); }