@ -403,28 +403,31 @@ void Config::SavePlayerValues(const std::size_t player_index) {
// No custom profile selected
return ;
}
WriteS etting( std : : string ( player_prefix ) . append ( " profile_name " ) , player . profile_name ,
WriteS tringS etting( std : : string ( player_prefix ) . append ( " profile_name " ) , player . profile_name ,
std : : make_optional ( std : : string ( " " ) ) ) ;
}
WriteSetting ( std : : string ( player_prefix ) . append ( " type " ) , static_cast < u8 > ( player . controller_type ) ,
WriteIntegerSetting (
std : : string ( player_prefix ) . append ( " type " ) , static_cast < u8 > ( player . controller_type ) ,
std : : make_optional ( static_cast < u8 > ( Settings : : ControllerType : : ProController ) ) ) ;
if ( ! player_prefix . empty ( ) | | ! Settings : : IsConfiguringGlobal ( ) ) {
Write Setting( std : : string ( player_prefix ) . append ( " connected " ) , player . connected ,
Write Boolean Setting( std : : string ( player_prefix ) . append ( " connected " ) , player . connected ,
std : : make_optional ( player_index = = 0 ) ) ;
Write Setting( std : : string ( player_prefix ) . append ( " vibration_enabled " ) ,
Write Integer Setting( std : : string ( player_prefix ) . append ( " vibration_enabled " ) ,
player . vibration_enabled , std : : make_optional ( true ) ) ;
Write Setting( std : : string ( player_prefix ) . append ( " vibration_strength " ) ,
Write Integer Setting( std : : string ( player_prefix ) . append ( " vibration_strength " ) ,
player . vibration_strength , std : : make_optional ( 100 ) ) ;
WriteSetting ( std : : string ( player_prefix ) . append ( " body_color_left " ) , player . body_color_left ,
WriteIntegerSetting ( std : : string ( player_prefix ) . append ( " body_color_left " ) ,
player . body_color_left ,
std : : make_optional ( Settings : : JOYCON_BODY_NEON_BLUE ) ) ;
WriteSetting ( std : : string ( player_prefix ) . append ( " body_color_right " ) , player . body_color_right ,
WriteIntegerSetting ( std : : string ( player_prefix ) . append ( " body_color_right " ) ,
player . body_color_right ,
std : : make_optional ( Settings : : JOYCON_BODY_NEON_RED ) ) ;
Write Setting( std : : string ( player_prefix ) . append ( " button_color_left " ) ,
Write Integer Setting( std : : string ( player_prefix ) . append ( " button_color_left " ) ,
player . button_color_left ,
std : : make_optional ( Settings : : JOYCON_BUTTONS_NEON_BLUE ) ) ;
Write Setting( std : : string ( player_prefix ) . append ( " button_color_right " ) ,
Write Integer Setting( std : : string ( player_prefix ) . append ( " button_color_right " ) ,
player . button_color_right ,
std : : make_optional ( Settings : : JOYCON_BUTTONS_NEON_RED ) ) ;
}
@ -433,13 +436,14 @@ void Config::SavePlayerValues(const std::size_t player_index) {
void Config : : SaveTouchscreenValues ( ) {
const auto & touchscreen = Settings : : values . touchscreen ;
WriteSetting ( std : : string ( " touchscreen_enabled " ) , touchscreen . enabled , std : : make_optional ( true ) ) ;
WriteBooleanSetting ( std : : string ( " touchscreen_enabled " ) , touchscreen . enabled ,
std : : make_optional ( true ) ) ;
Write Setting( std : : string ( " touchscreen_angle " ) , touchscreen . rotation_angle ,
Write Integer Setting( std : : string ( " touchscreen_angle " ) , touchscreen . rotation_angle ,
std : : make_optional ( static_cast < u32 > ( 0 ) ) ) ;
Write Setting( std : : string ( " touchscreen_diameter_x " ) , touchscreen . diameter_x ,
Write Integer Setting( std : : string ( " touchscreen_diameter_x " ) , touchscreen . diameter_x ,
std : : make_optional ( static_cast < u32 > ( 15 ) ) ) ;
Write Setting( std : : string ( " touchscreen_diameter_y " ) , touchscreen . diameter_y ,
Write Integer Setting( std : : string ( " touchscreen_diameter_y " ) , touchscreen . diameter_y ,
std : : make_optional ( static_cast < u32 > ( 15 ) ) ) ;
}
@ -447,14 +451,14 @@ void Config::SaveMotionTouchValues() {
BeginArray ( std : : string ( " touch_from_button_maps " ) ) ;
for ( std : : size_t p = 0 ; p < Settings : : values . touch_from_button_maps . size ( ) ; + + p ) {
SetArrayIndex ( static_cast < int > ( p ) ) ;
WriteS etting( std : : string ( " name " ) , Settings : : values . touch_from_button_maps [ p ] . name ,
WriteS tringS etting( std : : string ( " name " ) , Settings : : values . touch_from_button_maps [ p ] . name ,
std : : make_optional ( std : : string ( " default " ) ) ) ;
BeginArray ( std : : string ( " entries " ) ) ;
for ( std : : size_t q = 0 ; q < Settings : : values . touch_from_button_maps [ p ] . buttons . size ( ) ;
+ + q ) {
SetArrayIndex ( static_cast < int > ( q ) ) ;
WriteS etting( std : : string ( " bind " ) ,
WriteS tringS etting( std : : string ( " bind " ) ,
Settings : : values . touch_from_button_maps [ p ] . buttons [ q ] ) ;
}
EndArray ( ) ; // entries
@ -520,15 +524,15 @@ void Config::SaveCoreValues() {
void Config : : SaveDataStorageValues ( ) {
BeginGroup ( Settings : : TranslateCategory ( Settings : : Category : : DataStorage ) ) ;
WriteS etting( std : : string ( " nand_directory " ) , FS : : GetYuzuPathString ( FS : : YuzuPath : : NANDDir ) ,
WriteS tringS etting( std : : string ( " nand_directory " ) , FS : : GetYuzuPathString ( FS : : YuzuPath : : NANDDir ) ,
std : : make_optional ( FS : : GetYuzuPathString ( FS : : YuzuPath : : NANDDir ) ) ) ;
WriteS etting( std : : string ( " sdmc_directory " ) , FS : : GetYuzuPathString ( FS : : YuzuPath : : SDMCDir ) ,
WriteS tringS etting( std : : string ( " sdmc_directory " ) , FS : : GetYuzuPathString ( FS : : YuzuPath : : SDMCDir ) ,
std : : make_optional ( FS : : GetYuzuPathString ( FS : : YuzuPath : : SDMCDir ) ) ) ;
WriteS etting( std : : string ( " load_directory " ) , FS : : GetYuzuPathString ( FS : : YuzuPath : : LoadDir ) ,
WriteS tringS etting( std : : string ( " load_directory " ) , FS : : GetYuzuPathString ( FS : : YuzuPath : : LoadDir ) ,
std : : make_optional ( FS : : GetYuzuPathString ( FS : : YuzuPath : : LoadDir ) ) ) ;
WriteS etting( std : : string ( " dump_directory " ) , FS : : GetYuzuPathString ( FS : : YuzuPath : : DumpDir ) ,
WriteS tringS etting( std : : string ( " dump_directory " ) , FS : : GetYuzuPathString ( FS : : YuzuPath : : DumpDir ) ,
std : : make_optional ( FS : : GetYuzuPathString ( FS : : YuzuPath : : DumpDir ) ) ) ;
WriteS etting( std : : string ( " tas_directory " ) , FS : : GetYuzuPathString ( FS : : YuzuPath : : TASDir ) ,
WriteS tringS etting( std : : string ( " tas_directory " ) , FS : : GetYuzuPathString ( FS : : YuzuPath : : TASDir ) ,
std : : make_optional ( FS : : GetYuzuPathString ( FS : : YuzuPath : : TASDir ) ) ) ;
WriteCategory ( Settings : : Category : : DataStorage ) ;
@ -540,7 +544,7 @@ void Config::SaveDebuggingValues() {
BeginGroup ( Settings : : TranslateCategory ( Settings : : Category : : Debugging ) ) ;
// Intentionally not using the QT default setting as this is intended to be changed in the ini
Write Setting( std : : string ( " record_frame_times " ) , Settings : : values . record_frame_times ) ;
Write Boolean Setting( std : : string ( " record_frame_times " ) , Settings : : values . record_frame_times ) ;
WriteCategory ( Settings : : Category : : Debugging ) ;
WriteCategory ( Settings : : Category : : DebuggingGraphics ) ;
@ -564,11 +568,13 @@ void Config::SaveDisabledAddOnValues() {
BeginArray ( std : : string ( " " ) ) ;
for ( const auto & elem : Settings : : values . disabled_addons ) {
SetArrayIndex ( i ) ;
WriteSetting ( std : : string ( " title_id " ) , elem . first , std : : make_optional ( static_cast < u64 > ( 0 ) ) ) ;
WriteIntegerSetting ( std : : string ( " title_id " ) , elem . first ,
std : : make_optional ( static_cast < u64 > ( 0 ) ) ) ;
BeginArray ( std : : string ( " disabled " ) ) ;
for ( std : : size_t j = 0 ; j < elem . second . size ( ) ; + + j ) {
SetArrayIndex ( static_cast < int > ( j ) ) ;
WriteSetting ( std : : string ( " d " ) , elem . second [ j ] , std : : make_optional ( std : : string ( " " ) ) ) ;
WriteStringSetting ( std : : string ( " d " ) , elem . second [ j ] ,
std : : make_optional ( std : : string ( " " ) ) ) ;
}
EndArray ( ) ; // disabled
+ + i ;
@ -609,7 +615,7 @@ void Config::SaveRendererValues() {
void Config : : SaveScreenshotValues ( ) {
BeginGroup ( Settings : : TranslateCategory ( Settings : : Category : : Screenshots ) ) ;
WriteS etting( std : : string ( " screenshot_path " ) ,
WriteS tringS etting( std : : string ( " screenshot_path " ) ,
FS : : GetYuzuPathString ( FS : : YuzuPath : : ScreenshotsDir ) ) ;
WriteCategory ( Settings : : Category : : Screenshots ) ;
@ -746,46 +752,70 @@ bool Config::Exists(const std::string& section, const std::string& key) const {
return ! value . empty ( ) ;
}
template < typename Type >
void Config : : WriteSetting ( const std : : string & key , const Type & value ,
const std : : optional < Type > & default_value ,
void Config : : WriteBooleanSetting ( const std : : string & key , const bool & value ,
const std : : optional < bool > & default_value ,
const std : : optional < bool > & use_global ) {
std : : optional < std : : string > string_default = std : : nullopt ;
if ( default_value . has_value ( ) ) {
string_default = std : : make_optional ( ToString ( default_value . value ( ) ) ) ;
}
WritePreparedSetting ( key , AdjustOutputString ( ToString ( value ) ) , string_default , use_global ) ;
}
template < typename T >
std : : enable_if_t < std : : is_integral_v < T > > Config : : WriteIntegerSetting (
const std : : string & key , const T & value , const std : : optional < T > & default_value ,
const std : : optional < bool > & use_global ) {
std : : optional < std : : string > string_default = std : : nullopt ;
if ( default_value . has_value ( ) ) {
string_default = std : : make_optional ( ToString ( default_value . value ( ) ) ) ;
}
WritePreparedSetting ( key , AdjustOutputString ( ToString ( value ) ) , string_default , use_global ) ;
}
void Config : : WriteDoubleSetting ( const std : : string & key , const double & value ,
const std : : optional < double > & default_value ,
const std : : optional < bool > & use_global ) {
std : : optional < std : : string > string_default = std : : nullopt ;
if ( default_value . has_value ( ) ) {
string_default = std : : make_optional ( ToString ( default_value . value ( ) ) ) ;
}
WritePreparedSetting ( key , AdjustOutputString ( ToString ( value ) ) , string_default , use_global ) ;
}
void Config : : WriteStringSetting ( const std : : string & key , const std : : string & value ,
const std : : optional < std : : string > & default_value ,
const std : : optional < bool > & use_global ) {
std : : optional string_default = default_value ;
if ( default_value . has_value ( ) ) {
string_default . value ( ) . append ( AdjustOutputString ( default_value . value ( ) ) ) ;
}
WritePreparedSetting ( key , AdjustOutputString ( value ) , string_default , use_global ) ;
}
void Config : : WritePreparedSetting ( const std : : string & key , const std : : string & adjusted_value ,
const std : : optional < std : : string > & adjusted_default_value ,
const std : : optional < bool > & use_global ) {
std : : string full_key = GetFullKey ( key , false ) ;
std : : string saved_value ;
std : : string string_default ;
if constexpr ( std : : is_same_v < Type , std : : string > ) {
saved_value . append ( AdjustOutputString ( value ) ) ;
if ( default_value . has_value ( ) ) {
string_default . append ( AdjustOutputString ( default_value . value ( ) ) ) ;
}
} else {
saved_value . append ( AdjustOutputString ( ToString ( value ) ) ) ;
if ( default_value . has_value ( ) ) {
string_default . append ( ToString ( default_value . value ( ) ) ) ;
}
}
if ( default_value . has_value ( ) & & use_global . has_value ( ) ) {
if ( adjusted_default_value . has_value ( ) & & use_global . has_value ( ) ) {
if ( ! global ) {
WriteSettingInternal ( std : : string ( full_key ) . append ( " \\ global " ) ,
ToString ( use_global . value ( ) ) ) ;
WriteString ( std : : string ( full_key ) . append ( " \\ global " ) , ToString ( use_global . value ( ) ) ) ;
}
if ( global | | use_global . value ( ) = = false ) {
WriteSettingInternal ( std : : string ( full_key ) . append ( " \\ default " ) ,
ToString ( string_default = = saved_value ) ) ;
WriteSettingInternal ( full_key , saved_value ) ;
WriteString ( std : : string ( full_key ) . append ( " \\ default " ) ,
ToString ( adjusted_default_value = = adjusted_value ) ) ;
WriteString ( full_key , adjusted_value ) ;
}
} else if ( default_value . has_value ( ) & & ! use_global . has_value ( ) ) {
WriteSettingInternal ( std : : string ( full_key ) . append ( " \\ default " ) ,
ToString ( string_default = = saved_value ) ) ;
WriteSettingInternal ( full_key , saved_value ) ;
} else if ( adjusted_default_value . has_value ( ) & & ! use_global . has_value ( ) ) {
WriteString ( std : : string ( full_key ) . append ( " \\ default " ) ,
ToString ( adjusted_default_value = = adjusted_value ) ) ;
WriteString ( full_key , adjusted_value ) ;
} else {
WriteSettingInternal ( full_key , saved_value ) ;
WriteString ( full_key , adjusted_value ) ;
}
}
void Config : : WriteSettingInternal ( const std : : string & key , const std : : string & value ) {
void Config : : WriteS tring ( const std : : string & key , const std : : string & value ) {
config - > SetValue ( GetSection ( ) . c_str ( ) , key . c_str ( ) , value . c_str ( ) ) ;
}
@ -861,17 +891,17 @@ void Config::WriteSettingGeneric(const Settings::BasicSetting* const setting) {
std : : string key = AdjustKey ( setting - > GetLabel ( ) ) ;
if ( setting - > Switchable ( ) ) {
if ( ! global ) {
Write Setting( std : : string ( key ) . append ( " \\ use_global " ) , setting - > UsingGlobal ( ) ) ;
Write Boolean Setting( std : : string ( key ) . append ( " \\ use_global " ) , setting - > UsingGlobal ( ) ) ;
}
if ( global | | ! setting - > UsingGlobal ( ) ) {
Write Setting( std : : string ( key ) . append ( " \\ default " ) ,
Write Boolean Setting( std : : string ( key ) . append ( " \\ default " ) ,
setting - > ToString ( ) = = setting - > DefaultToString ( ) ) ;
WriteS etting( key , setting - > ToString ( ) ) ;
WriteS tringS etting( key , setting - > ToString ( ) ) ;
}
} else if ( global ) {
Write Setting( std : : string ( key ) . append ( " \\ default " ) ,
Write Boolean Setting( std : : string ( key ) . append ( " \\ default " ) ,
setting - > ToString ( ) = = setting - > DefaultToString ( ) ) ;
WriteS etting( key , setting - > ToString ( ) ) ;
WriteS tringS etting( key , setting - > ToString ( ) ) ;
}
}