summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2019-05-08 23:11:15 -0400
committerGravatar Lioncash2019-05-09 00:52:49 -0400
commit4ef3329f812a8b19b191633a7e1c661f2b0a4c09 (patch)
tree74c5c526b85a91c6096eac162f063fae8d0908bb /src
parentloader/nso: Remove left-in debug pragma (diff)
downloadyuzu-4ef3329f812a8b19b191633a7e1c661f2b0a4c09.tar.gz
yuzu-4ef3329f812a8b19b191633a7e1c661f2b0a4c09.tar.xz
yuzu-4ef3329f812a8b19b191633a7e1c661f2b0a4c09.zip
configuration/config: Move config loading and saving to functions based off groups
Over time our config values have grown quite numerous in size. Unfortunately it also makes the single functions we have for loading and saving values more error prone. For example, we were loading the core settings twice when they only should have been loaded once. In another section, a variable was shadowing another variable used to load settings from a completely different section. Finally, in one other case, there was an extraneous endGroup() call used that didn't need to be done. This was essentially dead code and also a bug waiting to happen. This separates the section loading code into its own separate functions. This keeps variables only visible to the code that actually needs it, and makes it much easier to visually see the end of each individual configuration group. It also makes it much easier to visually catch bugs during code review. While we're at it, this also uses QStringLiteral instead of raw string literals, which both avoids constructing a lot of QString instances, but also makes it much easier to disable implicit ASCII to QString and vice-versa in the future via setting QT_NO_CAST_FROM_ASCII and QT_NO_CAST_TO_ASCII as compilation flags.
Diffstat (limited to 'src')
-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);