From 9a1089b70eebc8488512ab88ec155dc9756b1adc Mon Sep 17 00:00:00 2001 From: IrisZ64 Date: Sun, 14 Dec 2025 16:21:21 +0100 Subject: [PATCH] Fix apply button not turning grey after clicking on it. --- CMakeLists.txt | 5 ++ src/frontend/AudioSettings.cpp | 5 +- src/frontend/AudioSettings.hpp | 11 ++-- src/frontend/CPUSettings.cpp | 4 +- src/frontend/CPUSettings.hpp | 10 +--- src/frontend/ImGuiImpl/SettingsTab.hpp | 8 +++ src/frontend/SettingsWindow.cpp | 77 +++++++++++++------------- src/frontend/SettingsWindow.hpp | 31 +++++++++-- 8 files changed, 87 insertions(+), 64 deletions(-) create mode 100644 src/frontend/ImGuiImpl/SettingsTab.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 441e6208..3df9fe24 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,6 +144,11 @@ endif() target_link_libraries(kaizen PUBLIC imgui SDL3::SDL3 SDL3::SDL3-static cflags::cflags ${MIO_LIB} parallel-rdp capstone backend) target_compile_definitions(kaizen PUBLIC SDL_MAIN_HANDLED) +if (${CMAKE_BUILD_TYPE} MATCHES Debug) + target_compile_options(kaizen PUBLIC -fsanitize=undefined -fsanitize=address) + target_link_options(kaizen PUBLIC -fsanitize=undefined -fsanitize=address) +endif () + file(COPY resources/ DESTINATION ${PROJECT_BINARY_DIR}/resources/) file(REMOVE ${PROJECT_BINARY_DIR}/resources/mario.png diff --git a/src/frontend/AudioSettings.cpp b/src/frontend/AudioSettings.cpp index b13c7abb..2bb380f2 100644 --- a/src/frontend/AudioSettings.cpp +++ b/src/frontend/AudioSettings.cpp @@ -1,5 +1,6 @@ #include #include +#include AudioSettings::AudioSettings() { lockChannels = Options::GetInstance().GetValue("audio", "lock"); @@ -7,7 +8,7 @@ AudioSettings::AudioSettings() { volumeR = Options::GetInstance().GetValue("audio", "volumeR") * 100; } -bool AudioSettings::render() { +void AudioSettings::render() { if(ImGui::Checkbox("Lock channels:", &lockChannels)) { Options::GetInstance().SetValue("audio", "lock", lockChannels); if(lockChannels) { @@ -34,6 +35,4 @@ bool AudioSettings::render() { modified = true; } ImGui::EndDisabled(); - - return modified; } \ No newline at end of file diff --git a/src/frontend/AudioSettings.hpp b/src/frontend/AudioSettings.hpp index ef34dedf..59291994 100644 --- a/src/frontend/AudioSettings.hpp +++ b/src/frontend/AudioSettings.hpp @@ -1,14 +1,11 @@ #pragma once -#include +#include -class AudioSettings final { +struct AudioSettings final : SettingsTab { bool lockChannels = false; - bool modified = false; -public: float volumeL{}; float volumeR{}; + explicit AudioSettings(); - bool render(); - void setModified(bool v) { modified = v; } - bool getModified() { return modified; } + void render() override; }; diff --git a/src/frontend/CPUSettings.cpp b/src/frontend/CPUSettings.cpp index f32d8b94..0b7ee07c 100644 --- a/src/frontend/CPUSettings.cpp +++ b/src/frontend/CPUSettings.cpp @@ -11,7 +11,7 @@ CPUSettings::CPUSettings() { } } -bool CPUSettings::render() { +void CPUSettings::render() { const char* items[] = { "Interpreter", "Dynamic Recompiler" @@ -40,6 +40,4 @@ bool CPUSettings::render() { Options::GetInstance().SetValue("cpu", "type", "jit"); } } - - return modified; } diff --git a/src/frontend/CPUSettings.hpp b/src/frontend/CPUSettings.hpp index 63f4859c..11fd921f 100644 --- a/src/frontend/CPUSettings.hpp +++ b/src/frontend/CPUSettings.hpp @@ -1,12 +1,8 @@ #pragma once -#include +#include -class CPUSettings final { +struct CPUSettings final : SettingsTab { int selectedCpuTypeIndex = 0; - bool modified = false; -public: - bool render(); + void render() override; explicit CPUSettings(); - void setModified(bool v) { modified = v; } - bool getModified() { return modified; } }; diff --git a/src/frontend/ImGuiImpl/SettingsTab.hpp b/src/frontend/ImGuiImpl/SettingsTab.hpp new file mode 100644 index 00000000..de57919f --- /dev/null +++ b/src/frontend/ImGuiImpl/SettingsTab.hpp @@ -0,0 +1,8 @@ +#pragma once + +struct SettingsTab { + virtual ~SettingsTab() = default; + virtual void render() = 0; + + bool modified = false; +}; \ No newline at end of file diff --git a/src/frontend/SettingsWindow.cpp b/src/frontend/SettingsWindow.cpp index 953d1178..32f2de36 100644 --- a/src/frontend/SettingsWindow.cpp +++ b/src/frontend/SettingsWindow.cpp @@ -2,13 +2,42 @@ #include #include #include +#include + +void GeneralTab::render() { + if(ImGui::Button("Pick...")) { + SDL_ShowOpenFolderDialog([](void *userdata, const char * const *filelist, int _) { + auto* general = static_cast(userdata); + auto& settings = general->settingsWindow; + + if (!filelist) { + panic("An error occurred: {}", SDL_GetError()); + } + + if (!*filelist) { + warn("The user did not select any file."); + warn("Most likely, the dialog was canceled."); + general->modified = false; + return; + } + + settings.savesPath = *filelist; + Options::GetInstance().SetValue("general", "savePath", settings.savesPath); + general->modified = true; + }, this, settingsWindow.window.getHandle(), nullptr, false); + } + ImGui::SameLine(); + ImGui::BeginDisabled(); + ImGui::InputText("Save Path", const_cast(settingsWindow.savesPath.c_str()), settingsWindow.savesPath.length()); + ImGui::EndDisabled(); +} SettingsWindow::SettingsWindow(gui::NativeWindow& window) : window(window) { savesPath = Options::GetInstance().GetValue("general", "savePath"); } bool SettingsWindow::render() { - ImVec2 center = ImGui::GetMainViewport()->GetCenter(); + const ImVec2 center = ImGui::GetMainViewport()->GetCenter(); ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); if(!ImGui::BeginPopupModal("Settings", &isOpen)) @@ -17,46 +46,14 @@ bool SettingsWindow::render() { if(!ImGui::BeginTabBar("SettingsTabBar")) return false; - if(ImGui::BeginTabItem("General")) { - if(ImGui::Button("Pick...")) { - SDL_ShowOpenFolderDialog([](void *userdata, const char * const *filelist, int filter) { - SettingsWindow* settings = (SettingsWindow*)userdata; - - if (!filelist) { - panic("An error occured: {}", SDL_GetError()); - return; - } else if (!*filelist) { - warn("The user did not select any file."); - warn("Most likely, the dialog was canceled."); - return; - } - - settings->savesPath = *filelist; - Options::GetInstance().SetValue("general", "savePath", settings->savesPath); - settings->applyEnabled = true; - }, this, window.getHandle(), nullptr, false); - } - ImGui::SameLine(); - ImGui::BeginDisabled(); - ImGui::InputText("Save Path", (char*)savesPath.c_str(), savesPath.length()); - ImGui::EndDisabled(); - ImGui::EndTabItem(); - } - - if(ImGui::BeginTabItem("Core")) { - if(cpuSettings.render()) { - if(cpuSettings.getModified()) + for (auto& [name, tab] : tabs) { + if (ImGui::BeginTabItem(name.c_str())) { + tab->render(); + if (tab->modified && !applyEnabled) applyEnabled = true; - } - ImGui::EndTabItem(); - } - if(ImGui::BeginTabItem("Audio")) { - if(audioSettings.render()) { - if(audioSettings.getModified()) - applyEnabled = true; + ImGui::EndTabItem(); } - ImGui::EndTabItem(); } ImGui::EndTabBar(); @@ -65,6 +62,10 @@ bool SettingsWindow::render() { if(ImGui::Button("Apply")) { applyEnabled = false; Options::GetInstance().Apply(); + + for (auto &tab : tabs | std::views::values) { + tab->modified = false; + } } ImGui::EndDisabled(); diff --git a/src/frontend/SettingsWindow.hpp b/src/frontend/SettingsWindow.hpp index 1dc5aaf1..c881ebde 100644 --- a/src/frontend/SettingsWindow.hpp +++ b/src/frontend/SettingsWindow.hpp @@ -2,18 +2,37 @@ #include #include #include -#include +#include + +class SettingsWindow; + +struct GeneralTab : SettingsTab { + explicit GeneralTab(SettingsWindow &window) : settingsWindow(window) {} + void render() override; +private: + SettingsWindow& settingsWindow; +}; class SettingsWindow final { - AudioSettings audioSettings; +public: + CPUSettings* cpuSettings = new CPUSettings; +private: + AudioSettings* audioSettings = new AudioSettings; + GeneralTab* generalSettings = new GeneralTab(*this); std::string savesPath; bool applyEnabled = false; gui::NativeWindow& window; + std::vector> tabs = { + { "General", generalSettings }, + { "CPU", cpuSettings }, + { "Audio", audioSettings }, + }; + + friend struct GeneralTab; public: - CPUSettings cpuSettings; bool isOpen = false; bool render(); - SettingsWindow(gui::NativeWindow& window); - [[nodiscard]] float getVolumeL() const { return audioSettings.volumeL / 100.f; } - [[nodiscard]] float getVolumeR() const { return audioSettings.volumeR / 100.f; } + explicit SettingsWindow(gui::NativeWindow& window); + [[nodiscard]] float getVolumeL() const { return audioSettings->volumeL / 100.f; } + [[nodiscard]] float getVolumeR() const { return audioSettings->volumeR / 100.f; } };