From 396d397ec6e3e5b70799e6f44841948837da27f0 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:13:14 +0800 Subject: [PATCH] Big Picture Settings: cleanup (#4268) * cleanup, declare variables in cpp instead of header * navigate navigate tabs with tab key as well * update comment --- src/imgui/settings_dialog_imgui.cpp | 393 +++++++++++++++++----------- src/imgui/settings_dialog_imgui.h | 150 +---------- 2 files changed, 243 insertions(+), 300 deletions(-) diff --git a/src/imgui/settings_dialog_imgui.cpp b/src/imgui/settings_dialog_imgui.cpp index f55a482a2..73aeb88f2 100644 --- a/src/imgui/settings_dialog_imgui.cpp +++ b/src/imgui/settings_dialog_imgui.cpp @@ -1,6 +1,8 @@ // SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include #include #include @@ -13,23 +15,124 @@ #include "imgui_fonts/proggyvector_regular.ttf.g.cpp" CMRC_DECLARE(res); - namespace BigPictureMode { +//////////////////// options for comboboxes +const std::map languageMap = {{"Arabic", 21}, + {"Czech", 23}, + {"Danish", 14}, + {"Dutch", 6}, + {"English (United Kingdom)", 18}, + {"English (United States)", 1}, + {"Finnish", 12}, + {"French (Canada)", 22}, + {"French (France)", 2}, + {"German", 4}, + {"Greek", 25}, + {"Hungarian", 24}, + {"Indonesian", 29}, + {"Italian", 5}, + {"Japanese", 0}, + {"Korean", 9}, + {"Norwegian (Bokmaal)", 15}, + {"Polish", 16}, + {"Portuguese (Brazil)", 17}, + {"Portuguese (Portugal)", 7}, + {"Romanian", 26}, + {"Russian", 8}, + {"Simplified Chinese", 11}, + {"Spanish (Latin America)", 20}, + {"Spanish (Spain)", 3}, + {"Swedish", 13}, + {"Thai", 27}, + {"Traditional Chinese", 10}, + {"Turkish", 19}, + {"Ukrainian", 30}, + {"Vietnamese", 28}}; +std::vector languageOptions; // assigned from keys above +const std::vector logTypeOptions = {"sync", "async"}; +const std::vector fullscreenModeOptions = {"Windowed", "Fullscreen", + "Fullscreen (Borderless)"}; +const std::vector audioBackendOptions = {"SDL", "OpenAL"}; +const std::vector presentModeOptions = {"Mailbox", "Fifo", "Immediate"}; +const std::vector hideCursorOptions = {"Never", "Idle", "Always"}; +const std::vector trophySideOptions = {"left", "right", "top", "bottom"}; +const std::vector readbacksModeOptions = {"Disabled", "Relaxed", "Precise"}; + +//////////////// Setting Variables +//////////////// Note:: Use int for all comboboxes as needed by ImGui + +// General tab +int consoleLanguageSetting; +int volumeSetting; +bool showSplashSetting; +int audioBackendSetting; + +// Graphics tab +int fullscreenModeSetting; +int presentModeSetting; +int windowWidthSetting; +int windowHeightSetting; +bool hdrAllowedSetting; +bool fsrEnabledSetting; +bool rcasEnabledSetting; +float rcasAttenuationSetting; + +// Input tab +bool motionControlsSetting; +bool backgroundControllerSetting; +int cursorStateSetting; +int cursorTimeoutSetting; + +// Trophy tab +bool trophyPopupDisabledSetting; +int trophySideSetting; +float trophyDurationSetting; + +// Log tab +bool logEnabledSetting; +bool separateLogSetting; +int logTypeSetting; + +// Experimental tab +int readbacksModeSetting; +bool readbackLinearImagesSetting; +bool directMemoryAccessSetting; +bool devkitConsoleSetting; +bool neoModeSetting; +bool psnSignedInSetting; +bool connectedNetworkSetting; +bool pipelineCacheEnabledSetting; +bool pipelineCacheArchiveSetting; +int extraDmemSetting; +int vblankFrequencySetting; + +//////////////// Texture data +SDL_Texture* profilesTexture; +SDL_Texture* generalTexture; +SDL_Texture* globalSettingsTexture; +SDL_Texture* experimentalTexture; +SDL_Texture* graphicsTexture; +SDL_Texture* inputTexture; +SDL_Texture* trophyTexture; +SDL_Texture* logTexture; + +//////////////// Gui variable const float gameImageSize = 200.f; const float settingsIconSize = 125.f; -static std::vector settingsProfileVec = {}; +std::vector settingsProfileVec = {}; -static float uiScale = 1.0f; -static CurrentSettings currentSettings; -static Textures textures; -static SDL_Renderer* renderer; +float uiScale = 1.0f; +SDL_Renderer* renderer; -static SettingsCategory currentCategory = SettingsCategory::Profiles; -static std::string currentProfile = "Global"; -static bool closeOnSave = false; +SettingsCategory currentCategory = SettingsCategory::Profiles; +std::string currentProfile = "Global"; +bool closeOnSave = false; void Init() { + auto languageKeys = std::views::keys(languageMap); + languageOptions.assign(languageKeys.begin(), languageKeys.end()); + currentProfile = "Global"; currentCategory = SettingsCategory::Profiles; LoadSettings("Global"); @@ -37,16 +140,16 @@ void Init() { SDL_Window* window = SDL_GetKeyboardFocus(); renderer = SDL_GetRenderer(window); - LoadEmbeddedTexture("src/images/big_picture/settings.png", textures.general); - LoadEmbeddedTexture("src/images/big_picture/folder.png", textures.profiles); - LoadEmbeddedTexture("src/images/big_picture/global-settings.png", textures.globalSettings); - LoadEmbeddedTexture("src/images/big_picture/experimental.png", textures.experimental); - LoadEmbeddedTexture("src/images/big_picture/graphics.png", textures.graphics); - LoadEmbeddedTexture("src/images/big_picture/controller.png", textures.input); - LoadEmbeddedTexture("src/images/big_picture/trophy.png", textures.trophy); - LoadEmbeddedTexture("src/images/big_picture/log.png", textures.log); + LoadEmbeddedTexture("src/images/big_picture/settings.png", generalTexture); + LoadEmbeddedTexture("src/images/big_picture/folder.png", profilesTexture); + LoadEmbeddedTexture("src/images/big_picture/global-settings.png", globalSettingsTexture); + LoadEmbeddedTexture("src/images/big_picture/experimental.png", experimentalTexture); + LoadEmbeddedTexture("src/images/big_picture/graphics.png", graphicsTexture); + LoadEmbeddedTexture("src/images/big_picture/controller.png", inputTexture); + LoadEmbeddedTexture("src/images/big_picture/trophy.png", trophyTexture); + LoadEmbeddedTexture("src/images/big_picture/log.png", logTexture); - GetGameInfo(settingsProfileVec, true, textures.globalSettings); + GetGameInfo(settingsProfileVec, true, globalSettingsTexture); uiScale = static_cast(EmulatorSettings.GetBigPictureScale() / 1000.f); } @@ -83,15 +186,15 @@ void DrawSettings(bool* open) { ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(30.0f * uiScale, 0.0f)); // Must add categories in enum order for L1/R1 to work correctly, with experimental last - AddCategory("Profiles", textures.profiles, SettingsCategory::Profiles); - AddCategory("General", textures.general, SettingsCategory::General); - AddCategory("Graphics", textures.graphics, SettingsCategory::Graphics); - AddCategory("Input", textures.input, SettingsCategory::Input); - AddCategory("Trophy", textures.trophy, SettingsCategory::Trophy); - AddCategory("Log", textures.log, SettingsCategory::Log); + AddCategory("Profiles", profilesTexture, SettingsCategory::Profiles); + AddCategory("General", generalTexture, SettingsCategory::General); + AddCategory("Graphics", graphicsTexture, SettingsCategory::Graphics); + AddCategory("Input", inputTexture, SettingsCategory::Input); + AddCategory("Trophy", trophyTexture, SettingsCategory::Trophy); + AddCategory("Log", logTexture, SettingsCategory::Log); if (currentProfile != "Global") - AddCategory("Experimental", textures.experimental, SettingsCategory::Experimental); + AddCategory("Experimental", experimentalTexture, SettingsCategory::Experimental); ImGui::PopStyleVar(); ImGui::EndChild(); // Categories @@ -173,15 +276,14 @@ void DrawSettings(bool* open) { SettingsCategory lastCategory = currentProfile != "Global" ? SettingsCategory::Experimental : SettingsCategory::Log; - // choose next category with R1 - if (ImGui::IsKeyPressed(ImGuiKey_GamepadR1)) { + // Navigate categories with Tab / R1 / L1 + if (ImGui::IsKeyPressed(ImGuiKey_GamepadR1) || ImGui::IsKeyPressed(ImGuiKey_Tab)) { int currentIndex = static_cast(currentCategory); currentCategory == lastCategory ? currentCategory = static_cast(0) : currentCategory = static_cast(currentIndex + 1); } - // choose previous category with R1 if (ImGui::IsKeyPressed(ImGuiKey_GamepadL1)) { int currentIndex = static_cast(currentCategory); currentIndex == 0 ? currentCategory = lastCategory @@ -203,10 +305,10 @@ void LoadCategory(SettingsCategory category) { ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 500.0f * uiScale); ImGui::TableSetupColumn("Value"); - AddSettingCombo("Console Language", currentSettings.consoleLanguage); - AddSettingSliderInt("Volume", currentSettings.volume, 0, 500); - AddSettingBool("Show Splash Screen When Launching Game", currentSettings.showSplash); - AddSettingCombo("Audio Backend", currentSettings.audioBackend); + AddSettingCombo("Console Language", consoleLanguageSetting, languageOptions); + AddSettingSliderInt("Volume", volumeSetting, 0, 500); + AddSettingBool("Show Splash Screen When Launching Game", showSplashSetting); + AddSettingCombo("Audio Backend", audioBackendSetting, audioBackendOptions); ImGui::EndTable(); } @@ -215,20 +317,19 @@ void LoadCategory(SettingsCategory category) { ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 500.0f * uiScale); ImGui::TableSetupColumn("Value"); - AddSettingCombo("Display Mode", currentSettings.fullscreenMode); - AddSettingCombo("Present Mode", currentSettings.presentMode); - AddSettingSliderInt("Window Width", currentSettings.windowWidth, 0, 8000); - AddSettingSliderInt("Window Height", currentSettings.windowHeight, 0, 7000); - AddSettingBool("Enable HDR", currentSettings.hdrAllowed); - AddSettingBool("Enable FSR", currentSettings.fsrEnabled); + AddSettingCombo("Display Mode", fullscreenModeSetting, fullscreenModeOptions); + AddSettingCombo("Present Mode", presentModeSetting, presentModeOptions); + AddSettingSliderInt("Window Width", windowWidthSetting, 0, 8000); + AddSettingSliderInt("Window Height", windowHeightSetting, 0, 7000); + AddSettingBool("Enable HDR", hdrAllowedSetting); + AddSettingBool("Enable FSR", fsrEnabledSetting); - if (currentSettings.fsrEnabled) { - AddSettingBool("Enable RCAS", currentSettings.rcasEnabled); + if (fsrEnabledSetting) { + AddSettingBool("Enable RCAS", rcasEnabledSetting); } - if (currentSettings.rcasEnabled && currentSettings.fsrEnabled) { - AddSettingSliderFloat("RCAS Attenuation", currentSettings.rcasAttenuation, 0.0f, - 3.0f, 3); + if (rcasEnabledSetting && fsrEnabledSetting) { + AddSettingSliderFloat("RCAS Attenuation", rcasAttenuationSetting, 0.0f, 3.0f, 3); } ImGui::EndTable(); @@ -238,14 +339,12 @@ void LoadCategory(SettingsCategory category) { ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 500.0f * uiScale); ImGui::TableSetupColumn("Value"); - AddSettingBool("Enable Motion Controls", currentSettings.motionControls); - AddSettingBool("Enable Background Controller Input", - currentSettings.backgroundController); - AddSettingCombo("Hide Cursor", currentSettings.cursorState); + AddSettingBool("Enable Motion Controls", motionControlsSetting); + AddSettingBool("Enable Background Controller Input", backgroundControllerSetting); + AddSettingCombo("Hide Cursor", cursorStateSetting, hideCursorOptions); - if (currentSettings.cursorState == 1) { - AddSettingSliderInt("Hide Cursor Idle Timeout", currentSettings.cursorTimeout, 1, - 10); + if (cursorStateSetting == 1) { + AddSettingSliderInt("Hide Cursor Idle Timeout", cursorTimeoutSetting, 1, 10); } ImGui::EndTable(); @@ -255,11 +354,12 @@ void LoadCategory(SettingsCategory category) { ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 500.0f * uiScale); ImGui::TableSetupColumn("Value"); - AddSettingBool("Disable Trophy Notification", currentSettings.trophyPopupDisabled); - if (!currentSettings.trophyPopupDisabled) { - AddSettingCombo("Trophy Notification Position", currentSettings.trophySide); - AddSettingSliderFloat("Trophy Notification Duration", - currentSettings.trophyDuration, 0.f, 10.f, 1); + AddSettingBool("Disable Trophy Notification", trophyPopupDisabledSetting); + if (!trophyPopupDisabledSetting) { + AddSettingCombo("Trophy Notification Position", trophySideSetting, + trophySideOptions); + AddSettingSliderFloat("Trophy Notification Duration", trophyDurationSetting, 0.f, + 10.f, 1); } ImGui::EndTable(); @@ -269,10 +369,10 @@ void LoadCategory(SettingsCategory category) { ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 500.0f * uiScale); ImGui::TableSetupColumn("Value"); - AddSettingBool("Enable Logging", currentSettings.logEnabled); - if (currentSettings.logEnabled) { - AddSettingBool("Separate Log Files", currentSettings.separateLog); - AddSettingCombo("Log Type", currentSettings.logType); + AddSettingBool("Enable Logging", logEnabledSetting); + if (logEnabledSetting) { + AddSettingBool("Separate Log Files", separateLogSetting); + AddSettingCombo("Log Type", logTypeSetting, logTypeOptions); } ImGui::EndTable(); @@ -282,20 +382,19 @@ void LoadCategory(SettingsCategory category) { ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 500.0f * uiScale); ImGui::TableSetupColumn("Value"); - AddSettingSliderInt("Additional DMem Allocation", currentSettings.extraDmem, 0, 20000); - AddSettingSliderInt("Vblank Frequency", currentSettings.vblankFrequency, 30, 360); - AddSettingCombo("Readbacks Mode", currentSettings.readbacksMode); - AddSettingBool("Enable Readback Linear Images", currentSettings.readbackLinearImages); - AddSettingBool("Enable Direct Memory Access", currentSettings.directMemoryAccess); - AddSettingBool("Enable Devkit Console Mode", currentSettings.devkitConsole); - AddSettingBool("Enable PS4 Neo Mode", currentSettings.neoMode); - AddSettingBool("Set PSN Sign-in to True", currentSettings.psnSignedIn); - AddSettingBool("Set Network Connected to True", currentSettings.connectedNetwork); - AddSettingBool("Enable Shader Cache", currentSettings.pipelineCacheEnabled); + AddSettingSliderInt("Additional DMem Allocation", extraDmemSetting, 0, 20000); + AddSettingSliderInt("Vblank Frequency", vblankFrequencySetting, 30, 360); + AddSettingCombo("Readbacks Mode", readbacksModeSetting, readbacksModeOptions); + AddSettingBool("Enable Readback Linear Images", readbackLinearImagesSetting); + AddSettingBool("Enable Direct Memory Access", directMemoryAccessSetting); + AddSettingBool("Enable Devkit Console Mode", devkitConsoleSetting); + AddSettingBool("Enable PS4 Neo Mode", neoModeSetting); + AddSettingBool("Set PSN Sign-in to True", psnSignedInSetting); + AddSettingBool("Set Network Connected to True", connectedNetworkSetting); + AddSettingBool("Enable Shader Cache", pipelineCacheEnabledSetting); - if (currentSettings.pipelineCacheEnabled) { - AddSettingBool("Compress Shader Cache to Zip File", - currentSettings.pipelineCacheArchive); + if (pipelineCacheEnabledSetting) { + AddSettingBool("Compress Shader Cache to Zip File", pipelineCacheArchiveSetting); } ImGui::EndTable(); @@ -319,57 +418,54 @@ void SaveSettings(std::string profile) { const bool isSpecific = currentProfile != "Global"; /////////// General Tab - EmulatorSettings.SetConsoleLanguage( - languageMap.at(optionsLanguage.at(currentSettings.consoleLanguage)), isSpecific); - EmulatorSettings.SetVolumeSlider(currentSettings.volume, isSpecific); - EmulatorSettings.SetShowSplash(currentSettings.showSplash, isSpecific); - EmulatorSettings.SetAudioBackend(currentSettings.audioBackend, isSpecific); + EmulatorSettings.SetConsoleLanguage(languageMap.at(languageOptions.at(consoleLanguageSetting)), + isSpecific); + EmulatorSettings.SetVolumeSlider(volumeSetting, isSpecific); + EmulatorSettings.SetShowSplash(showSplashSetting, isSpecific); + EmulatorSettings.SetAudioBackend(audioBackendSetting, isSpecific); /////////// Graphics Tab - bool isFullscreen = currentSettings.fullscreenMode != 0; + bool isFullscreen = fullscreenModeSetting != 0; EmulatorSettings.SetFullScreen(isFullscreen); - EmulatorSettings.SetFullScreenMode(optionsFullscreenMode.at(currentSettings.fullscreenMode), - isSpecific); - EmulatorSettings.SetPresentMode(optionsPresentMode.at(currentSettings.presentMode), isSpecific); - EmulatorSettings.SetWindowHeight(currentSettings.windowHeight, isSpecific); - EmulatorSettings.SetWindowWidth(currentSettings.windowWidth, isSpecific); - EmulatorSettings.SetHdrAllowed(currentSettings.hdrAllowed, isSpecific); - EmulatorSettings.SetFsrEnabled(currentSettings.fsrEnabled, isSpecific); - EmulatorSettings.SetRcasEnabled(currentSettings.rcasEnabled, isSpecific); - EmulatorSettings.SetRcasAttenuation(static_cast(currentSettings.rcasAttenuation * 1000), + EmulatorSettings.SetFullScreenMode(fullscreenModeOptions.at(fullscreenModeSetting), isSpecific); + EmulatorSettings.SetPresentMode(presentModeOptions.at(presentModeSetting), isSpecific); + EmulatorSettings.SetWindowHeight(windowHeightSetting, isSpecific); + EmulatorSettings.SetWindowWidth(windowWidthSetting, isSpecific); + EmulatorSettings.SetHdrAllowed(hdrAllowedSetting, isSpecific); + EmulatorSettings.SetFsrEnabled(fsrEnabledSetting, isSpecific); + EmulatorSettings.SetRcasEnabled(rcasEnabledSetting, isSpecific); + EmulatorSettings.SetRcasAttenuation(static_cast(rcasAttenuationSetting * 1000), isSpecific); /////////// Input Tab - EmulatorSettings.SetMotionControlsEnabled(currentSettings.motionControls, isSpecific); - EmulatorSettings.SetBackgroundControllerInput(currentSettings.backgroundController, isSpecific); - EmulatorSettings.SetCursorState(currentSettings.cursorState, isSpecific); - EmulatorSettings.SetCursorHideTimeout(currentSettings.cursorTimeout, isSpecific); + EmulatorSettings.SetMotionControlsEnabled(motionControlsSetting, isSpecific); + EmulatorSettings.SetBackgroundControllerInput(backgroundControllerSetting, isSpecific); + EmulatorSettings.SetCursorState(cursorStateSetting, isSpecific); + EmulatorSettings.SetCursorHideTimeout(cursorTimeoutSetting, isSpecific); /////////// Trophy Tab - EmulatorSettings.SetTrophyPopupDisabled(currentSettings.trophyPopupDisabled, isSpecific); - EmulatorSettings.SetTrophyNotificationSide(optionsTrophySide.at(currentSettings.trophySide), - isSpecific); - EmulatorSettings.SetTrophyNotificationDuration( - static_cast(currentSettings.trophyDuration)); + EmulatorSettings.SetTrophyPopupDisabled(trophyPopupDisabledSetting, isSpecific); + EmulatorSettings.SetTrophyNotificationSide(trophySideOptions.at(trophySideSetting), isSpecific); + EmulatorSettings.SetTrophyNotificationDuration(static_cast(trophyDurationSetting)); /////////// Log Tab - EmulatorSettings.SetLogEnabled(currentSettings.logEnabled, isSpecific); - EmulatorSettings.SetLogType(optionsLogType.at(currentSettings.logType), isSpecific); - EmulatorSettings.SetSeparateLoggingEnabled(currentSettings.separateLog, isSpecific); + EmulatorSettings.SetLogEnabled(logEnabledSetting, isSpecific); + EmulatorSettings.SetLogType(logTypeOptions.at(logTypeSetting), isSpecific); + EmulatorSettings.SetSeparateLoggingEnabled(separateLogSetting, isSpecific); /////////// Experimental Tab if (isSpecific) { - EmulatorSettings.SetReadbacksMode(currentSettings.readbacksMode, true); - EmulatorSettings.SetReadbackLinearImagesEnabled(currentSettings.readbackLinearImages, true); - EmulatorSettings.SetDirectMemoryAccessEnabled(currentSettings.directMemoryAccess, true); - EmulatorSettings.SetDevKit(currentSettings.devkitConsole, true); - EmulatorSettings.SetNeo(currentSettings.neoMode, true); - EmulatorSettings.SetPSNSignedIn(currentSettings.psnSignedIn, true); - EmulatorSettings.SetConnectedToNetwork(currentSettings.connectedNetwork, true); - EmulatorSettings.SetPipelineCacheEnabled(currentSettings.pipelineCacheEnabled, true); - EmulatorSettings.SetPipelineCacheArchived(currentSettings.pipelineCacheArchive, true); - EmulatorSettings.SetExtraDmemInMBytes(currentSettings.extraDmem, true); - EmulatorSettings.SetVblankFrequency(currentSettings.vblankFrequency, true); + EmulatorSettings.SetReadbacksMode(readbacksModeSetting, true); + EmulatorSettings.SetReadbackLinearImagesEnabled(readbackLinearImagesSetting, true); + EmulatorSettings.SetDirectMemoryAccessEnabled(directMemoryAccessSetting, true); + EmulatorSettings.SetDevKit(devkitConsoleSetting, true); + EmulatorSettings.SetNeo(neoModeSetting, true); + EmulatorSettings.SetPSNSignedIn(psnSignedInSetting, true); + EmulatorSettings.SetConnectedToNetwork(connectedNetworkSetting, true); + EmulatorSettings.SetPipelineCacheEnabled(pipelineCacheEnabledSetting, true); + EmulatorSettings.SetPipelineCacheArchived(pipelineCacheArchiveSetting, true); + EmulatorSettings.SetExtraDmemInMBytes(extraDmemSetting, true); + EmulatorSettings.SetVblankFrequency(vblankFrequencySetting, true); } if (!isSpecific) { @@ -395,55 +491,52 @@ void LoadSettings(std::string profile) { language = key; } } - currentSettings.consoleLanguage = GetComboIndex(language, optionsLanguage); - currentSettings.volume = EmulatorSettings.GetVolumeSlider(); - currentSettings.showSplash = EmulatorSettings.IsShowSplash(); - currentSettings.audioBackend = EmulatorSettings.GetAudioBackend(); + consoleLanguageSetting = GetComboIndex(language, languageOptions); + volumeSetting = EmulatorSettings.GetVolumeSlider(); + showSplashSetting = EmulatorSettings.IsShowSplash(); + audioBackendSetting = EmulatorSettings.GetAudioBackend(); /////////// Graphics Tab - currentSettings.fullscreenMode = - GetComboIndex(EmulatorSettings.GetFullScreenMode(), optionsFullscreenMode); - currentSettings.presentMode = - GetComboIndex(EmulatorSettings.GetPresentMode(), optionsPresentMode); - currentSettings.windowHeight = EmulatorSettings.GetWindowHeight(); - currentSettings.windowWidth = EmulatorSettings.GetWindowWidth(); - currentSettings.hdrAllowed = EmulatorSettings.IsHdrAllowed(); - currentSettings.fsrEnabled = EmulatorSettings.IsFsrEnabled(); - currentSettings.rcasEnabled = EmulatorSettings.IsRcasEnabled(); - currentSettings.rcasAttenuation = - static_cast(EmulatorSettings.GetRcasAttenuation() * 0.001f); + fullscreenModeSetting = + GetComboIndex(EmulatorSettings.GetFullScreenMode(), fullscreenModeOptions); + presentModeSetting = GetComboIndex(EmulatorSettings.GetPresentMode(), presentModeOptions); + windowHeightSetting = EmulatorSettings.GetWindowHeight(); + windowWidthSetting = EmulatorSettings.GetWindowWidth(); + hdrAllowedSetting = EmulatorSettings.IsHdrAllowed(); + fsrEnabledSetting = EmulatorSettings.IsFsrEnabled(); + rcasEnabledSetting = EmulatorSettings.IsRcasEnabled(); + rcasAttenuationSetting = static_cast(EmulatorSettings.GetRcasAttenuation() * 0.001f); /////////// Input Tab - currentSettings.motionControls = EmulatorSettings.IsMotionControlsEnabled(); - currentSettings.backgroundController = EmulatorSettings.IsBackgroundControllerInput(); - currentSettings.cursorState = EmulatorSettings.GetCursorState(); - currentSettings.cursorTimeout = EmulatorSettings.GetCursorHideTimeout(); + motionControlsSetting = EmulatorSettings.IsMotionControlsEnabled(); + backgroundControllerSetting = EmulatorSettings.IsBackgroundControllerInput(); + cursorStateSetting = EmulatorSettings.GetCursorState(); + cursorTimeoutSetting = EmulatorSettings.GetCursorHideTimeout(); /////////// Trophy Tab - currentSettings.trophyPopupDisabled = EmulatorSettings.IsTrophyPopupDisabled(); - currentSettings.trophySide = - GetComboIndex(EmulatorSettings.GetTrophyNotificationSide(), optionsTrophySide); - currentSettings.trophyDuration = - static_cast(EmulatorSettings.GetTrophyNotificationDuration()); + trophyPopupDisabledSetting = EmulatorSettings.IsTrophyPopupDisabled(); + trophySideSetting = + GetComboIndex(EmulatorSettings.GetTrophyNotificationSide(), trophySideOptions); + trophyDurationSetting = static_cast(EmulatorSettings.GetTrophyNotificationDuration()); /////////// Log Tab - currentSettings.logEnabled = EmulatorSettings.IsLogEnabled(); - currentSettings.logType = GetComboIndex(EmulatorSettings.GetLogType(), optionsLogType); - currentSettings.separateLog = EmulatorSettings.IsSeparateLoggingEnabled(); + logEnabledSetting = EmulatorSettings.IsLogEnabled(); + logTypeSetting = GetComboIndex(EmulatorSettings.GetLogType(), logTypeOptions); + separateLogSetting = EmulatorSettings.IsSeparateLoggingEnabled(); /////////// Experimental Tab if (isSpecific) { - currentSettings.readbacksMode = EmulatorSettings.GetReadbacksMode(); - currentSettings.readbackLinearImages = EmulatorSettings.IsReadbackLinearImagesEnabled(); - currentSettings.directMemoryAccess = EmulatorSettings.IsDirectMemoryAccessEnabled(); - currentSettings.devkitConsole = EmulatorSettings.IsDevKit(); - currentSettings.neoMode = EmulatorSettings.IsNeo(); - currentSettings.psnSignedIn = EmulatorSettings.IsPSNSignedIn(); - currentSettings.connectedNetwork = EmulatorSettings.IsConnectedToNetwork(); - currentSettings.pipelineCacheEnabled = EmulatorSettings.IsPipelineCacheEnabled(); - currentSettings.pipelineCacheArchive = EmulatorSettings.IsPipelineCacheArchived(); - currentSettings.extraDmem = EmulatorSettings.GetExtraDmemInMBytes(); - currentSettings.vblankFrequency = EmulatorSettings.GetVblankFrequency(); + readbacksModeSetting = EmulatorSettings.GetReadbacksMode(); + readbackLinearImagesSetting = EmulatorSettings.IsReadbackLinearImagesEnabled(); + directMemoryAccessSetting = EmulatorSettings.IsDirectMemoryAccessEnabled(); + devkitConsoleSetting = EmulatorSettings.IsDevKit(); + neoModeSetting = EmulatorSettings.IsNeo(); + psnSignedInSetting = EmulatorSettings.IsPSNSignedIn(); + connectedNetworkSetting = EmulatorSettings.IsConnectedToNetwork(); + pipelineCacheEnabledSetting = EmulatorSettings.IsPipelineCacheEnabled(); + pipelineCacheArchiveSetting = EmulatorSettings.IsPipelineCacheArchived(); + extraDmemSetting = EmulatorSettings.GetExtraDmemInMBytes(); + vblankFrequencySetting = EmulatorSettings.GetVblankFrequency(); } } @@ -503,15 +596,13 @@ void AddSettingSliderFloat(std::string name, float& value, int min, int max, int ImGui::SliderFloat(label.c_str(), &value, min, max, precisionString.c_str()); } -void AddSettingCombo(std::string name, int& value) { +void AddSettingCombo(std::string name, int& value, std::vector options) { std::string label = "##" + name; ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::TextWrapped("%s", name.c_str()); - std::vector options = optionsMap.at(name); ImGui::TableNextColumn(); - const char* combo_value = options[value].c_str(); if (ImGui::BeginCombo(label.c_str(), combo_value)) { for (int i = 0; i < options.size(); i++) { diff --git a/src/imgui/settings_dialog_imgui.h b/src/imgui/settings_dialog_imgui.h index 0686a8406..ab521a426 100644 --- a/src/imgui/settings_dialog_imgui.h +++ b/src/imgui/settings_dialog_imgui.h @@ -3,7 +3,6 @@ #pragma once -#include #include #include #include @@ -23,17 +22,6 @@ enum class SettingsCategory { Experimental, }; -struct Textures { - SDL_Texture* profiles; - SDL_Texture* general; - SDL_Texture* globalSettings; - SDL_Texture* experimental; - SDL_Texture* graphics; - SDL_Texture* input; - SDL_Texture* trophy; - SDL_Texture* log; -}; - void Init(); void DeInit(); @@ -49,143 +37,7 @@ void LoadCategory(SettingsCategory); void AddSettingBool(std::string name, bool& value); void AddSettingSliderInt(std::string name, int& value, int min, int max); void AddSettingSliderFloat(std::string name, float& value, int min, int max, int precision); -void AddSettingCombo(std::string name, int& value); +void AddSettingCombo(std::string name, int& value, std::vector options); int GetComboIndex(std::string selection, std::vector options); -//////////////////// Settings struct -// Note: use int instead of std::string for all combo settings as needed by ImGui -// then convert to string when saving/loading - -struct CurrentSettings { - // General tab - int consoleLanguage; - int volume; - bool showSplash; - int audioBackend; - - // Graphics tab - int fullscreenMode; - int presentMode; - int windowWidth; - int windowHeight; - bool hdrAllowed; - bool fsrEnabled; - bool rcasEnabled; - float rcasAttenuation; - - // Input tab - bool motionControls; - bool backgroundController; - int cursorState; - int cursorTimeout; - - // Trophy tab - bool trophyPopupDisabled; - int trophySide; - float trophyDuration; - - // Log tab - bool logEnabled; - bool separateLog; - int logType; - - // Experimental tab - int readbacksMode; - bool readbackLinearImages; - bool directMemoryAccess; - bool devkitConsole; - bool neoMode; - bool psnSignedIn; - bool connectedNetwork; - bool pipelineCacheEnabled; - bool pipelineCacheArchive; - int extraDmem; - int vblankFrequency; -}; - -//////////////////// option maps for comboboxes and other needed constants -const std::map languageMap = {{"Arabic", 21}, - {"Czech", 23}, - {"Danish", 14}, - {"Dutch", 6}, - {"English (United Kingdom)", 18}, - {"English (United States)", 1}, - {"Finnish", 12}, - {"French (Canada)", 22}, - {"French (France)", 2}, - {"German", 4}, - {"Greek", 25}, - {"Hungarian", 24}, - {"Indonesian", 29}, - {"Italian", 5}, - {"Japanese", 0}, - {"Korean", 9}, - {"Norwegian (Bokmaal)", 15}, - {"Polish", 16}, - {"Portuguese (Brazil)", 17}, - {"Portuguese (Portugal)", 7}, - {"Romanian", 26}, - {"Russian", 8}, - {"Simplified Chinese", 11}, - {"Spanish (Latin America)", 20}, - {"Spanish (Spain)", 3}, - {"Swedish", 13}, - {"Thai", 27}, - {"Traditional Chinese", 10}, - {"Turkish", 19}, - {"Ukrainian", 30}, - {"Vietnamese", 28}}; - -const std::vector optionsLanguage = {"Arabic", - "Czech", - "Danish", - "Dutch", - "English (United Kingdom)", - "English (United States)", - "Finnish", - "French (Canada)", - "French (France)", - "German", - "Greek", - "Hungarian", - "Indonesian", - "Italian", - "Japanese", - "Korean", - "Norwegian (Bokmaal)", - "Polish", - "Portuguese (Brazil)", - "Portuguese (Portugal)", - "Romanian", - "Russian", - "Simplified Chinese", - "Spanish (Latin America)", - "Spanish (Spain)", - "Swedish", - "Thai", - "Traditional Chinese", - "Turkish", - "Ukrainian", - "Vietnamese"}; - -const std::vector optionsLogType = {"sync", "async"}; -const std::vector optionsFullscreenMode = {"Windowed", "Fullscreen", - "Fullscreen (Borderless)"}; -const std::vector optionsAudioBackend = {"SDL", "OpenAL"}; -const std::vector optionsPresentMode = {"Mailbox", "Fifo", "Immediate"}; -const std::vector optionsHideCursor = {"Never", "Idle", "Always"}; -const std::vector optionsTrophySide = {"left", "right", "top", "bottom"}; -const std::vector optionsReadbacksMode = {"Disabled", "Relaxed", "Precise"}; - -const std::map> optionsMap = { - {"Log Type", optionsLogType}, - {"Console Language", optionsLanguage}, - {"Audio Backend", optionsAudioBackend}, - {"Display Mode", optionsFullscreenMode}, - {"Present Mode", optionsPresentMode}, - {"Hide Cursor", optionsHideCursor}, - {"Trophy Notification Position", optionsTrophySide}, - {"Readbacks Mode", optionsReadbacksMode}, -}; - } // namespace BigPictureMode