nicer gui
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
#include <Language.hpp>
|
#include <Language.hpp>
|
||||||
|
|
||||||
namespace Language {
|
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) {
|
switch (selectedLang) {
|
||||||
case AvailableLangs::ENGLISH: lang = english; break;
|
case AvailableLangs::ENGLISH: lang = english; break;
|
||||||
case AvailableLangs::ITALIAN: lang = italian; break;
|
case AvailableLangs::ITALIAN: lang = italian; break;
|
||||||
default: Util::panic("Language not supported, index {}\n", selectedLang);
|
default: Util::panic("Language not supported, index {}\n", selectedLang);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <log.hpp>
|
#include <log.hpp>
|
||||||
|
#include <map>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
namespace Language {
|
namespace Language {
|
||||||
@@ -23,49 +24,52 @@ enum StringID {
|
|||||||
SETTINGS_OPTION_LOCK_CHANNELS,
|
SETTINGS_OPTION_LOCK_CHANNELS,
|
||||||
SETTINGS_OPTION_ENABLE_JIT,
|
SETTINGS_OPTION_ENABLE_JIT,
|
||||||
SETTINGS_OPTION_LANGUAGE,
|
SETTINGS_OPTION_LANGUAGE,
|
||||||
|
SETTINGS_CLOSE,
|
||||||
STRING_COUNT
|
STRING_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
static const std::array<std::string, STRING_COUNT> english = {
|
static const std::map <StringID, const char*> english = {
|
||||||
"File",
|
{MENU_FILE, "File"},
|
||||||
"Open",
|
{FILE_ITEM_OPEN, "Open"},
|
||||||
"Exit",
|
{FILE_ITEM_EXIT, "Exit"},
|
||||||
"Emulation",
|
{MENU_EMULATION, "Emulation"},
|
||||||
"Reset",
|
{EMULATION_ITEM_RESET, "Reset"},
|
||||||
"Stop",
|
{EMULATION_ITEM_STOP, "Stop"},
|
||||||
"Pause",
|
{EMULATION_ITEM_PAUSE, "Pause"},
|
||||||
"Resume",
|
{EMULATION_ITEM_RESUME, "Resume"},
|
||||||
"Settings",
|
{EMULATION_ITEM_SETTINGS, "Settings"},
|
||||||
"CPU",
|
{SETTINGS_CATEGORY_CPU, "CPU"},
|
||||||
"Audio",
|
{SETTINGS_CATEGORY_AUDIO, "Audio"},
|
||||||
"Interface",
|
{SETTINGS_CATEGORY_INTERFACE, "Interface"},
|
||||||
"Mute",
|
{SETTINGS_OPTION_MUTE, "Mute"},
|
||||||
"Volume L",
|
{SETTINGS_OPTION_VOLUME_L, "Volume L"},
|
||||||
"Volume R",
|
{SETTINGS_OPTION_VOLUME_R, "Volume R"},
|
||||||
"Lock channels",
|
{SETTINGS_OPTION_LOCK_CHANNELS, "Lock channels"},
|
||||||
"Enable JIT",
|
{SETTINGS_OPTION_ENABLE_JIT, "Enable JIT"},
|
||||||
"Language"
|
{SETTINGS_OPTION_LANGUAGE, "Language"},
|
||||||
|
{SETTINGS_CLOSE, "Close"}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const std::array<std::string, STRING_COUNT> italian = {
|
static const std::map <StringID, const char*> italian = {
|
||||||
"File",
|
{MENU_FILE, "File"},
|
||||||
"Apri",
|
{FILE_ITEM_OPEN, "Apri"},
|
||||||
"Esci",
|
{FILE_ITEM_EXIT, "Esci"},
|
||||||
"Emulazione",
|
{MENU_EMULATION, "Emulazione"},
|
||||||
"Reset",
|
{EMULATION_ITEM_RESET, "Reset"},
|
||||||
"Stop",
|
{EMULATION_ITEM_STOP, "Stop"},
|
||||||
"Pausa",
|
{EMULATION_ITEM_PAUSE, "Pausa"},
|
||||||
"Riprendi",
|
{EMULATION_ITEM_RESUME, "Riprendi"},
|
||||||
"Impostazioni",
|
{EMULATION_ITEM_SETTINGS, "Opzioni"},
|
||||||
"CPU",
|
{SETTINGS_CATEGORY_CPU, "CPU"},
|
||||||
"Audio",
|
{SETTINGS_CATEGORY_AUDIO, "Audio"},
|
||||||
"Interfaccia",
|
{SETTINGS_CATEGORY_INTERFACE, "Interfaccia"},
|
||||||
"Muto",
|
{SETTINGS_OPTION_MUTE, "Muta"},
|
||||||
"Volume L",
|
{SETTINGS_OPTION_VOLUME_L, "Volume L"},
|
||||||
"Volume R",
|
{SETTINGS_OPTION_VOLUME_R, "Volume R"},
|
||||||
"Blocca canali",
|
{SETTINGS_OPTION_LOCK_CHANNELS, "Blocca canali"},
|
||||||
"Abilita JIT",
|
{SETTINGS_OPTION_ENABLE_JIT, "Abilita JIT"},
|
||||||
"Lingua"
|
{SETTINGS_OPTION_LANGUAGE, "Lingua"},
|
||||||
|
{SETTINGS_CLOSE, "Chiudi"}
|
||||||
};
|
};
|
||||||
|
|
||||||
enum AvailableLangs {
|
enum AvailableLangs {
|
||||||
@@ -74,10 +78,10 @@ enum AvailableLangs {
|
|||||||
AVAILABLE_LANGS_COUNT
|
AVAILABLE_LANGS_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
static const std::array<std::string, AVAILABLE_LANGS_COUNT> languages = {
|
static const std::array<const char*, AVAILABLE_LANGS_COUNT> languages = {
|
||||||
"English",
|
"English",
|
||||||
"Italiano"
|
"Italiano"
|
||||||
};
|
};
|
||||||
|
|
||||||
void SetLanguage(std::array<std::string, STRING_COUNT>& lang, int selectedLang);
|
void SetLanguage(std::map<StringID, const char*>& lang, int selectedLang);
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
#include <Core.hpp>
|
#include <Core.hpp>
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
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) \
|
#define checknestedjsonentry(name, type, param1, param2, defaultVal) \
|
||||||
do { \
|
do { \
|
||||||
@@ -99,71 +99,84 @@ Settings::~Settings() {
|
|||||||
settingsFile.close();
|
settingsFile.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Settings::RenderWidget(bool& show) {
|
void Settings::RenderWidget(const int& mWw, const int& mWh, bool& show) {
|
||||||
if(show) {
|
if(show) {
|
||||||
ImGui::OpenPopup(GET_TRANSLATED_STRING(Language::EMULATION_ITEM_SETTINGS));
|
ImGui::OpenPopup("##settings");
|
||||||
if(ImGui::BeginPopupModal(GET_TRANSLATED_STRING(Language::EMULATION_ITEM_SETTINGS), &show)) {
|
const float posX = (float)mWw * (1.f / 32.f), posY = (float)mWh * (1.f / 32.f) + 20;
|
||||||
enum class SelectedSetting { CPU, Audio, Interface, COUNT };
|
const float sizeX = (float)mWw * (30.f / 32.f), sizeY = (float)mWh * (30.f / 32.f) - 20;
|
||||||
static SelectedSetting selectedSetting = SelectedSetting::CPU;
|
ImGui::SetNextWindowPos({ posX, posY });
|
||||||
const char *categories[(int)SelectedSetting::COUNT] = {
|
ImGui::SetNextWindowSize({ sizeX, sizeY });
|
||||||
GET_TRANSLATED_STRING(Language::SETTINGS_CATEGORY_CPU),
|
if(ImGui::BeginPopupModal("##settings", &show, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) {
|
||||||
GET_TRANSLATED_STRING(Language::SETTINGS_CATEGORY_AUDIO),
|
if (ImGui::BeginTabBar("##categories")) {
|
||||||
GET_TRANSLATED_STRING(Language::SETTINGS_CATEGORY_INTERFACE)};
|
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::BeginDisabled();
|
||||||
ImGui::Separator();
|
ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_L), &oldVolumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
||||||
switch (selectedSetting) {
|
if (lockChannels) {
|
||||||
case SelectedSetting::Audio:
|
oldVolumeR = oldVolumeL;
|
||||||
ImGui::Checkbox(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_LOCK_CHANNELS), &lockChannels);
|
}
|
||||||
ImGui::Checkbox(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_MUTE), &mute);
|
ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_R), &oldVolumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
||||||
if(mute) {
|
ImGui::EndDisabled();
|
||||||
volumeL = 0;
|
}
|
||||||
volumeR = 0;
|
else {
|
||||||
|
volumeL = oldVolumeL;
|
||||||
|
volumeR = oldVolumeR;
|
||||||
|
|
||||||
ImGui::BeginDisabled();
|
ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_L), &volumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
||||||
ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_L), &oldVolumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
if (!lockChannels) {
|
||||||
if (lockChannels) {
|
ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_R), &volumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
||||||
oldVolumeR = oldVolumeL;
|
|
||||||
}
|
|
||||||
ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_R), &oldVolumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
|
||||||
ImGui::EndDisabled();
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
volumeL = oldVolumeL;
|
volumeR = volumeL;
|
||||||
volumeR = oldVolumeR;
|
ImGui::BeginDisabled();
|
||||||
|
ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_R), &volumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
||||||
ImGui::SliderFloat(GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_VOLUME_L), &volumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
ImGui::EndDisabled();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
oldVolumeL = volumeL;
|
||||||
case SelectedSetting::CPU:
|
oldVolumeR = volumeR;
|
||||||
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] = {
|
const char* languages[Language::AVAILABLE_LANGS_COUNT] = {
|
||||||
Language::languages[Language::ENGLISH].c_str(),
|
Language::languages[Language::ENGLISH],
|
||||||
Language::languages[Language::ITALIAN].c_str()
|
Language::languages[Language::ITALIAN]
|
||||||
};
|
};
|
||||||
ImGui::Text("%s:", GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_LANGUAGE));
|
ImGui::Text("%s:", GET_TRANSLATED_STRING(Language::SETTINGS_OPTION_LANGUAGE));
|
||||||
CreateComboList("##language", (int*)&selectedLanguage, languages, (int)Language::AVAILABLE_LANGS_COUNT);
|
CreateComboList("##language", (int*)&selectedLanguage, languages, (int)Language::AVAILABLE_LANGS_COUNT);
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
} break;
|
|
||||||
case SelectedSetting::COUNT:
|
if (currentLang != selectedLanguage) {
|
||||||
Util::panic("BRUH");
|
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();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ struct Settings {
|
|||||||
[[nodiscard]] FORCE_INLINE float GetVolumeL() const { return volumeL; };
|
[[nodiscard]] FORCE_INLINE float GetVolumeL() const { return volumeL; };
|
||||||
[[nodiscard]] FORCE_INLINE float GetVolumeR() const { return volumeR; };
|
[[nodiscard]] FORCE_INLINE float GetVolumeR() const { return volumeR; };
|
||||||
|
|
||||||
void RenderWidget(bool& show);
|
void RenderWidget(const int& mWw, const int& mWh, bool& show);
|
||||||
std::array<std::string, Language::STRING_COUNT> languageStrings{};
|
std::map<Language::StringID, const char*> languageStrings{};
|
||||||
private:
|
private:
|
||||||
bool jit = false;
|
bool jit = false;
|
||||||
float volumeL, volumeR;
|
float volumeL, volumeR;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
VkInstance instance{};
|
VkInstance instance{};
|
||||||
namespace fs = std::filesystem;
|
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) {
|
Window::Window(n64::Core& core) : settings(core) {
|
||||||
InitSDL();
|
InitSDL();
|
||||||
@@ -17,11 +17,11 @@ Window::Window(n64::Core& core) : settings(core) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Window::handleEvents(SDL_Event event, n64::Core& 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);
|
&& event.window.windowID == SDL_GetWindowID(window);
|
||||||
|
|
||||||
bool minimized = SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED;
|
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;
|
core.render = !minimized;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,7 +244,10 @@ void Window::Render(n64::Core& core) {
|
|||||||
RenderMainMenuBar(core);
|
RenderMainMenuBar(core);
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.RenderWidget(showSettings);
|
int w, h;
|
||||||
|
SDL_GetWindowSize(window, &w, &h);
|
||||||
|
|
||||||
|
settings.RenderWidget(w, h, showSettings);
|
||||||
|
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user