feat(service-menu): pobla OPCIONS amb idioma i toggle del HUD de debug
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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_;
|
||||
|
||||
Reference in New Issue
Block a user