nicer gui

This commit is contained in:
SimoneN64
2023-10-23 14:42:11 +02:00
parent 7358fa3fe7
commit 51f7868272
5 changed files with 120 additions and 100 deletions

View File

@@ -1,7 +1,7 @@
#include <Language.hpp>
namespace Language {
void SetLanguage(std::array<std::string, STRING_COUNT>& lang, int selectedLang) {
void SetLanguage(std::map<StringID, const char*>& lang, int selectedLang) {
switch (selectedLang) {
case AvailableLangs::ENGLISH: lang = english; break;
case AvailableLangs::ITALIAN: lang = italian; break;

View File

@@ -1,5 +1,6 @@
#pragma once
#include <log.hpp>
#include <map>
#include <array>
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<std::string, STRING_COUNT> 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 <StringID, const char*> 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<std::string, STRING_COUNT> 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 <StringID, const char*> 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<std::string, AVAILABLE_LANGS_COUNT> languages = {
static const std::array<const char*, AVAILABLE_LANGS_COUNT> languages = {
"English",
"Italiano"
};
void SetLanguage(std::array<std::string, STRING_COUNT>& lang, int selectedLang);
void SetLanguage(std::map<StringID, const char*>& lang, int selectedLang);
}

View File

@@ -5,7 +5,7 @@
#include <Core.hpp>
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,24 +99,24 @@ 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();
}
CreateComboList("##categories", (int*)&selectedSetting, categories, (int)SelectedSetting::COUNT);
ImGui::Separator();
switch (selectedSetting) {
case SelectedSetting::Audio:
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) {
if (mute) {
volumeL = 0;
volumeR = 0;
@@ -147,23 +147,36 @@ void Settings::RenderWidget(bool& show) {
oldVolumeR = volumeR;
}
break;
case SelectedSetting::CPU:
ImGui::Checkbox(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_ENABLE_JIT), &jit);
break;
case SelectedSetting::Interface: {
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();
}
}

View File

@@ -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<std::string, Language::STRING_COUNT> languageStrings{};
void RenderWidget(const int& mWw, const int& mWh, bool& show);
std::map<Language::StringID, const char*> languageStrings{};
private:
bool jit = false;
float volumeL, volumeR;

View File

@@ -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();
}