summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/yuzu/configuration/config.cpp854
-rw-r--r--src/yuzu/configuration/config.h34
2 files changed, 573 insertions, 315 deletions
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 6c6f047d8..d28826c67 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -230,55 +230,64 @@ void Config::ReadPlayerValues() {
230 for (std::size_t p = 0; p < Settings::values.players.size(); ++p) { 230 for (std::size_t p = 0; p < Settings::values.players.size(); ++p) {
231 auto& player = Settings::values.players[p]; 231 auto& player = Settings::values.players[p];
232 232
233 player.connected = ReadSetting(QString("player_%1_connected").arg(p), false).toBool(); 233 player.connected =
234 ReadSetting(QStringLiteral("player_%1_connected").arg(p), false).toBool();
234 235
235 player.type = static_cast<Settings::ControllerType>( 236 player.type = static_cast<Settings::ControllerType>(
236 qt_config 237 qt_config
237 ->value(QString("player_%1_type").arg(p), 238 ->value(QStringLiteral("player_%1_type").arg(p),
238 static_cast<u8>(Settings::ControllerType::DualJoycon)) 239 static_cast<u8>(Settings::ControllerType::DualJoycon))
239 .toUInt()); 240 .toUInt());
240 241
241 player.body_color_left = qt_config 242 player.body_color_left = qt_config
242 ->value(QString("player_%1_body_color_left").arg(p), 243 ->value(QStringLiteral("player_%1_body_color_left").arg(p),
243 Settings::JOYCON_BODY_NEON_BLUE) 244 Settings::JOYCON_BODY_NEON_BLUE)
244 .toUInt(); 245 .toUInt();
245 player.body_color_right = qt_config 246 player.body_color_right = qt_config
246 ->value(QString("player_%1_body_color_right").arg(p), 247 ->value(QStringLiteral("player_%1_body_color_right").arg(p),
247 Settings::JOYCON_BODY_NEON_RED) 248 Settings::JOYCON_BODY_NEON_RED)
248 .toUInt(); 249 .toUInt();
249 player.button_color_left = qt_config 250 player.button_color_left = qt_config
250 ->value(QString("player_%1_button_color_left").arg(p), 251 ->value(QStringLiteral("player_%1_button_color_left").arg(p),
251 Settings::JOYCON_BUTTONS_NEON_BLUE) 252 Settings::JOYCON_BUTTONS_NEON_BLUE)
252 .toUInt(); 253 .toUInt();
253 player.button_color_right = qt_config 254 player.button_color_right =
254 ->value(QString("player_%1_button_color_right").arg(p), 255 qt_config
255 Settings::JOYCON_BUTTONS_NEON_RED) 256 ->value(QStringLiteral("player_%1_button_color_right").arg(p),
256 .toUInt(); 257 Settings::JOYCON_BUTTONS_NEON_RED)
258 .toUInt();
257 259
258 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { 260 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
259 std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); 261 const std::string default_param =
260 player.buttons[i] = 262 InputCommon::GenerateKeyboardParam(default_buttons[i]);
261 qt_config 263 auto& player_buttons = player.buttons[i];
262 ->value(QString("player_%1_").arg(p) + Settings::NativeButton::mapping[i], 264
263 QString::fromStdString(default_param)) 265 player_buttons = qt_config
264 .toString() 266 ->value(QStringLiteral("player_%1_").arg(p) +
265 .toStdString(); 267 QString::fromUtf8(Settings::NativeButton::mapping[i]),
266 if (player.buttons[i].empty()) 268 QString::fromStdString(default_param))
267 player.buttons[i] = default_param; 269 .toString()
270 .toStdString();
271 if (player_buttons.empty()) {
272 player_buttons = default_param;
273 }
268 } 274 }
269 275
270 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { 276 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
271 std::string default_param = InputCommon::GenerateAnalogParamFromKeys( 277 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
272 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], 278 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
273 default_analogs[i][3], default_analogs[i][4], 0.5f); 279 default_analogs[i][3], default_analogs[i][4], 0.5f);
274 player.analogs[i] = 280 auto& player_analogs = player.analogs[i];
275 qt_config 281
276 ->value(QString("player_%1_").arg(p) + Settings::NativeAnalog::mapping[i], 282 player_analogs = qt_config
277 QString::fromStdString(default_param)) 283 ->value(QStringLiteral("player_%1_").arg(p) +
278 .toString() 284 QString::fromUtf8(Settings::NativeAnalog::mapping[i]),
279 .toStdString(); 285 QString::fromStdString(default_param))
280 if (player.analogs[i].empty()) 286 .toString()
281 player.analogs[i] = default_param; 287 .toStdString();
288 if (player_analogs.empty()) {
289 player_analogs = default_param;
290 }
282 } 291 }
283 } 292 }
284 293
@@ -290,36 +299,45 @@ void Config::ReadPlayerValues() {
290} 299}
291 300
292void Config::ReadDebugValues() { 301void Config::ReadDebugValues() {
293 Settings::values.debug_pad_enabled = ReadSetting("debug_pad_enabled", false).toBool(); 302 Settings::values.debug_pad_enabled =
303 ReadSetting(QStringLiteral("debug_pad_enabled"), false).toBool();
304
294 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { 305 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
295 std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); 306 const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
296 Settings::values.debug_pad_buttons[i] = 307 auto& debug_pad_buttons = Settings::values.debug_pad_buttons[i];
297 qt_config 308
298 ->value(QString("debug_pad_") + Settings::NativeButton::mapping[i], 309 debug_pad_buttons = qt_config
299 QString::fromStdString(default_param)) 310 ->value(QStringLiteral("debug_pad_") +
300 .toString() 311 QString::fromUtf8(Settings::NativeButton::mapping[i]),
301 .toStdString(); 312 QString::fromStdString(default_param))
302 if (Settings::values.debug_pad_buttons[i].empty()) 313 .toString()
303 Settings::values.debug_pad_buttons[i] = default_param; 314 .toStdString();
315 if (debug_pad_buttons.empty()) {
316 debug_pad_buttons = default_param;
317 }
304 } 318 }
305 319
306 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { 320 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
307 std::string default_param = InputCommon::GenerateAnalogParamFromKeys( 321 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
308 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], 322 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
309 default_analogs[i][3], default_analogs[i][4], 0.5f); 323 default_analogs[i][3], default_analogs[i][4], 0.5f);
310 Settings::values.debug_pad_analogs[i] = 324 auto& debug_pad_analogs = Settings::values.debug_pad_analogs[i];
311 qt_config 325
312 ->value(QString("debug_pad_") + Settings::NativeAnalog::mapping[i], 326 debug_pad_analogs = qt_config
313 QString::fromStdString(default_param)) 327 ->value(QStringLiteral("debug_pad_") +
314 .toString() 328 QString::fromUtf8(Settings::NativeAnalog::mapping[i]),
315 .toStdString(); 329 QString::fromStdString(default_param))
316 if (Settings::values.debug_pad_analogs[i].empty()) 330 .toString()
317 Settings::values.debug_pad_analogs[i] = default_param; 331 .toStdString();
332 if (debug_pad_analogs.empty()) {
333 debug_pad_analogs = default_param;
334 }
318 } 335 }
319} 336}
320 337
321void Config::ReadKeyboardValues() { 338void Config::ReadKeyboardValues() {
322 Settings::values.keyboard_enabled = ReadSetting("keyboard_enabled", false).toBool(); 339 Settings::values.keyboard_enabled =
340 ReadSetting(QStringLiteral("keyboard_enabled"), false).toBool();
323 341
324 std::transform(default_keyboard_keys.begin(), default_keyboard_keys.end(), 342 std::transform(default_keyboard_keys.begin(), default_keyboard_keys.end(),
325 Settings::values.keyboard_keys.begin(), InputCommon::GenerateKeyboardParam); 343 Settings::values.keyboard_keys.begin(), InputCommon::GenerateKeyboardParam);
@@ -332,18 +350,22 @@ void Config::ReadKeyboardValues() {
332} 350}
333 351
334void Config::ReadMouseValues() { 352void Config::ReadMouseValues() {
335 Settings::values.mouse_enabled = ReadSetting("mouse_enabled", false).toBool(); 353 Settings::values.mouse_enabled = ReadSetting(QStringLiteral("mouse_enabled"), false).toBool();
336 354
337 for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) { 355 for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) {
338 std::string default_param = InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]); 356 const std::string default_param =
339 Settings::values.mouse_buttons[i] = 357 InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]);
340 qt_config 358 auto& mouse_buttons = Settings::values.mouse_buttons[i];
341 ->value(QString("mouse_") + Settings::NativeMouseButton::mapping[i], 359
342 QString::fromStdString(default_param)) 360 mouse_buttons = qt_config
343 .toString() 361 ->value(QStringLiteral("mouse_") +
344 .toStdString(); 362 QString::fromUtf8(Settings::NativeMouseButton::mapping[i]),
345 if (Settings::values.mouse_buttons[i].empty()) 363 QString::fromStdString(default_param))
346 Settings::values.mouse_buttons[i] = default_param; 364 .toString()
365 .toStdString();
366 if (mouse_buttons.empty()) {
367 mouse_buttons = default_param;
368 }
347 } 369 }
348} 370}
349 371
@@ -356,7 +378,6 @@ void Config::ReadTouchscreenValues() {
356 Settings::values.touchscreen.rotation_angle = ReadSetting("touchscreen_angle", 0).toUInt(); 378 Settings::values.touchscreen.rotation_angle = ReadSetting("touchscreen_angle", 0).toUInt();
357 Settings::values.touchscreen.diameter_x = ReadSetting("touchscreen_diameter_x", 15).toUInt(); 379 Settings::values.touchscreen.diameter_x = ReadSetting("touchscreen_diameter_x", 15).toUInt();
358 Settings::values.touchscreen.diameter_y = ReadSetting("touchscreen_diameter_y", 15).toUInt(); 380 Settings::values.touchscreen.diameter_y = ReadSetting("touchscreen_diameter_y", 15).toUInt();
359 qt_config->endGroup();
360} 381}
361 382
362void Config::ApplyDefaultProfileIfInputInvalid() { 383void Config::ApplyDefaultProfileIfInputInvalid() {
@@ -366,8 +387,25 @@ void Config::ApplyDefaultProfileIfInputInvalid() {
366 } 387 }
367} 388}
368 389
369void Config::ReadValues() { 390void Config::ReadAudioValues() {
370 qt_config->beginGroup("Controls"); 391 qt_config->beginGroup(QStringLiteral("Audio"));
392
393 Settings::values.sink_id = ReadSetting(QStringLiteral("output_engine"), QStringLiteral("auto"))
394 .toString()
395 .toStdString();
396 Settings::values.enable_audio_stretching =
397 ReadSetting(QStringLiteral("enable_audio_stretching"), true).toBool();
398 Settings::values.audio_device_id =
399 ReadSetting(QStringLiteral("output_device"), QStringLiteral("auto"))
400 .toString()
401 .toStdString();
402 Settings::values.volume = ReadSetting(QStringLiteral("volume"), 1).toFloat();
403
404 qt_config->endGroup();
405}
406
407void Config::ReadControlValues() {
408 qt_config->beginGroup(QStringLiteral("Controls"));
371 409
372 ReadPlayerValues(); 410 ReadPlayerValues();
373 ReadDebugValues(); 411 ReadDebugValues();
@@ -376,162 +414,133 @@ void Config::ReadValues() {
376 ReadTouchscreenValues(); 414 ReadTouchscreenValues();
377 415
378 Settings::values.motion_device = 416 Settings::values.motion_device =
379 ReadSetting("motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01") 417 ReadSetting(QStringLiteral("motion_device"),
418 QStringLiteral("engine:motion_emu,update_period:100,sensitivity:0.01"))
380 .toString() 419 .toString()
381 .toStdString(); 420 .toStdString();
382 421
383 qt_config->beginGroup("Core");
384 Settings::values.use_cpu_jit = ReadSetting("use_cpu_jit", true).toBool();
385 Settings::values.use_multi_core = ReadSetting("use_multi_core", false).toBool();
386 qt_config->endGroup(); 422 qt_config->endGroup();
423}
387 424
388 qt_config->beginGroup("Renderer"); 425void Config::ReadCoreValues() {
389 Settings::values.resolution_factor = ReadSetting("resolution_factor", 1.0).toFloat(); 426 qt_config->beginGroup(QStringLiteral("Core"));
390 Settings::values.use_frame_limit = ReadSetting("use_frame_limit", true).toBool();
391 Settings::values.frame_limit = ReadSetting("frame_limit", 100).toInt();
392 Settings::values.use_compatibility_profile =
393 ReadSetting("use_compatibility_profile", true).toBool();
394 Settings::values.use_disk_shader_cache = ReadSetting("use_disk_shader_cache", true).toBool();
395 Settings::values.use_accurate_gpu_emulation =
396 ReadSetting("use_accurate_gpu_emulation", false).toBool();
397 Settings::values.use_asynchronous_gpu_emulation =
398 ReadSetting("use_asynchronous_gpu_emulation", false).toBool();
399 Settings::values.force_30fps_mode = ReadSetting("force_30fps_mode", false).toBool();
400 427
401 Settings::values.bg_red = ReadSetting("bg_red", 0.0).toFloat(); 428 Settings::values.use_cpu_jit = ReadSetting(QStringLiteral("use_cpu_jit"), true).toBool();
402 Settings::values.bg_green = ReadSetting("bg_green", 0.0).toFloat(); 429 Settings::values.use_multi_core = ReadSetting(QStringLiteral("use_multi_core"), false).toBool();
403 Settings::values.bg_blue = ReadSetting("bg_blue", 0.0).toFloat();
404 qt_config->endGroup();
405 430
406 qt_config->beginGroup("Audio");
407 Settings::values.sink_id = ReadSetting("output_engine", "auto").toString().toStdString();
408 Settings::values.enable_audio_stretching =
409 ReadSetting("enable_audio_stretching", true).toBool();
410 Settings::values.audio_device_id =
411 ReadSetting("output_device", "auto").toString().toStdString();
412 Settings::values.volume = ReadSetting("volume", 1).toFloat();
413 qt_config->endGroup(); 431 qt_config->endGroup();
432}
433
434void Config::ReadDataStorageValues() {
435 qt_config->beginGroup(QStringLiteral("Data Storage"));
414 436
415 qt_config->beginGroup("Data Storage"); 437 Settings::values.use_virtual_sd = ReadSetting(QStringLiteral("use_virtual_sd"), true).toBool();
416 Settings::values.use_virtual_sd = ReadSetting("use_virtual_sd", true).toBool();
417 FileUtil::GetUserPath( 438 FileUtil::GetUserPath(
418 FileUtil::UserPath::NANDDir, 439 FileUtil::UserPath::NANDDir,
419 qt_config 440 qt_config
420 ->value("nand_directory", 441 ->value(QStringLiteral("nand_directory"),
421 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir))) 442 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)))
422 .toString() 443 .toString()
423 .toStdString()); 444 .toStdString());
424 FileUtil::GetUserPath( 445 FileUtil::GetUserPath(
425 FileUtil::UserPath::SDMCDir, 446 FileUtil::UserPath::SDMCDir,
426 qt_config 447 qt_config
427 ->value("sdmc_directory", 448 ->value(QStringLiteral("sdmc_directory"),
428 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir))) 449 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)))
429 .toString() 450 .toString()
430 .toStdString()); 451 .toStdString());
431 qt_config->endGroup();
432 452
433 qt_config->beginGroup("Core");
434 Settings::values.use_cpu_jit = ReadSetting("use_cpu_jit", true).toBool();
435 Settings::values.use_multi_core = ReadSetting("use_multi_core", false).toBool();
436 qt_config->endGroup(); 453 qt_config->endGroup();
454}
437 455
438 qt_config->beginGroup("System"); 456void Config::ReadDebuggingValues() {
439 Settings::values.use_docked_mode = ReadSetting("use_docked_mode", false).toBool(); 457 qt_config->beginGroup(QStringLiteral("Debugging"));
440
441 Settings::values.current_user =
442 std::clamp<int>(ReadSetting("current_user", 0).toInt(), 0, Service::Account::MAX_USERS - 1);
443
444 Settings::values.language_index = ReadSetting("language_index", 1).toInt();
445
446 const auto rng_seed_enabled = ReadSetting("rng_seed_enabled", false).toBool();
447 if (rng_seed_enabled) {
448 Settings::values.rng_seed = ReadSetting("rng_seed", 0).toULongLong();
449 } else {
450 Settings::values.rng_seed = std::nullopt;
451 }
452
453 const auto custom_rtc_enabled = ReadSetting("custom_rtc_enabled", false).toBool();
454 if (custom_rtc_enabled) {
455 Settings::values.custom_rtc =
456 std::chrono::seconds(ReadSetting("custom_rtc", 0).toULongLong());
457 } else {
458 Settings::values.custom_rtc = std::nullopt;
459 }
460
461 qt_config->endGroup();
462 458
463 qt_config->beginGroup("Miscellaneous"); 459 Settings::values.use_gdbstub = ReadSetting(QStringLiteral("use_gdbstub"), false).toBool();
464 Settings::values.log_filter = ReadSetting("log_filter", "*:Info").toString().toStdString(); 460 Settings::values.gdbstub_port = ReadSetting(QStringLiteral("gdbstub_port"), 24689).toInt();
465 Settings::values.use_dev_keys = ReadSetting("use_dev_keys", false).toBool(); 461 Settings::values.program_args =
466 qt_config->endGroup(); 462 ReadSetting(QStringLiteral("program_args"), QStringLiteral("")).toString().toStdString();
463 Settings::values.dump_exefs = ReadSetting(QStringLiteral("dump_exefs"), false).toBool();
464 Settings::values.dump_nso = ReadSetting(QStringLiteral("dump_nso"), false).toBool();
467 465
468 qt_config->beginGroup("Debugging");
469 Settings::values.use_gdbstub = ReadSetting("use_gdbstub", false).toBool();
470 Settings::values.gdbstub_port = ReadSetting("gdbstub_port", 24689).toInt();
471 Settings::values.program_args = ReadSetting("program_args", "").toString().toStdString();
472 Settings::values.dump_exefs = ReadSetting("dump_exefs", false).toBool();
473 Settings::values.dump_nso = ReadSetting("dump_nso", false).toBool();
474 qt_config->endGroup(); 466 qt_config->endGroup();
467}
475 468
476 qt_config->beginGroup("WebService"); 469void Config::ReadDisabledAddOnValues() {
477 Settings::values.enable_telemetry = ReadSetting("enable_telemetry", true).toBool(); 470 const auto size = qt_config->beginReadArray(QStringLiteral("DisabledAddOns"));
478 Settings::values.web_api_url =
479 ReadSetting("web_api_url", "https://api.yuzu-emu.org").toString().toStdString();
480 Settings::values.yuzu_username = ReadSetting("yuzu_username").toString().toStdString();
481 Settings::values.yuzu_token = ReadSetting("yuzu_token").toString().toStdString();
482 qt_config->endGroup();
483 471
484 const auto size = qt_config->beginReadArray("DisabledAddOns");
485 for (int i = 0; i < size; ++i) { 472 for (int i = 0; i < size; ++i) {
486 qt_config->setArrayIndex(i); 473 qt_config->setArrayIndex(i);
487 const auto title_id = ReadSetting("title_id", 0).toULongLong(); 474 const auto title_id = ReadSetting(QStringLiteral("title_id"), 0).toULongLong();
488 std::vector<std::string> out; 475 std::vector<std::string> out;
489 const auto d_size = qt_config->beginReadArray("disabled"); 476 const auto d_size = qt_config->beginReadArray(QStringLiteral("disabled"));
490 for (int j = 0; j < d_size; ++j) { 477 for (int j = 0; j < d_size; ++j) {
491 qt_config->setArrayIndex(j); 478 qt_config->setArrayIndex(j);
492 out.push_back(ReadSetting("d", "").toString().toStdString()); 479 out.push_back(
480 ReadSetting(QStringLiteral("d"), QStringLiteral("")).toString().toStdString());
493 } 481 }
494 qt_config->endArray(); 482 qt_config->endArray();
495 Settings::values.disabled_addons.insert_or_assign(title_id, out); 483 Settings::values.disabled_addons.insert_or_assign(title_id, out);
496 } 484 }
485
497 qt_config->endArray(); 486 qt_config->endArray();
487}
498 488
499 qt_config->beginGroup("UI"); 489void Config::ReadMiscellaneousValues() {
500 UISettings::values.theme = ReadSetting("theme", UISettings::themes[0].second).toString(); 490 qt_config->beginGroup(QStringLiteral("Miscellaneous"));
501 UISettings::values.enable_discord_presence = 491
502 ReadSetting("enable_discord_presence", true).toBool(); 492 Settings::values.log_filter =
503 UISettings::values.screenshot_resolution_factor = 493 ReadSetting(QStringLiteral("log_filter"), QStringLiteral("*:Info"))
504 static_cast<u16>(ReadSetting("screenshot_resolution_factor", 0).toUInt()); 494 .toString()
505 UISettings::values.select_user_on_boot = ReadSetting("select_user_on_boot", false).toBool(); 495 .toStdString();
496 Settings::values.use_dev_keys = ReadSetting(QStringLiteral("use_dev_keys"), false).toBool();
506 497
507 qt_config->beginGroup("UIGameList");
508 UISettings::values.show_unknown = ReadSetting("show_unknown", true).toBool();
509 UISettings::values.show_add_ons = ReadSetting("show_add_ons", true).toBool();
510 UISettings::values.icon_size = ReadSetting("icon_size", 64).toUInt();
511 UISettings::values.row_1_text_id = ReadSetting("row_1_text_id", 3).toUInt();
512 UISettings::values.row_2_text_id = ReadSetting("row_2_text_id", 2).toUInt();
513 qt_config->endGroup(); 498 qt_config->endGroup();
499}
500
501void Config::ReadPathValues() {
502 qt_config->beginGroup(QStringLiteral("Paths"));
503
504 UISettings::values.roms_path = ReadSetting(QStringLiteral("romsPath")).toString();
505 UISettings::values.symbols_path = ReadSetting(QStringLiteral("symbolsPath")).toString();
506 UISettings::values.game_directory_path =
507 ReadSetting(QStringLiteral("gameListRootDir"), QStringLiteral(".")).toString();
508 UISettings::values.game_directory_deepscan =
509 ReadSetting(QStringLiteral("gameListDeepScan"), false).toBool();
510 UISettings::values.recent_files = ReadSetting(QStringLiteral("recentFiles")).toStringList();
514 511
515 qt_config->beginGroup("UILayout");
516 UISettings::values.geometry = ReadSetting("geometry").toByteArray();
517 UISettings::values.state = ReadSetting("state").toByteArray();
518 UISettings::values.renderwindow_geometry = ReadSetting("geometryRenderWindow").toByteArray();
519 UISettings::values.gamelist_header_state = ReadSetting("gameListHeaderState").toByteArray();
520 UISettings::values.microprofile_geometry =
521 ReadSetting("microProfileDialogGeometry").toByteArray();
522 UISettings::values.microprofile_visible =
523 ReadSetting("microProfileDialogVisible", false).toBool();
524 qt_config->endGroup(); 512 qt_config->endGroup();
513}
514
515void Config::ReadRendererValues() {
516 qt_config->beginGroup(QStringLiteral("Renderer"));
517
518 Settings::values.resolution_factor =
519 ReadSetting(QStringLiteral("resolution_factor"), 1.0).toFloat();
520 Settings::values.use_frame_limit =
521 ReadSetting(QStringLiteral("use_frame_limit"), true).toBool();
522 Settings::values.frame_limit = ReadSetting(QStringLiteral("frame_limit"), 100).toInt();
523 Settings::values.use_compatibility_profile =
524 ReadSetting(QStringLiteral("use_compatibility_profile"), true).toBool();
525 Settings::values.use_disk_shader_cache =
526 ReadSetting(QStringLiteral("use_disk_shader_cache"), true).toBool();
527 Settings::values.use_accurate_gpu_emulation =
528 ReadSetting(QStringLiteral("use_accurate_gpu_emulation"), false).toBool();
529 Settings::values.use_asynchronous_gpu_emulation =
530 ReadSetting(QStringLiteral("use_asynchronous_gpu_emulation"), false).toBool();
531 Settings::values.force_30fps_mode =
532 ReadSetting(QStringLiteral("force_30fps_mode"), false).toBool();
533
534 Settings::values.bg_red = ReadSetting(QStringLiteral("bg_red"), 0.0).toFloat();
535 Settings::values.bg_green = ReadSetting(QStringLiteral("bg_green"), 0.0).toFloat();
536 Settings::values.bg_blue = ReadSetting(QStringLiteral("bg_blue"), 0.0).toFloat();
525 537
526 qt_config->beginGroup("Paths");
527 UISettings::values.roms_path = ReadSetting("romsPath").toString();
528 UISettings::values.symbols_path = ReadSetting("symbolsPath").toString();
529 UISettings::values.game_directory_path = ReadSetting("gameListRootDir", ".").toString();
530 UISettings::values.game_directory_deepscan = ReadSetting("gameListDeepScan", false).toBool();
531 UISettings::values.recent_files = ReadSetting("recentFiles").toStringList();
532 qt_config->endGroup(); 538 qt_config->endGroup();
539}
540
541void Config::ReadShortcutValues() {
542 qt_config->beginGroup(QStringLiteral("Shortcuts"));
533 543
534 qt_config->beginGroup("Shortcuts");
535 for (auto [name, group, shortcut] : default_hotkeys) { 544 for (auto [name, group, shortcut] : default_hotkeys) {
536 auto [keyseq, context] = shortcut; 545 auto [keyseq, context] = shortcut;
537 qt_config->beginGroup(group); 546 qt_config->beginGroup(group);
@@ -539,57 +548,173 @@ void Config::ReadValues() {
539 UISettings::values.shortcuts.push_back( 548 UISettings::values.shortcuts.push_back(
540 {name, 549 {name,
541 group, 550 group,
542 {ReadSetting("KeySeq", keyseq).toString(), ReadSetting("Context", context).toInt()}}); 551 {ReadSetting(QStringLiteral("KeySeq"), keyseq).toString(),
552 ReadSetting(QStringLiteral("Context"), context).toInt()}});
543 qt_config->endGroup(); 553 qt_config->endGroup();
544 qt_config->endGroup(); 554 qt_config->endGroup();
545 } 555 }
556
557 qt_config->endGroup();
558}
559
560void Config::ReadSystemValues() {
561 qt_config->beginGroup(QStringLiteral("System"));
562
563 Settings::values.use_docked_mode =
564 ReadSetting(QStringLiteral("use_docked_mode"), false).toBool();
565
566 Settings::values.current_user = std::clamp<int>(
567 ReadSetting(QStringLiteral("current_user"), 0).toInt(), 0, Service::Account::MAX_USERS - 1);
568
569 Settings::values.language_index = ReadSetting(QStringLiteral("language_index"), 1).toInt();
570
571 const auto rng_seed_enabled = ReadSetting(QStringLiteral("rng_seed_enabled"), false).toBool();
572 if (rng_seed_enabled) {
573 Settings::values.rng_seed = ReadSetting(QStringLiteral("rng_seed"), 0).toULongLong();
574 } else {
575 Settings::values.rng_seed = std::nullopt;
576 }
577
578 const auto custom_rtc_enabled =
579 ReadSetting(QStringLiteral("custom_rtc_enabled"), false).toBool();
580 if (custom_rtc_enabled) {
581 Settings::values.custom_rtc =
582 std::chrono::seconds(ReadSetting(QStringLiteral("custom_rtc"), 0).toULongLong());
583 } else {
584 Settings::values.custom_rtc = std::nullopt;
585 }
586
546 qt_config->endGroup(); 587 qt_config->endGroup();
588}
547 589
548 UISettings::values.single_window_mode = ReadSetting("singleWindowMode", true).toBool(); 590void Config::ReadUIValues() {
549 UISettings::values.fullscreen = ReadSetting("fullscreen", false).toBool(); 591 qt_config->beginGroup(QStringLiteral("UI"));
550 UISettings::values.display_titlebar = ReadSetting("displayTitleBars", true).toBool(); 592
551 UISettings::values.show_filter_bar = ReadSetting("showFilterBar", true).toBool(); 593 UISettings::values.theme =
552 UISettings::values.show_status_bar = ReadSetting("showStatusBar", true).toBool(); 594 ReadSetting(QStringLiteral("theme"), UISettings::themes[0].second).toString();
553 UISettings::values.confirm_before_closing = ReadSetting("confirmClose", true).toBool(); 595 UISettings::values.enable_discord_presence =
554 UISettings::values.first_start = ReadSetting("firstStart", true).toBool(); 596 ReadSetting(QStringLiteral("enable_discord_presence"), true).toBool();
555 UISettings::values.callout_flags = ReadSetting("calloutFlags", 0).toUInt(); 597 UISettings::values.screenshot_resolution_factor =
556 UISettings::values.show_console = ReadSetting("showConsole", false).toBool(); 598 static_cast<u16>(ReadSetting(QStringLiteral("screenshot_resolution_factor"), 0).toUInt());
557 UISettings::values.profile_index = ReadSetting("profileIndex", 0).toUInt(); 599 UISettings::values.select_user_on_boot =
600 ReadSetting(QStringLiteral("select_user_on_boot"), false).toBool();
601
602 ReadUIGamelistValues();
603 ReadUILayoutValues();
604 ReadPathValues();
605 ReadShortcutValues();
606
607 UISettings::values.single_window_mode =
608 ReadSetting(QStringLiteral("singleWindowMode"), true).toBool();
609 UISettings::values.fullscreen = ReadSetting(QStringLiteral("fullscreen"), false).toBool();
610 UISettings::values.display_titlebar =
611 ReadSetting(QStringLiteral("displayTitleBars"), true).toBool();
612 UISettings::values.show_filter_bar =
613 ReadSetting(QStringLiteral("showFilterBar"), true).toBool();
614 UISettings::values.show_status_bar =
615 ReadSetting(QStringLiteral("showStatusBar"), true).toBool();
616 UISettings::values.confirm_before_closing =
617 ReadSetting(QStringLiteral("confirmClose"), true).toBool();
618 UISettings::values.first_start = ReadSetting(QStringLiteral("firstStart"), true).toBool();
619 UISettings::values.callout_flags = ReadSetting(QStringLiteral("calloutFlags"), 0).toUInt();
620 UISettings::values.show_console = ReadSetting(QStringLiteral("showConsole"), false).toBool();
621 UISettings::values.profile_index = ReadSetting(QStringLiteral("profileIndex"), 0).toUInt();
558 622
559 ApplyDefaultProfileIfInputInvalid(); 623 ApplyDefaultProfileIfInputInvalid();
560 624
561 qt_config->endGroup(); 625 qt_config->endGroup();
562} 626}
563 627
628void Config::ReadUIGamelistValues() {
629 qt_config->beginGroup("UIGameList");
630
631 UISettings::values.show_unknown = ReadSetting(QStringLiteral("show_unknown"), true).toBool();
632 UISettings::values.show_add_ons = ReadSetting(QStringLiteral("show_add_ons"), true).toBool();
633 UISettings::values.icon_size = ReadSetting(QStringLiteral("icon_size"), 64).toUInt();
634 UISettings::values.row_1_text_id = ReadSetting(QStringLiteral("row_1_text_id"), 3).toUInt();
635 UISettings::values.row_2_text_id = ReadSetting(QStringLiteral("row_2_text_id"), 2).toUInt();
636
637 qt_config->endGroup();
638}
639
640void Config::ReadUILayoutValues() {
641 qt_config->beginGroup(QStringLiteral("UILayout"));
642
643 UISettings::values.geometry = ReadSetting(QStringLiteral("geometry")).toByteArray();
644 UISettings::values.state = ReadSetting(QStringLiteral("state")).toByteArray();
645 UISettings::values.renderwindow_geometry =
646 ReadSetting(QStringLiteral("geometryRenderWindow")).toByteArray();
647 UISettings::values.gamelist_header_state =
648 ReadSetting(QStringLiteral("gameListHeaderState")).toByteArray();
649 UISettings::values.microprofile_geometry =
650 ReadSetting(QStringLiteral("microProfileDialogGeometry")).toByteArray();
651 UISettings::values.microprofile_visible =
652 ReadSetting(QStringLiteral("microProfileDialogVisible"), false).toBool();
653
654 qt_config->endGroup();
655}
656
657void Config::ReadWebServiceValues() {
658 qt_config->beginGroup(QStringLiteral("WebService"));
659
660 Settings::values.enable_telemetry =
661 ReadSetting(QStringLiteral("enable_telemetry"), true).toBool();
662 Settings::values.web_api_url =
663 ReadSetting(QStringLiteral("web_api_url"), QStringLiteral("https://api.yuzu-emu.org"))
664 .toString()
665 .toStdString();
666 Settings::values.yuzu_username =
667 ReadSetting(QStringLiteral("yuzu_username")).toString().toStdString();
668 Settings::values.yuzu_token =
669 ReadSetting(QStringLiteral("yuzu_token")).toString().toStdString();
670
671 qt_config->endGroup();
672}
673
674void Config::ReadValues() {
675 ReadControlValues();
676 ReadCoreValues();
677 ReadRendererValues();
678 ReadAudioValues();
679 ReadDataStorageValues();
680 ReadSystemValues();
681 ReadMiscellaneousValues();
682 ReadDebugValues();
683 ReadWebServiceValues();
684 ReadDisabledAddOnValues();
685 ReadUIValues();
686}
687
564void Config::SavePlayerValues() { 688void Config::SavePlayerValues() {
565 for (std::size_t p = 0; p < Settings::values.players.size(); ++p) { 689 for (std::size_t p = 0; p < Settings::values.players.size(); ++p) {
566 const auto& player = Settings::values.players[p]; 690 const auto& player = Settings::values.players[p];
567 691
568 WriteSetting(QString("player_%1_connected").arg(p), player.connected, false); 692 WriteSetting(QStringLiteral("player_%1_connected").arg(p), player.connected, false);
569 WriteSetting(QString("player_%1_type").arg(p), static_cast<u8>(player.type), 693 WriteSetting(QStringLiteral("player_%1_type").arg(p), static_cast<u8>(player.type),
570 static_cast<u8>(Settings::ControllerType::DualJoycon)); 694 static_cast<u8>(Settings::ControllerType::DualJoycon));
571 695
572 WriteSetting(QString("player_%1_body_color_left").arg(p), player.body_color_left, 696 WriteSetting(QStringLiteral("player_%1_body_color_left").arg(p), player.body_color_left,
573 Settings::JOYCON_BODY_NEON_BLUE); 697 Settings::JOYCON_BODY_NEON_BLUE);
574 WriteSetting(QString("player_%1_body_color_right").arg(p), player.body_color_right, 698 WriteSetting(QStringLiteral("player_%1_body_color_right").arg(p), player.body_color_right,
575 Settings::JOYCON_BODY_NEON_RED); 699 Settings::JOYCON_BODY_NEON_RED);
576 WriteSetting(QString("player_%1_button_color_left").arg(p), player.button_color_left, 700 WriteSetting(QStringLiteral("player_%1_button_color_left").arg(p), player.button_color_left,
577 Settings::JOYCON_BUTTONS_NEON_BLUE); 701 Settings::JOYCON_BUTTONS_NEON_BLUE);
578 WriteSetting(QString("player_%1_button_color_right").arg(p), player.button_color_right, 702 WriteSetting(QStringLiteral("player_%1_button_color_right").arg(p),
579 Settings::JOYCON_BUTTONS_NEON_RED); 703 player.button_color_right, Settings::JOYCON_BUTTONS_NEON_RED);
580 704
581 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { 705 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
582 std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); 706 const std::string default_param =
583 WriteSetting(QString("player_%1_").arg(p) + 707 InputCommon::GenerateKeyboardParam(default_buttons[i]);
708 WriteSetting(QStringLiteral("player_%1_").arg(p) +
584 QString::fromStdString(Settings::NativeButton::mapping[i]), 709 QString::fromStdString(Settings::NativeButton::mapping[i]),
585 QString::fromStdString(player.buttons[i]), 710 QString::fromStdString(player.buttons[i]),
586 QString::fromStdString(default_param)); 711 QString::fromStdString(default_param));
587 } 712 }
588 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { 713 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
589 std::string default_param = InputCommon::GenerateAnalogParamFromKeys( 714 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
590 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], 715 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
591 default_analogs[i][3], default_analogs[i][4], 0.5f); 716 default_analogs[i][3], default_analogs[i][4], 0.5f);
592 WriteSetting(QString("player_%1_").arg(p) + 717 WriteSetting(QStringLiteral("player_%1_").arg(p) +
593 QString::fromStdString(Settings::NativeAnalog::mapping[i]), 718 QString::fromStdString(Settings::NativeAnalog::mapping[i]),
594 QString::fromStdString(player.analogs[i]), 719 QString::fromStdString(player.analogs[i]),
595 QString::fromStdString(default_param)); 720 QString::fromStdString(default_param));
@@ -600,17 +725,17 @@ void Config::SavePlayerValues() {
600void Config::SaveDebugValues() { 725void Config::SaveDebugValues() {
601 WriteSetting("debug_pad_enabled", Settings::values.debug_pad_enabled, false); 726 WriteSetting("debug_pad_enabled", Settings::values.debug_pad_enabled, false);
602 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { 727 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
603 std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); 728 const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
604 WriteSetting(QString("debug_pad_") + 729 WriteSetting(QStringLiteral("debug_pad_") +
605 QString::fromStdString(Settings::NativeButton::mapping[i]), 730 QString::fromStdString(Settings::NativeButton::mapping[i]),
606 QString::fromStdString(Settings::values.debug_pad_buttons[i]), 731 QString::fromStdString(Settings::values.debug_pad_buttons[i]),
607 QString::fromStdString(default_param)); 732 QString::fromStdString(default_param));
608 } 733 }
609 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { 734 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
610 std::string default_param = InputCommon::GenerateAnalogParamFromKeys( 735 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
611 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], 736 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
612 default_analogs[i][3], default_analogs[i][4], 0.5f); 737 default_analogs[i][3], default_analogs[i][4], 0.5f);
613 WriteSetting(QString("debug_pad_") + 738 WriteSetting(QStringLiteral("debug_pad_") +
614 QString::fromStdString(Settings::NativeAnalog::mapping[i]), 739 QString::fromStdString(Settings::NativeAnalog::mapping[i]),
615 QString::fromStdString(Settings::values.debug_pad_analogs[i]), 740 QString::fromStdString(Settings::values.debug_pad_analogs[i]),
616 QString::fromStdString(default_param)); 741 QString::fromStdString(default_param));
@@ -618,11 +743,12 @@ void Config::SaveDebugValues() {
618} 743}
619 744
620void Config::SaveMouseValues() { 745void Config::SaveMouseValues() {
621 WriteSetting("mouse_enabled", Settings::values.mouse_enabled, false); 746 WriteSetting(QStringLiteral("mouse_enabled"), Settings::values.mouse_enabled, false);
622 747
623 for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) { 748 for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) {
624 std::string default_param = InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]); 749 const std::string default_param =
625 WriteSetting(QString("mouse_") + 750 InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]);
751 WriteSetting(QStringLiteral("mouse_") +
626 QString::fromStdString(Settings::NativeMouseButton::mapping[i]), 752 QString::fromStdString(Settings::NativeMouseButton::mapping[i]),
627 QString::fromStdString(Settings::values.mouse_buttons[i]), 753 QString::fromStdString(Settings::values.mouse_buttons[i]),
628 QString::fromStdString(default_param)); 754 QString::fromStdString(default_param));
@@ -630,178 +756,276 @@ void Config::SaveMouseValues() {
630} 756}
631 757
632void Config::SaveTouchscreenValues() { 758void Config::SaveTouchscreenValues() {
633 WriteSetting("touchscreen_enabled", Settings::values.touchscreen.enabled, true); 759 const auto& touchscreen = Settings::values.touchscreen;
634 WriteSetting("touchscreen_device", QString::fromStdString(Settings::values.touchscreen.device), 760
635 "engine:emu_window"); 761 WriteSetting(QStringLiteral("touchscreen_enabled"), touchscreen.enabled, true);
762 WriteSetting(QStringLiteral("touchscreen_device"), QString::fromStdString(touchscreen.device),
763 QStringLiteral("engine:emu_window"));
636 764
637 WriteSetting("touchscreen_finger", Settings::values.touchscreen.finger, 0); 765 WriteSetting(QStringLiteral("touchscreen_finger"), touchscreen.finger, 0);
638 WriteSetting("touchscreen_angle", Settings::values.touchscreen.rotation_angle, 0); 766 WriteSetting(QStringLiteral("touchscreen_angle"), touchscreen.rotation_angle, 0);
639 WriteSetting("touchscreen_diameter_x", Settings::values.touchscreen.diameter_x, 15); 767 WriteSetting(QStringLiteral("touchscreen_diameter_x"), touchscreen.diameter_x, 15);
640 WriteSetting("touchscreen_diameter_y", Settings::values.touchscreen.diameter_y, 15); 768 WriteSetting(QStringLiteral("touchscreen_diameter_y"), touchscreen.diameter_y, 15);
641} 769}
642 770
643void Config::SaveValues() { 771void Config::SaveValues() {
644 qt_config->beginGroup("Controls"); 772 SaveControlValues();
773 SaveCoreValues();
774 SaveRendererValues();
775 SaveAudioValues();
776 SaveDataStorageValues();
777 SaveSystemValues();
778 SaveMiscellaneousValues();
779 SaveDebuggingValues();
780 SaveWebServiceValues();
781 SaveDisabledAddOnValues();
782 SaveUIValues();
783}
784
785void Config::SaveAudioValues() {
786 qt_config->beginGroup(QStringLiteral("Audio"));
787
788 WriteSetting(QStringLiteral("output_engine"), QString::fromStdString(Settings::values.sink_id),
789 QStringLiteral("auto"));
790 WriteSetting(QStringLiteral("enable_audio_stretching"),
791 Settings::values.enable_audio_stretching, true);
792 WriteSetting(QStringLiteral("output_device"),
793 QString::fromStdString(Settings::values.audio_device_id), QStringLiteral("auto"));
794 WriteSetting(QStringLiteral("volume"), Settings::values.volume, 1.0f);
795
796 qt_config->endGroup();
797}
798
799void Config::SaveControlValues() {
800 qt_config->beginGroup(QStringLiteral("Controls"));
645 801
646 SavePlayerValues(); 802 SavePlayerValues();
647 SaveDebugValues(); 803 SaveDebugValues();
648 SaveMouseValues(); 804 SaveMouseValues();
649 SaveTouchscreenValues(); 805 SaveTouchscreenValues();
650 806
651 WriteSetting("motion_device", QString::fromStdString(Settings::values.motion_device), 807 WriteSetting(QStringLiteral("motion_device"),
652 "engine:motion_emu,update_period:100,sensitivity:0.01"); 808 QString::fromStdString(Settings::values.motion_device),
653 WriteSetting("keyboard_enabled", Settings::values.keyboard_enabled, false); 809 QStringLiteral("engine:motion_emu,update_period:100,sensitivity:0.01"));
810 WriteSetting(QStringLiteral("keyboard_enabled"), Settings::values.keyboard_enabled, false);
654 811
655 qt_config->endGroup(); 812 qt_config->endGroup();
813}
656 814
657 qt_config->beginGroup("Core"); 815void Config::SaveCoreValues() {
658 WriteSetting("use_cpu_jit", Settings::values.use_cpu_jit, true); 816 qt_config->beginGroup(QStringLiteral("Core"));
659 WriteSetting("use_multi_core", Settings::values.use_multi_core, false);
660 qt_config->endGroup();
661 817
662 qt_config->beginGroup("Renderer"); 818 WriteSetting(QStringLiteral("use_cpu_jit"), Settings::values.use_cpu_jit, true);
663 WriteSetting("resolution_factor", (double)Settings::values.resolution_factor, 1.0); 819 WriteSetting(QStringLiteral("use_multi_core"), Settings::values.use_multi_core, false);
664 WriteSetting("use_frame_limit", Settings::values.use_frame_limit, true);
665 WriteSetting("frame_limit", Settings::values.frame_limit, 100);
666 WriteSetting("use_compatibility_profile", Settings::values.use_compatibility_profile, true);
667 WriteSetting("use_disk_shader_cache", Settings::values.use_disk_shader_cache, true);
668 WriteSetting("use_accurate_gpu_emulation", Settings::values.use_accurate_gpu_emulation, false);
669 WriteSetting("use_asynchronous_gpu_emulation", Settings::values.use_asynchronous_gpu_emulation,
670 false);
671 WriteSetting("force_30fps_mode", Settings::values.force_30fps_mode, false);
672 820
673 // Cast to double because Qt's written float values are not human-readable
674 WriteSetting("bg_red", (double)Settings::values.bg_red, 0.0);
675 WriteSetting("bg_green", (double)Settings::values.bg_green, 0.0);
676 WriteSetting("bg_blue", (double)Settings::values.bg_blue, 0.0);
677 qt_config->endGroup(); 821 qt_config->endGroup();
822}
678 823
679 qt_config->beginGroup("Audio"); 824void Config::SaveDataStorageValues() {
680 WriteSetting("output_engine", QString::fromStdString(Settings::values.sink_id), "auto"); 825 qt_config->beginGroup(QStringLiteral("Data Storage"));
681 WriteSetting("enable_audio_stretching", Settings::values.enable_audio_stretching, true);
682 WriteSetting("output_device", QString::fromStdString(Settings::values.audio_device_id), "auto");
683 WriteSetting("volume", Settings::values.volume, 1.0f);
684 qt_config->endGroup();
685 826
686 qt_config->beginGroup("Data Storage"); 827 WriteSetting(QStringLiteral("use_virtual_sd"), Settings::values.use_virtual_sd, true);
687 WriteSetting("use_virtual_sd", Settings::values.use_virtual_sd, true); 828 WriteSetting(QStringLiteral("nand_directory"),
688 WriteSetting("nand_directory",
689 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)), 829 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)),
690 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir))); 830 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)));
691 WriteSetting("sdmc_directory", 831 WriteSetting(QStringLiteral("sdmc_directory"),
692 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)), 832 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)),
693 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir))); 833 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)));
694 qt_config->endGroup();
695
696 qt_config->beginGroup("System");
697 WriteSetting("use_docked_mode", Settings::values.use_docked_mode, false);
698 WriteSetting("current_user", Settings::values.current_user, 0);
699 WriteSetting("language_index", Settings::values.language_index, 1);
700
701 WriteSetting("rng_seed_enabled", Settings::values.rng_seed.has_value(), false);
702 WriteSetting("rng_seed", Settings::values.rng_seed.value_or(0), 0);
703
704 WriteSetting("custom_rtc_enabled", Settings::values.custom_rtc.has_value(), false);
705 WriteSetting("custom_rtc",
706 QVariant::fromValue<long long>(
707 Settings::values.custom_rtc.value_or(std::chrono::seconds{}).count()),
708 0);
709 834
710 qt_config->endGroup(); 835 qt_config->endGroup();
836}
711 837
712 qt_config->beginGroup("Miscellaneous"); 838void Config::SaveDebuggingValues() {
713 WriteSetting("log_filter", QString::fromStdString(Settings::values.log_filter), "*:Info"); 839 qt_config->beginGroup(QStringLiteral("Debugging"));
714 WriteSetting("use_dev_keys", Settings::values.use_dev_keys, false);
715 qt_config->endGroup();
716 840
717 qt_config->beginGroup("Debugging"); 841 WriteSetting(QStringLiteral("use_gdbstub"), Settings::values.use_gdbstub, false);
718 WriteSetting("use_gdbstub", Settings::values.use_gdbstub, false); 842 WriteSetting(QStringLiteral("gdbstub_port"), Settings::values.gdbstub_port, 24689);
719 WriteSetting("gdbstub_port", Settings::values.gdbstub_port, 24689); 843 WriteSetting(QStringLiteral("program_args"),
720 WriteSetting("program_args", QString::fromStdString(Settings::values.program_args), ""); 844 QString::fromStdString(Settings::values.program_args), QStringLiteral(""));
721 WriteSetting("dump_exefs", Settings::values.dump_exefs, false); 845 WriteSetting(QStringLiteral("dump_exefs"), Settings::values.dump_exefs, false);
722 WriteSetting("dump_nso", Settings::values.dump_nso, false); 846 WriteSetting(QStringLiteral("dump_nso"), Settings::values.dump_nso, false);
723 qt_config->endGroup();
724 847
725 qt_config->beginGroup("WebService");
726 WriteSetting("enable_telemetry", Settings::values.enable_telemetry, true);
727 WriteSetting("web_api_url", QString::fromStdString(Settings::values.web_api_url),
728 "https://api.yuzu-emu.org");
729 WriteSetting("yuzu_username", QString::fromStdString(Settings::values.yuzu_username));
730 WriteSetting("yuzu_token", QString::fromStdString(Settings::values.yuzu_token));
731 qt_config->endGroup(); 848 qt_config->endGroup();
849}
850
851void Config::SaveDisabledAddOnValues() {
852 qt_config->beginWriteArray(QStringLiteral("DisabledAddOns"));
732 853
733 qt_config->beginWriteArray("DisabledAddOns");
734 int i = 0; 854 int i = 0;
735 for (const auto& elem : Settings::values.disabled_addons) { 855 for (const auto& elem : Settings::values.disabled_addons) {
736 qt_config->setArrayIndex(i); 856 qt_config->setArrayIndex(i);
737 WriteSetting("title_id", QVariant::fromValue<u64>(elem.first), 0); 857 WriteSetting(QStringLiteral("title_id"), QVariant::fromValue<u64>(elem.first), 0);
738 qt_config->beginWriteArray("disabled"); 858 qt_config->beginWriteArray(QStringLiteral("disabled"));
739 for (std::size_t j = 0; j < elem.second.size(); ++j) { 859 for (std::size_t j = 0; j < elem.second.size(); ++j) {
740 qt_config->setArrayIndex(static_cast<int>(j)); 860 qt_config->setArrayIndex(static_cast<int>(j));
741 WriteSetting("d", QString::fromStdString(elem.second[j]), ""); 861 WriteSetting(QStringLiteral("d"), QString::fromStdString(elem.second[j]),
862 QStringLiteral(""));
742 } 863 }
743 qt_config->endArray(); 864 qt_config->endArray();
744 ++i; 865 ++i;
745 } 866 }
867
746 qt_config->endArray(); 868 qt_config->endArray();
869}
747 870
748 qt_config->beginGroup("UI"); 871void Config::SaveMiscellaneousValues() {
749 WriteSetting("theme", UISettings::values.theme, UISettings::themes[0].second); 872 qt_config->beginGroup(QStringLiteral("Miscellaneous"));
750 WriteSetting("enable_discord_presence", UISettings::values.enable_discord_presence, true); 873
751 WriteSetting("screenshot_resolution_factor", UISettings::values.screenshot_resolution_factor, 874 WriteSetting(QStringLiteral("log_filter"), QString::fromStdString(Settings::values.log_filter),
752 0); 875 QStringLiteral("*:Info"));
753 WriteSetting("select_user_on_boot", UISettings::values.select_user_on_boot, false); 876 WriteSetting(QStringLiteral("use_dev_keys"), Settings::values.use_dev_keys, false);
754 877
755 qt_config->beginGroup("UIGameList");
756 WriteSetting("show_unknown", UISettings::values.show_unknown, true);
757 WriteSetting("show_add_ons", UISettings::values.show_add_ons, true);
758 WriteSetting("icon_size", UISettings::values.icon_size, 64);
759 WriteSetting("row_1_text_id", UISettings::values.row_1_text_id, 3);
760 WriteSetting("row_2_text_id", UISettings::values.row_2_text_id, 2);
761 qt_config->endGroup(); 878 qt_config->endGroup();
879}
880
881void Config::SavePathValues() {
882 qt_config->beginGroup(QStringLiteral("Paths"));
883
884 WriteSetting(QStringLiteral("romsPath"), UISettings::values.roms_path);
885 WriteSetting(QStringLiteral("symbolsPath"), UISettings::values.symbols_path);
886 WriteSetting(QStringLiteral("screenshotPath"), UISettings::values.screenshot_path);
887 WriteSetting(QStringLiteral("gameListRootDir"), UISettings::values.game_directory_path,
888 QStringLiteral("."));
889 WriteSetting(QStringLiteral("gameListDeepScan"), UISettings::values.game_directory_deepscan,
890 false);
891 WriteSetting(QStringLiteral("recentFiles"), UISettings::values.recent_files);
762 892
763 qt_config->beginGroup("UILayout");
764 WriteSetting("geometry", UISettings::values.geometry);
765 WriteSetting("state", UISettings::values.state);
766 WriteSetting("geometryRenderWindow", UISettings::values.renderwindow_geometry);
767 WriteSetting("gameListHeaderState", UISettings::values.gamelist_header_state);
768 WriteSetting("microProfileDialogGeometry", UISettings::values.microprofile_geometry);
769 WriteSetting("microProfileDialogVisible", UISettings::values.microprofile_visible, false);
770 qt_config->endGroup(); 893 qt_config->endGroup();
894}
895
896void Config::SaveRendererValues() {
897 qt_config->beginGroup(QStringLiteral("Renderer"));
898
899 WriteSetting(QStringLiteral("resolution_factor"),
900 static_cast<double>(Settings::values.resolution_factor), 1.0);
901 WriteSetting(QStringLiteral("use_frame_limit"), Settings::values.use_frame_limit, true);
902 WriteSetting(QStringLiteral("frame_limit"), Settings::values.frame_limit, 100);
903 WriteSetting(QStringLiteral("use_compatibility_profile"),
904 Settings::values.use_compatibility_profile, true);
905 WriteSetting(QStringLiteral("use_disk_shader_cache"), Settings::values.use_disk_shader_cache,
906 true);
907 WriteSetting(QStringLiteral("use_accurate_gpu_emulation"),
908 Settings::values.use_accurate_gpu_emulation, false);
909 WriteSetting(QStringLiteral("use_asynchronous_gpu_emulation"),
910 Settings::values.use_asynchronous_gpu_emulation, false);
911 WriteSetting(QStringLiteral("force_30fps_mode"), Settings::values.force_30fps_mode, false);
912
913 // Cast to double because Qt's written float values are not human-readable
914 WriteSetting(QStringLiteral("bg_red"), static_cast<double>(Settings::values.bg_red), 0.0);
915 WriteSetting(QStringLiteral("bg_green"), static_cast<double>(Settings::values.bg_green), 0.0);
916 WriteSetting(QStringLiteral("bg_blue"), static_cast<double>(Settings::values.bg_blue), 0.0);
771 917
772 qt_config->beginGroup("Paths");
773 WriteSetting("romsPath", UISettings::values.roms_path);
774 WriteSetting("symbolsPath", UISettings::values.symbols_path);
775 WriteSetting("screenshotPath", UISettings::values.screenshot_path);
776 WriteSetting("gameListRootDir", UISettings::values.game_directory_path, ".");
777 WriteSetting("gameListDeepScan", UISettings::values.game_directory_deepscan, false);
778 WriteSetting("recentFiles", UISettings::values.recent_files);
779 qt_config->endGroup(); 918 qt_config->endGroup();
919}
920
921void Config::SaveShortcutValues() {
922 qt_config->beginGroup(QStringLiteral("Shortcuts"));
780 923
781 qt_config->beginGroup("Shortcuts");
782 // Lengths of UISettings::values.shortcuts & default_hotkeys are same. 924 // Lengths of UISettings::values.shortcuts & default_hotkeys are same.
783 // However, their ordering must also be the same. 925 // However, their ordering must also be the same.
784 for (std::size_t i = 0; i < default_hotkeys.size(); i++) { 926 for (std::size_t i = 0; i < default_hotkeys.size(); i++) {
785 auto [name, group, shortcut] = UISettings::values.shortcuts[i]; 927 const auto [name, group, shortcut] = UISettings::values.shortcuts[i];
928 const auto& default_hotkey = default_hotkeys[i].shortcut;
929
786 qt_config->beginGroup(group); 930 qt_config->beginGroup(group);
787 qt_config->beginGroup(name); 931 qt_config->beginGroup(name);
788 WriteSetting("KeySeq", shortcut.first, default_hotkeys[i].shortcut.first); 932 WriteSetting(QStringLiteral("KeySeq"), shortcut.first, default_hotkey.first);
789 WriteSetting("Context", shortcut.second, default_hotkeys[i].shortcut.second); 933 WriteSetting(QStringLiteral("Context"), shortcut.second, default_hotkey.second);
790 qt_config->endGroup(); 934 qt_config->endGroup();
791 qt_config->endGroup(); 935 qt_config->endGroup();
792 } 936 }
937
938 qt_config->endGroup();
939}
940
941void Config::SaveSystemValues() {
942 qt_config->beginGroup(QStringLiteral("System"));
943
944 WriteSetting(QStringLiteral("use_docked_mode"), Settings::values.use_docked_mode, false);
945 WriteSetting(QStringLiteral("current_user"), Settings::values.current_user, 0);
946 WriteSetting(QStringLiteral("language_index"), Settings::values.language_index, 1);
947
948 WriteSetting(QStringLiteral("rng_seed_enabled"), Settings::values.rng_seed.has_value(), false);
949 WriteSetting(QStringLiteral("rng_seed"), Settings::values.rng_seed.value_or(0), 0);
950
951 WriteSetting(QStringLiteral("custom_rtc_enabled"), Settings::values.custom_rtc.has_value(),
952 false);
953 WriteSetting(QStringLiteral("custom_rtc"),
954 QVariant::fromValue<long long>(
955 Settings::values.custom_rtc.value_or(std::chrono::seconds{}).count()),
956 0);
957
958 qt_config->endGroup();
959}
960
961void Config::SaveUIValues() {
962 qt_config->beginGroup(QStringLiteral("UI"));
963
964 WriteSetting(QStringLiteral("theme"), UISettings::values.theme, UISettings::themes[0].second);
965 WriteSetting(QStringLiteral("enable_discord_presence"),
966 UISettings::values.enable_discord_presence, true);
967 WriteSetting(QStringLiteral("screenshot_resolution_factor"),
968 UISettings::values.screenshot_resolution_factor, 0);
969 WriteSetting(QStringLiteral("select_user_on_boot"), UISettings::values.select_user_on_boot,
970 false);
971
972 SaveUIGamelistValues();
973 SaveUILayoutValues();
974 SavePathValues();
975 SaveShortcutValues();
976
977 WriteSetting(QStringLiteral("singleWindowMode"), UISettings::values.single_window_mode, true);
978 WriteSetting(QStringLiteral("fullscreen"), UISettings::values.fullscreen, false);
979 WriteSetting(QStringLiteral("displayTitleBars"), UISettings::values.display_titlebar, true);
980 WriteSetting(QStringLiteral("showFilterBar"), UISettings::values.show_filter_bar, true);
981 WriteSetting(QStringLiteral("showStatusBar"), UISettings::values.show_status_bar, true);
982 WriteSetting(QStringLiteral("confirmClose"), UISettings::values.confirm_before_closing, true);
983 WriteSetting(QStringLiteral("firstStart"), UISettings::values.first_start, true);
984 WriteSetting(QStringLiteral("calloutFlags"), UISettings::values.callout_flags, 0);
985 WriteSetting(QStringLiteral("showConsole"), UISettings::values.show_console, false);
986 WriteSetting(QStringLiteral("profileIndex"), UISettings::values.profile_index, 0);
987
988 qt_config->endGroup();
989}
990
991void Config::SaveUIGamelistValues() {
992 qt_config->beginGroup(QStringLiteral("UIGameList"));
993
994 WriteSetting(QStringLiteral("show_unknown"), UISettings::values.show_unknown, true);
995 WriteSetting(QStringLiteral("show_add_ons"), UISettings::values.show_add_ons, true);
996 WriteSetting(QStringLiteral("icon_size"), UISettings::values.icon_size, 64);
997 WriteSetting(QStringLiteral("row_1_text_id"), UISettings::values.row_1_text_id, 3);
998 WriteSetting(QStringLiteral("row_2_text_id"), UISettings::values.row_2_text_id, 2);
999
1000 qt_config->endGroup();
1001}
1002
1003void Config::SaveUILayoutValues() {
1004 qt_config->beginGroup(QStringLiteral("UILayout"));
1005
1006 WriteSetting(QStringLiteral("geometry"), UISettings::values.geometry);
1007 WriteSetting(QStringLiteral("state"), UISettings::values.state);
1008 WriteSetting(QStringLiteral("geometryRenderWindow"), UISettings::values.renderwindow_geometry);
1009 WriteSetting(QStringLiteral("gameListHeaderState"), UISettings::values.gamelist_header_state);
1010 WriteSetting(QStringLiteral("microProfileDialogGeometry"),
1011 UISettings::values.microprofile_geometry);
1012 WriteSetting(QStringLiteral("microProfileDialogVisible"),
1013 UISettings::values.microprofile_visible, false);
1014
793 qt_config->endGroup(); 1015 qt_config->endGroup();
1016}
1017
1018void Config::SaveWebServiceValues() {
1019 qt_config->beginGroup(QStringLiteral("WebService"));
1020
1021 WriteSetting(QStringLiteral("enable_telemetry"), Settings::values.enable_telemetry, true);
1022 WriteSetting(QStringLiteral("web_api_url"),
1023 QString::fromStdString(Settings::values.web_api_url),
1024 QStringLiteral("https://api.yuzu-emu.org"));
1025 WriteSetting(QStringLiteral("yuzu_username"),
1026 QString::fromStdString(Settings::values.yuzu_username));
1027 WriteSetting(QStringLiteral("yuzu_token"), QString::fromStdString(Settings::values.yuzu_token));
794 1028
795 WriteSetting("singleWindowMode", UISettings::values.single_window_mode, true);
796 WriteSetting("fullscreen", UISettings::values.fullscreen, false);
797 WriteSetting("displayTitleBars", UISettings::values.display_titlebar, true);
798 WriteSetting("showFilterBar", UISettings::values.show_filter_bar, true);
799 WriteSetting("showStatusBar", UISettings::values.show_status_bar, true);
800 WriteSetting("confirmClose", UISettings::values.confirm_before_closing, true);
801 WriteSetting("firstStart", UISettings::values.first_start, true);
802 WriteSetting("calloutFlags", UISettings::values.callout_flags, 0);
803 WriteSetting("showConsole", UISettings::values.show_console, false);
804 WriteSetting("profileIndex", UISettings::values.profile_index, 0);
805 qt_config->endGroup(); 1029 qt_config->endGroup();
806} 1030}
807 1031
@@ -811,7 +1035,7 @@ QVariant Config::ReadSetting(const QString& name) const {
811 1035
812QVariant Config::ReadSetting(const QString& name, const QVariant& default_value) const { 1036QVariant Config::ReadSetting(const QString& name, const QVariant& default_value) const {
813 QVariant result; 1037 QVariant result;
814 if (qt_config->value(name + "/default", false).toBool()) { 1038 if (qt_config->value(name + QStringLiteral("/default"), false).toBool()) {
815 result = default_value; 1039 result = default_value;
816 } else { 1040 } else {
817 result = qt_config->value(name, default_value); 1041 result = qt_config->value(name, default_value);
@@ -825,7 +1049,7 @@ void Config::WriteSetting(const QString& name, const QVariant& value) {
825 1049
826void Config::WriteSetting(const QString& name, const QVariant& value, 1050void Config::WriteSetting(const QString& name, const QVariant& value,
827 const QVariant& default_value) { 1051 const QVariant& default_value) {
828 qt_config->setValue(name + "/default", value == default_value); 1052 qt_config->setValue(name + QStringLiteral("/default"), value == default_value);
829 qt_config->setValue(name, value); 1053 qt_config->setValue(name, value);
830} 1054}
831 1055
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index 221d2364c..b62a480ee 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -37,12 +37,46 @@ private:
37 void ReadTouchscreenValues(); 37 void ReadTouchscreenValues();
38 void ApplyDefaultProfileIfInputInvalid(); 38 void ApplyDefaultProfileIfInputInvalid();
39 39
40 // Read functions bases off the respective config section names.
41 void ReadAudioValues();
42 void ReadControlValues();
43 void ReadCoreValues();
44 void ReadDataStorageValues();
45 void ReadDebuggingValues();
46 void ReadDisabledAddOnValues();
47 void ReadMiscellaneousValues();
48 void ReadPathValues();
49 void ReadRendererValues();
50 void ReadShortcutValues();
51 void ReadSystemValues();
52 void ReadUIValues();
53 void ReadUIGamelistValues();
54 void ReadUILayoutValues();
55 void ReadWebServiceValues();
56
40 void SaveValues(); 57 void SaveValues();
41 void SavePlayerValues(); 58 void SavePlayerValues();
42 void SaveDebugValues(); 59 void SaveDebugValues();
43 void SaveMouseValues(); 60 void SaveMouseValues();
44 void SaveTouchscreenValues(); 61 void SaveTouchscreenValues();
45 62
63 // Save functions based off the respective config section names.
64 void SaveAudioValues();
65 void SaveControlValues();
66 void SaveCoreValues();
67 void SaveDataStorageValues();
68 void SaveDebuggingValues();
69 void SaveDisabledAddOnValues();
70 void SaveMiscellaneousValues();
71 void SavePathValues();
72 void SaveRendererValues();
73 void SaveShortcutValues();
74 void SaveSystemValues();
75 void SaveUIValues();
76 void SaveUIGamelistValues();
77 void SaveUILayoutValues();
78 void SaveWebServiceValues();
79
46 QVariant ReadSetting(const QString& name) const; 80 QVariant ReadSetting(const QString& name) const;
47 QVariant ReadSetting(const QString& name, const QVariant& default_value) const; 81 QVariant ReadSetting(const QString& name, const QVariant& default_value) const;
48 void WriteSetting(const QString& name, const QVariant& value); 82 void WriteSetting(const QString& name, const QVariant& value);