Qt: Better handling of default settings not in ini

This commit is contained in:
Connor McLaughlin
2020-07-01 00:33:53 +10:00
parent 4dc9e10777
commit 0b11a14e24
9 changed files with 94 additions and 47 deletions

View File

@ -10,7 +10,8 @@ AdvancedSettingsWidget::AdvancedSettingsWidget(QtHostInterface* host_interface,
m_ui.logLevel->addItem(tr(Settings::GetLogLevelDisplayName(static_cast<LOGLEVEL>(i))));
SettingWidgetBinder::BindWidgetToEnumSetting(m_host_interface, m_ui.logLevel, QStringLiteral("Logging/LogLevel"),
&Settings::ParseLogLevelName, &Settings::GetLogLevelName);
&Settings::ParseLogLevelName, &Settings::GetLogLevelName,
Settings::DEFAULT_LOG_LEVEL);
SettingWidgetBinder::BindWidgetToStringSetting(m_host_interface, m_ui.logFilter, QStringLiteral("Logging/LogFilter"));
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.logToConsole,
QStringLiteral("Logging/LogToConsole"));

View File

@ -12,7 +12,8 @@ AudioSettingsWidget::AudioSettingsWidget(QtHostInterface* host_interface, QWidge
m_ui.audioBackend->addItem(tr(Settings::GetAudioBackendDisplayName(static_cast<AudioBackend>(i))));
SettingWidgetBinder::BindWidgetToEnumSetting(m_host_interface, m_ui.audioBackend, "Audio/Backend",
&Settings::ParseAudioBackend, &Settings::GetAudioBackendName);
&Settings::ParseAudioBackend, &Settings::GetAudioBackendName,
Settings::DEFAULT_AUDIO_BACKEND);
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.syncToOutput, "Audio/Sync");
SettingWidgetBinder::BindWidgetToIntSetting(m_host_interface, m_ui.bufferSize, "Audio/BufferSize");
SettingWidgetBinder::BindWidgetToIntSetting(m_host_interface, m_ui.volume, "Audio/OutputVolume");

View File

@ -16,12 +16,14 @@ ConsoleSettingsWidget::ConsoleSettingsWidget(QtHostInterface* host_interface, QW
m_ui.cpuExecutionMode->addItem(tr(Settings::GetCPUExecutionModeDisplayName(static_cast<CPUExecutionMode>(i))));
SettingWidgetBinder::BindWidgetToEnumSetting(m_host_interface, m_ui.region, "Console/Region",
&Settings::ParseConsoleRegionName, &Settings::GetConsoleRegionName);
&Settings::ParseConsoleRegionName, &Settings::GetConsoleRegionName,
Settings::DEFAULT_CONSOLE_REGION);
SettingWidgetBinder::BindWidgetToStringSetting(m_host_interface, m_ui.biosPath, "BIOS/Path");
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.enableTTYOutput, "BIOS/PatchTTYEnable");
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.fastBoot, "BIOS/PatchFastBoot");
SettingWidgetBinder::BindWidgetToEnumSetting(m_host_interface, m_ui.cpuExecutionMode, "CPU/ExecutionMode",
&Settings::ParseCPUExecutionMode, &Settings::GetCPUExecutionModeName);
&Settings::ParseCPUExecutionMode, &Settings::GetCPUExecutionModeName,
Settings::DEFAULT_CPU_EXECUTION_MODE);
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.cdromReadThread, "CDROM/ReadThread");
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.cdromRegionCheck, "CDROM/RegionCheck");

View File

@ -17,15 +17,16 @@ GPUSettingsWidget::GPUSettingsWidget(QtHostInterface* host_interface, QWidget* p
setupAdditionalUi();
SettingWidgetBinder::BindWidgetToEnumSetting(m_host_interface, m_ui.renderer, QStringLiteral("GPU/Renderer"),
&Settings::ParseRendererName, &Settings::GetRendererName);
&Settings::ParseRendererName, &Settings::GetRendererName,
Settings::DEFAULT_GPU_RENDERER);
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.useDebugDevice,
QStringLiteral("GPU/UseDebugDevice"));
SettingWidgetBinder::BindWidgetToEnumSetting(
m_host_interface, m_ui.displayAspectRatio, QStringLiteral("Display/AspectRatio"),
&Settings::ParseDisplayAspectRatio, &Settings::GetDisplayAspectRatioName);
&Settings::ParseDisplayAspectRatio, &Settings::GetDisplayAspectRatioName, Settings::DEFAULT_DISPLAY_ASPECT_RATIO);
SettingWidgetBinder::BindWidgetToEnumSetting(m_host_interface, m_ui.displayCropMode,
QStringLiteral("Display/CropMode"), &Settings::ParseDisplayCropMode,
&Settings::GetDisplayCropModeName);
&Settings::GetDisplayCropModeName, Settings::DEFAULT_DISPLAY_CROP_MODE);
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.displayLinearFiltering,
QStringLiteral("Display/LinearFiltering"));
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.displayIntegerScaling,

View File

@ -62,9 +62,11 @@ void MemoryCardSettingsWidget::createPortSettingsUi(int index, PortSettingsUI* u
ui->memory_card_type->addItem(
QString::fromUtf8(Settings::GetMemoryCardTypeDisplayName(static_cast<MemoryCardType>(i))));
}
SettingWidgetBinder::BindWidgetToEnumSetting(m_host_interface, ui->memory_card_type,
QStringLiteral("MemoryCards/Card%1Type").arg(index + 1),
&Settings::ParseMemoryCardTypeName, &Settings::GetMemoryCardTypeName);
const MemoryCardType default_value = (index == 0) ? MemoryCardType::PerGameTitle : MemoryCardType::None;
SettingWidgetBinder::BindWidgetToEnumSetting(
m_host_interface, ui->memory_card_type, QStringLiteral("MemoryCards/Card%1Type").arg(index + 1),
&Settings::ParseMemoryCardTypeName, &Settings::GetMemoryCardTypeName, default_value);
ui->layout->addWidget(new QLabel(tr("Memory Card Type:"), ui->container));
ui->layout->addWidget(ui->memory_card_type);

View File

@ -156,11 +156,16 @@ struct SettingAccessor<QAction>
/// Binds a widget's value to a setting, updating it when the value changes.
template<typename WidgetType>
void BindWidgetToBoolSetting(QtHostInterface* hi, WidgetType* widget, const QString& setting_name)
void BindWidgetToBoolSetting(QtHostInterface* hi, WidgetType* widget, const QString& setting_name,
bool default_value = false)
{
using Accessor = SettingAccessor<WidgetType>;
Accessor::setBoolValue(widget, hi->getSettingValue(setting_name).toBool());
QVariant value = hi->getSettingValue(setting_name);
if (value.isValid())
Accessor::setBoolValue(widget, value.toBool());
else
Accessor::setBoolValue(widget, default_value);
Accessor::connectValueChanged(widget, [hi, widget, setting_name]() {
const bool new_value = Accessor::getBoolValue(widget);
@ -170,11 +175,15 @@ void BindWidgetToBoolSetting(QtHostInterface* hi, WidgetType* widget, const QStr
}
template<typename WidgetType>
void BindWidgetToIntSetting(QtHostInterface* hi, WidgetType* widget, const QString& setting_name)
void BindWidgetToIntSetting(QtHostInterface* hi, WidgetType* widget, const QString& setting_name, int default_value = 0)
{
using Accessor = SettingAccessor<WidgetType>;
Accessor::setIntValue(widget, hi->getSettingValue(setting_name).toInt());
QVariant value = hi->getSettingValue(setting_name);
if (value.isValid())
Accessor::setIntValue(widget, value.toInt());
else
Accessor::setIntValue(widget, default_value);
Accessor::connectValueChanged(widget, [hi, widget, setting_name]() {
const int new_value = Accessor::getIntValue(widget);
@ -184,11 +193,16 @@ void BindWidgetToIntSetting(QtHostInterface* hi, WidgetType* widget, const QStri
}
template<typename WidgetType>
void BindWidgetToNormalizedSetting(QtHostInterface* hi, WidgetType* widget, const QString& setting_name, float range)
void BindWidgetToNormalizedSetting(QtHostInterface* hi, WidgetType* widget, const QString& setting_name, float range,
float default_value = 0.0f)
{
using Accessor = SettingAccessor<WidgetType>;
Accessor::setIntValue(widget, static_cast<int>(hi->getSettingValue(setting_name).toFloat() * range));
QVariant value = hi->getSettingValue(setting_name);
if (value.isValid())
Accessor::setIntValue(widget, static_cast<int>(value.toFloat() * range));
else
Accessor::setIntValue(widget, static_cast<int>(default_value * range));
Accessor::connectValueChanged(widget, [hi, widget, setting_name, range]() {
const float new_value = (static_cast<float>(Accessor::getIntValue(widget)) / range);
@ -198,11 +212,16 @@ void BindWidgetToNormalizedSetting(QtHostInterface* hi, WidgetType* widget, cons
}
template<typename WidgetType>
void BindWidgetToStringSetting(QtHostInterface* hi, WidgetType* widget, const QString& setting_name)
void BindWidgetToStringSetting(QtHostInterface* hi, WidgetType* widget, const QString& setting_name,
const QString& default_value = QString())
{
using Accessor = SettingAccessor<WidgetType>;
Accessor::setStringValue(widget, hi->getSettingValue(setting_name).toString());
QVariant value = hi->getSettingValue(setting_name);
if (value.isValid())
Accessor::setStringValue(widget, value.toString());
else
Accessor::setStringValue(widget, default_value);
Accessor::connectValueChanged(widget, [hi, widget, setting_name]() {
const QString new_value = Accessor::getStringValue(widget);
@ -214,7 +233,7 @@ void BindWidgetToStringSetting(QtHostInterface* hi, WidgetType* widget, const QS
template<typename WidgetType, typename DataType>
void BindWidgetToEnumSetting(QtHostInterface* hi, WidgetType* widget, const QString& setting_name,
std::optional<DataType> (*from_string_function)(const char* str),
const char* (*to_string_function)(DataType value))
const char* (*to_string_function)(DataType value), DataType default_value)
{
using Accessor = SettingAccessor<WidgetType>;
using UnderlyingType = std::underlying_type_t<DataType>;
@ -224,6 +243,8 @@ void BindWidgetToEnumSetting(QtHostInterface* hi, WidgetType* widget, const QStr
from_string_function(old_setting_string_value.toStdString().c_str());
if (old_setting_value.has_value())
Accessor::setIntValue(widget, static_cast<int>(static_cast<UnderlyingType>(old_setting_value.value())));
else
Accessor::setIntValue(widget, static_cast<int>(static_cast<UnderlyingType>(default_value)));
Accessor::connectValueChanged(widget, [hi, widget, setting_name, to_string_function]() {
const DataType value = static_cast<DataType>(static_cast<UnderlyingType>(Accessor::getIntValue(widget)));