summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/settings.cpp1
-rw-r--r--src/common/settings.h114
-rw-r--r--src/core/core.cpp20
-rw-r--r--src/core/file_sys/control_metadata.cpp3
-rw-r--r--src/core/file_sys/patch_manager.cpp4
-rw-r--r--src/core/hle/service/ns/ns.cpp2
-rw-r--r--src/core/hle/service/set/set.cpp10
-rw-r--r--src/yuzu/configuration/config.cpp2
-rw-r--r--src/yuzu/configuration/configure_dialog.cpp2
-rw-r--r--src/yuzu/configuration/configure_graphics.cpp2
-rw-r--r--src/yuzu/configuration/configure_per_game.cpp2
-rw-r--r--src/yuzu/configuration/configure_system.cpp232
-rw-r--r--src/yuzu/configuration/configure_system.h17
-rw-r--r--src/yuzu/configuration/configure_system.ui509
-rw-r--r--src/yuzu/configuration/shared_translation.cpp43
-rw-r--r--src/yuzu/configuration/shared_widget.cpp179
-rw-r--r--src/yuzu/configuration/shared_widget.h13
-rw-r--r--src/yuzu_cmd/config.cpp1
18 files changed, 508 insertions, 648 deletions
diff --git a/src/common/settings.cpp b/src/common/settings.cpp
index b7a0c063f..605fe7f86 100644
--- a/src/common/settings.cpp
+++ b/src/common/settings.cpp
@@ -162,6 +162,7 @@ const char* TranslateCategory(Category category) {
case Category::RendererDebug:
return "Renderer";
case Category::System:
+ case Category::SystemAudio:
return "System";
case Category::DataStorage:
return "Data Storage";
diff --git a/src/common/settings.h b/src/common/settings.h
index fdadb06a1..1f95bd7d5 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -20,6 +20,86 @@
namespace Settings {
+enum class Language : u32 {
+ Japanese,
+ EnglishAmerican,
+ French,
+ German,
+ Italian,
+ Spanish,
+ Chinese,
+ Korean,
+ Dutch,
+ Portuguese,
+ Russian,
+ Taiwanese,
+ EnglishBritish,
+ FrenchCanadian,
+ SpanishLatin,
+ ChineseSimplified,
+ ChineseTraditional,
+ PortugueseBrazilian,
+};
+
+enum class Region : u32 {
+ Japan,
+ USA,
+ Europe,
+ Australia,
+ China,
+ Korea,
+ Taiwan,
+};
+
+enum class TimeZone : u32 {
+ Auto,
+ Default,
+ CET,
+ CST6CDT,
+ Cuba,
+ EET,
+ Egypt,
+ Eire,
+ EST,
+ EST5EDT,
+ GB,
+ GBEire,
+ GMT,
+ GMTPlusZero,
+ GMTMinusZero,
+ GMTZero,
+ Greenwich,
+ Hongkong,
+ HST,
+ Iceland,
+ Iran,
+ Israel,
+ Jamaica,
+ Japan,
+ Kwajalein,
+ Libya,
+ MET,
+ MST,
+ MST7MDT,
+ Navajo,
+ NZ,
+ NZCHAT,
+ Poland,
+ Portugal,
+ PRC,
+ PST8PDT,
+ ROC,
+ ROK,
+ Singapore,
+ Turkey,
+ UCT,
+ Universal,
+ UTC,
+ W_SU,
+ WET,
+ Zulu,
+};
+
enum class AnisotropyMode : u32 {
Automatic = 0,
Default = 1,
@@ -134,6 +214,7 @@ enum class Category : u32 {
RendererAdvanced,
RendererDebug,
System,
+ SystemAudio,
DataStorage,
Debugging,
DebuggingGraphics,
@@ -810,22 +891,31 @@ struct Values {
SwitchableSetting<u8, false> bg_blue{linkage, 0, "bg_blue", Category::Renderer, true, true};
// System
- SwitchableSetting<bool> rng_seed_enabled{linkage, false, "rng_seed_enabled", Category::System};
- SwitchableSetting<u32> rng_seed{linkage, 0, "rng_seed", Category::System};
- Setting<std::string> device_name{linkage, "Yuzu", "device_name", Category::System};
+ SwitchableSetting<bool> rng_seed_enabled{linkage, false, "rng_seed_enabled",
+ Category::System, true, true};
+ SwitchableSetting<u32> rng_seed{linkage, 0, "rng_seed", Category::System, true, true};
+ Setting<std::string> device_name{linkage, "Yuzu", "device_name", Category::System, true, true};
// Measured in seconds since epoch
- Setting<bool> custom_rtc_enabled{linkage, false, "custom_rtc_enabled", Category::System};
- Setting<s64> custom_rtc{linkage, 0, "custom_rtc", Category::System};
+ SwitchableSetting<bool> custom_rtc_enabled{linkage, false, "custom_rtc_enabled",
+ Category::System, true, true};
+ SwitchableSetting<s64> custom_rtc{linkage, 0, "custom_rtc", Category::System, true, true};
// Set on game boot, reset on stop. Seconds difference between current time and `custom_rtc`
s64 custom_rtc_differential;
Setting<s32> current_user{linkage, 0, "current_user", Category::System};
- SwitchableSetting<s32, true> language_index{linkage, 1, 0, 17, "language_index",
- Category::System};
- SwitchableSetting<s32, true> region_index{linkage, 1, 0, 6, "region_index", Category::System};
- SwitchableSetting<s32, true> time_zone_index{linkage, 0, 0, 45, "time_zone_index",
- Category::System};
- SwitchableSetting<s32, true> sound_index{linkage, 1, 0, 2, "sound_index", Category::System};
+ SwitchableSetting<Language, true> language_index{linkage,
+ Language::EnglishAmerican,
+ Language::Japanese,
+ Language::PortugueseBrazilian,
+ "language_index",
+ Category::System};
+ SwitchableSetting<Region, true> region_index{linkage, Region::USA, Region::Japan,
+ Region::Taiwan, "region_index", Category::System};
+ SwitchableSetting<TimeZone, true> time_zone_index{linkage, TimeZone::Auto,
+ TimeZone::Auto, TimeZone::Zulu,
+ "time_zone_index", Category::System};
+ SwitchableSetting<s32, true> sound_index{
+ linkage, 1, 0, 2, "sound_index", Category::SystemAudio};
SwitchableSetting<bool> use_docked_mode{linkage, true, "use_docked_mode", Category::System};
@@ -837,7 +927,7 @@ struct Values {
#ifdef _WIN32
true
#else
- false
+ false
#endif
};
Setting<bool> controller_navigation{linkage, true, "controller_navigation", Category::Controls};
diff --git a/src/core/core.cpp b/src/core/core.cpp
index da1baa892..e2902a91f 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -145,13 +145,7 @@ struct System::Impl {
core_timing.SetMulticore(is_multicore);
core_timing.Initialize([&system]() { system.RegisterHostThread(); });
- const auto posix_time = std::chrono::system_clock::now().time_since_epoch();
- const auto current_time =
- std::chrono::duration_cast<std::chrono::seconds>(posix_time).count();
- Settings::values.custom_rtc_differential =
- (Settings::values.custom_rtc_enabled ? Settings::values.custom_rtc.GetValue()
- : current_time) -
- current_time;
+ RefreshTime();
// Create a default fs if one doesn't already exist.
if (virtual_filesystem == nullptr) {
@@ -188,6 +182,16 @@ struct System::Impl {
Initialize(system);
}
+ void RefreshTime() {
+ const auto posix_time = std::chrono::system_clock::now().time_since_epoch();
+ const auto current_time =
+ std::chrono::duration_cast<std::chrono::seconds>(posix_time).count();
+ Settings::values.custom_rtc_differential =
+ (Settings::values.custom_rtc_enabled ? Settings::values.custom_rtc.GetValue()
+ : current_time) -
+ current_time;
+ }
+
void Run() {
std::unique_lock<std::mutex> lk(suspend_guard);
@@ -1022,6 +1026,8 @@ void System::Exit() {
}
void System::ApplySettings() {
+ impl->RefreshTime();
+
if (IsPoweredOn()) {
Renderer().RefreshBaseSettings();
}
diff --git a/src/core/file_sys/control_metadata.cpp b/src/core/file_sys/control_metadata.cpp
index cd9ac2e75..0697c29ae 100644
--- a/src/core/file_sys/control_metadata.cpp
+++ b/src/core/file_sys/control_metadata.cpp
@@ -68,7 +68,8 @@ NACP::NACP(VirtualFile file) {
NACP::~NACP() = default;
const LanguageEntry& NACP::GetLanguageEntry() const {
- Language language = language_to_codes[Settings::values.language_index.GetValue()];
+ Language language =
+ language_to_codes[static_cast<s32>(Settings::values.language_index.GetValue())];
{
const auto& language_entry = raw.language_entries.at(static_cast<u8>(language));
diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp
index d3286b352..2ba1b34a4 100644
--- a/src/core/file_sys/patch_manager.cpp
+++ b/src/core/file_sys/patch_manager.cpp
@@ -626,8 +626,8 @@ PatchManager::Metadata PatchManager::ParseControlNCA(const NCA& nca) const {
auto nacp = nacp_file == nullptr ? nullptr : std::make_unique<NACP>(nacp_file);
// Get language code from settings
- const auto language_code =
- Service::Set::GetLanguageCodeFromIndex(Settings::values.language_index.GetValue());
+ const auto language_code = Service::Set::GetLanguageCodeFromIndex(
+ static_cast<u32>(Settings::values.language_index.GetValue()));
// Convert to application language and get priority list
const auto application_language =
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
index 376067a95..91c5a2182 100644
--- a/src/core/hle/service/ns/ns.cpp
+++ b/src/core/hle/service/ns/ns.cpp
@@ -409,7 +409,7 @@ ResultVal<u8> IApplicationManagerInterface::GetApplicationDesiredLanguage(
// Get language code from settings
const auto language_code =
- Set::GetLanguageCodeFromIndex(Settings::values.language_index.GetValue());
+ Set::GetLanguageCodeFromIndex(static_cast<s32>(Settings::values.language_index.GetValue()));
// Convert to application language, get priority list
const auto application_language = ConvertToApplicationLanguage(language_code);
diff --git a/src/core/hle/service/set/set.cpp b/src/core/hle/service/set/set.cpp
index f5788b481..83f888c54 100644
--- a/src/core/hle/service/set/set.cpp
+++ b/src/core/hle/service/set/set.cpp
@@ -93,7 +93,8 @@ void GetAvailableLanguageCodesImpl(HLERequestContext& ctx, std::size_t max_entri
}
void GetKeyCodeMapImpl(HLERequestContext& ctx) {
- const auto language_code = available_language_codes[Settings::values.language_index.GetValue()];
+ const auto language_code =
+ available_language_codes[static_cast<s32>(Settings::values.language_index.GetValue())];
const auto key_code =
std::find_if(language_to_layout.cbegin(), language_to_layout.cend(),
[=](const auto& element) { return element.first == language_code; });
@@ -162,7 +163,7 @@ void SET::GetQuestFlag(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
- rb.Push(static_cast<u32>(Settings::values.quest_flag.GetValue()));
+ rb.Push(static_cast<s32>(Settings::values.quest_flag.GetValue()));
}
void SET::GetLanguageCode(HLERequestContext& ctx) {
@@ -170,7 +171,8 @@ void SET::GetLanguageCode(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 4};
rb.Push(ResultSuccess);
- rb.PushEnum(available_language_codes[Settings::values.language_index.GetValue()]);
+ rb.PushEnum(
+ available_language_codes[static_cast<s32>(Settings::values.language_index.GetValue())]);
}
void SET::GetRegionCode(HLERequestContext& ctx) {
@@ -178,7 +180,7 @@ void SET::GetRegionCode(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
- rb.Push(Settings::values.region_index.GetValue());
+ rb.Push(static_cast<u32>(Settings::values.region_index.GetValue()));
}
void SET::GetKeyCodeMap(HLERequestContext& ctx) {
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 3181a9528..28ee5d492 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -696,6 +696,7 @@ void Config::ReadSystemValues() {
qt_config->beginGroup(QStringLiteral("System"));
ReadCategory(Settings::Category::System);
+ ReadCategory(Settings::Category::SystemAudio);
qt_config->endGroup();
}
@@ -1134,6 +1135,7 @@ void Config::SaveSystemValues() {
qt_config->beginGroup(QStringLiteral("System"));
WriteCategory(Settings::Category::System);
+ WriteCategory(Settings::Category::SystemAudio);
qt_config->endGroup();
}
diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp
index 8baa8de1e..3a94fee9e 100644
--- a/src/yuzu/configuration/configure_dialog.cpp
+++ b/src/yuzu/configuration/configure_dialog.cpp
@@ -48,7 +48,7 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_,
input_tab{std::make_unique<ConfigureInput>(system_, this)},
network_tab{std::make_unique<ConfigureNetwork>(system_, this)},
profile_tab{std::make_unique<ConfigureProfileManager>(system_, this)},
- system_tab{std::make_unique<ConfigureSystem>(system_, nullptr, this)},
+ system_tab{std::make_unique<ConfigureSystem>(system_, nullptr, *translations, this)},
ui_tab{std::make_unique<ConfigureUi>(system_, this)}, web_tab{std::make_unique<ConfigureWeb>(
this)} {
Settings::SetConfiguringGlobal(true);
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp
index ae3cf269f..977aed42d 100644
--- a/src/yuzu/configuration/configure_graphics.cpp
+++ b/src/yuzu/configuration/configure_graphics.cpp
@@ -240,7 +240,7 @@ void ConfigureGraphics::Setup() {
return new ConfigurationShared::Widget(
setting, translations, this, runtime_lock, apply_funcs,
ConfigurationShared::RequestType::SpinBox, true, 1.0f,
- &Settings::values.speed_limit, QStringLiteral("%"));
+ &Settings::values.speed_limit, "%");
} else {
return new ConfigurationShared::Widget(setting, translations, this, runtime_lock,
apply_funcs);
diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp
index 5548fc2ba..c39855334 100644
--- a/src/yuzu/configuration/configure_per_game.cpp
+++ b/src/yuzu/configuration/configure_per_game.cpp
@@ -58,7 +58,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st
system_, vk_device_records, [&]() { graphics_advanced_tab->ExposeComputeOption(); },
tab_group, *translations, this);
input_tab = std::make_unique<ConfigureInputPerGame>(system_, game_config.get(), this);
- system_tab = std::make_unique<ConfigureSystem>(system_, tab_group, this);
+ system_tab = std::make_unique<ConfigureSystem>(system_, tab_group, *translations, this);
ui->setupUi(this);
diff --git a/src/yuzu/configuration/configure_system.cpp b/src/yuzu/configuration/configure_system.cpp
index 4872a475b..dedbad57f 100644
--- a/src/yuzu/configuration/configure_system.cpp
+++ b/src/yuzu/configuration/configure_system.cpp
@@ -2,17 +2,22 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include <chrono>
+#include <forward_list>
#include <optional>
+#include <QDateTimeEdit>
#include <QFileDialog>
#include <QGraphicsItem>
+#include <QLineEdit>
#include <QMessageBox>
#include "common/settings.h"
#include "core/core.h"
#include "core/hle/service/time/time_manager.h"
#include "ui_configure_system.h"
+#include "yuzu/configuration/config.h"
#include "yuzu/configuration/configuration_shared.h"
#include "yuzu/configuration/configure_system.h"
+#include "yuzu/configuration/shared_widget.h"
constexpr std::array<u32, 7> LOCALE_BLOCKLIST{
// pzzefezrpnkzeidfej
@@ -39,44 +44,42 @@ static bool IsValidLocale(u32 region_index, u32 language_index) {
ConfigureSystem::ConfigureSystem(
Core::System& system_, std::shared_ptr<std::forward_list<ConfigurationShared::Tab*>> group,
- QWidget* parent)
- : Tab(group, parent), ui{std::make_unique<Ui::ConfigureSystem>()}, system{system_} {
+ ConfigurationShared::TranslationMap& translations_, QWidget* parent)
+ : Tab(group, parent), ui{std::make_unique<Ui::ConfigureSystem>()}, system{system_},
+ translations{translations_} {
ui->setupUi(this);
- connect(ui->rng_seed_checkbox, &QCheckBox::stateChanged, this, [this](int state) {
- ui->rng_seed_edit->setEnabled(state == Qt::Checked);
+ Setup();
+
+ connect(rng_seed_checkbox, &QCheckBox::stateChanged, this, [this](int state) {
+ rng_seed_edit->setEnabled(state == Qt::Checked);
if (state != Qt::Checked) {
- ui->rng_seed_edit->setText(QStringLiteral("00000000"));
+ rng_seed_edit->setText(QStringLiteral("00000000"));
}
});
- connect(ui->custom_rtc_checkbox, &QCheckBox::stateChanged, this, [this](int state) {
- ui->custom_rtc_edit->setEnabled(state == Qt::Checked);
+ connect(custom_rtc_checkbox, &QCheckBox::stateChanged, this, [this](int state) {
+ custom_rtc_edit->setEnabled(state == Qt::Checked);
if (state != Qt::Checked) {
- ui->custom_rtc_edit->setDateTime(QDateTime::currentDateTime());
+ custom_rtc_edit->setDateTime(QDateTime::currentDateTime());
}
});
const auto locale_check = [this](int index) {
- const auto region_index = ConfigurationShared::GetComboboxIndex(
- Settings::values.region_index.GetValue(true), ui->combo_region);
- const auto language_index = ConfigurationShared::GetComboboxIndex(
- Settings::values.language_index.GetValue(true), ui->combo_language);
+ const auto region_index = combo_region->currentIndex();
+ const auto language_index = combo_language->currentIndex();
const bool valid_locale = IsValidLocale(region_index, language_index);
ui->label_warn_invalid_locale->setVisible(!valid_locale);
if (!valid_locale) {
ui->label_warn_invalid_locale->setText(
tr("Warning: \"%1\" is not a valid language for region \"%2\"")
- .arg(ui->combo_language->currentText())
- .arg(ui->combo_region->currentText()));
+ .arg(combo_language->currentText())
+ .arg(combo_region->currentText()));
}
};
- connect(ui->combo_language, qOverload<int>(&QComboBox::currentIndexChanged), this,
- locale_check);
- connect(ui->combo_region, qOverload<int>(&QComboBox::currentIndexChanged), this, locale_check);
-
- SetupPerGameUI();
+ connect(combo_language, qOverload<int>(&QComboBox::currentIndexChanged), this, locale_check);
+ connect(combo_region, qOverload<int>(&QComboBox::currentIndexChanged), this, locale_check);
SetConfiguration();
}
@@ -95,137 +98,94 @@ void ConfigureSystem::RetranslateUI() {
ui->retranslateUi(this);
}
-void ConfigureSystem::SetConfiguration() {
- enabled = !system.IsPoweredOn();
- const auto rng_seed = QStringLiteral("%1")
- .arg(Settings::values.rng_seed.GetValue(), 8, 16, QLatin1Char{'0'})
- .toUpper();
- const auto rtc_time = Settings::values.custom_rtc_enabled
- ? Settings::values.custom_rtc.GetValue()
- : QDateTime::currentSecsSinceEpoch();
-
- ui->rng_seed_checkbox->setChecked(Settings::values.rng_seed_enabled.GetValue());
- ui->rng_seed_edit->setEnabled(Settings::values.rng_seed_enabled.GetValue() &&
- Settings::values.rng_seed.UsingGlobal());
- ui->rng_seed_edit->setText(rng_seed);
-
- ui->custom_rtc_checkbox->setChecked(Settings::values.custom_rtc_enabled.GetValue());
- ui->custom_rtc_edit->setEnabled(Settings::values.custom_rtc_enabled.GetValue());
- ui->custom_rtc_edit->setDateTime(QDateTime::fromSecsSinceEpoch(rtc_time));
- ui->device_name_edit->setText(
- QString::fromUtf8(Settings::values.device_name.GetValue().c_str()));
- ui->use_unsafe_extended_memory_layout->setEnabled(enabled);
- ui->use_unsafe_extended_memory_layout->setChecked(
- Settings::values.use_unsafe_extended_memory_layout.GetValue());
-
- if (Settings::IsConfiguringGlobal()) {
- ui->combo_language->setCurrentIndex(Settings::values.language_index.GetValue());
- ui->combo_region->setCurrentIndex(Settings::values.region_index.GetValue());
- ui->combo_time_zone->setCurrentIndex(Settings::values.time_zone_index.GetValue());
- } else {
- ConfigurationShared::SetPerGameSetting(ui->combo_language,
- &Settings::values.language_index);
- ConfigurationShared::SetPerGameSetting(ui->combo_region, &Settings::values.region_index);
- ConfigurationShared::SetPerGameSetting(ui->combo_time_zone,
- &Settings::values.time_zone_index);
-
- ConfigurationShared::SetHighlight(ui->label_language,
- !Settings::values.language_index.UsingGlobal());
- ConfigurationShared::SetHighlight(ui->label_region,
- !Settings::values.region_index.UsingGlobal());
- ConfigurationShared::SetHighlight(ui->label_timezone,
- !Settings::values.time_zone_index.UsingGlobal());
- }
-}
+void ConfigureSystem::Setup() {
+ const bool runtime_lock = !system.IsPoweredOn();
+ auto& core_layout = *ui->core_widget->layout();
+ auto& system_layout = *ui->system_widget->layout();
-void ConfigureSystem::ReadSystemSettings() {}
+ std::map<std::string, QWidget*> core_hold{};
+ std::map<bool, std::map<std::string, QWidget*>> system_hold{};
-void ConfigureSystem::ApplyConfiguration() {
- // Allow setting custom RTC even if system is powered on,
- // to allow in-game time to be fast forwarded
- if (Settings::IsConfiguringGlobal()) {
- if (ui->custom_rtc_checkbox->isChecked()) {
- Settings::values.custom_rtc_enabled = true;
- Settings::values.custom_rtc = ui->custom_rtc_edit->dateTime().toSecsSinceEpoch();
- if (system.IsPoweredOn()) {
- const s64 posix_time{Settings::values.custom_rtc.GetValue() +
- Service::Time::TimeManager::GetExternalTimeZoneOffset()};
- system.GetTimeManager().UpdateLocalSystemClockTime(posix_time);
- }
- } else {
- Settings::values.custom_rtc_enabled = false;
+ std::forward_list<Settings::BasicSetting*> settings;
+ auto push = [&settings](std::forward_list<Settings::BasicSetting*>& list) {
+ for (auto setting : list) {
+ settings.push_front(setting);
}
- }
+ };
- Settings::values.device_name = ui->device_name_edit->text().toStdString();
+ push(Settings::values.linkage.by_category[Settings::Category::Core]);
+ push(Settings::values.linkage.by_category[Settings::Category::System]);
+
+ for (auto setting : settings) {
+ ConfigurationShared::Widget* widget = [=]() {
+ if (setting->Id() == Settings::values.custom_rtc_enabled.Id()) {
+ return new ConfigurationShared::Widget(
+ setting, translations, this, runtime_lock, apply_funcs,
+ ConfigurationShared::RequestType::DateTimeEdit, true, 1.0f,
+ &Settings::values.custom_rtc);
+ } else if (setting->Id() == Settings::values.rng_seed_enabled.Id()) {
+ return new ConfigurationShared::Widget(setting, translations, this, runtime_lock,
+ apply_funcs,
+ ConfigurationShared::RequestType::HexEdit,
+ true, 1.0f, &Settings::values.rng_seed);
+ } else {
+ return new ConfigurationShared::Widget(setting, translations, this, runtime_lock,
+
+ apply_funcs);
+ }
+ }();
- if (!enabled) {
- return;
- }
+ if (!widget->Valid()) {
+ delete widget;
+ continue;
+ }
+
+ if (setting->Id() == Settings::values.rng_seed_enabled.Id()) {
+ rng_seed_checkbox = widget->checkbox;
+ rng_seed_edit = widget->line_edit;
- ConfigurationShared::ApplyPerGameSetting(&Settings::values.language_index, ui->combo_language);
- ConfigurationShared::ApplyPerGameSetting(&Settings::values.region_index, ui->combo_region);
- ConfigurationShared::ApplyPerGameSetting(&Settings::values.time_zone_index,
- ui->combo_time_zone);
- ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_unsafe_extended_memory_layout,
- ui->use_unsafe_extended_memory_layout,
- use_unsafe_extended_memory_layout);
-
- if (Settings::IsConfiguringGlobal()) {
- // Guard if during game and set to game-specific value
- if (Settings::values.rng_seed.UsingGlobal()) {
- Settings::values.rng_seed_enabled = ui->rng_seed_checkbox->isChecked();
- if (ui->rng_seed_checkbox->isChecked()) {
- Settings::values.rng_seed.SetValue(ui->rng_seed_edit->text().toUInt(nullptr, 16));
+ if (!Settings::values.rng_seed_enabled.GetValue()) {
+ rng_seed_edit->setEnabled(false);
}
+ } else if (setting->Id() == Settings::values.custom_rtc_enabled.Id()) {
+ custom_rtc_checkbox = widget->checkbox;
+ custom_rtc_edit = widget->date_time_edit;
+
+ custom_rtc_edit->setEnabled(Settings::values.custom_rtc_enabled.GetValue());
+ } else if (setting->Id() == Settings::values.region_index.Id()) {
+
+ combo_region = widget->combobox;
+ } else if (setting->Id() == Settings::values.language_index.Id()) {
+ combo_language = widget->combobox;
}
- } else {
- switch (use_rng_seed) {
- case ConfigurationShared::CheckState::On:
- case ConfigurationShared::CheckState::Off:
- Settings::values.rng_seed_enabled.SetGlobal(false);
- Settings::values.rng_seed.SetGlobal(false);
- if (ui->rng_seed_checkbox->isChecked()) {
- Settings::values.rng_seed.SetValue(ui->rng_seed_edit->text().toUInt(nullptr, 16));
- }
- break;
- case ConfigurationShared::CheckState::Global:
- Settings::values.rng_seed_enabled.SetGlobal(true);
- Settings::values.rng_seed.SetGlobal(true);
+
+ switch (setting->Category()) {
+ case Settings::Category::Core:
+ core_hold[setting->GetLabel()] = widget;
break;
- case ConfigurationShared::CheckState::Count:
+ case Settings::Category::System:
+ system_hold[setting->IsEnum()].insert(std::pair{setting->GetLabel(), widget});
break;
+ default:
+ delete widget;
}
}
+ for (const auto& [label, widget] : core_hold) {
+ core_layout.addWidget(widget);
+ }
+ for (const auto& [label, widget] : system_hold[true]) {
+ system_layout.addWidget(widget);
+ }
+ for (const auto& [label, widget] : system_hold[false]) {
+ system_layout.addWidget(widget);
+ }
}
-void ConfigureSystem::SetupPerGameUI() {
- if (Settings::IsConfiguringGlobal()) {
- ui->combo_language->setEnabled(Settings::values.language_index.UsingGlobal());
- ui->combo_region->setEnabled(Settings::values.region_index.UsingGlobal());
- ui->combo_time_zone->setEnabled(Settings::values.time_zone_index.UsingGlobal());
- ui->rng_seed_checkbox->setEnabled(Settings::values.rng_seed.UsingGlobal());
- ui->rng_seed_edit->setEnabled(Settings::values.rng_seed.UsingGlobal());
+void ConfigureSystem::SetConfiguration() {}
- return;
+void ConfigureSystem::ApplyConfiguration() {
+ const bool powered_on = system.IsPoweredOn();
+ for (const auto& func : apply_funcs) {
+ func(powered_on);
}
-
- ConfigurationShared::SetColoredComboBox(ui->combo_language, ui->label_language,
- Settings::values.language_index.GetValue(true));
- ConfigurationShared::SetColoredComboBox(ui->combo_region, ui->label_region,
- Settings::values.region_index.GetValue(true));
- ConfigurationShared::SetColoredComboBox(ui->combo_time_zone, ui->label_timezone,
- Settings::values.time_zone_index.GetValue(true));
-
- ConfigurationShared::SetColoredTristate(
- ui->rng_seed_checkbox, Settings::values.rng_seed.UsingGlobal(),
- Settings::values.rng_seed_enabled.GetValue(),
- Settings::values.rng_seed_enabled.GetValue(true), use_rng_seed);
-
- ConfigurationShared::SetColoredTristate(ui->use_unsafe_extended_memory_layout,
- Settings::values.use_unsafe_extended_memory_layout,
- use_unsafe_extended_memory_layout);
-
- ui->custom_rtc_checkbox->setVisible(false);
- ui->custom_rtc_edit->setVisible(false);
}
diff --git a/src/yuzu/configuration/configure_system.h b/src/yuzu/configuration/configure_system.h
index 6064b5b40..87b575060 100644
--- a/src/yuzu/configuration/configure_system.h
+++ b/src/yuzu/configuration/configure_system.h
@@ -3,11 +3,15 @@
#pragma once
+#include <forward_list>
+#include <functional>
#include <memory>
#include <QWidget>
#include "yuzu/configuration/configuration_shared.h"
+class QDateTimeEdit;
+
namespace Core {
class System;
}
@@ -20,6 +24,7 @@ class ConfigureSystem : public ConfigurationShared::Tab {
public:
explicit ConfigureSystem(Core::System& system_,
std::shared_ptr<std::forward_list<ConfigurationShared::Tab*>> group,
+ ConfigurationShared::TranslationMap& translations,
QWidget* parent = nullptr);
~ConfigureSystem() override;
@@ -30,9 +35,9 @@ private:
void changeEvent(QEvent* event) override;
void RetranslateUI();
- void ReadSystemSettings();
+ void Setup();
- void SetupPerGameUI();
+ std::forward_list<std::function<void(bool)>> apply_funcs{};
std::unique_ptr<Ui::ConfigureSystem> ui;
bool enabled = false;
@@ -41,4 +46,12 @@ private:
ConfigurationShared::CheckState use_unsafe_extended_memory_layout;
Core::System& system;
+ ConfigurationShared::TranslationMap& translations;
+
+ QCheckBox* rng_seed_checkbox;
+ QLineEdit* rng_seed_edit;
+ QCheckBox* custom_rtc_checkbox;
+ QDateTimeEdit* custom_rtc_edit;
+ QComboBox* combo_region;
+ QComboBox* combo_language;
};
diff --git a/src/yuzu/configuration/configure_system.ui b/src/yuzu/configuration/configure_system.ui
index e0caecd5e..a5a3e2dc3 100644
--- a/src/yuzu/configuration/configure_system.ui
+++ b/src/yuzu/configuration/configure_system.ui
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>366</width>
+ <width>605</width>
<height>483</height>
</rect>
</property>
@@ -22,470 +22,53 @@
<item>
<widget class="QGroupBox" name="group_system_settings">
<property name="title">
- <string>System Settings</string>
+ <string>System</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="1" column="0">
- <widget class="QLabel" name="label_region">
- <property name="text">
- <string>Region:</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QComboBox" name="combo_time_zone">
- <item>
- <property name="text">
- <string>Auto</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Default</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>CET</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>CST6CDT</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Cuba</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>EET</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Egypt</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Eire</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>EST</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>EST5EDT</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>GB</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>GB-Eire</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>GMT</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>GMT+0</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>GMT-0</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>GMT0</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Greenwich</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Hongkong</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>HST</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Iceland</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Iran</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Israel</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Jamaica</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Japan</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Kwajalein</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Libya</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>MET</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>MST</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>MST7MDT</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Navajo</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>NZ</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>NZ-CHAT</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Poland</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Portugal</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>PRC</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>PST8PDT</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>ROC</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>ROK</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Singapore</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Turkey</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>UCT</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Universal</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>UTC</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>W-SU</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>WET</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Zulu</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QComboBox" name="combo_region">
- <item>
- <property name="text">
- <string>Japan</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>USA</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Europe</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Australia</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>China</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Korea</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Taiwan</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_timezone">
- <property name="text">
- <string>Time Zone:</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QComboBox" name="combo_language">
- <property name="toolTip">
- <string>Note: this can be overridden when region setting is auto-select</string>
- </property>
- <item>
- <property name="text">
- <string>Japanese (日本語)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>American English</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>French (français)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>German (Deutsch)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Italian (italiano)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Spanish (español)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Chinese</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Korean (한국어)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Dutch (Nederlands)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Portuguese (português)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Russian (Русский)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Taiwanese</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>British English</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Canadian French</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Latin American Spanish</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Simplified Chinese</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Traditional Chinese (正體中文)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Brazilian Portuguese (português do Brasil)</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QCheckBox" name="custom_rtc_checkbox">
- <property name="text">
- <string>Custom RTC</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_language">
- <property name="text">
- <string>Language</string>
- </property>
- </widget>
- </item>
- <item row="5" column="0">
- <widget class="QCheckBox" name="rng_seed_checkbox">
- <property name="text">
- <string>RNG Seed</string>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="device_name_label">
- <property name="text">
- <string>Device Name</string>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QDateTimeEdit" name="custom_rtc_edit">
- <property name="minimumDate">
- <date>
- <year>1970</year>
- <month>1</month>
- <day>1</day>
- </date>
- </property>
- </widget>
- </item>
- <item row="6" column="1">
- <widget class="QLineEdit" name="device_name_edit">
- <property name="maxLength">
- <number>128</number>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QLineEdit" name="rng_seed_edit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <family>Lucida Console</family>
- </font>
- </property>
- <property name="inputMask">
- <string notr="true">HHHHHHHH</string>
- </property>
- <property name="maxLength">
- <number>8</number>
- </property>
- </widget>
- </item>
- <item row="7" column="0">
- <widget class="QCheckBox" name="use_unsafe_extended_memory_layout">
- <property name="text">
- <string>Unsafe extended memory layout (8GB DRAM)</string>
- </property>
- </widget>
- </item>
- </layout>
+ <widget class="QWidget" name="system_widget" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Core</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <item>
+ <widget class="QWidget" name="core_widget" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ </layout>
+ </widget>
</item>
</layout>
</widget>
@@ -506,7 +89,7 @@
<item>
<widget class="QLabel" name="label_warn_invalid_locale">
<property name="text">
- <string></string>
+ <string/>
</property>
<property name="wordWrap">
<bool>true</bool>
diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/yuzu/configuration/shared_translation.cpp
index d38815e77..dc9f15cdd 100644
--- a/src/yuzu/configuration/shared_translation.cpp
+++ b/src/yuzu/configuration/shared_translation.cpp
@@ -109,15 +109,16 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QWidget* parent) {
// System
INSERT(Settings, rng_seed_enabled, "RNG Seed", "");
- INSERT(Settings, rng_seed, "RNG Seed", "");
+ INSERT(Settings, rng_seed, "", "");
INSERT(Settings, device_name, "Device Name", "");
INSERT(Settings, custom_rtc_enabled, "Custom RTC", "");
- INSERT(Settings, custom_rtc, "Custom RTC", "");
+ INSERT(Settings, custom_rtc, "", "");
INSERT(Settings, language_index, "Language:", "");
INSERT(Settings, region_index, "Region:", "");
INSERT(Settings, time_zone_index, "Time Zone:", "");
INSERT(Settings, sound_index, "Sound Output Mode:", "");
INSERT(Settings, use_docked_mode, "", "");
+ INSERT(Settings, current_user, "", "");
// Controls
@@ -231,6 +232,44 @@ std::forward_list<QString> ComboboxEnumeration(std::type_index type, QWidget* pa
return {
tr("Automatic"), tr("Default"), tr("2x"), tr("4x"), tr("8x"), tr("16x"),
};
+ } else if (type == typeid(Settings::Language)) {
+ return {
+ tr("Japanese (日本語)"),
+ tr("American English"),
+ tr("French (français)"),
+ tr("German (Deutsch)"),
+ tr("Italian (italiano)"),
+ tr("Spanish (español)"),
+ tr("Chinese"),
+ tr("Korean (한국어)"),
+ tr("Dutch (Nederlands)"),
+ tr("Portuguese (português)"),
+ tr("Russian (Русский)"),
+ tr("Taiwanese"),
+ tr("British English"),
+ tr("Canadian French"),
+ tr("Latin American Spanish"),
+ tr("Simplified Chinese"),
+ tr("Traditional Chinese (正體中文)"),
+ tr("Brazilian Portuguese (português do Brasil)"),
+ };
+ } else if (type == typeid(Settings::Region)) {
+ return {
+ tr("Japan"), tr("USA"), tr("Europe"), tr("Australia"),
+ tr("China"), tr("Korea"), tr("Taiwan"),
+ };
+ } else if (type == typeid(Settings::TimeZone)) {
+ return {
+ tr("Auto"), tr("Default"), tr("CET"), tr("CST6CDT"), tr("Cuba"),
+ tr("EET"), tr("Egypt"), tr("Eire"), tr("EST"), tr("EST5EDT"),
+ tr("GB"), tr("GB-Eire"), tr("GMT"), tr("GMT+0"), tr("GMT-0"),
+ tr("GMT0"), tr("Greenwich"), tr("Hongkong"), tr("HST"), tr("Iceland"),
+ tr("Iran"), tr("Israel"), tr("Jamaica"), tr("Kwajalein"), tr("Libya"),
+ tr("MET"), tr("MST"), tr("MST7MDT"), tr("Navajo"), tr("NZ"),
+ tr("NZ-CHAT"), tr("Poland"), tr("Portugal"), tr("PRC"), tr("PST8PDT"),
+ tr("ROC"), tr("ROK"), tr("Singapore"), tr("Turkey"), tr("UCT"),
+ tr("W-SU"), tr("WET"), tr("Zulu"),
+ };
}
return {};
diff --git a/src/yuzu/configuration/shared_widget.cpp b/src/yuzu/configuration/shared_widget.cpp
index d1113f793..0d553c67f 100644
--- a/src/yuzu/configuration/shared_widget.cpp
+++ b/src/yuzu/configuration/shared_widget.cpp
@@ -1,5 +1,7 @@
#include <functional>
+#include <limits>
#include <QCheckBox>
+#include <QDateTimeEdit>
#include <QHBoxLayout>
#include <QIcon>
#include <QLabel>
@@ -9,6 +11,9 @@
#include <QSpinBox>
#include <QWidget>
#include <qabstractbutton.h>
+#include <qabstractspinbox.h>
+#include <qnamespace.h>
+#include <qvalidator.h>
#include "common/common_types.h"
#include "common/settings.h"
#include "yuzu/configuration/configuration_shared.h"
@@ -25,7 +30,7 @@ QPushButton* Widget::CreateRestoreGlobalButton(Settings::BasicSetting& setting,
QStyle* style = parent->style();
QIcon* icon = new QIcon(style->standardIcon(QStyle::SP_DialogResetButton));
QPushButton* restore_button = new QPushButton(*icon, QStringLiteral(""), parent);
- restore_button->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
+ restore_button->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
QSizePolicy sp_retain = restore_button->sizePolicy();
sp_retain.setRetainSizeWhenHidden(true);
@@ -241,6 +246,67 @@ void Widget::CreateSlider(const QString& name, bool reversed, float multiplier,
}
}
+void Widget::CreateCheckBoxWithHexEdit(const QString& label, Settings::BasicSetting* other_setting,
+ std::function<void()>& load_func) {
+ if (other_setting == nullptr) {
+ LOG_WARNING(Frontend, "Extra setting is null or not an integer");
+ return;
+ }
+ created = true;
+
+ std::function<void()> checkbox_load_func;
+ CreateCheckBox(label, checkbox_load_func);
+
+ auto to_hex = [=](const std::string& input) {
+ return QString::fromStdString(fmt::format("{:08x}", std::stoi(input)));
+ };
+
+ QHBoxLayout* layout = reinterpret_cast<QHBoxLayout*>(this->layout());
+ const QString default_val = to_hex(other_setting->ToString());
+
+ line_edit = new QLineEdit(this);
+ line_edit->setText(default_val);
+
+ checkbox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+
+ layout->insertWidget(1, line_edit);
+
+ line_edit->setMaxLength(8);
+ QRegExpValidator* regex =
+ new QRegExpValidator{QRegExp{QStringLiteral("^[0-9a-fA-F]{0,8}$")}, line_edit};
+ line_edit->setValidator(regex);
+
+ auto hex_to_dec = [=]() -> std::string {
+ return std::to_string(std::stoul(line_edit->text().toStdString(), nullptr, 16));
+ };
+
+ if (Settings::IsConfiguringGlobal()) {
+ load_func = [=]() {
+ checkbox_load_func();
+ other_setting->LoadString(hex_to_dec());
+ };
+ } else {
+ QObject::connect(restore_button, &QAbstractButton::clicked, [=](bool) {
+ line_edit->setText(to_hex(other_setting->ToStringGlobal()));
+ });
+
+ QObject::connect(line_edit, &QLineEdit::textEdited, [=](const QString&) {
+ restore_button->setEnabled(true);
+ restore_button->setVisible(true);
+ });
+
+ load_func = [=]() {
+ checkbox_load_func();
+
+ const bool using_global = !restore_button->isEnabled();
+ other_setting->SetGlobal(using_global);
+ if (!using_global) {
+ other_setting->LoadString(hex_to_dec());
+ }
+ };
+ }
+}
+
void Widget::CreateCheckBoxWithLineEdit(const QString& label, Settings::BasicSetting* other_setting,
std::function<void()>& load_func) {
if (other_setting == nullptr) {
@@ -268,8 +334,9 @@ void Widget::CreateCheckBoxWithLineEdit(const QString& label, Settings::BasicSet
other_setting->LoadString(line_edit->text().toStdString());
};
} else {
- QObject::connect(restore_button, &QAbstractButton::clicked,
- [=](bool) { line_edit->setText(default_val); });
+ QObject::connect(restore_button, &QAbstractButton::clicked, [=](bool) {
+ line_edit->setText(QString::fromStdString(other_setting->ToStringGlobal()));
+ });
QObject::connect(line_edit, &QLineEdit::textEdited, [=](const QString&) {
restore_button->setEnabled(true);
@@ -279,7 +346,7 @@ void Widget::CreateCheckBoxWithLineEdit(const QString& label, Settings::BasicSet
load_func = [=]() {
checkbox_load_func();
- const bool using_global = !restore_button->isVisible();
+ const bool using_global = !restore_button->isEnabled();
other_setting->SetGlobal(using_global);
if (!using_global) {
other_setting->LoadString(line_edit->text().toStdString());
@@ -289,7 +356,8 @@ void Widget::CreateCheckBoxWithLineEdit(const QString& label, Settings::BasicSet
}
void Widget::CreateCheckBoxWithSpinBox(const QString& label, Settings::BasicSetting* other_setting,
- std::function<void()>& load_func, const QString& suffix) {
+ std::function<void()>& load_func,
+ const std::string& suffix) {
if (other_setting == nullptr && IsInt(other_setting->TypeId())) {
LOG_WARNING(Frontend, "Extra setting is null or not an integer");
return;
@@ -308,7 +376,7 @@ void Widget::CreateCheckBoxWithSpinBox(const QString& label, Settings::BasicSett
const int default_val = std::stoi(other_setting->ToString());
spinbox->setRange(min_val, max_val);
spinbox->setValue(default_val);
- spinbox->setSuffix(suffix);
+ spinbox->setSuffix(QString::fromStdString(suffix));
spinbox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
layout->insertWidget(1, spinbox);
@@ -320,7 +388,7 @@ void Widget::CreateCheckBoxWithSpinBox(const QString& label, Settings::BasicSett
};
} else {
QObject::connect(restore_button, &QAbstractButton::clicked, [this, other_setting](bool) {
- spinbox->setValue(std::stoi(other_setting->ToString()));
+ spinbox->setValue(std::stoi(other_setting->ToStringGlobal()));
});
QObject::connect(spinbox, QOverload<int>::of(&QSpinBox::valueChanged), [this](int) {
@@ -331,7 +399,7 @@ void Widget::CreateCheckBoxWithSpinBox(const QString& label, Settings::BasicSett
load_func = [=]() {
checkbox_load_func();
- const bool using_global = !restore_button->isVisible();
+ const bool using_global = !restore_button->isEnabled();
other_setting->SetGlobal(using_global);
if (!using_global) {
other_setting->LoadString(std::to_string(spinbox->value()));
@@ -340,6 +408,81 @@ void Widget::CreateCheckBoxWithSpinBox(const QString& label, Settings::BasicSett
}
}
+// Currently tailored to custom_rtc
+void Widget::CreateCheckBoxWithDateTimeEdit(const QString& label,
+ Settings::BasicSetting* other_setting,
+ std::function<void()>& load_func) {
+ if (other_setting == nullptr) {
+ LOG_WARNING(Frontend, "Extra setting is null or not an integer");
+ return;
+ }
+ created = true;
+
+ std::function<void()> checkbox_load_func;
+ CreateCheckBox(label, checkbox_load_func);
+
+ QHBoxLayout* layout = reinterpret_cast<QHBoxLayout*>(this->layout());
+ const bool disabled = setting.ToString() != "true";
+ const long long current_time = QDateTime::currentSecsSinceEpoch();
+ const s64 the_time = disabled ? current_time : std::stoll(other_setting->ToString());
+ const auto default_val = QDateTime::fromSecsSinceEpoch(the_time);
+
+ date_time_edit = new QDateTimeEdit(this);
+ date_time_edit->setDateTime(default_val);
+
+ date_time_edit->setMinimumDateTime(QDateTime::fromSecsSinceEpoch(0));
+
+ date_time_edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ checkbox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+
+ layout->insertWidget(1, date_time_edit);
+
+ if (Settings::IsConfiguringGlobal()) {
+ load_func = [=]() {
+ checkbox_load_func();
+ if (checkbox->checkState() == Qt::Unchecked) {
+ return;
+ }
+
+ other_setting->LoadString(
+ std::to_string(date_time_edit->dateTime().toSecsSinceEpoch()));
+ };
+ } else {
+ auto get_clear_val = [=]() {
+ return QDateTime::fromSecsSinceEpoch([=]() {
+ if (checkbox->checkState() == Qt::Checked) {
+ return std::stoll(other_setting->ToStringGlobal());
+ }
+ return current_time;
+ }());
+ };
+
+ QObject::connect(restore_button, &QAbstractButton::clicked,
+ [=](bool) { date_time_edit->setDateTime(get_clear_val()); });
+
+ QObject::connect(date_time_edit, &QDateTimeEdit::editingFinished, [=]() {
+ if (date_time_edit->dateTime() != get_clear_val()) {
+ restore_button->setEnabled(true);
+ restore_button->setVisible(true);
+ }
+ });
+
+ load_func = [=]() {
+ checkbox_load_func();
+ if (checkbox->checkState() == Qt::Unchecked) {
+ return;
+ }
+
+ const bool using_global = !restore_button->isEnabled();
+ other_setting->SetGlobal(using_global);
+ if (!using_global) {
+ other_setting->LoadString(
+ std::to_string(date_time_edit->dateTime().toSecsSinceEpoch()));
+ }
+ };
+ }
+}
+
bool Widget::Valid() {
return created;
}
@@ -350,7 +493,7 @@ Widget::Widget(Settings::BasicSetting* setting_, const TranslationMap& translati
QWidget* parent_, bool runtime_lock,
std::forward_list<std::function<void(bool)>>& apply_funcs, RequestType request,
bool managed, float multiplier, Settings::BasicSetting* other_setting,
- const QString& format)
+ const std::string& string)
: QWidget(parent_), parent{parent_}, translations{translations_}, setting{*setting_} {
if (!Settings::IsConfiguringGlobal() && !setting.Switchable()) {
LOG_DEBUG(Frontend, "\"{}\" is not switchable, skipping...", setting.GetLabel());
@@ -379,19 +522,26 @@ Widget::Widget(Settings::BasicSetting* setting_, const TranslationMap& translati
if (type == typeid(bool)) {
switch (request) {
- case RequestType::SpinBox:
- CreateCheckBoxWithSpinBox(label, other_setting, load_func, format);
- break;
case RequestType::Default:
CreateCheckBox(label, load_func);
break;
+ case RequestType::SpinBox:
+ CreateCheckBoxWithSpinBox(label, other_setting, load_func, string);
+ break;
+ case RequestType::HexEdit:
+ CreateCheckBoxWithHexEdit(label, other_setting, load_func);
+ break;
case RequestType::LineEdit:
CreateCheckBoxWithLineEdit(label, other_setting, load_func);
break;
+ case RequestType::DateTimeEdit:
+ CreateCheckBoxWithDateTimeEdit(label, other_setting, load_func);
+ break;
case RequestType::ComboBox:
case RequestType::Slider:
case RequestType::ReverseSlider:
case RequestType::MaxEnum:
+ LOG_DEBUG(Frontend, "Requested widget is unimplemented.");
break;
}
} else if (setting.IsEnum()) {
@@ -409,10 +559,15 @@ Widget::Widget(Settings::BasicSetting* setting_, const TranslationMap& translati
case RequestType::ComboBox:
CreateCombobox(label, managed, load_func);
break;
+ case RequestType::DateTimeEdit:
case RequestType::SpinBox:
+ case RequestType::HexEdit:
case RequestType::MaxEnum:
+ LOG_DEBUG(Frontend, "Requested widget is unimplemented.");
break;
}
+ } else if (type == typeid(std::string)) {
+ CreateLineEdit(label, managed, load_func);
}
if (!created) {
diff --git a/src/yuzu/configuration/shared_widget.h b/src/yuzu/configuration/shared_widget.h
index 88a864b42..9923aa2ea 100644
--- a/src/yuzu/configuration/shared_widget.h
+++ b/src/yuzu/configuration/shared_widget.h
@@ -9,6 +9,7 @@ class QComboBox;
class QLineEdit;
class QSlider;
class QCheckBox;
+class QDateTimeEdit;
namespace Settings {
class BasicSetting;
@@ -23,6 +24,8 @@ enum class RequestType {
Slider,
ReverseSlider,
LineEdit,
+ HexEdit,
+ DateTimeEdit,
MaxEnum,
};
@@ -33,8 +36,7 @@ public:
Widget(Settings::BasicSetting* setting, const TranslationMap& translations, QWidget* parent,
bool runtime_lock, std::forward_list<std::function<void(bool)>>& apply_funcs,
RequestType request = RequestType::Default, bool managed = true, float multiplier = 1.0f,
- Settings::BasicSetting* other_setting = nullptr,
- const QString& format = QStringLiteral(""));
+ Settings::BasicSetting* other_setting = nullptr, const std::string& format = "");
virtual ~Widget();
bool Valid();
@@ -48,13 +50,18 @@ public:
QCheckBox* checkbox{};
QSlider* slider{};
QComboBox* combobox{};
+ QDateTimeEdit* date_time_edit{};
private:
void CreateCheckBox(const QString& label, std::function<void()>& load_func);
void CreateCheckBoxWithLineEdit(const QString& label, Settings::BasicSetting* other_setting,
std::function<void()>& load_func);
+ void CreateCheckBoxWithHexEdit(const QString& label, Settings::BasicSetting* other_setting,
+ std::function<void()>& load_func);
void CreateCheckBoxWithSpinBox(const QString& label, Settings::BasicSetting* other_setting,
- std::function<void()>& load_func, const QString& suffix);
+ std::function<void()>& load_func, const std::string& suffix);
+ void CreateCheckBoxWithDateTimeEdit(const QString& label, Settings::BasicSetting* other_setting,
+ std::function<void()>& load_func);
void CreateCombobox(const QString& label, bool managed, std::function<void()>& load_func);
void CreateLineEdit(const QString& label, bool managed, std::function<void()>& load_func);
void CreateSlider(const QString& label, bool reversed, float multiplier,
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp
index f8cbf8034..c42d98709 100644
--- a/src/yuzu_cmd/config.cpp
+++ b/src/yuzu_cmd/config.cpp
@@ -229,6 +229,7 @@ void Config::ReadValues() {
ReadCategory(Settings::Category::RendererAdvanced);
ReadCategory(Settings::Category::RendererDebug);
ReadCategory(Settings::Category::System);
+ ReadCategory(Settings::Category::SystemAudio);
ReadCategory(Settings::Category::DataStorage);
ReadCategory(Settings::Category::Debugging);
ReadCategory(Settings::Category::DebuggingGraphics);