2022-05-15 02:06:02 +02:00
// SPDX-FileCopyrightText: 2014 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
2014-09-12 17:06:13 -07:00
2023-06-05 21:05:22 -04:00
# include <algorithm>
2019-02-16 16:19:29 +01:00
# include <array>
# include <QKeySequence>
2016-09-21 00:21:23 +09:00
# include <QSettings>
2021-05-25 19:32:56 -04:00
# include "common/fs/fs.h"
# include "common/fs/path_util.h"
2023-04-30 15:39:00 -04:00
# include "common/settings.h"
2020-11-27 10:50:48 -05:00
# include "core/core.h"
2018-10-10 21:49:20 -04:00
# include "core/hle/service/acc/profile_manager.h"
2018-11-04 10:18:59 -05:00
# include "core/hle/service/hid/controllers/npad.h"
2017-01-21 11:53:03 +02:00
# include "input_common/main.h"
2021-12-25 20:27:52 +01:00
# include "network/network.h"
2018-01-11 20:33:56 -07:00
# include "yuzu/configuration/config.h"
2020-08-15 08:33:16 -04:00
namespace FS = Common : : FS ;
2023-06-05 21:05:22 -04:00
Config : : Config ( const std : : string & config_name , ConfigType config_type )
: type ( config_type ) , global { config_type = = ConfigType : : GlobalConfig } {
2020-09-27 14:20:22 -04:00
Initialize ( config_name ) ;
2014-09-12 17:06:13 -07:00
}
2018-10-23 21:49:50 -04:00
Config : : ~ Config ( ) {
2020-07-09 22:42:09 -04:00
if ( global ) {
Save ( ) ;
}
2018-10-23 21:49:50 -04:00
}
2017-01-21 11:53:03 +02:00
const std : : array < int , Settings : : NativeButton : : NumButtons > Config : : default_buttons = {
2021-04-25 07:00:29 -04:00
Qt : : Key_C , Qt : : Key_X , Qt : : Key_V , Qt : : Key_Z , Qt : : Key_F ,
Qt : : Key_G , Qt : : Key_Q , Qt : : Key_E , Qt : : Key_R , Qt : : Key_T ,
Qt : : Key_M , Qt : : Key_N , Qt : : Key_Left , Qt : : Key_Up , Qt : : Key_Right ,
Qt : : Key_Down , Qt : : Key_Q , Qt : : Key_E , 0 , 0 ,
2015-06-20 04:34:45 +01:00
} ;
2020-09-04 21:48:03 -05:00
const std : : array < int , Settings : : NativeMotion : : NumMotions > Config : : default_motions = {
Qt : : Key_7 ,
Qt : : Key_8 ,
} ;
2020-07-22 10:39:53 -04:00
const std : : array < std : : array < int , 4 > , Settings : : NativeAnalog : : NumAnalogs > Config : : default_analogs { {
2017-01-21 13:04:00 +02:00
{
2021-04-25 07:00:29 -04:00
Qt : : Key_W ,
Qt : : Key_S ,
Qt : : Key_A ,
Qt : : Key_D ,
2017-01-21 13:04:00 +02:00
} ,
{
2018-01-20 00:48:02 -07:00
Qt : : Key_I ,
Qt : : Key_K ,
Qt : : Key_J ,
Qt : : Key_L ,
2017-01-21 13:04:00 +02:00
} ,
} } ;
2020-08-28 23:51:19 -04:00
const std : : array < int , 2 > Config : : default_stick_mod = {
2021-04-25 07:00:29 -04:00
Qt : : Key_Shift ,
0 ,
2020-08-28 23:51:19 -04:00
} ;
2020-07-22 10:39:53 -04:00
2022-01-08 23:23:40 -06:00
const std : : array < int , 2 > Config : : default_ringcon_analogs { {
Qt : : Key_A ,
Qt : : Key_D ,
} } ;
2023-05-16 20:17:54 +01:00
const std : : map < Settings : : AntiAliasing , QString > Config : : anti_aliasing_texts_map = {
{ Settings : : AntiAliasing : : None , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " None " ) ) } ,
{ Settings : : AntiAliasing : : Fxaa , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " FXAA " ) ) } ,
{ Settings : : AntiAliasing : : Smaa , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " SMAA " ) ) } ,
} ;
const std : : map < Settings : : ScalingFilter , QString > Config : : scaling_filter_texts_map = {
{ Settings : : ScalingFilter : : NearestNeighbor ,
QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " Nearest " ) ) } ,
{ Settings : : ScalingFilter : : Bilinear ,
QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " Bilinear " ) ) } ,
{ Settings : : ScalingFilter : : Bicubic , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " Bicubic " ) ) } ,
{ Settings : : ScalingFilter : : Gaussian ,
QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " Gaussian " ) ) } ,
{ Settings : : ScalingFilter : : ScaleForce ,
QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " ScaleForce " ) ) } ,
{ Settings : : ScalingFilter : : Fsr , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " FSR " ) ) } ,
} ;
const std : : map < bool , QString > Config : : use_docked_mode_texts_map = {
{ true , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " Docked " ) ) } ,
{ false , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " Handheld " ) ) } ,
} ;
2023-06-07 01:52:23 -04:00
const std : : map < Settings : : GpuAccuracy , QString > Config : : gpu_accuracy_texts_map = {
{ Settings : : GpuAccuracy : : Normal , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " Normal " ) ) } ,
{ Settings : : GpuAccuracy : : High , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " High " ) ) } ,
{ Settings : : GpuAccuracy : : Extreme , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " Extreme " ) ) } ,
2023-05-16 20:17:54 +01:00
} ;
const std : : map < Settings : : RendererBackend , QString > Config : : renderer_backend_texts_map = {
{ Settings : : RendererBackend : : Vulkan , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " Vulkan " ) ) } ,
{ Settings : : RendererBackend : : OpenGL , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " OpenGL " ) ) } ,
{ Settings : : RendererBackend : : Null , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " Null " ) ) } ,
} ;
2023-06-04 14:00:53 -04:00
const std : : map < Settings : : ShaderBackend , QString > Config : : shader_backend_texts_map = {
2023-06-10 23:40:39 -04:00
{ Settings : : ShaderBackend : : Glsl , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " GLSL " ) ) } ,
{ Settings : : ShaderBackend : : Glasm , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " GLASM " ) ) } ,
{ Settings : : ShaderBackend : : SpirV , QStringLiteral ( QT_TRANSLATE_NOOP ( " GMainWindow " , " SPIRV " ) ) } ,
2023-06-04 14:00:53 -04:00
} ;
2019-02-16 16:19:29 +01:00
// This shouldn't have anything except static initializers (no functions). So
2019-05-20 20:51:27 -04:00
// QKeySequence(...).toString() is NOT ALLOWED HERE.
2019-02-16 16:19:29 +01:00
// This must be in alphabetical order according to action name as it must have the same order as
// UISetting::values.shortcuts, which is alphabetically ordered.
2019-05-20 20:51:27 -04:00
// clang-format off
2022-02-06 20:27:38 -06:00
const std : : array < UISettings : : Shortcut , 22 > Config : : default_hotkeys { {
2023-01-18 00:39:31 +01:00
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Audio Mute/Unmute " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+M " ) , QStringLiteral ( " Home+Dpad_Right " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Audio Volume Down " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " - " ) , QStringLiteral ( " Home+Dpad_Down " ) , Qt : : ApplicationShortcut , true } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Audio Volume Up " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " = " ) , QStringLiteral ( " Home+Dpad_Up " ) , Qt : : ApplicationShortcut , true } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Capture Screenshot " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+P " ) , QStringLiteral ( " Screenshot " ) , Qt : : WidgetWithChildrenShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Change Adapting Filter " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " F8 " ) , QStringLiteral ( " Home+L " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Change Docked Mode " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " F10 " ) , QStringLiteral ( " Home+X " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Change GPU Accuracy " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " F9 " ) , QStringLiteral ( " Home+R " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Continue/Pause Emulation " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " F4 " ) , QStringLiteral ( " Home+Plus " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Exit Fullscreen " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Esc " ) , QStringLiteral ( " " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Exit yuzu " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+Q " ) , QStringLiteral ( " Home+Minus " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Fullscreen " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " F11 " ) , QStringLiteral ( " Home+B " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Load File " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+O " ) , QStringLiteral ( " " ) , Qt : : WidgetWithChildrenShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Load/Remove Amiibo " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " F2 " ) , QStringLiteral ( " Home+A " ) , Qt : : WidgetWithChildrenShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Restart Emulation " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " F6 " ) , QStringLiteral ( " " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Stop Emulation " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " F5 " ) , QStringLiteral ( " " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " TAS Record " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+F7 " ) , QStringLiteral ( " " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " TAS Reset " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+F6 " ) , QStringLiteral ( " " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " TAS Start/Stop " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+F5 " ) , QStringLiteral ( " " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Toggle Filter Bar " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+F " ) , QStringLiteral ( " " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Toggle Framerate Limit " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+U " ) , QStringLiteral ( " Home+Y " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Toggle Mouse Panning " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+F9 " ) , QStringLiteral ( " " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Toggle Status Bar " ) ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) , { QStringLiteral ( " Ctrl+S " ) , QStringLiteral ( " " ) , Qt : : WindowShortcut , false } } ,
2019-05-20 20:51:27 -04:00
} } ;
// clang-format on
2019-02-16 16:19:29 +01:00
2021-06-02 15:05:45 -04:00
void Config : : Initialize ( const std : : string & config_name ) {
2021-05-25 19:32:56 -04:00
const auto fs_config_loc = FS : : GetYuzuPath ( FS : : YuzuPath : : ConfigDir ) ;
const auto config_file = fmt : : format ( " {}.ini " , config_name ) ;
2020-09-27 14:20:22 -04:00
switch ( type ) {
case ConfigType : : GlobalConfig :
2021-05-25 19:32:56 -04:00
qt_config_loc = FS : : PathToUTF8String ( fs_config_loc / config_file ) ;
void ( FS : : CreateParentDir ( qt_config_loc ) ) ;
2020-09-27 14:20:22 -04:00
qt_config = std : : make_unique < QSettings > ( QString : : fromStdString ( qt_config_loc ) ,
QSettings : : IniFormat ) ;
Reload ( ) ;
break ;
case ConfigType : : PerGameConfig :
2021-06-02 15:05:45 -04:00
qt_config_loc =
FS : : PathToUTF8String ( fs_config_loc / " custom " / FS : : ToU8String ( config_file ) ) ;
2021-05-25 19:32:56 -04:00
void ( FS : : CreateParentDir ( qt_config_loc ) ) ;
2020-09-27 14:20:22 -04:00
qt_config = std : : make_unique < QSettings > ( QString : : fromStdString ( qt_config_loc ) ,
QSettings : : IniFormat ) ;
Reload ( ) ;
break ;
case ConfigType : : InputProfile :
2021-05-25 19:32:56 -04:00
qt_config_loc = FS : : PathToUTF8String ( fs_config_loc / " input " / config_file ) ;
void ( FS : : CreateParentDir ( qt_config_loc ) ) ;
2020-09-27 14:20:22 -04:00
qt_config = std : : make_unique < QSettings > ( QString : : fromStdString ( qt_config_loc ) ,
QSettings : : IniFormat ) ;
break ;
}
}
2022-11-19 15:39:09 -05:00
bool Config : : IsCustomConfig ( ) {
return type = = ConfigType : : PerGameConfig ;
}
2021-06-28 17:32:24 -04:00
/* {Read,Write}BasicSetting and WriteGlobalSetting templates must be defined here before their
* usages later in this file. This allows explicit definition of some types that don't work
* nicely with the general version.
*/
// Explicit std::string definition: Qt can't implicitly convert a std::string to a QVariant, nor
2021-06-28 15:58:16 -04:00
// can it implicitly convert a QVariant back to a {std::,Q}string
template < >
2022-06-30 12:32:03 -04:00
void Config : : ReadBasicSetting ( Settings : : Setting < std : : string > & setting ) {
2021-06-28 15:58:16 -04:00
const QString name = QString : : fromStdString ( setting . GetLabel ( ) ) ;
2021-07-08 14:07:10 -04:00
const auto default_value = QString : : fromStdString ( setting . GetDefault ( ) ) ;
2021-06-28 15:58:16 -04:00
if ( qt_config - > value ( name + QStringLiteral ( " /default " ) , false ) . toBool ( ) ) {
2021-07-08 14:07:10 -04:00
setting . SetValue ( default_value . toStdString ( ) ) ;
2021-06-28 15:58:16 -04:00
} else {
2021-07-08 14:07:10 -04:00
setting . SetValue ( qt_config - > value ( name , default_value ) . toString ( ) . toStdString ( ) ) ;
2021-06-28 15:58:16 -04:00
}
}
2021-07-08 14:07:10 -04:00
2022-07-15 18:37:48 +01:00
template < typename Type , bool ranged >
void Config : : ReadBasicSetting ( Settings : : Setting < Type , ranged > & setting ) {
2021-06-28 15:58:16 -04:00
const QString name = QString : : fromStdString ( setting . GetLabel ( ) ) ;
2021-07-08 14:07:10 -04:00
const Type default_value = setting . GetDefault ( ) ;
2021-06-28 15:58:16 -04:00
if ( qt_config - > value ( name + QStringLiteral ( " /default " ) , false ) . toBool ( ) ) {
2021-07-08 14:07:10 -04:00
setting . SetValue ( default_value ) ;
2021-06-28 15:58:16 -04:00
} else {
setting . SetValue (
2021-07-08 14:07:10 -04:00
static_cast < QVariant > ( qt_config - > value ( name , default_value ) ) . value < Type > ( ) ) ;
2021-06-28 15:58:16 -04:00
}
}
// Explicit std::string definition: Qt can't implicitly convert a std::string to a QVariant
template < >
2022-06-30 12:32:03 -04:00
void Config : : WriteBasicSetting ( const Settings : : Setting < std : : string > & setting ) {
2021-06-28 15:58:16 -04:00
const QString name = QString : : fromStdString ( setting . GetLabel ( ) ) ;
2021-07-08 14:07:10 -04:00
const std : : string & value = setting . GetValue ( ) ;
qt_config - > setValue ( name + QStringLiteral ( " /default " ) , value = = setting . GetDefault ( ) ) ;
qt_config - > setValue ( name , QString : : fromStdString ( value ) ) ;
2021-06-28 15:58:16 -04:00
}
2021-07-08 14:07:10 -04:00
2022-07-15 18:37:48 +01:00
template < typename Type , bool ranged >
void Config : : WriteBasicSetting ( const Settings : : Setting < Type , ranged > & setting ) {
2021-06-28 15:58:16 -04:00
const QString name = QString : : fromStdString ( setting . GetLabel ( ) ) ;
2021-07-08 14:07:10 -04:00
const Type value = setting . GetValue ( ) ;
qt_config - > setValue ( name + QStringLiteral ( " /default " ) , value = = setting . GetDefault ( ) ) ;
qt_config - > setValue ( name , value ) ;
2021-06-28 15:58:16 -04:00
}
2022-07-15 18:37:48 +01:00
template < typename Type , bool ranged >
void Config : : WriteGlobalSetting ( const Settings : : SwitchableSetting < Type , ranged > & setting ) {
2021-07-08 14:07:10 -04:00
const QString name = QString : : fromStdString ( setting . GetLabel ( ) ) ;
const Type & value = setting . GetValue ( global ) ;
2021-06-28 15:58:16 -04:00
if ( ! global ) {
qt_config - > setValue ( name + QStringLiteral ( " /use_global " ) , setting . UsingGlobal ( ) ) ;
}
if ( global | | ! setting . UsingGlobal ( ) ) {
2021-07-08 14:07:10 -04:00
qt_config - > setValue ( name + QStringLiteral ( " /default " ) , value = = setting . GetDefault ( ) ) ;
qt_config - > setValue ( name , value ) ;
2021-06-28 15:58:16 -04:00
}
}
2020-09-23 09:52:25 -04:00
void Config : : ReadPlayerValue ( std : : size_t player_index ) {
const QString player_prefix = [ this , player_index ] {
if ( type = = ConfigType : : InputProfile ) {
return QString { } ;
} else {
return QStringLiteral ( " player_%1_ " ) . arg ( player_index ) ;
}
} ( ) ;
2020-09-28 10:00:15 -04:00
auto & player = Settings : : values . players . GetValue ( ) [ player_index ] ;
2022-11-19 15:39:09 -05:00
if ( IsCustomConfig ( ) ) {
const auto profile_name =
qt_config - > value ( QStringLiteral ( " %1profile_name " ) . arg ( player_prefix ) , QString { } )
. toString ( )
. toStdString ( ) ;
if ( profile_name . empty ( ) ) {
// Use the global input config
player = Settings : : values . players . GetValue ( true ) [ player_index ] ;
return ;
}
player . profile_name = profile_name ;
}
2020-09-23 09:52:25 -04:00
2022-11-19 15:39:09 -05:00
if ( player_prefix . isEmpty ( ) & & Settings : : IsConfiguringGlobal ( ) ) {
2023-02-26 14:39:13 -06:00
const auto controller = static_cast < Settings : : ControllerType > (
2020-09-23 09:52:25 -04:00
qt_config
- > value ( QStringLiteral ( " %1type " ) . arg ( player_prefix ) ,
static_cast < u8 > ( Settings : : ControllerType : : ProController ) )
. toUInt ( ) ) ;
2023-02-26 14:39:13 -06:00
if ( controller = = Settings : : ControllerType : : LeftJoycon | |
controller = = Settings : : ControllerType : : RightJoycon ) {
player . controller_type = controller ;
}
2020-09-23 09:52:25 -04:00
} else {
2019-05-08 23:11:15 -04:00
player . connected =
2020-09-27 11:40:15 -04:00
ReadSetting ( QStringLiteral ( " %1connected " ) . arg ( player_prefix ) , player_index = = 0 )
. toBool ( ) ;
2018-12-05 03:41:31 -05:00
2020-07-22 10:39:53 -04:00
player . controller_type = static_cast < Settings : : ControllerType > (
2018-11-01 21:57:13 -04:00
qt_config
2020-09-23 09:52:25 -04:00
- > value ( QStringLiteral ( " %1type " ) . arg ( player_prefix ) ,
2020-07-22 10:39:53 -04:00
static_cast < u8 > ( Settings : : ControllerType : : ProController ) )
2018-11-01 21:57:13 -04:00
. toUInt ( ) ) ;
2020-10-17 09:38:12 -04:00
player . vibration_enabled =
qt_config - > value ( QStringLiteral ( " %1vibration_enabled " ) . arg ( player_prefix ) , true )
. toBool ( ) ;
player . vibration_strength =
qt_config - > value ( QStringLiteral ( " %1vibration_strength " ) . arg ( player_prefix ) , 100 )
. toInt ( ) ;
2018-12-05 03:41:31 -05:00
player . body_color_left = qt_config
2020-09-23 09:52:25 -04:00
- > value ( QStringLiteral ( " %1body_color_left " ) . arg ( player_prefix ) ,
2018-12-05 03:41:31 -05:00
Settings : : JOYCON_BODY_NEON_BLUE )
. toUInt ( ) ;
2020-09-23 09:52:25 -04:00
player . body_color_right =
qt_config
- > value ( QStringLiteral ( " %1body_color_right " ) . arg ( player_prefix ) ,
Settings : : JOYCON_BODY_NEON_RED )
. toUInt ( ) ;
player . button_color_left =
qt_config
- > value ( QStringLiteral ( " %1button_color_left " ) . arg ( player_prefix ) ,
Settings : : JOYCON_BUTTONS_NEON_BLUE )
. toUInt ( ) ;
2019-05-08 23:11:15 -04:00
player . button_color_right =
qt_config
2020-09-23 09:52:25 -04:00
- > value ( QStringLiteral ( " %1button_color_right " ) . arg ( player_prefix ) ,
2019-05-08 23:11:15 -04:00
Settings : : JOYCON_BUTTONS_NEON_RED )
. toUInt ( ) ;
2020-09-23 09:52:25 -04:00
}
2018-11-01 21:57:13 -04:00
2020-09-23 09:52:25 -04:00
for ( int i = 0 ; i < Settings : : NativeButton : : NumButtons ; + + i ) {
const std : : string default_param = InputCommon : : GenerateKeyboardParam ( default_buttons [ i ] ) ;
auto & player_buttons = player . buttons [ i ] ;
player_buttons = qt_config
- > value ( QStringLiteral ( " %1 " ) . arg ( player_prefix ) +
QString : : fromUtf8 ( Settings : : NativeButton : : mapping [ i ] ) ,
QString : : fromStdString ( default_param ) )
. toString ( )
. toStdString ( ) ;
if ( player_buttons . empty ( ) ) {
player_buttons = default_param ;
2018-11-01 21:57:13 -04:00
}
2020-09-23 09:52:25 -04:00
}
2018-11-01 21:57:13 -04:00
2020-09-23 09:52:25 -04:00
for ( int i = 0 ; i < Settings : : NativeAnalog : : NumAnalogs ; + + i ) {
const std : : string default_param = InputCommon : : GenerateAnalogParamFromKeys (
default_analogs [ i ] [ 0 ] , default_analogs [ i ] [ 1 ] , default_analogs [ i ] [ 2 ] ,
default_analogs [ i ] [ 3 ] , default_stick_mod [ i ] , 0.5f ) ;
auto & player_analogs = player . analogs [ i ] ;
player_analogs = qt_config
- > value ( QStringLiteral ( " %1 " ) . arg ( player_prefix ) +
QString : : fromUtf8 ( Settings : : NativeAnalog : : mapping [ i ] ) ,
QString : : fromStdString ( default_param ) )
. toString ( )
. toStdString ( ) ;
if ( player_analogs . empty ( ) ) {
player_analogs = default_param ;
2018-11-01 21:57:13 -04:00
}
}
2020-10-20 13:55:25 -04:00
for ( int i = 0 ; i < Settings : : NativeMotion : : NumMotions ; + + i ) {
const std : : string default_param = InputCommon : : GenerateKeyboardParam ( default_motions [ i ] ) ;
auto & player_motions = player . motions [ i ] ;
player_motions = qt_config
- > value ( QStringLiteral ( " %1 " ) . arg ( player_prefix ) +
QString : : fromUtf8 ( Settings : : NativeMotion : : mapping [ i ] ) ,
QString : : fromStdString ( default_param ) )
. toString ( )
. toStdString ( ) ;
if ( player_motions . empty ( ) ) {
player_motions = default_param ;
}
}
2018-11-03 12:55:39 -04:00
}
2018-11-01 21:57:13 -04:00
2018-11-03 12:55:39 -04:00
void Config : : ReadDebugValues ( ) {
2017-01-21 11:53:03 +02:00
for ( int i = 0 ; i < Settings : : NativeButton : : NumButtons ; + + i ) {
2019-05-08 23:11:15 -04:00
const std : : string default_param = InputCommon : : GenerateKeyboardParam ( default_buttons [ i ] ) ;
auto & debug_pad_buttons = Settings : : values . debug_pad_buttons [ i ] ;
debug_pad_buttons = qt_config
- > value ( QStringLiteral ( " debug_pad_ " ) +
QString : : fromUtf8 ( Settings : : NativeButton : : mapping [ i ] ) ,
QString : : fromStdString ( default_param ) )
. toString ( )
. toStdString ( ) ;
if ( debug_pad_buttons . empty ( ) ) {
debug_pad_buttons = default_param ;
}
2015-06-20 04:34:45 +01:00
}
2017-01-21 13:04:00 +02:00
for ( int i = 0 ; i < Settings : : NativeAnalog : : NumAnalogs ; + + i ) {
2019-05-08 23:11:15 -04:00
const std : : string default_param = InputCommon : : GenerateAnalogParamFromKeys (
2017-01-21 13:04:00 +02:00
default_analogs [ i ] [ 0 ] , default_analogs [ i ] [ 1 ] , default_analogs [ i ] [ 2 ] ,
2020-08-28 23:51:19 -04:00
default_analogs [ i ] [ 3 ] , default_stick_mod [ i ] , 0.5f ) ;
2019-05-08 23:11:15 -04:00
auto & debug_pad_analogs = Settings : : values . debug_pad_analogs [ i ] ;
debug_pad_analogs = qt_config
- > value ( QStringLiteral ( " debug_pad_ " ) +
QString : : fromUtf8 ( Settings : : NativeAnalog : : mapping [ i ] ) ,
QString : : fromStdString ( default_param ) )
. toString ( )
. toStdString ( ) ;
if ( debug_pad_analogs . empty ( ) ) {
debug_pad_analogs = default_param ;
}
2017-01-21 13:04:00 +02:00
}
2018-11-03 12:55:39 -04:00
}
void Config : : ReadTouchscreenValues ( ) {
2019-05-20 20:51:27 -04:00
Settings : : values . touchscreen . enabled =
ReadSetting ( QStringLiteral ( " touchscreen_enabled " ) , true ) . toBool ( ) ;
2018-07-09 20:07:59 +08:00
2019-05-20 20:51:27 -04:00
Settings : : values . touchscreen . rotation_angle =
ReadSetting ( QStringLiteral ( " touchscreen_angle " ) , 0 ) . toUInt ( ) ;
Settings : : values . touchscreen . diameter_x =
ReadSetting ( QStringLiteral ( " touchscreen_diameter_x " ) , 15 ) . toUInt ( ) ;
Settings : : values . touchscreen . diameter_y =
ReadSetting ( QStringLiteral ( " touchscreen_diameter_y " ) , 15 ) . toUInt ( ) ;
2018-11-03 12:55:39 -04:00
}
2022-01-08 23:23:40 -06:00
void Config : : ReadHidbusValues ( ) {
const std : : string default_param = InputCommon : : GenerateAnalogParamFromKeys (
0 , 0 , default_ringcon_analogs [ 0 ] , default_ringcon_analogs [ 1 ] , 0 , 0.05f ) ;
auto & ringcon_analogs = Settings : : values . ringcon_analogs ;
ringcon_analogs =
qt_config - > value ( QStringLiteral ( " ring_controller " ) , QString : : fromStdString ( default_param ) )
. toString ( )
. toStdString ( ) ;
if ( ringcon_analogs . empty ( ) ) {
ringcon_analogs = default_param ;
}
}
2019-05-08 23:11:15 -04:00
void Config : : ReadAudioValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Audio " ) ) ;
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : Audio ) ;
2019-05-08 23:11:15 -04:00
qt_config - > endGroup ( ) ;
}
void Config : : ReadControlValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Controls " ) ) ;
2018-11-03 12:55:39 -04:00
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : Controls ) ;
2022-11-19 15:39:09 -05:00
Settings : : values . players . SetGlobal ( ! IsCustomConfig ( ) ) ;
2020-09-28 10:00:15 -04:00
for ( std : : size_t p = 0 ; p < Settings : : values . players . GetValue ( ) . size ( ) ; + + p ) {
2020-09-23 09:52:25 -04:00
ReadPlayerValue ( p ) ;
}
2022-11-19 15:39:09 -05:00
// Disable docked mode if handheld is selected
const auto controller_type = Settings : : values . players . GetValue ( ) [ 0 ] . controller_type ;
if ( controller_type = = Settings : : ControllerType : : Handheld ) {
Settings : : values . use_docked_mode . SetGlobal ( ! IsCustomConfig ( ) ) ;
Settings : : values . use_docked_mode . SetValue ( false ) ;
}
if ( IsCustomConfig ( ) ) {
qt_config - > endGroup ( ) ;
return ;
}
2018-11-03 12:55:39 -04:00
ReadDebugValues ( ) ;
ReadTouchscreenValues ( ) ;
2020-08-29 20:56:51 +02:00
ReadMotionTouchValues ( ) ;
2022-01-08 23:23:40 -06:00
ReadHidbusValues ( ) ;
2022-01-23 21:08:49 -06:00
2020-08-29 20:56:51 +02:00
qt_config - > endGroup ( ) ;
}
2020-07-14 19:01:36 +02:00
2020-08-29 20:56:51 +02:00
void Config : : ReadMotionTouchValues ( ) {
2020-07-14 19:01:36 +02:00
int num_touch_from_button_maps =
qt_config - > beginReadArray ( QStringLiteral ( " touch_from_button_maps " ) ) ;
if ( num_touch_from_button_maps > 0 ) {
const auto append_touch_from_button_map = [ this ] {
Settings : : TouchFromButtonMap map ;
map . name = ReadSetting ( QStringLiteral ( " name " ) , QStringLiteral ( " default " ) )
. toString ( )
. toStdString ( ) ;
const int num_touch_maps = qt_config - > beginReadArray ( QStringLiteral ( " entries " ) ) ;
map . buttons . reserve ( num_touch_maps ) ;
for ( int i = 0 ; i < num_touch_maps ; i + + ) {
qt_config - > setArrayIndex ( i ) ;
std : : string touch_mapping =
ReadSetting ( QStringLiteral ( " bind " ) ) . toString ( ) . toStdString ( ) ;
map . buttons . emplace_back ( std : : move ( touch_mapping ) ) ;
}
qt_config - > endArray ( ) ; // entries
Settings : : values . touch_from_button_maps . emplace_back ( std : : move ( map ) ) ;
} ;
for ( int i = 0 ; i < num_touch_from_button_maps ; + + i ) {
qt_config - > setArrayIndex ( i ) ;
append_touch_from_button_map ( ) ;
}
} else {
Settings : : values . touch_from_button_maps . emplace_back (
Settings : : TouchFromButtonMap { " default " , { } } ) ;
num_touch_from_button_maps = 1 ;
}
qt_config - > endArray ( ) ;
2021-06-28 15:58:16 -04:00
Settings : : values . touch_from_button_map_index = std : : clamp (
Settings : : values . touch_from_button_map_index . GetValue ( ) , 0 , num_touch_from_button_maps - 1 ) ;
2019-05-08 23:11:15 -04:00
}
2014-11-15 11:56:18 -08:00
2019-05-08 23:11:15 -04:00
void Config : : ReadCoreValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Core " ) ) ;
2015-05-03 15:34:48 -04:00
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : Core ) ;
2015-04-03 15:35:51 -07:00
2018-07-30 23:57:53 -04:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
void Config : : ReadDataStorageValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Data Storage " ) ) ;
2018-07-30 23:57:53 -04:00
2021-05-25 19:32:56 -04:00
FS : : SetYuzuPath (
FS : : YuzuPath : : NANDDir ,
qt_config
- > value ( QStringLiteral ( " nand_directory " ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : NANDDir ) ) )
. toString ( )
. toStdString ( ) ) ;
FS : : SetYuzuPath (
FS : : YuzuPath : : SDMCDir ,
qt_config
- > value ( QStringLiteral ( " sdmc_directory " ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : SDMCDir ) ) )
. toString ( )
. toStdString ( ) ) ;
FS : : SetYuzuPath (
FS : : YuzuPath : : LoadDir ,
qt_config
- > value ( QStringLiteral ( " load_directory " ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : LoadDir ) ) )
. toString ( )
. toStdString ( ) ) ;
FS : : SetYuzuPath (
FS : : YuzuPath : : DumpDir ,
qt_config
- > value ( QStringLiteral ( " dump_directory " ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : DumpDir ) ) )
. toString ( )
. toStdString ( ) ) ;
2021-07-05 20:58:52 -05:00
FS : : SetYuzuPath ( FS : : YuzuPath : : TASDir ,
qt_config
- > value ( QStringLiteral ( " tas_directory " ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : TASDir ) ) )
. toString ( )
. toStdString ( ) ) ;
2021-06-18 16:20:10 +02:00
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : DataStorage ) ;
2014-11-15 11:56:18 -08:00
2018-11-01 21:57:13 -04:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2018-11-01 21:57:13 -04:00
2019-05-08 23:11:15 -04:00
void Config : : ReadDebuggingValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Debugging " ) ) ;
2018-03-26 22:24:31 -04:00
2019-08-26 17:29:08 +02:00
// Intentionally not using the QT default setting as this is intended to be changed in the ini
Settings : : values . record_frame_times =
qt_config - > value ( QStringLiteral ( " record_frame_times " ) , false ) . toBool ( ) ;
2022-05-30 19:35:01 -04:00
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : Debugging ) ;
2023-05-07 10:35:28 -04:00
ReadCategory ( Settings : : Category : : DebuggingGraphics ) ;
2015-09-02 08:56:38 -04:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2016-01-24 21:23:55 +01:00
2019-04-28 18:44:46 -04:00
void Config : : ReadServiceValues ( ) {
2019-06-20 20:31:17 -04:00
qt_config - > beginGroup ( QStringLiteral ( " Services " ) ) ;
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : Services ) ;
2019-04-28 18:44:46 -04:00
qt_config - > endGroup ( ) ;
}
2019-05-08 23:11:15 -04:00
void Config : : ReadDisabledAddOnValues ( ) {
const auto size = qt_config - > beginReadArray ( QStringLiteral ( " DisabledAddOns " ) ) ;
2018-09-16 20:05:51 +02:00
2018-11-28 14:00:01 -05:00
for ( int i = 0 ; i < size ; + + i ) {
qt_config - > setArrayIndex ( i ) ;
2019-05-08 23:11:15 -04:00
const auto title_id = ReadSetting ( QStringLiteral ( " title_id " ) , 0 ) . toULongLong ( ) ;
2018-11-28 14:00:01 -05:00
std : : vector < std : : string > out ;
2019-05-08 23:11:15 -04:00
const auto d_size = qt_config - > beginReadArray ( QStringLiteral ( " disabled " ) ) ;
2018-11-28 14:00:01 -05:00
for ( int j = 0 ; j < d_size ; + + j ) {
qt_config - > setArrayIndex ( j ) ;
2020-07-22 10:39:53 -04:00
out . push_back ( ReadSetting ( QStringLiteral ( " d " ) , QString { } ) . toString ( ) . toStdString ( ) ) ;
2018-11-28 14:00:01 -05:00
}
qt_config - > endArray ( ) ;
Settings : : values . disabled_addons . insert_or_assign ( title_id , out ) ;
}
2019-05-08 23:11:15 -04:00
2018-11-28 14:00:01 -05:00
qt_config - > endArray ( ) ;
2019-05-08 23:11:15 -04:00
}
2018-11-28 14:00:01 -05:00
2019-05-08 23:11:15 -04:00
void Config : : ReadMiscellaneousValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Miscellaneous " ) ) ;
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : Miscellaneous ) ;
2018-03-30 14:18:35 +02:00
2018-07-28 12:32:16 -04:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
void Config : : ReadPathValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Paths " ) ) ;
UISettings : : values . roms_path = ReadSetting ( QStringLiteral ( " romsPath " ) ) . toString ( ) ;
UISettings : : values . symbols_path = ReadSetting ( QStringLiteral ( " symbolsPath " ) ) . toString ( ) ;
2019-05-01 23:21:04 +02:00
UISettings : : values . game_dir_deprecated =
2019-05-08 23:11:15 -04:00
ReadSetting ( QStringLiteral ( " gameListRootDir " ) , QStringLiteral ( " . " ) ) . toString ( ) ;
2019-05-01 23:21:04 +02:00
UISettings : : values . game_dir_deprecated_deepscan =
2019-05-08 23:11:15 -04:00
ReadSetting ( QStringLiteral ( " gameListDeepScan " ) , false ) . toBool ( ) ;
2019-05-03 19:21:57 +02:00
const int gamedirs_size = qt_config - > beginReadArray ( QStringLiteral ( " gamedirs " ) ) ;
2019-05-01 23:21:04 +02:00
for ( int i = 0 ; i < gamedirs_size ; + + i ) {
qt_config - > setArrayIndex ( i ) ;
UISettings : : GameDir game_dir ;
game_dir . path = ReadSetting ( QStringLiteral ( " path " ) ) . toString ( ) ;
game_dir . deep_scan = ReadSetting ( QStringLiteral ( " deep_scan " ) , false ) . toBool ( ) ;
game_dir . expanded = ReadSetting ( QStringLiteral ( " expanded " ) , true ) . toBool ( ) ;
UISettings : : values . game_dirs . append ( game_dir ) ;
}
qt_config - > endArray ( ) ;
// create NAND and SD card directories if empty, these are not removable through the UI,
// also carries over old game list settings if present
if ( UISettings : : values . game_dirs . isEmpty ( ) ) {
UISettings : : GameDir game_dir ;
2019-05-05 03:07:09 +02:00
game_dir . path = QStringLiteral ( " SDMC " ) ;
2019-05-01 23:21:04 +02:00
game_dir . expanded = true ;
UISettings : : values . game_dirs . append ( game_dir ) ;
2019-05-05 03:07:09 +02:00
game_dir . path = QStringLiteral ( " UserNAND " ) ;
UISettings : : values . game_dirs . append ( game_dir ) ;
game_dir . path = QStringLiteral ( " SysNAND " ) ;
2019-05-01 23:21:04 +02:00
UISettings : : values . game_dirs . append ( game_dir ) ;
if ( UISettings : : values . game_dir_deprecated ! = QStringLiteral ( " . " ) ) {
game_dir . path = UISettings : : values . game_dir_deprecated ;
game_dir . deep_scan = UISettings : : values . game_dir_deprecated_deepscan ;
UISettings : : values . game_dirs . append ( game_dir ) ;
}
}
2019-05-08 23:11:15 -04:00
UISettings : : values . recent_files = ReadSetting ( QStringLiteral ( " recentFiles " ) ) . toStringList ( ) ;
2020-01-26 00:26:07 +01:00
UISettings : : values . language = ReadSetting ( QStringLiteral ( " language " ) , QString { } ) . toString ( ) ;
2018-07-28 12:32:16 -04:00
2016-01-24 21:23:55 +01:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2020-07-11 14:26:36 +01:00
void Config : : ReadCpuValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Cpu " ) ) ;
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : Cpu ) ;
2023-05-07 10:35:28 -04:00
ReadCategory ( Settings : : Category : : CpuDebug ) ;
ReadCategory ( Settings : : Category : : CpuUnsafe ) ;
2023-06-05 21:05:22 -04:00
2020-07-11 14:26:36 +01:00
qt_config - > endGroup ( ) ;
}
2019-05-08 23:11:15 -04:00
void Config : : ReadRendererValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Renderer " ) ) ;
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : Renderer ) ;
2023-05-07 10:35:28 -04:00
ReadCategory ( Settings : : Category : : RendererAdvanced ) ;
ReadCategory ( Settings : : Category : : RendererDebug ) ;
2021-07-09 10:47:42 -04:00
2016-01-24 21:23:55 +01:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2020-07-20 23:03:49 -04:00
void Config : : ReadScreenshotValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Screenshots " ) ) ;
UISettings : : values . enable_screenshot_save_as =
ReadSetting ( QStringLiteral ( " enable_screenshot_save_as " ) , true ) . toBool ( ) ;
2021-05-25 19:32:56 -04:00
FS : : SetYuzuPath (
FS : : YuzuPath : : ScreenshotsDir ,
2020-07-20 23:03:49 -04:00
qt_config
2020-08-15 08:33:16 -04:00
- > value ( QStringLiteral ( " screenshot_path " ) ,
2021-05-25 19:32:56 -04:00
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : ScreenshotsDir ) ) )
2020-07-20 23:03:49 -04:00
. toString ( )
. toStdString ( ) ) ;
qt_config - > endGroup ( ) ;
}
2019-05-08 23:11:15 -04:00
void Config : : ReadShortcutValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Shortcuts " ) ) ;
2016-01-24 21:23:55 +01:00
2019-05-20 20:51:27 -04:00
for ( const auto & [ name , group , shortcut ] : default_hotkeys ) {
2016-01-24 21:23:55 +01:00
qt_config - > beginGroup ( group ) ;
2019-02-16 16:19:29 +01:00
qt_config - > beginGroup ( name ) ;
2023-01-18 00:39:31 +01:00
// No longer using ReadSetting for shortcut.second as it inaccurately returns a value of 1
2020-07-06 19:45:57 -04:00
// for WidgetWithChildrenShortcut which is a value of 3. Needed to fix shortcuts the open
// a file dialog in windowed mode
2019-02-16 16:19:29 +01:00
UISettings : : values . shortcuts . push_back (
{ name ,
group ,
2021-11-15 17:57:41 -06:00
{ ReadSetting ( QStringLiteral ( " KeySeq " ) , shortcut . keyseq ) . toString ( ) ,
ReadSetting ( QStringLiteral ( " Controller_KeySeq " ) , shortcut . controller_keyseq )
. toString ( ) ,
2023-01-18 15:49:47 +01:00
shortcut . context , ReadSetting ( QStringLiteral ( " Repeat " ) , shortcut . repeat ) . toBool ( ) } } ) ;
2019-02-16 16:19:29 +01:00
qt_config - > endGroup ( ) ;
2016-01-24 21:23:55 +01:00
qt_config - > endGroup ( ) ;
}
2019-05-08 23:11:15 -04:00
qt_config - > endGroup ( ) ;
}
void Config : : ReadSystemValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " System " ) ) ;
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : System ) ;
2023-05-10 17:57:25 -04:00
ReadCategory ( Settings : : Category : : SystemAudio ) ;
2020-03-17 19:03:00 +01:00
2016-01-24 21:23:55 +01:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2016-01-24 21:23:55 +01:00
2019-05-08 23:11:15 -04:00
void Config : : ReadUIValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " UI " ) ) ;
UISettings : : values . theme =
2022-01-17 02:46:30 -05:00
ReadSetting (
QStringLiteral ( " theme " ) ,
2022-01-21 20:51:19 +03:00
QString : : fromUtf8 ( UISettings : : themes [ static_cast < size_t > ( default_theme ) ] . second ) )
2019-05-20 20:51:27 -04:00
. toString ( ) ;
2019-05-08 23:11:15 -04:00
ReadUIGamelistValues ( ) ;
ReadUILayoutValues ( ) ;
ReadPathValues ( ) ;
2020-07-20 23:03:49 -04:00
ReadScreenshotValues ( ) ;
2019-05-08 23:11:15 -04:00
ReadShortcutValues ( ) ;
2021-12-25 20:27:52 +01:00
ReadMultiplayerValues ( ) ;
2019-05-08 23:11:15 -04:00
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : Ui ) ;
2023-05-09 01:35:25 -04:00
ReadCategory ( Settings : : Category : : UiGeneral ) ;
2016-01-24 21:23:55 +01:00
qt_config - > endGroup ( ) ;
2014-09-12 17:06:13 -07:00
}
2019-05-08 23:11:15 -04:00
void Config : : ReadUIGamelistValues ( ) {
2019-05-20 20:51:27 -04:00
qt_config - > beginGroup ( QStringLiteral ( " UIGameList " ) ) ;
2019-05-08 23:11:15 -04:00
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : UiGameList ) ;
2021-04-10 11:09:01 +02:00
const int favorites_size = qt_config - > beginReadArray ( QStringLiteral ( " favorites " ) ) ;
for ( int i = 0 ; i < favorites_size ; i + + ) {
qt_config - > setArrayIndex ( i ) ;
UISettings : : values . favorited_ids . append (
ReadSetting ( QStringLiteral ( " program_id " ) ) . toULongLong ( ) ) ;
}
qt_config - > endArray ( ) ;
2019-05-08 23:11:15 -04:00
qt_config - > endGroup ( ) ;
}
void Config : : ReadUILayoutValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " UILayout " ) ) ;
UISettings : : values . geometry = ReadSetting ( QStringLiteral ( " geometry " ) ) . toByteArray ( ) ;
UISettings : : values . state = ReadSetting ( QStringLiteral ( " state " ) ) . toByteArray ( ) ;
UISettings : : values . renderwindow_geometry =
ReadSetting ( QStringLiteral ( " geometryRenderWindow " ) ) . toByteArray ( ) ;
UISettings : : values . gamelist_header_state =
ReadSetting ( QStringLiteral ( " gameListHeaderState " ) ) . toByteArray ( ) ;
UISettings : : values . microprofile_geometry =
ReadSetting ( QStringLiteral ( " microProfileDialogGeometry " ) ) . toByteArray ( ) ;
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : UiLayout ) ;
2019-05-08 23:11:15 -04:00
qt_config - > endGroup ( ) ;
}
void Config : : ReadWebServiceValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " WebService " ) ) ;
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : WebService ) ;
2019-05-08 23:11:15 -04:00
qt_config - > endGroup ( ) ;
}
2022-07-15 19:45:35 +02:00
void Config : : ReadMultiplayerValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Multiplayer " ) ) ;
2023-06-05 21:05:22 -04:00
ReadCategory ( Settings : : Category : : Multiplayer ) ;
2022-07-15 19:45:35 +02:00
// Read ban list back
int size = qt_config - > beginReadArray ( QStringLiteral ( " username_ban_list " ) ) ;
UISettings : : values . multiplayer_ban_list . first . resize ( size ) ;
for ( int i = 0 ; i < size ; + + i ) {
qt_config - > setArrayIndex ( i ) ;
UISettings : : values . multiplayer_ban_list . first [ i ] =
ReadSetting ( QStringLiteral ( " username " ) ) . toString ( ) . toStdString ( ) ;
}
qt_config - > endArray ( ) ;
size = qt_config - > beginReadArray ( QStringLiteral ( " ip_ban_list " ) ) ;
UISettings : : values . multiplayer_ban_list . second . resize ( size ) ;
for ( int i = 0 ; i < size ; + + i ) {
qt_config - > setArrayIndex ( i ) ;
UISettings : : values . multiplayer_ban_list . second [ i ] =
ReadSetting ( QStringLiteral ( " ip " ) ) . toString ( ) . toStdString ( ) ;
}
qt_config - > endArray ( ) ;
qt_config - > endGroup ( ) ;
}
2019-05-08 23:11:15 -04:00
void Config : : ReadValues ( ) {
2020-07-09 22:42:09 -04:00
if ( global ) {
ReadDataStorageValues ( ) ;
ReadDebuggingValues ( ) ;
ReadDisabledAddOnValues ( ) ;
ReadServiceValues ( ) ;
ReadUIValues ( ) ;
ReadWebServiceValues ( ) ;
ReadMiscellaneousValues ( ) ;
}
2022-11-17 19:23:48 -05:00
ReadControlValues ( ) ;
2019-05-08 23:11:15 -04:00
ReadCoreValues ( ) ;
2020-07-11 14:26:36 +01:00
ReadCpuValues ( ) ;
2019-05-08 23:11:15 -04:00
ReadRendererValues ( ) ;
ReadAudioValues ( ) ;
ReadSystemValues ( ) ;
}
2020-09-23 09:52:25 -04:00
void Config : : SavePlayerValue ( std : : size_t player_index ) {
const QString player_prefix = [ this , player_index ] {
if ( type = = ConfigType : : InputProfile ) {
return QString { } ;
} else {
return QStringLiteral ( " player_%1_ " ) . arg ( player_index ) ;
}
} ( ) ;
2020-09-28 10:00:15 -04:00
const auto & player = Settings : : values . players . GetValue ( ) [ player_index ] ;
2022-11-19 15:39:09 -05:00
if ( IsCustomConfig ( ) ) {
if ( player . profile_name . empty ( ) ) {
// No custom profile selected
return ;
}
WriteSetting ( QStringLiteral ( " %1profile_name " ) . arg ( player_prefix ) ,
QString : : fromStdString ( player . profile_name ) , QString { } ) ;
}
2018-12-05 03:41:31 -05:00
2020-09-23 09:52:25 -04:00
WriteSetting ( QStringLiteral ( " %1type " ) . arg ( player_prefix ) ,
static_cast < u8 > ( player . controller_type ) ,
static_cast < u8 > ( Settings : : ControllerType : : ProController ) ) ;
2018-12-05 03:41:31 -05:00
2022-11-19 15:39:09 -05:00
if ( ! player_prefix . isEmpty ( ) | | ! Settings : : IsConfiguringGlobal ( ) ) {
2021-01-17 12:55:02 -06:00
WriteSetting ( QStringLiteral ( " %1connected " ) . arg ( player_prefix ) , player . connected ,
player_index = = 0 ) ;
2020-10-17 09:38:12 -04:00
WriteSetting ( QStringLiteral ( " %1vibration_enabled " ) . arg ( player_prefix ) ,
player . vibration_enabled , true ) ;
WriteSetting ( QStringLiteral ( " %1vibration_strength " ) . arg ( player_prefix ) ,
player . vibration_strength , 100 ) ;
2020-09-23 09:52:25 -04:00
WriteSetting ( QStringLiteral ( " %1body_color_left " ) . arg ( player_prefix ) , player . body_color_left ,
2018-07-09 20:07:59 +08:00
Settings : : JOYCON_BODY_NEON_BLUE ) ;
2020-09-23 09:52:25 -04:00
WriteSetting ( QStringLiteral ( " %1body_color_right " ) . arg ( player_prefix ) ,
player . body_color_right , Settings : : JOYCON_BODY_NEON_RED ) ;
WriteSetting ( QStringLiteral ( " %1button_color_left " ) . arg ( player_prefix ) ,
player . button_color_left , Settings : : JOYCON_BUTTONS_NEON_BLUE ) ;
WriteSetting ( QStringLiteral ( " %1button_color_right " ) . arg ( player_prefix ) ,
2019-05-08 23:11:15 -04:00
player . button_color_right , Settings : : JOYCON_BUTTONS_NEON_RED ) ;
2020-09-23 09:52:25 -04:00
}
2018-11-01 21:57:13 -04:00
2020-09-23 09:52:25 -04:00
for ( int i = 0 ; i < Settings : : NativeButton : : NumButtons ; + + i ) {
const std : : string default_param = InputCommon : : GenerateKeyboardParam ( default_buttons [ i ] ) ;
WriteSetting ( QStringLiteral ( " %1 " ) . arg ( player_prefix ) +
QString : : fromStdString ( Settings : : NativeButton : : mapping [ i ] ) ,
QString : : fromStdString ( player . buttons [ i ] ) ,
QString : : fromStdString ( default_param ) ) ;
}
for ( int i = 0 ; i < Settings : : NativeAnalog : : NumAnalogs ; + + i ) {
const std : : string default_param = InputCommon : : GenerateAnalogParamFromKeys (
default_analogs [ i ] [ 0 ] , default_analogs [ i ] [ 1 ] , default_analogs [ i ] [ 2 ] ,
default_analogs [ i ] [ 3 ] , default_stick_mod [ i ] , 0.5f ) ;
WriteSetting ( QStringLiteral ( " %1 " ) . arg ( player_prefix ) +
QString : : fromStdString ( Settings : : NativeAnalog : : mapping [ i ] ) ,
QString : : fromStdString ( player . analogs [ i ] ) ,
QString : : fromStdString ( default_param ) ) ;
2018-11-01 21:57:13 -04:00
}
2020-10-20 13:55:25 -04:00
for ( int i = 0 ; i < Settings : : NativeMotion : : NumMotions ; + + i ) {
const std : : string default_param = InputCommon : : GenerateKeyboardParam ( default_motions [ i ] ) ;
WriteSetting ( QStringLiteral ( " %1 " ) . arg ( player_prefix ) +
QString : : fromStdString ( Settings : : NativeMotion : : mapping [ i ] ) ,
QString : : fromStdString ( player . motions [ i ] ) ,
QString : : fromStdString ( default_param ) ) ;
}
2018-11-03 12:55:39 -04:00
}
2018-11-01 21:57:13 -04:00
2018-11-03 12:55:39 -04:00
void Config : : SaveDebugValues ( ) {
2017-01-21 11:53:03 +02:00
for ( int i = 0 ; i < Settings : : NativeButton : : NumButtons ; + + i ) {
2019-05-08 23:11:15 -04:00
const std : : string default_param = InputCommon : : GenerateKeyboardParam ( default_buttons [ i ] ) ;
WriteSetting ( QStringLiteral ( " debug_pad_ " ) +
2018-07-09 20:07:59 +08:00
QString : : fromStdString ( Settings : : NativeButton : : mapping [ i ] ) ,
QString : : fromStdString ( Settings : : values . debug_pad_buttons [ i ] ) ,
QString : : fromStdString ( default_param ) ) ;
2017-01-21 13:04:00 +02:00
}
for ( int i = 0 ; i < Settings : : NativeAnalog : : NumAnalogs ; + + i ) {
2019-05-08 23:11:15 -04:00
const std : : string default_param = InputCommon : : GenerateAnalogParamFromKeys (
2018-07-09 20:07:59 +08:00
default_analogs [ i ] [ 0 ] , default_analogs [ i ] [ 1 ] , default_analogs [ i ] [ 2 ] ,
2020-08-28 23:51:19 -04:00
default_analogs [ i ] [ 3 ] , default_stick_mod [ i ] , 0.5f ) ;
2019-05-08 23:11:15 -04:00
WriteSetting ( QStringLiteral ( " debug_pad_ " ) +
2018-07-09 20:07:59 +08:00
QString : : fromStdString ( Settings : : NativeAnalog : : mapping [ i ] ) ,
QString : : fromStdString ( Settings : : values . debug_pad_analogs [ i ] ) ,
QString : : fromStdString ( default_param ) ) ;
2015-06-20 04:34:45 +01:00
}
2018-11-03 12:55:39 -04:00
}
void Config : : SaveTouchscreenValues ( ) {
2019-05-08 23:11:15 -04:00
const auto & touchscreen = Settings : : values . touchscreen ;
WriteSetting ( QStringLiteral ( " touchscreen_enabled " ) , touchscreen . enabled , true ) ;
2018-07-09 20:07:59 +08:00
2019-05-08 23:11:15 -04:00
WriteSetting ( QStringLiteral ( " touchscreen_angle " ) , touchscreen . rotation_angle , 0 ) ;
WriteSetting ( QStringLiteral ( " touchscreen_diameter_x " ) , touchscreen . diameter_x , 15 ) ;
WriteSetting ( QStringLiteral ( " touchscreen_diameter_y " ) , touchscreen . diameter_y , 15 ) ;
2018-11-03 12:55:39 -04:00
}
2020-08-29 20:56:51 +02:00
void Config : : SaveMotionTouchValues ( ) {
qt_config - > beginWriteArray ( QStringLiteral ( " touch_from_button_maps " ) ) ;
for ( std : : size_t p = 0 ; p < Settings : : values . touch_from_button_maps . size ( ) ; + + p ) {
qt_config - > setArrayIndex ( static_cast < int > ( p ) ) ;
WriteSetting ( QStringLiteral ( " name " ) ,
QString : : fromStdString ( Settings : : values . touch_from_button_maps [ p ] . name ) ,
QStringLiteral ( " default " ) ) ;
qt_config - > beginWriteArray ( QStringLiteral ( " entries " ) ) ;
for ( std : : size_t q = 0 ; q < Settings : : values . touch_from_button_maps [ p ] . buttons . size ( ) ;
+ + q ) {
qt_config - > setArrayIndex ( static_cast < int > ( q ) ) ;
WriteSetting (
QStringLiteral ( " bind " ) ,
QString : : fromStdString ( Settings : : values . touch_from_button_maps [ p ] . buttons [ q ] ) ) ;
}
qt_config - > endArray ( ) ;
}
qt_config - > endArray ( ) ;
}
2022-01-08 23:23:40 -06:00
void Config : : SaveHidbusValues ( ) {
const std : : string default_param = InputCommon : : GenerateAnalogParamFromKeys (
0 , 0 , default_ringcon_analogs [ 0 ] , default_ringcon_analogs [ 1 ] , 0 , 0.05f ) ;
WriteSetting ( QStringLiteral ( " ring_controller " ) ,
QString : : fromStdString ( Settings : : values . ringcon_analogs ) ,
QString : : fromStdString ( default_param ) ) ;
}
2018-11-03 12:55:39 -04:00
void Config : : SaveValues ( ) {
2020-07-09 22:42:09 -04:00
if ( global ) {
SaveDataStorageValues ( ) ;
SaveDebuggingValues ( ) ;
SaveDisabledAddOnValues ( ) ;
2021-08-12 21:32:53 +02:00
SaveNetworkValues ( ) ;
2020-07-09 22:42:09 -04:00
SaveUIValues ( ) ;
SaveWebServiceValues ( ) ;
SaveMiscellaneousValues ( ) ;
}
2022-11-17 19:23:48 -05:00
SaveControlValues ( ) ;
2019-05-08 23:11:15 -04:00
SaveCoreValues ( ) ;
2020-07-11 14:26:36 +01:00
SaveCpuValues ( ) ;
2019-05-08 23:11:15 -04:00
SaveRendererValues ( ) ;
SaveAudioValues ( ) ;
SaveSystemValues ( ) ;
2023-06-05 21:05:22 -04:00
2023-02-16 10:53:42 -06:00
qt_config - > sync ( ) ;
2019-05-08 23:11:15 -04:00
}
void Config : : SaveAudioValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Audio " ) ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Audio ) ;
2019-05-08 23:11:15 -04:00
qt_config - > endGroup ( ) ;
}
void Config : : SaveControlValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Controls " ) ) ;
2018-11-03 12:55:39 -04:00
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Controls ) ;
2022-11-19 15:39:09 -05:00
Settings : : values . players . SetGlobal ( ! IsCustomConfig ( ) ) ;
2020-09-28 10:00:15 -04:00
for ( std : : size_t p = 0 ; p < Settings : : values . players . GetValue ( ) . size ( ) ; + + p ) {
2020-09-23 09:52:25 -04:00
SavePlayerValue ( p ) ;
}
2022-11-19 15:39:09 -05:00
if ( IsCustomConfig ( ) ) {
qt_config - > endGroup ( ) ;
return ;
}
2018-11-03 12:55:39 -04:00
SaveDebugValues ( ) ;
SaveTouchscreenValues ( ) ;
2020-08-29 20:56:51 +02:00
SaveMotionTouchValues ( ) ;
2022-01-08 23:23:40 -06:00
SaveHidbusValues ( ) ;
2021-07-05 20:58:52 -05:00
2014-09-12 17:06:13 -07:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2014-10-25 12:54:44 -07:00
2019-05-08 23:11:15 -04:00
void Config : : SaveCoreValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Core " ) ) ;
2014-10-09 19:43:40 -07:00
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Core ) ;
2015-05-03 15:34:48 -04:00
2015-04-03 15:35:51 -07:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2015-04-03 15:35:51 -07:00
2019-05-08 23:11:15 -04:00
void Config : : SaveDataStorageValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Data Storage " ) ) ;
2018-07-30 23:57:53 -04:00
2019-05-08 23:11:15 -04:00
WriteSetting ( QStringLiteral ( " nand_directory " ) ,
2021-05-25 19:32:56 -04:00
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : NANDDir ) ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : NANDDir ) ) ) ;
2019-05-08 23:11:15 -04:00
WriteSetting ( QStringLiteral ( " sdmc_directory " ) ,
2021-05-25 19:32:56 -04:00
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : SDMCDir ) ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : SDMCDir ) ) ) ;
2019-04-23 08:35:12 -04:00
WriteSetting ( QStringLiteral ( " load_directory " ) ,
2021-05-25 19:32:56 -04:00
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : LoadDir ) ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : LoadDir ) ) ) ;
2019-04-23 08:35:12 -04:00
WriteSetting ( QStringLiteral ( " dump_directory " ) ,
2021-05-25 19:32:56 -04:00
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : DumpDir ) ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : DumpDir ) ) ) ;
2021-07-05 20:58:52 -05:00
WriteSetting ( QStringLiteral ( " tas_directory " ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : TASDir ) ) ,
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : TASDir ) ) ) ;
2021-06-18 16:20:10 +02:00
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : DataStorage ) ;
2020-07-09 12:19:06 -04:00
2018-03-26 22:24:31 -04:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2018-03-26 22:24:31 -04:00
2019-05-08 23:11:15 -04:00
void Config : : SaveDebuggingValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Debugging " ) ) ;
2015-09-02 08:56:38 -04:00
2019-08-26 17:29:08 +02:00
// Intentionally not using the QT default setting as this is intended to be changed in the ini
qt_config - > setValue ( QStringLiteral ( " record_frame_times " ) , Settings : : values . record_frame_times ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Debugging ) ;
2023-05-07 10:35:28 -04:00
WriteCategory ( Settings : : Category : : DebuggingGraphics ) ;
2016-01-24 21:23:55 +01:00
2018-09-16 20:05:51 +02:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2021-08-12 21:32:53 +02:00
void Config : : SaveNetworkValues ( ) {
2019-06-20 20:31:17 -04:00
qt_config - > beginGroup ( QStringLiteral ( " Services " ) ) ;
2021-06-28 15:58:16 -04:00
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Network ) ;
2021-06-28 15:58:16 -04:00
2019-04-28 18:44:46 -04:00
qt_config - > endGroup ( ) ;
}
2019-05-08 23:11:15 -04:00
void Config : : SaveDisabledAddOnValues ( ) {
qt_config - > beginWriteArray ( QStringLiteral ( " DisabledAddOns " ) ) ;
2018-09-16 20:05:51 +02:00
2018-11-28 14:00:01 -05:00
int i = 0 ;
for ( const auto & elem : Settings : : values . disabled_addons ) {
qt_config - > setArrayIndex ( i ) ;
2019-05-08 23:11:15 -04:00
WriteSetting ( QStringLiteral ( " title_id " ) , QVariant : : fromValue < u64 > ( elem . first ) , 0 ) ;
qt_config - > beginWriteArray ( QStringLiteral ( " disabled " ) ) ;
2018-11-28 14:00:01 -05:00
for ( std : : size_t j = 0 ; j < elem . second . size ( ) ; + + j ) {
2018-12-31 19:11:29 -05:00
qt_config - > setArrayIndex ( static_cast < int > ( j ) ) ;
2020-07-22 10:39:53 -04:00
WriteSetting ( QStringLiteral ( " d " ) , QString : : fromStdString ( elem . second [ j ] ) , QString { } ) ;
2018-11-28 14:00:01 -05:00
}
qt_config - > endArray ( ) ;
+ + i ;
}
2019-05-08 23:11:15 -04:00
2018-11-28 14:00:01 -05:00
qt_config - > endArray ( ) ;
2019-05-08 23:11:15 -04:00
}
2018-11-28 14:00:01 -05:00
2019-05-08 23:11:15 -04:00
void Config : : SaveMiscellaneousValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Miscellaneous " ) ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Miscellaneous ) ;
2016-01-24 21:23:55 +01:00
2018-07-28 12:32:16 -04:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
void Config : : SavePathValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Paths " ) ) ;
WriteSetting ( QStringLiteral ( " romsPath " ) , UISettings : : values . roms_path ) ;
WriteSetting ( QStringLiteral ( " symbolsPath " ) , UISettings : : values . symbols_path ) ;
2019-05-01 23:21:04 +02:00
qt_config - > beginWriteArray ( QStringLiteral ( " gamedirs " ) ) ;
for ( int i = 0 ; i < UISettings : : values . game_dirs . size ( ) ; + + i ) {
qt_config - > setArrayIndex ( i ) ;
2019-05-03 19:21:57 +02:00
const auto & game_dir = UISettings : : values . game_dirs [ i ] ;
2019-05-01 23:21:04 +02:00
WriteSetting ( QStringLiteral ( " path " ) , game_dir . path ) ;
WriteSetting ( QStringLiteral ( " deep_scan " ) , game_dir . deep_scan , false ) ;
WriteSetting ( QStringLiteral ( " expanded " ) , game_dir . expanded , true ) ;
}
qt_config - > endArray ( ) ;
2019-05-08 23:11:15 -04:00
WriteSetting ( QStringLiteral ( " recentFiles " ) , UISettings : : values . recent_files ) ;
2020-01-26 00:26:07 +01:00
WriteSetting ( QStringLiteral ( " language " ) , UISettings : : values . language , QString { } ) ;
2018-07-28 12:32:16 -04:00
2016-01-24 21:23:55 +01:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2020-07-11 14:26:36 +01:00
void Config : : SaveCpuValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Cpu " ) ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Cpu ) ;
2023-05-07 10:35:28 -04:00
WriteCategory ( Settings : : Category : : CpuDebug ) ;
WriteCategory ( Settings : : Category : : CpuUnsafe ) ;
2020-07-11 14:26:36 +01:00
qt_config - > endGroup ( ) ;
}
2019-05-08 23:11:15 -04:00
void Config : : SaveRendererValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Renderer " ) ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Renderer ) ;
2023-05-07 10:35:28 -04:00
WriteCategory ( Settings : : Category : : RendererAdvanced ) ;
WriteCategory ( Settings : : Category : : RendererDebug ) ;
2021-07-09 10:47:42 -04:00
2016-01-24 21:23:55 +01:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
2020-07-20 23:03:49 -04:00
void Config : : SaveScreenshotValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Screenshots " ) ) ;
2020-07-26 13:29:47 -04:00
WriteSetting ( QStringLiteral ( " screenshot_path " ) ,
2021-05-25 19:32:56 -04:00
QString : : fromStdString ( FS : : GetYuzuPathString ( FS : : YuzuPath : : ScreenshotsDir ) ) ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Screenshots ) ;
2020-07-20 23:03:49 -04:00
qt_config - > endGroup ( ) ;
}
2019-05-08 23:11:15 -04:00
void Config : : SaveShortcutValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Shortcuts " ) ) ;
2016-01-24 21:23:55 +01:00
2019-02-16 16:19:29 +01:00
// Lengths of UISettings::values.shortcuts & default_hotkeys are same.
// However, their ordering must also be the same.
for ( std : : size_t i = 0 ; i < default_hotkeys . size ( ) ; i + + ) {
2019-05-20 20:51:27 -04:00
const auto & [ name , group , shortcut ] = UISettings : : values . shortcuts [ i ] ;
2019-05-08 23:11:15 -04:00
const auto & default_hotkey = default_hotkeys [ i ] . shortcut ;
2019-02-16 16:19:29 +01:00
qt_config - > beginGroup ( group ) ;
qt_config - > beginGroup ( name ) ;
2021-11-15 17:57:41 -06:00
WriteSetting ( QStringLiteral ( " KeySeq " ) , shortcut . keyseq , default_hotkey . keyseq ) ;
WriteSetting ( QStringLiteral ( " Controller_KeySeq " ) , shortcut . controller_keyseq ,
default_hotkey . controller_keyseq ) ;
WriteSetting ( QStringLiteral ( " Context " ) , shortcut . context , default_hotkey . context ) ;
2023-01-18 00:39:31 +01:00
WriteSetting ( QStringLiteral ( " Repeat " ) , shortcut . repeat , default_hotkey . repeat ) ;
2019-02-16 16:19:29 +01:00
qt_config - > endGroup ( ) ;
qt_config - > endGroup ( ) ;
2016-01-24 21:23:55 +01:00
}
2019-05-08 23:11:15 -04:00
qt_config - > endGroup ( ) ;
}
void Config : : SaveSystemValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " System " ) ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : System ) ;
2023-05-10 17:57:25 -04:00
WriteCategory ( Settings : : Category : : SystemAudio ) ;
2020-03-17 19:03:00 +01:00
2019-05-08 23:11:15 -04:00
qt_config - > endGroup ( ) ;
}
void Config : : SaveUIValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " UI " ) ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Ui ) ;
2022-01-21 20:51:19 +03:00
WriteSetting ( QStringLiteral ( " theme " ) , UISettings : : values . theme ,
QString : : fromUtf8 ( UISettings : : themes [ static_cast < size_t > ( default_theme ) ] . second ) ) ;
2019-05-08 23:11:15 -04:00
SaveUIGamelistValues ( ) ;
SaveUILayoutValues ( ) ;
SavePathValues ( ) ;
2020-07-20 23:03:49 -04:00
SaveScreenshotValues ( ) ;
2019-05-08 23:11:15 -04:00
SaveShortcutValues ( ) ;
2021-12-25 20:27:52 +01:00
SaveMultiplayerValues ( ) ;
2019-05-08 23:11:15 -04:00
qt_config - > endGroup ( ) ;
}
void Config : : SaveUIGamelistValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " UIGameList " ) ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : UiGameList ) ;
2021-04-10 11:09:01 +02:00
qt_config - > beginWriteArray ( QStringLiteral ( " favorites " ) ) ;
for ( int i = 0 ; i < UISettings : : values . favorited_ids . size ( ) ; i + + ) {
qt_config - > setArrayIndex ( i ) ;
WriteSetting ( QStringLiteral ( " program_id " ) ,
QVariant : : fromValue ( UISettings : : values . favorited_ids [ i ] ) ) ;
}
qt_config - > endArray ( ) ;
2019-05-08 23:11:15 -04:00
qt_config - > endGroup ( ) ;
}
void Config : : SaveUILayoutValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " UILayout " ) ) ;
WriteSetting ( QStringLiteral ( " geometry " ) , UISettings : : values . geometry ) ;
WriteSetting ( QStringLiteral ( " state " ) , UISettings : : values . state ) ;
WriteSetting ( QStringLiteral ( " geometryRenderWindow " ) , UISettings : : values . renderwindow_geometry ) ;
WriteSetting ( QStringLiteral ( " gameListHeaderState " ) , UISettings : : values . gamelist_header_state ) ;
WriteSetting ( QStringLiteral ( " microProfileDialogGeometry " ) ,
UISettings : : values . microprofile_geometry ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : UiLayout ) ;
2019-05-08 23:11:15 -04:00
2016-01-24 21:23:55 +01:00
qt_config - > endGroup ( ) ;
2019-05-08 23:11:15 -04:00
}
void Config : : SaveWebServiceValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " WebService " ) ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : WebService ) ;
2016-01-24 21:23:55 +01:00
qt_config - > endGroup ( ) ;
2014-10-27 17:18:28 -04:00
}
2022-07-15 19:45:35 +02:00
void Config : : SaveMultiplayerValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Multiplayer " ) ) ;
2023-06-05 21:05:22 -04:00
WriteCategory ( Settings : : Category : : Multiplayer ) ;
2022-07-15 19:45:35 +02:00
// Write ban list
qt_config - > beginWriteArray ( QStringLiteral ( " username_ban_list " ) ) ;
for ( std : : size_t i = 0 ; i < UISettings : : values . multiplayer_ban_list . first . size ( ) ; + + i ) {
qt_config - > setArrayIndex ( static_cast < int > ( i ) ) ;
WriteSetting ( QStringLiteral ( " username " ) ,
QString : : fromStdString ( UISettings : : values . multiplayer_ban_list . first [ i ] ) ) ;
}
qt_config - > endArray ( ) ;
qt_config - > beginWriteArray ( QStringLiteral ( " ip_ban_list " ) ) ;
for ( std : : size_t i = 0 ; i < UISettings : : values . multiplayer_ban_list . second . size ( ) ; + + i ) {
qt_config - > setArrayIndex ( static_cast < int > ( i ) ) ;
WriteSetting ( QStringLiteral ( " ip " ) ,
QString : : fromStdString ( UISettings : : values . multiplayer_ban_list . second [ i ] ) ) ;
}
qt_config - > endArray ( ) ;
qt_config - > endGroup ( ) ;
}
2018-07-09 20:07:59 +08:00
QVariant Config : : ReadSetting ( const QString & name ) const {
return qt_config - > value ( name ) ;
}
QVariant Config : : ReadSetting ( const QString & name , const QVariant & default_value ) const {
QVariant result ;
2019-05-08 23:11:15 -04:00
if ( qt_config - > value ( name + QStringLiteral ( " /default " ) , false ) . toBool ( ) ) {
2018-07-09 20:07:59 +08:00
result = default_value ;
} else {
result = qt_config - > value ( name , default_value ) ;
}
return result ;
}
2022-07-15 18:37:48 +01:00
template < typename Type , bool ranged >
void Config : : ReadGlobalSetting ( Settings : : SwitchableSetting < Type , ranged > & setting ) {
2021-06-28 15:58:16 -04:00
QString name = QString : : fromStdString ( setting . GetLabel ( ) ) ;
2020-07-09 22:42:09 -04:00
const bool use_global = qt_config - > value ( name + QStringLiteral ( " /use_global " ) , true ) . toBool ( ) ;
setting . SetGlobal ( use_global ) ;
if ( global | | ! use_global ) {
2021-06-28 15:58:16 -04:00
setting . SetValue ( static_cast < QVariant > (
ReadSetting ( name , QVariant : : fromValue < Type > ( setting . GetDefault ( ) ) ) )
. value < Type > ( ) ) ;
2020-07-09 22:42:09 -04:00
}
}
template < typename Type >
void Config : : ReadSettingGlobal ( Type & setting , const QString & name ,
const QVariant & default_value ) const {
const bool use_global = qt_config - > value ( name + QStringLiteral ( " /use_global " ) , true ) . toBool ( ) ;
if ( global | | ! use_global ) {
setting = ReadSetting ( name , default_value ) . value < Type > ( ) ;
}
}
2018-07-09 20:07:59 +08:00
void Config : : WriteSetting ( const QString & name , const QVariant & value ) {
qt_config - > setValue ( name , value ) ;
}
void Config : : WriteSetting ( const QString & name , const QVariant & value ,
const QVariant & default_value ) {
2019-05-08 23:11:15 -04:00
qt_config - > setValue ( name + QStringLiteral ( " /default " ) , value = = default_value ) ;
2018-07-09 20:07:59 +08:00
qt_config - > setValue ( name , value ) ;
}
2021-06-28 15:58:16 -04:00
void Config : : WriteSetting ( const QString & name , const QVariant & value , const QVariant & default_value ,
bool use_global ) {
2020-07-09 22:42:09 -04:00
if ( ! global ) {
qt_config - > setValue ( name + QStringLiteral ( " /use_global " ) , use_global ) ;
}
if ( global | | ! use_global ) {
qt_config - > setValue ( name + QStringLiteral ( " /default " ) , value = = default_value ) ;
qt_config - > setValue ( name , value ) ;
}
}
2014-09-12 17:06:13 -07:00
void Config : : Reload ( ) {
2014-11-15 11:56:18 -08:00
ReadValues ( ) ;
2018-07-09 20:07:59 +08:00
// To apply default value changes
SaveValues ( ) ;
2014-09-12 17:06:13 -07:00
}
void Config : : Save ( ) {
2014-11-15 11:56:18 -08:00
SaveValues ( ) ;
2014-09-12 17:06:13 -07:00
}
2020-09-23 09:52:25 -04:00
void Config : : ReadControlPlayerValue ( std : : size_t player_index ) {
qt_config - > beginGroup ( QStringLiteral ( " Controls " ) ) ;
ReadPlayerValue ( player_index ) ;
qt_config - > endGroup ( ) ;
}
void Config : : SaveControlPlayerValue ( std : : size_t player_index ) {
qt_config - > beginGroup ( QStringLiteral ( " Controls " ) ) ;
SavePlayerValue ( player_index ) ;
qt_config - > endGroup ( ) ;
}
2022-11-19 15:39:09 -05:00
void Config : : ClearControlPlayerValues ( ) {
qt_config - > beginGroup ( QStringLiteral ( " Controls " ) ) ;
// If key is an empty string, all keys in the current group() are removed.
qt_config - > remove ( QString { } ) ;
qt_config - > endGroup ( ) ;
}
2020-09-23 09:52:25 -04:00
const std : : string & Config : : GetConfigFilePath ( ) const {
return qt_config_loc ;
}
2023-06-05 21:05:22 -04:00
2023-05-09 01:29:08 -04:00
static auto FindRelevantList ( Settings : : Category category ) {
auto & map = Settings : : values . linkage . by_category ;
if ( map . contains ( category ) ) {
return Settings : : values . linkage . by_category [ category ] ;
}
return UISettings : : values . linkage . by_category [ category ] ;
}
2023-06-05 21:05:22 -04:00
void Config : : ReadCategory ( Settings : : Category category ) {
2023-05-09 01:29:08 -04:00
const auto & settings = FindRelevantList ( category ) ;
2023-06-05 21:05:22 -04:00
std : : for_each ( settings . begin ( ) , settings . end ( ) ,
[ & ] ( const auto & setting ) { ReadSettingGeneric ( setting ) ; } ) ;
}
void Config : : WriteCategory ( Settings : : Category category ) {
2023-05-09 01:29:08 -04:00
const auto & settings = FindRelevantList ( category ) ;
2023-06-05 21:05:22 -04:00
std : : for_each ( settings . begin ( ) , settings . end ( ) ,
[ & ] ( const auto & setting ) { WriteSettingGeneric ( setting ) ; } ) ;
}
void Config : : ReadSettingGeneric ( Settings : : BasicSetting * const setting ) {
if ( ! setting - > Save ( ) ) {
return ;
}
const QString name = QString : : fromStdString ( setting - > GetLabel ( ) ) ;
const auto default_value =
QVariant : : fromValue < QString > ( QString : : fromStdString ( setting - > DefaultToString ( ) ) ) ;
if ( setting - > Switchable ( ) ) {
const bool use_global =
qt_config - > value ( name + QStringLiteral ( " /use_global " ) , true ) . value < bool > ( ) ;
setting - > SetGlobal ( use_global ) ;
if ( global | | ! use_global ) {
setting - > LoadString ( ReadSetting ( name , default_value ) . value < QString > ( ) . toStdString ( ) ) ;
}
} else if ( global ) {
setting - > LoadString ( ReadSetting ( name , default_value ) . value < QString > ( ) . toStdString ( ) ) ;
}
}
void Config : : WriteSettingGeneric ( Settings : : BasicSetting * const setting ) const {
if ( ! setting - > Save ( ) ) {
return ;
}
const QVariant value = QVariant : : fromValue ( QString : : fromStdString ( setting - > ToString ( ) ) ) ;
const QVariant default_value =
QVariant : : fromValue ( QString : : fromStdString ( setting - > DefaultToString ( ) ) ) ;
const QString label = QString : : fromStdString ( setting - > GetLabel ( ) ) ;
if ( setting - > Switchable ( ) ) {
if ( ! global ) {
qt_config - > setValue ( label + QStringLiteral ( " /use_global " ) , setting - > UsingGlobal ( ) ) ;
}
if ( global | | ! setting - > UsingGlobal ( ) ) {
qt_config - > setValue ( label + QStringLiteral ( " /default " ) , value = = default_value ) ;
qt_config - > setValue ( label , value ) ;
}
} else if ( global ) {
qt_config - > setValue ( label + QStringLiteral ( " /default " ) , value = = default_value ) ;
qt_config - > setValue ( label , value ) ;
}
}