feat(service-menu): pobla OPCIONS amb idioma i toggle del HUD de debug

This commit is contained in:
2026-05-24 11:56:11 +02:00
parent 56d7d4af52
commit 8c21345f14
5 changed files with 62 additions and 10 deletions
+3
View File
@@ -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"
+3
View File
@@ -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"
+1 -1
View File
@@ -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();
}
+46 -4
View File
@@ -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> 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
+9 -5
View File
@@ -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<Page> stack_;