aboutsummaryrefslogtreecommitdiff
path: root/src/yuzu/user_data_migration.cpp
diff options
context:
space:
mode:
authorswurl <swurl@swurl.xyz>2025-05-11 23:58:25 +0000
committercrueter <crueter@noreply.localhost>2025-05-11 23:58:25 +0000
commit7e943732bf025bb7ead5ee3e104b88c020f9f422 (patch)
tree0f1a403b8f44190c90f9b4fab0a8de188237f735 /src/yuzu/user_data_migration.cpp
parent5bbb9eba32734219cd9b57dfeefaa028b1e8ab02 (diff)
fix a large variety of issues (#101)
- GLASM/SPIR-V mixup on Android - potential greenscreen fix (thx suyu) - save memory layout and add 10gb/12gb options - potential samsung gaming hub fix - fix layout of controller UI - fix default settings to sensible defaults. - note to TotK that you should increase memory layout - Error checking for Windows linking - fix an IDE error - improved migration system w/threading and busy indicator - disabled citron migration for now - replaced some user-facing legacy strings with eden - Added 10GB and 12GB DRAM layouts - Fix Android black screen issues - add discord link & update FAQ/Quickstart - update links in about page - add back rich presence - add Don't show again for desktop pre alpha banner - add citron warning to android and polaris to desktop Signed-off-by: swurl <swurl@swurl.xyz> Co-authored-by: Pavel Barabanov <pavelbarabanov94@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/101 Co-authored-by: swurl <swurl@swurl.xyz> Co-committed-by: swurl <swurl@swurl.xyz>
Diffstat (limited to 'src/yuzu/user_data_migration.cpp')
-rw-r--r--src/yuzu/user_data_migration.cpp173
1 files changed, 56 insertions, 117 deletions
diff --git a/src/yuzu/user_data_migration.cpp b/src/yuzu/user_data_migration.cpp
index 1946254fb2..1585695ff0 100644
--- a/src/yuzu/user_data_migration.cpp
+++ b/src/yuzu/user_data_migration.cpp
@@ -14,15 +14,17 @@
#include "migration_dialog.h"
// Needs to be included at the end due to https://bugreports.qt.io/browse/QTBUG-73263
+#include <QApplication>
#include <QButtonGroup>
#include <QCheckBox>
+#include <QProgressDialog>
#include <QRadioButton>
+#include <QThread>
#include <filesystem>
namespace fs = std::filesystem;
-UserDataMigrator::UserDataMigrator(
- QMainWindow *main_window)
+UserDataMigrator::UserDataMigrator(QMainWindow *main_window)
{
// NOTE: Logging is not initialized yet, do not produce logs here.
@@ -34,8 +36,7 @@ UserDataMigrator::UserDataMigrator(
}
}
-void UserDataMigrator::ShowMigrationPrompt(
- QMainWindow *main_window)
+void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window)
{
namespace fs = std::filesystem;
@@ -90,15 +91,15 @@ void UserDataMigrator::ShowMigrationPrompt(
// Reflection would make this code 10x better
// but for now... MACRO MADNESS!!!!
QMap<QString, bool> found;
- QMap<QString, LegacyEmu> legacyMap;
+ QMap<QString, MigrationWorker::LegacyEmu> legacyMap;
QMap<QString, QAbstractButton *> buttonMap;
#define EMU_MAP(name) \
const bool name##_found = fs::is_directory( \
Common::FS::GetLegacyPath(Common::FS::LegacyPath::name##Dir)); \
- legacyMap[main_window->tr(#name)] = LegacyEmu::name; \
- found[main_window->tr(#name)] = name##_found; \
- if (name##_found) \
+ legacyMap[main_window->tr(#name)] = MigrationWorker::LegacyEmu::name; \
+ found[main_window->tr(#name)] = name##_found; \
+ if (name##_found) \
any_found = true;
EMU_MAP(Citron)
@@ -118,7 +119,15 @@ void UserDataMigrator::ShowMigrationPrompt(
if (!iter.value())
continue;
- buttonMap[iter.key()] = migration_prompt.addButton(iter.key());
+ QAbstractButton *button = migration_prompt.addButton(iter.key());
+ // TMP: disable citron
+ if (iter.key() == main_window->tr("Citron")) {
+ button->setEnabled(false);
+ button->setToolTip(
+ main_window->tr("Citron migration is known to cause issues. It's recommended "
+ "to manually set up your data again."));
+ }
+ buttonMap[iter.key()] = button;
promptText.append(main_window->tr("\n- %1").arg(iter.key()));
}
@@ -129,13 +138,13 @@ void UserDataMigrator::ShowMigrationPrompt(
migration_prompt.exec();
- MigrationStrategy strategy;
+ MigrationWorker::MigrationStrategy strategy;
if (link->isChecked()) {
- strategy = MigrationStrategy::Link;
+ strategy = MigrationWorker::MigrationStrategy::Link;
} else if (clear_old->isChecked()) {
- strategy = MigrationStrategy::Move;
+ strategy = MigrationWorker::MigrationStrategy::Move;
} else {
- strategy = MigrationStrategy::Copy;
+ strategy = MigrationWorker::MigrationStrategy::Copy;
}
QMapIterator buttonIter(buttonMap);
@@ -159,8 +168,7 @@ void UserDataMigrator::ShowMigrationPrompt(
return;
}
-void UserDataMigrator::ShowMigrationCancelledMessage(
- QMainWindow *main_window)
+void UserDataMigrator::ShowMigrationCancelledMessage(QMainWindow *main_window)
{
QMessageBox::information(main_window,
main_window->tr("Migration"),
@@ -173,107 +181,38 @@ void UserDataMigrator::ShowMigrationCancelledMessage(
QMessageBox::Ok);
}
-void UserDataMigrator::MigrateUserData(
- QMainWindow *main_window,
- const LegacyEmu selected_legacy_emu,
- const bool clear_shader_cache,
- const MigrationStrategy strategy)
+void UserDataMigrator::MigrateUserData(QMainWindow *main_window,
+ const MigrationWorker::LegacyEmu selected_legacy_emu,
+ const bool clear_shader_cache,
+ const MigrationWorker::MigrationStrategy strategy)
{
- namespace fs = std::filesystem;
- const auto copy_options = fs::copy_options::update_existing | fs::copy_options::recursive;
-
- QString success_text = main_window->tr("Data was migrated successfully.");
-
- std::string legacy_user_dir;
- std::string legacy_config_dir;
- std::string legacy_cache_dir;
-
-#define LEGACY_EMU(emu) \
-case LegacyEmu::emu: \
- legacy_user_dir = Common::FS::GetLegacyPath(Common::FS::LegacyPath::emu##Dir).string(); \
- legacy_config_dir = Common::FS::GetLegacyPath(Common::FS::LegacyPath::emu##ConfigDir) \
- .string(); \
- legacy_cache_dir = Common::FS::GetLegacyPath(Common::FS::LegacyPath::emu##CacheDir) \
- .string(); \
- break;
-
- switch (selected_legacy_emu) {
- LEGACY_EMU(Citron)
- LEGACY_EMU(Sudachi)
- LEGACY_EMU(Yuzu)
- LEGACY_EMU(Suyu)
- }
-
-#undef LEGACY_EMU
-
- fs::path eden_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::EdenDir);
- fs::path config_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir);
- fs::path cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir);
- fs::path shader_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir);
-
- fs::remove_all(eden_dir);
-
- switch (strategy) {
- case MigrationStrategy::Link:
- // Create symlinks/directory junctions if requested
- fs::create_directory_symlink(legacy_user_dir, eden_dir);
-
-// Windows doesn't need any more links, because cache and config
-// are already children of the root directory
-#ifndef WIN32
- if (fs::is_directory(legacy_config_dir)) {
- fs::create_directory_symlink(legacy_config_dir, config_dir);
- }
-
- if (fs::is_directory(legacy_cache_dir)) {
- fs::create_directory_symlink(legacy_cache_dir, cache_dir);
- }
-#endif
- break;
- case MigrationStrategy::Move:
- // Rename directories if deletion is requested (achieves the same result)
- fs::rename(legacy_user_dir, eden_dir);
-
-// Windows doesn't need any more renames, because cache and config
-// are already children of the root directory
-#ifndef WIN32
- if (fs::is_directory(legacy_config_dir)) {
- fs::rename(legacy_config_dir, config_dir);
- }
-
- if (fs::is_directory(legacy_cache_dir)) {
- fs::rename(legacy_cache_dir, cache_dir);
- }
-#endif
- break;
- case MigrationStrategy::Copy:
- default:
- // Default behavior: copy
- fs::copy(legacy_user_dir, eden_dir, copy_options);
-
- if (fs::is_directory(legacy_config_dir)) {
- fs::copy(legacy_config_dir, config_dir, copy_options);
- }
-
- if (fs::is_directory(legacy_cache_dir)) {
- fs::copy(legacy_cache_dir, cache_dir, copy_options);
- }
-
- success_text.append(
- main_window->tr("\n\nIf you wish to clean up the files which were left in the old "
- "data location, you can do so by deleting the following directory:\n"
- "%1").arg(QString::fromStdString(legacy_user_dir)));
- break;
- }
-
- // Delete and re-create shader dir
- if (clear_shader_cache) {
- fs::remove_all(shader_dir);
- fs::create_directory(shader_dir);
- }
-
- QMessageBox::information(main_window,
- main_window->tr("Migration"),
- success_text,
- QMessageBox::Ok);
+ // Create a dialog to let the user know it's migrating, some users noted confusion.
+ QProgressDialog *progress = new QProgressDialog(main_window);
+ progress->setWindowTitle(main_window->tr("Migrating"));
+ progress->setLabelText(main_window->tr("Migrating, this may take a while..."));
+ progress->setRange(0, 0);
+ progress->setCancelButton(nullptr);
+ progress->setWindowModality(Qt::WindowModality::ApplicationModal);
+
+ QThread *thread = new QThread(main_window);
+ MigrationWorker *worker = new MigrationWorker(selected_legacy_emu, clear_shader_cache, strategy);
+ worker->moveToThread(thread);
+
+ thread->connect(thread, &QThread::started, worker, &MigrationWorker::process);
+
+ thread->connect(worker, &MigrationWorker::finished, progress, [=](const QString &success_text) {
+ progress->close();
+ QMessageBox::information(main_window,
+ main_window->tr("Migration"),
+ success_text,
+ QMessageBox::Ok);
+
+ thread->quit();
+ });
+
+ thread->connect(worker, &MigrationWorker::finished, worker, &QObject::deleteLater);
+ thread->connect(thread, &QThread::finished, thread, &QObject::deleteLater);
+
+ thread->start();
+ progress->exec();
}