diff --git a/data/locale/ca.yaml b/data/locale/ca.yaml index 565aeab..a49f63b 100644 --- a/data/locale/ca.yaml +++ b/data/locale/ca.yaml @@ -61,6 +61,9 @@ service_menu: video_vsync: "VSYNC" video_aa: "ANTIALIAS" video_postfx: "POSTPROCESSAT" + # Items del submenu OPCIONS + options_language: "IDIOMA" + options_show_info: "MOSTRAR INFO" # Items del submenu AUDIO audio_master: "AUDIO" audio_master_volume: "VOLUM GENERAL" diff --git a/data/locale/en.yaml b/data/locale/en.yaml index d107c96..a10340e 100644 --- a/data/locale/en.yaml +++ b/data/locale/en.yaml @@ -60,6 +60,9 @@ service_menu: video_vsync: "VSYNC" video_aa: "ANTIALIAS" video_postfx: "POSTPROCESS" + # Items of OPTIONS submenu + options_language: "LANGUAGE" + options_show_info: "SHOW INFO" # Items of AUDIO submenu audio_master: "AUDIO" audio_master_volume: "MASTER VOLUME" diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index 0094ce1..0422a14 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -166,7 +166,7 @@ Director::Director(int argc, char* argv[]) cfg_->rendering); System::Notifier::init(sdl_->getRenderer()); - System::ServiceMenu::init(sdl_->getRenderer(), sdl_.get()); + System::ServiceMenu::init(sdl_->getRenderer(), sdl_.get(), debug_overlay_.get()); last_ticks_ms_ = SDL_GetTicks(); } diff --git a/source/core/system/service_menu.cpp b/source/core/system/service_menu.cpp index a2d6819..5e5cef6 100644 --- a/source/core/system/service_menu.cpp +++ b/source/core/system/service_menu.cpp @@ -15,6 +15,7 @@ #include "core/defaults/service_menu.hpp" #include "core/locale/locale.hpp" #include "core/rendering/sdl_manager.hpp" +#include "core/system/debug_overlay.hpp" #include "core/types.hpp" #include "game/config_yaml.hpp" @@ -55,8 +56,8 @@ namespace System { std::unique_ptr ServiceMenu::instance; - void ServiceMenu::init(Rendering::Renderer* renderer, SDLManager* sdl) { - instance.reset(new ServiceMenu(renderer, sdl)); + void ServiceMenu::init(Rendering::Renderer* renderer, SDLManager* sdl, DebugOverlay* debug_overlay) { + instance.reset(new ServiceMenu(renderer, sdl, debug_overlay)); } void ServiceMenu::destroy() { @@ -67,9 +68,10 @@ namespace System { return instance.get(); } - ServiceMenu::ServiceMenu(Rendering::Renderer* renderer, SDLManager* sdl) + ServiceMenu::ServiceMenu(Rendering::Renderer* renderer, SDLManager* sdl, DebugOverlay* debug_overlay) : renderer_(renderer), sdl_(sdl), + debug_overlay_(debug_overlay), text_(renderer) {} auto ServiceMenu::isOpen() const -> bool { @@ -118,7 +120,7 @@ namespace System { root.items = { makeSubmenu("service_menu.video", [this] { pushPage(buildVideoPage()); }), makeSubmenu("service_menu.audio", [this] { pushPage(buildAudioPage()); }), - makeSubmenu("service_menu.options", [this] { pushSubmenuPlaceholder("service_menu.options"); }), + makeSubmenu("service_menu.options", [this] { pushPage(buildOptionsPage()); }), makeSubmenu("service_menu.system", [this] { pushSubmenuPlaceholder("service_menu.system"); }), }; stack_.clear(); @@ -304,6 +306,46 @@ namespace System { return page; } + auto ServiceMenu::buildOptionsPage() const -> Page { + auto on_off_text = [](bool v) -> std::string { + return Locale::get().text(v ? "service_menu.value_on" : "service_menu.value_off"); + }; + + DebugOverlay* debug = debug_overlay_; + + Page page; + page.title_key = "service_menu.options"; + page.items = { + // IDIOMA (cycle entre ca i en, mateix codi que F7). + Item{ + .kind = Kind::CYCLE, + .label_key = "service_menu.options_language", + .selectable = true, + .on_activate = {}, + .get_value_text = [] { return Locale::get().text("language." + ConfigYaml::engine_config.locale); }, + .on_change = [](int) { + const std::string NEW_LANG = (ConfigYaml::engine_config.locale == "ca") ? "en" : "ca"; + if (Locale::get().switchTo(NEW_LANG)) { + ConfigYaml::engine_config.locale = NEW_LANG; + ConfigYaml::saveToFile(); + } }, + }, + // MOSTRAR INFO (debug overlay, equivalent a F11). + Item{ + .kind = Kind::TOGGLE, + .label_key = "service_menu.options_show_info", + .selectable = true, + .on_activate = {}, + .get_value_text = [debug, on_off_text] { return on_off_text(debug != nullptr && debug->isVisible()); }, + .on_change = [debug](int) { + if (debug != nullptr) { + debug->toggle(); + } }, + }, + }; + return page; + } + void ServiceMenu::pushPage(Page page) { stack_.push_back(std::move(page)); // El cursor salta a una pagina nova: enganxem el highlight per a diff --git a/source/core/system/service_menu.hpp b/source/core/system/service_menu.hpp index 24210cc..3c8d128 100644 --- a/source/core/system/service_menu.hpp +++ b/source/core/system/service_menu.hpp @@ -32,6 +32,8 @@ class SDLManager; namespace System { + class DebugOverlay; + class ServiceMenu { public: // Tipus d'item de menu. En aquesta iteracio nomes s'usen SUBMENU i @@ -64,10 +66,10 @@ namespace System { std::size_t cursor = 0; }; - // Inicialitza el singleton amb el renderer global i l'SDLManager (per - // a operar amb video toggles: fullscreen, vsync, AA, postfx, zoom). - // Tots dos son propietat del Director i sobreviuen al menu. - static void init(Rendering::Renderer* renderer, SDLManager* sdl); + // Inicialitza el singleton amb el renderer global, l'SDLManager (video + // toggles: fullscreen, vsync, AA, postfx, zoom) i el DebugOverlay + // (toggle del HUD de debug a OPCIONS). Tots propietat del Director. + static void init(Rendering::Renderer* renderer, SDLManager* sdl, DebugOverlay* debug_overlay); static void destroy(); [[nodiscard]] static auto get() -> ServiceMenu*; @@ -83,12 +85,13 @@ namespace System { auto handleEvent(const SDL_Event& event) -> bool; private: - ServiceMenu(Rendering::Renderer* renderer, SDLManager* sdl); + ServiceMenu(Rendering::Renderer* renderer, SDLManager* sdl, DebugOverlay* debug_overlay); void buildRootPage(); void pushSubmenuPlaceholder(const std::string& title_key); [[nodiscard]] auto buildVideoPage() const -> Page; [[nodiscard]] static auto buildAudioPage() -> Page; + [[nodiscard]] auto buildOptionsPage() const -> Page; void pushPage(Page page); void popPage(); void moveCursor(int direction); @@ -105,6 +108,7 @@ namespace System { Rendering::Renderer* renderer_; SDLManager* sdl_; + DebugOverlay* debug_overlay_; Graphics::VectorText text_; std::vector stack_;