diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/controlleremu/EmulatedController.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/controlleremu/EmulatedController.kt index e84dd201a5..4b2c6ec92c 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/controlleremu/EmulatedController.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/controlleremu/EmulatedController.kt @@ -30,7 +30,11 @@ class EmulatedController private constructor(private val pointer: Long) { external fun saveProfile(path: String) - external fun getProfileName(): String + external fun getProfileKey(): String + + external fun getUserProfileDirectoryPath(): String + + external fun getSysProfileDirectoryPath(): String companion object { @JvmStatic diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/ui/ProfileDialogPresenter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/ui/ProfileDialogPresenter.kt index 2896c815fe..5c0a50a8b8 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/ui/ProfileDialogPresenter.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/ui/ProfileDialogPresenter.kt @@ -101,11 +101,11 @@ class ProfileDialogPresenter { } private fun getProfileDirectoryPath(stock: Boolean): String { - val profileDirectoryName = menuTag.correspondingEmulatedController.getProfileName() + val controller = menuTag.correspondingEmulatedController return if (stock) { - "${DirectoryInitialization.getSysDirectory()}/Profiles/$profileDirectoryName/" + controller.getSysProfileDirectoryPath() } else { - "${DirectoryInitialization.getUserDirectory()}/Config/Profiles/$profileDirectoryName/" + controller.getUserProfileDirectoryPath() } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt index 1051f445ae..44e2b2b915 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt @@ -2237,7 +2237,7 @@ class SettingsFragmentPresenter( controllerNumber: Int ) { val profiles = ProfileDialogPresenter(menuTag).getProfileNames(false) - val profileKey = controller.getProfileName() + "Profile" + (controllerNumber + 1) + val profileKey = controller.getProfileKey() + "Profile" + (controllerNumber + 1) sl.add( StringSingleChoiceSetting( context, diff --git a/Source/Android/jni/Input/EmulatedController.cpp b/Source/Android/jni/Input/EmulatedController.cpp index c1dfd7ce5d..8a76240dfd 100644 --- a/Source/Android/jni/Input/EmulatedController.cpp +++ b/Source/Android/jni/Input/EmulatedController.cpp @@ -126,10 +126,26 @@ Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedContro } JNIEXPORT jstring JNICALL -Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getProfileName( +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getProfileKey( JNIEnv* env, jobject obj) { - return ToJString(env, EmulatedControllerFromJava(env, obj)->GetConfig()->GetProfileName()); + return ToJString(env, EmulatedControllerFromJava(env, obj)->GetConfig()->GetProfileKey()); +} + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getUserProfileDirectoryPath( + JNIEnv* env, jobject obj) +{ + return ToJString( + env, EmulatedControllerFromJava(env, obj)->GetConfig()->GetUserProfileDirectoryPath()); +} + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getSysProfileDirectoryPath( + JNIEnv* env, jobject obj) +{ + return ToJString(env, + EmulatedControllerFromJava(env, obj)->GetConfig()->GetSysProfileDirectoryPath()); } JNIEXPORT jobject JNICALL diff --git a/Source/Core/Core/FreeLookManager.cpp b/Source/Core/Core/FreeLookManager.cpp index 4c5596588d..d69c3cec13 100644 --- a/Source/Core/Core/FreeLookManager.cpp +++ b/Source/Core/Core/FreeLookManager.cpp @@ -312,7 +312,8 @@ void FreeLookController::UpdateInput(CameraControllerInput* camera_controller) namespace FreeLook { -static InputConfig s_config("FreeLookController", _trans("FreeLook"), "FreeLookController"); +static InputConfig s_config("FreeLookController", _trans("FreeLook"), "FreeLookController", + "FreeLookController"); InputConfig* GetInputConfig() { return &s_config; @@ -336,12 +337,12 @@ void Initialize() FreeLook::GetConfig().Refresh(); - s_config.LoadConfig(InputConfig::InputClass::GC); + s_config.LoadConfig(); } void LoadInputConfig() { - s_config.LoadConfig(InputConfig::InputClass::GC); + s_config.LoadConfig(); } bool IsInitialized() diff --git a/Source/Core/Core/HW/GBAPad.cpp b/Source/Core/Core/HW/GBAPad.cpp index 7f25b56fd1..77585a27f0 100644 --- a/Source/Core/Core/HW/GBAPad.cpp +++ b/Source/Core/Core/HW/GBAPad.cpp @@ -10,7 +10,7 @@ namespace Pad { -static InputConfig s_config("GBA", _trans("Pad"), "GBA"); +static InputConfig s_config("GBA", _trans("Pad"), "GBA", "GBA"); InputConfig* GetGBAConfig() { return &s_config; @@ -34,12 +34,12 @@ void InitializeGBA() s_config.RegisterHotplugCallback(); // Load the saved controller config - s_config.LoadConfig(InputConfig::InputClass::GBA); + s_config.LoadConfig(); } void LoadGBAConfig() { - s_config.LoadConfig(InputConfig::InputClass::GBA); + s_config.LoadConfig(); } bool IsGBAInitialized() diff --git a/Source/Core/Core/HW/GCKeyboard.cpp b/Source/Core/Core/HW/GCKeyboard.cpp index f99193f4d4..4af090de70 100644 --- a/Source/Core/Core/HW/GCKeyboard.cpp +++ b/Source/Core/Core/HW/GCKeyboard.cpp @@ -17,7 +17,7 @@ namespace Keyboard { -static InputConfig s_config("GCKeyNew", _trans("Keyboard"), "GCKey"); +static InputConfig s_config("GCKeyNew", _trans("Keyboard"), "GCKey", "GCKey"); InputConfig* GetConfig() { return &s_config; @@ -41,12 +41,12 @@ void Initialize() s_config.RegisterHotplugCallback(); // Load the saved controller config - s_config.LoadConfig(InputConfig::InputClass::GC); + s_config.LoadConfig(); } void LoadConfig() { - s_config.LoadConfig(InputConfig::InputClass::GC); + s_config.LoadConfig(); } ControllerEmu::ControlGroup* GetGroup(int port, KeyboardGroup group) diff --git a/Source/Core/Core/HW/GCPad.cpp b/Source/Core/Core/HW/GCPad.cpp index faf50f3c02..5450eea0c4 100644 --- a/Source/Core/Core/HW/GCPad.cpp +++ b/Source/Core/Core/HW/GCPad.cpp @@ -14,7 +14,7 @@ namespace Pad { -static InputConfig s_config("GCPadNew", _trans("Pad"), "GCPad"); +static InputConfig s_config("GCPadNew", _trans("Pad"), "GCPad", "Pad"); InputConfig* GetConfig() { return &s_config; @@ -38,12 +38,12 @@ void Initialize() s_config.RegisterHotplugCallback(); // Load the saved controller config - s_config.LoadConfig(InputConfig::InputClass::GC); + s_config.LoadConfig(); } void LoadConfig() { - s_config.LoadConfig(InputConfig::InputClass::GC); + s_config.LoadConfig(); } bool IsInitialized() diff --git a/Source/Core/Core/HW/Wiimote.cpp b/Source/Core/Core/HW/Wiimote.cpp index 86f9c6a56c..2fa2270635 100644 --- a/Source/Core/Core/HW/Wiimote.cpp +++ b/Source/Core/Core/HW/Wiimote.cpp @@ -97,7 +97,7 @@ HIDWiimote* GetHIDWiimoteSource(unsigned int index) namespace Wiimote { -static InputConfig s_config(WIIMOTE_INI_NAME, _trans("Wii Remote"), "Wiimote"); +static InputConfig s_config(WIIMOTE_INI_NAME, _trans("Wii Remote"), "Wiimote", "Wiimote"); InputConfig* GetConfig() { @@ -206,7 +206,7 @@ void ResetAllWiimotes() void LoadConfig() { - s_config.LoadConfig(InputConfig::InputClass::Wii); + s_config.LoadConfig(); s_last_connect_request_counter.fill(0); } diff --git a/Source/Core/Core/HotkeyManager.cpp b/Source/Core/Core/HotkeyManager.cpp index 668c500390..83b0c31616 100644 --- a/Source/Core/Core/HotkeyManager.cpp +++ b/Source/Core/Core/HotkeyManager.cpp @@ -207,7 +207,7 @@ static std::array s_hotkey_down; static HotkeyStatus s_hotkey; static bool s_enabled; -static InputConfig s_config("Hotkeys", _trans("Hotkeys"), "Hotkeys"); +static InputConfig s_config("Hotkeys", _trans("Hotkeys"), "Hotkeys", "Hotkeys"); InputConfig* GetConfig() { @@ -304,7 +304,7 @@ void Initialize() void LoadConfig() { - s_config.LoadConfig(InputConfig::InputClass::GC); + s_config.LoadConfig(); LoadLegacyConfig(s_config.GetController(0)); } diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp index 8413db981d..6c815e4a15 100644 --- a/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp +++ b/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp @@ -319,9 +319,8 @@ void MappingWindow::OnSaveProfilePressed() if (profile_name.isEmpty()) return; - const std::string profile_path = File::GetUserPath(D_CONFIG_IDX) + PROFILES_DIR + - m_config->GetProfileName() + "/" + profile_name.toStdString() + - ".ini"; + const std::string profile_path = + m_config->GetUserProfileDirectoryPath() + profile_name.toStdString() + ".ini"; File::CreateFullPath(profile_path); @@ -487,8 +486,7 @@ void MappingWindow::PopulateProfileSelection() { m_profiles_combo->clear(); - const std::string profiles_path = - File::GetUserPath(D_CONFIG_IDX) + PROFILES_DIR + m_config->GetProfileName(); + const std::string profiles_path = m_config->GetUserProfileDirectoryPath(); for (const auto& filename : Common::DoFileSearch({profiles_path}, {".ini"})) { std::string basename; @@ -499,9 +497,8 @@ void MappingWindow::PopulateProfileSelection() m_profiles_combo->insertSeparator(m_profiles_combo->count()); - const std::string builtin_profiles_path = - File::GetSysDirectory() + PROFILES_DIR + m_config->GetProfileName(); - for (const auto& filename : Common::DoFileSearch({builtin_profiles_path}, {".ini"})) + for (const auto& filename : + Common::DoFileSearch({m_config->GetSysProfileDirectoryPath()}, {".ini"})) { std::string basename; SplitPath(filename, nullptr, &basename, nullptr); diff --git a/Source/Core/InputCommon/InputConfig.cpp b/Source/Core/InputCommon/InputConfig.cpp index f372fa3c1f..ff3f68acd0 100644 --- a/Source/Core/InputCommon/InputConfig.cpp +++ b/Source/Core/InputCommon/InputConfig.cpp @@ -20,57 +20,40 @@ #include "InputCommon/InputProfile.h" InputConfig::InputConfig(const std::string& ini_name, const std::string& gui_name, - const std::string& profile_name) - : m_ini_name(ini_name), m_gui_name(gui_name), m_profile_name(profile_name) + const std::string& profile_directory_name, const std::string& profile_key) + : m_ini_name(ini_name), m_gui_name(gui_name), m_profile_directory_name(profile_directory_name), + m_profile_key(profile_key) { } InputConfig::~InputConfig() = default; -bool InputConfig::LoadConfig(InputClass type) +bool InputConfig::LoadConfig() { Common::IniFile inifile; bool useProfile[MAX_BBMOTES] = {false, false, false, false, false}; static constexpr std::array num = {"1", "2", "3", "4", "BB"}; std::string profile[MAX_BBMOTES]; - std::string path; m_dynamic_input_tex_config_manager.Load(); if (SConfig::GetInstance().GetGameID() != "00000000") { - std::string type_str; - switch (type) - { - case InputClass::GBA: - type_str = "GBA"; - path = "Profiles/GBA/"; - break; - case InputClass::Wii: - type_str = "Wiimote"; - path = "Profiles/Wiimote/"; - break; - case InputClass::GC: - default: - type_str = "Pad"; - path = "Profiles/GCPad/"; - break; - } + const std::string profile_directory = GetUserProfileDirectoryPath(); Common::IniFile game_ini = SConfig::GetInstance().LoadGameIni(); auto* control_section = game_ini.GetOrCreateSection("Controls"); for (int i = 0; i < 4; i++) { - const auto profile_name = fmt::format("{}Profile{}", type_str, num[i]); + const auto profile_name = fmt::format("{}Profile{}", GetProfileKey(), num[i]); if (control_section->Exists(profile_name)) { std::string profile_setting; if (control_section->Get(profile_name, &profile_setting)) { - auto profiles = InputProfile::GetProfilesFromSetting( - profile_setting, File::GetUserPath(D_CONFIG_IDX) + path); + auto profiles = InputProfile::GetProfilesFromSetting(profile_setting, profile_directory); if (profiles.empty()) { @@ -176,6 +159,16 @@ bool InputConfig::ControllersNeedToBeCreated() const return m_controllers.empty(); } +std::string InputConfig::GetUserProfileDirectoryPath() const +{ + return fmt::format("{}Profiles/{}/", File::GetUserPath(D_CONFIG_IDX), GetProfileDirectoryName()); +} + +std::string InputConfig::GetSysProfileDirectoryPath() const +{ + return fmt::format("{}Profiles/{}/", File::GetSysDirectory(), GetProfileDirectoryName()); +} + int InputConfig::GetControllerCount() const { return static_cast(m_controllers.size()); diff --git a/Source/Core/InputCommon/InputConfig.h b/Source/Core/InputCommon/InputConfig.h index a0d0203df6..09b9f6c182 100644 --- a/Source/Core/InputCommon/InputConfig.h +++ b/Source/Core/InputCommon/InputConfig.h @@ -25,18 +25,11 @@ class InputConfig { public: InputConfig(const std::string& ini_name, const std::string& gui_name, - const std::string& profile_name); + const std::string& profile_directory_name, const std::string& profile_key); ~InputConfig(); - enum class InputClass - { - GC, - Wii, - GBA, - }; - - bool LoadConfig(InputClass type); + bool LoadConfig(); void SaveConfig(); template @@ -51,7 +44,10 @@ public: bool IsControllerControlledByGamepadDevice(int index) const; std::string GetGUIName() const { return m_gui_name; } - std::string GetProfileName() const { return m_profile_name; } + std::string GetProfileKey() const { return m_profile_key; } + std::string GetProfileDirectoryName() const { return m_profile_directory_name; } + std::string GetUserProfileDirectoryPath() const; + std::string GetSysProfileDirectoryPath() const; int GetControllerCount() const; // These should be used after creating all controllers and before clearing them, respectively. @@ -65,6 +61,7 @@ private: std::vector> m_controllers; const std::string m_ini_name; const std::string m_gui_name; - const std::string m_profile_name; + const std::string m_profile_directory_name; + const std::string m_profile_key; InputCommon::DynamicInputTextureManager m_dynamic_input_tex_config_manager; }; diff --git a/Source/Core/InputCommon/InputProfile.cpp b/Source/Core/InputCommon/InputProfile.cpp index 81d04cf75a..0d439c48e1 100644 --- a/Source/Core/InputCommon/InputProfile.cpp +++ b/Source/Core/InputCommon/InputProfile.cpp @@ -55,8 +55,8 @@ std::vector GetProfilesFromSetting(const std::string& setting, cons std::vector ProfileCycler::GetProfilesForDevice(InputConfig* device_configuration) { - const std::string device_profile_root_location(File::GetUserPath(D_CONFIG_IDX) + "Profiles/" + - device_configuration->GetProfileName()); + const std::string device_profile_root_location( + device_configuration->GetUserProfileDirectoryPath()); return Common::DoFileSearch({device_profile_root_location}, {".ini"}, true); } @@ -101,8 +101,8 @@ ProfileCycler::GetMatchingProfilesFromSetting(const std::string& setting, const std::vector& profiles, InputConfig* device_configuration) { - const std::string device_profile_root_location(File::GetUserPath(D_CONFIG_IDX) + "Profiles/" + - device_configuration->GetProfileName() + "/"); + const std::string device_profile_root_location( + device_configuration->GetUserProfileDirectoryPath()); const auto& profiles_from_setting = GetProfilesFromSetting(setting, device_profile_root_location); if (profiles_from_setting.empty())