feat(service-menu): pobla VIDEO amb zoom, fullscreen, vsync, AA i postfx

This commit is contained in:
2026-05-24 11:37:36 +02:00
parent 443b461974
commit 71c43ec6fe
7 changed files with 200 additions and 39 deletions
+17 -4
View File
@@ -28,6 +28,8 @@
#include "core/graphics/vector_text.hpp"
#include "core/rendering/render_context.hpp"
class SDLManager;
namespace System {
class ServiceMenu {
@@ -48,7 +50,12 @@ namespace System {
Kind kind = Kind::LABEL;
std::string label_key; // Clau de locale
bool selectable = true;
// SUBMENU / ACTION: callback en ENTER / RIGHT.
std::function<void()> on_activate;
// TOGGLE / CYCLE / INT_RANGE: text del valor actual (renderitzat a la dreta).
std::function<std::string()> get_value_text;
// TOGGLE / CYCLE / INT_RANGE: callback amb +1 (RIGHT/ENTER) o -1 (LEFT).
std::function<void(int)> on_change;
};
struct Page {
@@ -57,9 +64,10 @@ namespace System {
std::size_t cursor = 0;
};
// Inicialitza el singleton amb el renderer global (propietat del
// Director via SDLManager). Posterior get() retorna instancia valida.
static void init(Rendering::Renderer* renderer);
// 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);
static void destroy();
[[nodiscard]] static auto get() -> ServiceMenu*;
@@ -75,14 +83,18 @@ namespace System {
auto handleEvent(const SDL_Event& event) -> bool;
private:
explicit ServiceMenu(Rendering::Renderer* renderer);
ServiceMenu(Rendering::Renderer* renderer, SDLManager* sdl);
void buildRootPage();
void pushSubmenuPlaceholder(const std::string& title_key);
[[nodiscard]] auto buildVideoPage() const -> Page;
void pushPage(Page page);
void popPage();
void moveCursor(int direction);
void activateCurrent();
// RIGHT (direction=+1) / LEFT (direction=-1). Per a TOGGLE/CYCLE/INT_RANGE
// crida on_change. Per a SUBMENU/ACTION nomes +1 (entra/activa).
void changeValue(int direction);
// Alçada objectiu de la caixa per a la pagina superior (sense animacio).
[[nodiscard]] auto computeTargetHeight() const -> float;
@@ -91,6 +103,7 @@ namespace System {
[[nodiscard]] static auto computeItemTopY(float box_y, std::size_t index) -> float;
Rendering::Renderer* renderer_;
SDLManager* sdl_;
Graphics::VectorText text_;
std::vector<Page> stack_;