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
+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