From 51f7868272a1b3535319d4dcb890213cc0c2bb93 Mon Sep 17 00:00:00 2001 From: SimoneN64 Date: Mon, 23 Oct 2023 14:42:11 +0200 Subject: [PATCH] nicer gui --- src/frontend/Language.cpp | 4 +- src/frontend/Language.hpp | 84 ++++++++++++----------- src/frontend/imgui/Settings.cpp | 117 ++++++++++++++++++-------------- src/frontend/imgui/Settings.hpp | 4 +- src/frontend/imgui/Window.cpp | 11 +-- 5 files changed, 120 insertions(+), 100 deletions(-) diff --git a/src/frontend/Language.cpp b/src/frontend/Language.cpp index 9473d250..f88df5ab 100644 --- a/src/frontend/Language.cpp +++ b/src/frontend/Language.cpp @@ -1,8 +1,8 @@ #include namespace Language { -void SetLanguage(std::array& lang, int selectedLang) { - switch (selectedLang) { +void SetLanguage(std::map& lang, int selectedLang) { + switch (selectedLang) { case AvailableLangs::ENGLISH: lang = english; break; case AvailableLangs::ITALIAN: lang = italian; break; default: Util::panic("Language not supported, index {}\n", selectedLang); diff --git a/src/frontend/Language.hpp b/src/frontend/Language.hpp index 606b5006..9c058d37 100644 --- a/src/frontend/Language.hpp +++ b/src/frontend/Language.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include #include namespace Language { @@ -23,49 +24,52 @@ enum StringID { SETTINGS_OPTION_LOCK_CHANNELS, SETTINGS_OPTION_ENABLE_JIT, SETTINGS_OPTION_LANGUAGE, + SETTINGS_CLOSE, STRING_COUNT }; -static const std::array english = { - "File", - "Open", - "Exit", - "Emulation", - "Reset", - "Stop", - "Pause", - "Resume", - "Settings", - "CPU", - "Audio", - "Interface", - "Mute", - "Volume L", - "Volume R", - "Lock channels", - "Enable JIT", - "Language" +static const std::map english = { + {MENU_FILE, "File"}, + {FILE_ITEM_OPEN, "Open"}, + {FILE_ITEM_EXIT, "Exit"}, + {MENU_EMULATION, "Emulation"}, + {EMULATION_ITEM_RESET, "Reset"}, + {EMULATION_ITEM_STOP, "Stop"}, + {EMULATION_ITEM_PAUSE, "Pause"}, + {EMULATION_ITEM_RESUME, "Resume"}, + {EMULATION_ITEM_SETTINGS, "Settings"}, + {SETTINGS_CATEGORY_CPU, "CPU"}, + {SETTINGS_CATEGORY_AUDIO, "Audio"}, + {SETTINGS_CATEGORY_INTERFACE, "Interface"}, + {SETTINGS_OPTION_MUTE, "Mute"}, + {SETTINGS_OPTION_VOLUME_L, "Volume L"}, + {SETTINGS_OPTION_VOLUME_R, "Volume R"}, + {SETTINGS_OPTION_LOCK_CHANNELS, "Lock channels"}, + {SETTINGS_OPTION_ENABLE_JIT, "Enable JIT"}, + {SETTINGS_OPTION_LANGUAGE, "Language"}, + {SETTINGS_CLOSE, "Close"} }; -static const std::array italian = { - "File", - "Apri", - "Esci", - "Emulazione", - "Reset", - "Stop", - "Pausa", - "Riprendi", - "Impostazioni", - "CPU", - "Audio", - "Interfaccia", - "Muto", - "Volume L", - "Volume R", - "Blocca canali", - "Abilita JIT", - "Lingua" +static const std::map italian = { + {MENU_FILE, "File"}, + {FILE_ITEM_OPEN, "Apri"}, + {FILE_ITEM_EXIT, "Esci"}, + {MENU_EMULATION, "Emulazione"}, + {EMULATION_ITEM_RESET, "Reset"}, + {EMULATION_ITEM_STOP, "Stop"}, + {EMULATION_ITEM_PAUSE, "Pausa"}, + {EMULATION_ITEM_RESUME, "Riprendi"}, + {EMULATION_ITEM_SETTINGS, "Opzioni"}, + {SETTINGS_CATEGORY_CPU, "CPU"}, + {SETTINGS_CATEGORY_AUDIO, "Audio"}, + {SETTINGS_CATEGORY_INTERFACE, "Interfaccia"}, + {SETTINGS_OPTION_MUTE, "Muta"}, + {SETTINGS_OPTION_VOLUME_L, "Volume L"}, + {SETTINGS_OPTION_VOLUME_R, "Volume R"}, + {SETTINGS_OPTION_LOCK_CHANNELS, "Blocca canali"}, + {SETTINGS_OPTION_ENABLE_JIT, "Abilita JIT"}, + {SETTINGS_OPTION_LANGUAGE, "Lingua"}, + {SETTINGS_CLOSE, "Chiudi"} }; enum AvailableLangs { @@ -74,10 +78,10 @@ enum AvailableLangs { AVAILABLE_LANGS_COUNT }; -static const std::array languages = { +static const std::array languages = { "English", "Italiano" }; -void SetLanguage(std::array& lang, int selectedLang); +void SetLanguage(std::map& lang, int selectedLang); } \ No newline at end of file diff --git a/src/frontend/imgui/Settings.cpp b/src/frontend/imgui/Settings.cpp index a1985778..9cb279ce 100644 --- a/src/frontend/imgui/Settings.cpp +++ b/src/frontend/imgui/Settings.cpp @@ -5,7 +5,7 @@ #include namespace fs = std::filesystem; -#define GET_TRANSLATED_STRING(x) languageStrings[(x)].c_str() +#define GET_TRANSLATED_STRING(x) languageStrings[(x)] #define checknestedjsonentry(name, type, param1, param2, defaultVal) \ do { \ @@ -99,71 +99,84 @@ Settings::~Settings() { settingsFile.close(); } -void Settings::RenderWidget(bool& show) { +void Settings::RenderWidget(const int& mWw, const int& mWh, bool& show) { if(show) { - ImGui::OpenPopup(GET_TRANSLATED_STRING(Language::EMULATION_ITEM_SETTINGS)); - if(ImGui::BeginPopupModal(GET_TRANSLATED_STRING(Language::EMULATION_ITEM_SETTINGS), &show)) { - enum class SelectedSetting { CPU, Audio, Interface, COUNT }; - static SelectedSetting selectedSetting = SelectedSetting::CPU; - const char *categories[(int)SelectedSetting::COUNT] = { - GET_TRANSLATED_STRING(Language::SETTINGS_CATEGORY_CPU), - GET_TRANSLATED_STRING(Language::SETTINGS_CATEGORY_AUDIO), - GET_TRANSLATED_STRING(Language::SETTINGS_CATEGORY_INTERFACE)}; + ImGui::OpenPopup("##settings"); + const float posX = (float)mWw * (1.f / 32.f), posY = (float)mWh * (1.f / 32.f) + 20; + const float sizeX = (float)mWw * (30.f / 32.f), sizeY = (float)mWh * (30.f / 32.f) - 20; + ImGui::SetNextWindowPos({ posX, posY }); + ImGui::SetNextWindowSize({ sizeX, sizeY }); + if(ImGui::BeginPopupModal("##settings", &show, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) { + if (ImGui::BeginTabBar("##categories")) { + if (ImGui::BeginTabItem(GET_TRANSLATED_STRING(Language::SETTINGS_CATEGORY_CPU))) { + ImGui::Checkbox(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_ENABLE_JIT), &jit); + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem(GET_TRANSLATED_STRING(Language::SETTINGS_CATEGORY_AUDIO))) { + ImGui::Checkbox(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_LOCK_CHANNELS), &lockChannels); + ImGui::Checkbox(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_MUTE), &mute); + if (mute) { + volumeL = 0; + volumeR = 0; - CreateComboList("##categories", (int*)&selectedSetting, categories, (int)SelectedSetting::COUNT); - ImGui::Separator(); - switch (selectedSetting) { - case SelectedSetting::Audio: - ImGui::Checkbox(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_LOCK_CHANNELS), &lockChannels); - ImGui::Checkbox(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_MUTE), &mute); - if(mute) { - volumeL = 0; - volumeR = 0; + ImGui::BeginDisabled(); + ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_L), &oldVolumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput); + if (lockChannels) { + oldVolumeR = oldVolumeL; + } + ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_R), &oldVolumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput); + ImGui::EndDisabled(); + } + else { + volumeL = oldVolumeL; + volumeR = oldVolumeR; - ImGui::BeginDisabled(); - ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_L), &oldVolumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput); - if (lockChannels) { - oldVolumeR = oldVolumeL; - } - ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_R), &oldVolumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput); - ImGui::EndDisabled(); + ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_L), &volumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput); + if (!lockChannels) { + ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_R), &volumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput); } else { - volumeL = oldVolumeL; - volumeR = oldVolumeR; - - ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_L), &volumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput); - if (!lockChannels) { - ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_R), &volumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput); - } - else { - volumeR = volumeL; - ImGui::BeginDisabled(); - ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_R), &volumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput); - ImGui::EndDisabled(); - } - - oldVolumeL = volumeL; - oldVolumeR = volumeR; + volumeR = volumeL; + ImGui::BeginDisabled(); + ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_R), &volumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput); + ImGui::EndDisabled(); } - break; - case SelectedSetting::CPU: - ImGui::Checkbox(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_ENABLE_JIT), &jit); - break; - case SelectedSetting::Interface: { + oldVolumeL = volumeL; + oldVolumeR = volumeR; + } + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem(GET_TRANSLATED_STRING(Language::SETTINGS_CATEGORY_INTERFACE))) { + static auto currentLang = selectedLanguage; const char* languages[Language::AVAILABLE_LANGS_COUNT] = { - Language::languages[Language::ENGLISH].c_str(), - Language::languages[Language::ITALIAN].c_str() + Language::languages[Language::ENGLISH], + Language::languages[Language::ITALIAN] }; ImGui::Text("%s:", GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_LANGUAGE)); CreateComboList("##language", (int*)&selectedLanguage, languages, (int)Language::AVAILABLE_LANGS_COUNT); ImGui::Separator(); - } break; - case SelectedSetting::COUNT: - Util::panic("BRUH"); + + if (currentLang != selectedLanguage) { + currentLang = selectedLanguage; + Language::SetLanguage(languageStrings, selectedLanguage); + } + + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); } + const auto style = ImGui::GetStyle(); + ImGui::SetCursorPos({ + ImGui::GetWindowWidth() - ImGui::CalcTextSize(GET_TRANSLATED_STRING(Language::SETTINGS_CLOSE)).x - style.FramePadding.x * 5, + ImGui::GetWindowHeight() - ImGui::CalcTextSize(GET_TRANSLATED_STRING(Language::SETTINGS_CLOSE)).y - style.FramePadding.y * 5, + }); + if (ImGui::Button(GET_TRANSLATED_STRING(Language::SETTINGS_CLOSE))) show = false; + ImGui::EndPopup(); } } diff --git a/src/frontend/imgui/Settings.hpp b/src/frontend/imgui/Settings.hpp index d4b33bf9..c076932d 100644 --- a/src/frontend/imgui/Settings.hpp +++ b/src/frontend/imgui/Settings.hpp @@ -12,8 +12,8 @@ struct Settings { [[nodiscard]] FORCE_INLINE float GetVolumeL() const { return volumeL; }; [[nodiscard]] FORCE_INLINE float GetVolumeR() const { return volumeR; }; - void RenderWidget(bool& show); - std::array languageStrings{}; + void RenderWidget(const int& mWw, const int& mWh, bool& show); + std::map languageStrings{}; private: bool jit = false; float volumeL, volumeR; diff --git a/src/frontend/imgui/Window.cpp b/src/frontend/imgui/Window.cpp index b7ad5947..e04e7c4e 100644 --- a/src/frontend/imgui/Window.cpp +++ b/src/frontend/imgui/Window.cpp @@ -7,7 +7,7 @@ VkInstance instance{}; namespace fs = std::filesystem; -#define GET_TRANSLATED_STRING(x) settings.languageStrings[(x)].c_str() +#define GET_TRANSLATED_STRING(x) settings.languageStrings[(x)] Window::Window(n64::Core& core) : settings(core) { InitSDL(); @@ -17,11 +17,11 @@ Window::Window(n64::Core& core) : settings(core) { } void Window::handleEvents(SDL_Event event, n64::Core& core) { - done = event.window.event == SDL_WINDOWEVENT_CLOSE + done = event.window.event == (u8)SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window); bool minimized = SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED; - core.pause = event.window.event == SDL_WINDOWEVENT_FOCUS_LOST || minimized; + core.pause = event.window.event == (u8)SDL_WINDOWEVENT_FOCUS_LOST || minimized; core.render = !minimized; } @@ -244,7 +244,10 @@ void Window::Render(n64::Core& core) { RenderMainMenuBar(core); } - settings.RenderWidget(showSettings); + int w, h; + SDL_GetWindowSize(window, &w, &h); + + settings.RenderWidget(w, h, showSettings); ImGui::PopFont(); }