From 942834db32b334eaec56ce9d2150394b77b2ecfb Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 14 Jun 2026 02:15:51 -0700 Subject: [PATCH] big_picture: Improvements to UI settings (#4575) --- src/imgui/big_picture/big_picture.cpp | 30 ++++++++++--------- .../big_picture/settings_dialog_imgui.cpp | 17 ++++++++--- src/imgui/big_picture/settings_dialog_imgui.h | 6 ++-- .../big_picture/settings_dialog_layer.cpp | 3 +- 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/imgui/big_picture/big_picture.cpp b/src/imgui/big_picture/big_picture.cpp index e2e2aeb66..e4131dbc5 100644 --- a/src/imgui/big_picture/big_picture.cpp +++ b/src/imgui/big_picture/big_picture.cpp @@ -200,7 +200,8 @@ void Launch(char* executableName) { } SDL_Window* window = - SDL_CreateWindow("shadPS4 Big Picture Mode", 1280, 720, SDL_WINDOW_FULLSCREEN); + SDL_CreateWindow("shadPS4 Big Picture Mode", 1280, 720, + EmulatorSettings.IsFullScreen() ? SDL_WINDOW_FULLSCREEN : 0); renderer = SDL_CreateRenderer(window, nullptr); if (window == nullptr) { @@ -229,11 +230,19 @@ void Launch(char* executableName) { ImGui_ImplSDL3_InitForSDLRenderer(window, renderer); ImGui_ImplSDLRenderer3_Init(renderer); - GetGameIconInfo(gameIcons); - uiScale = static_cast(EmulatorSettings.GetBigPictureScale() / 1000.f); ImGuiEmuSettings::SettingsWindow settingsWindow(false); + float sliderScale = 1.0f; + auto applySettings = [&] { + uiScale = EmulatorSettings.GetBigPictureScale() / 1000.f; + sliderScale = uiScale; + GetGameIconInfo(gameIcons); + SDL_SetWindowFullscreen(window, + EmulatorSettings.IsFullScreen() ? SDL_WINDOW_FULLSCREEN : 0); + }; + applySettings(); + while (!done) { SDL_Event event; while (SDL_PollEvent(&event)) { @@ -297,7 +306,6 @@ void Launch(char* executableName) { ImGui::SetNextItemWidth(300.0f * uiScale); - static float sliderScale = 1.0f; if (ImGui::IsWindowAppearing()) { sliderScale = uiScale; } @@ -317,6 +325,9 @@ void Launch(char* executableName) { ImGui::SetCursorPosX(ImGui::GetWindowContentRegionMax().x - buttonsWidth); if (ImGui::Button("Settings")) { + EmulatorSettings.SetBigPictureScale(static_cast(uiScale * 1000)); + EmulatorSettings.Save(); + settingsWindow.Prepare(); showSettings = true; } @@ -350,16 +361,7 @@ void Launch(char* executableName) { } if (showSettings) { - EmulatorSettings.SetBigPictureScale(static_cast(uiScale * 1000)); - EmulatorSettings.Save(); - settingsWindow.DrawSettings(&showSettings); - - // update when settings dialog closed - if (!showSettings) { - uiScale = static_cast(EmulatorSettings.GetBigPictureScale() / 1000.f); - sliderScale = uiScale; - GetGameIconInfo(gameIcons); - } + settingsWindow.DrawSettings(&showSettings, applySettings); } ImGui::PopStyleVar(8); diff --git a/src/imgui/big_picture/settings_dialog_imgui.cpp b/src/imgui/big_picture/settings_dialog_imgui.cpp index 838f6c7cd..85e066727 100644 --- a/src/imgui/big_picture/settings_dialog_imgui.cpp +++ b/src/imgui/big_picture/settings_dialog_imgui.cpp @@ -202,7 +202,6 @@ SettingsWindow::SettingsWindow(bool gameRunning) : isGameRunning(gameRunning) { currentProfile = "Global"; m_GameInstallDirs = EmulatorSettings.GetAllGameInstallDirs(); currentCategory = isGameRunning ? SettingsCategory::General : SettingsCategory::Profiles; - uiScale = static_cast(EmulatorSettings.GetBigPictureScale() / 1000.f); bool customConfigFound = false; if (isGameRunning) { @@ -223,6 +222,10 @@ SettingsWindow::SettingsWindow(bool gameRunning) : isGameRunning(gameRunning) { customConfigFound ? LoadSettings(runningGameSerial) : LoadSettings("Global"); } +void SettingsWindow::Prepare() { + uiScale = EmulatorSettings.GetBigPictureScale() / 1000.f; +} + void SettingsWindow::DeInit() { EmulatorSettings.Load(); EmulatorSettings.SetBigPictureScale(static_cast(uiScale * 1000)); @@ -232,7 +235,7 @@ void SettingsWindow::DeInit() { EmulatorSettings.Load(runningGameSerial); } } -void SettingsWindow::DrawSettings(bool* open) { +void SettingsWindow::DrawSettings(bool* open, const std::function& applySettings) { ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.06f, 0.06f, 0.06f, 1.00f)); // black ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(0.20f, 0.40f, 0.70f, 1.00f)); // blue ImGui::PushStyleColor(ImGuiCol_HeaderHovered, @@ -253,7 +256,7 @@ void SettingsWindow::DrawSettings(bool* open) { SetupWindow(); DrawCategoryTabs(); - DrawMainContent(open); + DrawMainContent(open, applySettings); ImGui::PopStyleVar(8); ImGui::PopStyleColor(5); @@ -366,7 +369,7 @@ void SettingsWindow::AddCategory(std::string name, ImGui::EndGroup(); } -void SettingsWindow::DrawMainContent(bool* open) { +void SettingsWindow::DrawMainContent(bool* open, const std::function& applySettings) { ImVec4 settingsColor = ImVec4(0.1f, 0.1f, 0.12f, 0.8f); // Darker gray ImGui::PushStyleColor(ImGuiCol_ChildBg, settingsColor); ImGuiWindowFlags child_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | @@ -442,6 +445,9 @@ void SettingsWindow::DrawMainContent(bool* open) { } else { ImGui::CloseCurrentPopup(); } + if (applySettings) { + applySettings(); + } } ImGui::EndPopup(); @@ -451,6 +457,9 @@ void SettingsWindow::DrawMainContent(bool* open) { if (ImGui::Button("Cancel")) { DeInit(); *open = false; + if (applySettings) { + applySettings(); + } } } diff --git a/src/imgui/big_picture/settings_dialog_imgui.h b/src/imgui/big_picture/settings_dialog_imgui.h index 3c4383694..f356f4fb5 100644 --- a/src/imgui/big_picture/settings_dialog_imgui.h +++ b/src/imgui/big_picture/settings_dialog_imgui.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include #include @@ -18,7 +19,8 @@ class SettingsWindow { public: SettingsWindow(bool gameRunning); - void DrawSettings(bool* open); + void Prepare(); + void DrawSettings(bool* open, const std::function& applySettings); private: enum class SettingsCategory { @@ -40,7 +42,7 @@ private: void DeInit(); void GetProfileInfo(); - void DrawMainContent(bool* open); + void DrawMainContent(bool* open, const std::function& applySettings); void DrawSettingsTable(SettingsCategory); void DrawProfileSelector(); void DrawGameFolderManager(); diff --git a/src/imgui/big_picture/settings_dialog_layer.cpp b/src/imgui/big_picture/settings_dialog_layer.cpp index dab411871..0b03ea71d 100644 --- a/src/imgui/big_picture/settings_dialog_layer.cpp +++ b/src/imgui/big_picture/settings_dialog_layer.cpp @@ -13,6 +13,7 @@ static std::optional settingsLayer = std::nullopt; SettingsLayer::SettingsLayer() { AddLayer(this); + settingsWindow.Prepare(); } SettingsLayer::~SettingsLayer() {} @@ -24,7 +25,7 @@ void SettingsLayer::Finish() { void SettingsLayer::Draw() { ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[IMGUI_FONT_SETTINGS_WINDOW]); - settingsWindow.DrawSettings(&running); + settingsWindow.DrawSettings(&running, nullptr); ImGui::PopFont(); if (!running) {