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_vsync: "VSYNC"
|
||||||
video_aa: "ANTIALIAS"
|
video_aa: "ANTIALIAS"
|
||||||
video_postfx: "POSTPROCESSAT"
|
video_postfx: "POSTPROCESSAT"
|
||||||
|
# Items del submenu OPCIONS
|
||||||
|
options_language: "IDIOMA"
|
||||||
|
options_show_info: "MOSTRAR INFO"
|
||||||
# Items del submenu AUDIO
|
# Items del submenu AUDIO
|
||||||
audio_master: "AUDIO"
|
audio_master: "AUDIO"
|
||||||
audio_master_volume: "VOLUM GENERAL"
|
audio_master_volume: "VOLUM GENERAL"
|
||||||
|
|||||||
@@ -60,6 +60,9 @@ service_menu:
|
|||||||
video_vsync: "VSYNC"
|
video_vsync: "VSYNC"
|
||||||
video_aa: "ANTIALIAS"
|
video_aa: "ANTIALIAS"
|
||||||
video_postfx: "POSTPROCESS"
|
video_postfx: "POSTPROCESS"
|
||||||
|
# Items of OPTIONS submenu
|
||||||
|
options_language: "LANGUAGE"
|
||||||
|
options_show_info: "SHOW INFO"
|
||||||
# Items of AUDIO submenu
|
# Items of AUDIO submenu
|
||||||
audio_master: "AUDIO"
|
audio_master: "AUDIO"
|
||||||
audio_master_volume: "MASTER VOLUME"
|
audio_master_volume: "MASTER VOLUME"
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ Director::Director(int argc, char* argv[])
|
|||||||
cfg_->rendering);
|
cfg_->rendering);
|
||||||
|
|
||||||
System::Notifier::init(sdl_->getRenderer());
|
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();
|
last_ticks_ms_ = SDL_GetTicks();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include "core/defaults/service_menu.hpp"
|
#include "core/defaults/service_menu.hpp"
|
||||||
#include "core/locale/locale.hpp"
|
#include "core/locale/locale.hpp"
|
||||||
#include "core/rendering/sdl_manager.hpp"
|
#include "core/rendering/sdl_manager.hpp"
|
||||||
|
#include "core/system/debug_overlay.hpp"
|
||||||
#include "core/types.hpp"
|
#include "core/types.hpp"
|
||||||
#include "game/config_yaml.hpp"
|
#include "game/config_yaml.hpp"
|
||||||
|
|
||||||
@@ -55,8 +56,8 @@ namespace System {
|
|||||||
|
|
||||||
std::unique_ptr<ServiceMenu> ServiceMenu::instance;
|
std::unique_ptr<ServiceMenu> ServiceMenu::instance;
|
||||||
|
|
||||||
void ServiceMenu::init(Rendering::Renderer* renderer, SDLManager* sdl) {
|
void ServiceMenu::init(Rendering::Renderer* renderer, SDLManager* sdl, DebugOverlay* debug_overlay) {
|
||||||
instance.reset(new ServiceMenu(renderer, sdl));
|
instance.reset(new ServiceMenu(renderer, sdl, debug_overlay));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServiceMenu::destroy() {
|
void ServiceMenu::destroy() {
|
||||||
@@ -67,9 +68,10 @@ namespace System {
|
|||||||
return instance.get();
|
return instance.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
ServiceMenu::ServiceMenu(Rendering::Renderer* renderer, SDLManager* sdl)
|
ServiceMenu::ServiceMenu(Rendering::Renderer* renderer, SDLManager* sdl, DebugOverlay* debug_overlay)
|
||||||
: renderer_(renderer),
|
: renderer_(renderer),
|
||||||
sdl_(sdl),
|
sdl_(sdl),
|
||||||
|
debug_overlay_(debug_overlay),
|
||||||
text_(renderer) {}
|
text_(renderer) {}
|
||||||
|
|
||||||
auto ServiceMenu::isOpen() const -> bool {
|
auto ServiceMenu::isOpen() const -> bool {
|
||||||
@@ -118,7 +120,7 @@ namespace System {
|
|||||||
root.items = {
|
root.items = {
|
||||||
makeSubmenu("service_menu.video", [this] { pushPage(buildVideoPage()); }),
|
makeSubmenu("service_menu.video", [this] { pushPage(buildVideoPage()); }),
|
||||||
makeSubmenu("service_menu.audio", [this] { pushPage(buildAudioPage()); }),
|
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"); }),
|
makeSubmenu("service_menu.system", [this] { pushSubmenuPlaceholder("service_menu.system"); }),
|
||||||
};
|
};
|
||||||
stack_.clear();
|
stack_.clear();
|
||||||
@@ -304,6 +306,46 @@ namespace System {
|
|||||||
return page;
|
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) {
|
void ServiceMenu::pushPage(Page page) {
|
||||||
stack_.push_back(std::move(page));
|
stack_.push_back(std::move(page));
|
||||||
// El cursor salta a una pagina nova: enganxem el highlight per a
|
// El cursor salta a una pagina nova: enganxem el highlight per a
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ class SDLManager;
|
|||||||
|
|
||||||
namespace System {
|
namespace System {
|
||||||
|
|
||||||
|
class DebugOverlay;
|
||||||
|
|
||||||
class ServiceMenu {
|
class ServiceMenu {
|
||||||
public:
|
public:
|
||||||
// Tipus d'item de menu. En aquesta iteracio nomes s'usen SUBMENU i
|
// Tipus d'item de menu. En aquesta iteracio nomes s'usen SUBMENU i
|
||||||
@@ -64,10 +66,10 @@ namespace System {
|
|||||||
std::size_t cursor = 0;
|
std::size_t cursor = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Inicialitza el singleton amb el renderer global i l'SDLManager (per
|
// Inicialitza el singleton amb el renderer global, l'SDLManager (video
|
||||||
// a operar amb video toggles: fullscreen, vsync, AA, postfx, zoom).
|
// toggles: fullscreen, vsync, AA, postfx, zoom) i el DebugOverlay
|
||||||
// Tots dos son propietat del Director i sobreviuen al menu.
|
// (toggle del HUD de debug a OPCIONS). Tots propietat del Director.
|
||||||
static void init(Rendering::Renderer* renderer, SDLManager* sdl);
|
static void init(Rendering::Renderer* renderer, SDLManager* sdl, DebugOverlay* debug_overlay);
|
||||||
static void destroy();
|
static void destroy();
|
||||||
[[nodiscard]] static auto get() -> ServiceMenu*;
|
[[nodiscard]] static auto get() -> ServiceMenu*;
|
||||||
|
|
||||||
@@ -83,12 +85,13 @@ namespace System {
|
|||||||
auto handleEvent(const SDL_Event& event) -> bool;
|
auto handleEvent(const SDL_Event& event) -> bool;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ServiceMenu(Rendering::Renderer* renderer, SDLManager* sdl);
|
ServiceMenu(Rendering::Renderer* renderer, SDLManager* sdl, DebugOverlay* debug_overlay);
|
||||||
|
|
||||||
void buildRootPage();
|
void buildRootPage();
|
||||||
void pushSubmenuPlaceholder(const std::string& title_key);
|
void pushSubmenuPlaceholder(const std::string& title_key);
|
||||||
[[nodiscard]] auto buildVideoPage() const -> Page;
|
[[nodiscard]] auto buildVideoPage() const -> Page;
|
||||||
[[nodiscard]] static auto buildAudioPage() -> Page;
|
[[nodiscard]] static auto buildAudioPage() -> Page;
|
||||||
|
[[nodiscard]] auto buildOptionsPage() const -> Page;
|
||||||
void pushPage(Page page);
|
void pushPage(Page page);
|
||||||
void popPage();
|
void popPage();
|
||||||
void moveCursor(int direction);
|
void moveCursor(int direction);
|
||||||
@@ -105,6 +108,7 @@ namespace System {
|
|||||||
|
|
||||||
Rendering::Renderer* renderer_;
|
Rendering::Renderer* renderer_;
|
||||||
SDLManager* sdl_;
|
SDLManager* sdl_;
|
||||||
|
DebugOverlay* debug_overlay_;
|
||||||
Graphics::VectorText text_;
|
Graphics::VectorText text_;
|
||||||
|
|
||||||
std::vector<Page> stack_;
|
std::vector<Page> stack_;
|
||||||
|
|||||||
Reference in New Issue
Block a user