diff --git a/source/sections/game.cpp b/source/sections/game.cpp index 187b484..81c4541 100644 --- a/source/sections/game.cpp +++ b/source/sections/game.cpp @@ -98,6 +98,14 @@ Game::Game(Player::Id player_id, int current_stage, bool demo) initPaths(); setTotalPower(); + // Registra callbacks + ServiceMenu::get()->setStateChangeCallback([this](bool isActive) { + // Solo aplicar pausa si NO estamos en modo demo + if (!demo_.enabled) { + pause_manager_->setServiceMenuPause(isActive); + } + }); + #ifdef _DEBUG // Si se empieza en una fase que no es la primera if (!demo_.enabled) { @@ -890,7 +898,6 @@ void Game::update() { ticks_ = SDL_GetTicks(); screen_->update(); - checkServiceMenu(); updateDemo(); #ifdef RECORDING updateRecording(); @@ -1860,19 +1867,6 @@ void Game::sortPlayersByZOrder() { } } -// Comprueba si está activo el menu de servicio para poner el juego en pausa -void Game::checkServiceMenu() { - if (demo_.enabled) { - return; - } - - if (ServiceMenu::get()->isEnabled()) { - pause_manager_->setServiceMenuPause(true); - } else { - pause_manager_->setServiceMenuPause(false); - } -} - // Mueve el jugador para pintarlo al fondo de la lista de jugadores void Game::sendPlayerToTheBack(const std::shared_ptr &player) { players_to_put_at_back_.push_back(player); diff --git a/source/sections/game.h b/source/sections/game.h index a86037e..1e8b351 100644 --- a/source/sections/game.h +++ b/source/sections/game.h @@ -289,9 +289,6 @@ class Game { static void resumeMusic(); // Retoma la música que eestaba pausada void playSound(const std::string &name) const; // Reproduce un efecto de sonido específico - // --- Utilidades y servicios --- - void checkServiceMenu(); // Verifica si el menú de servicio está activo - void sendPlayerToTheBack(const std::shared_ptr &player); // Mueve el jugador para pintarlo al fondo de la lista de jugadores void sendPlayerToTheFront(const std::shared_ptr &player); // Mueve el jugador para pintarlo el primero de la lista de jugadores void onPauseStateChanged(bool isPaused); diff --git a/source/ui/service_menu.cpp b/source/ui/service_menu.cpp index 206ad0b..7329eb6 100644 --- a/source/ui/service_menu.cpp +++ b/source/ui/service_menu.cpp @@ -42,19 +42,18 @@ ServiceMenu::ServiceMenu() void ServiceMenu::toggle() { if (define_buttons_ && define_buttons_->isEnabled()) return; - if (isAnimating() && !define_buttons_->isEnabled()) return; // No permitir toggle durante una animación + if (isAnimating() && !define_buttons_->isEnabled()) return; playBackSound(); - enabled_ = !enabled_; - - if (enabled_) { - // Primero resetea el estado y luego muestra la animación + + if (!enabled_) { // Si está cerrado, abrir reset(); Options::gamepad_manager.assignAndLinkGamepads(); renderer_->show(this); - } else { - // Al cerrar, solo inicia la animación de ocultar + setEnabledInternal(true); + } else { // Si está abierto, cerrar renderer_->hide(); + setEnabledInternal(false); } } @@ -623,4 +622,21 @@ void ServiceMenu::refresh() { // sincroniza los valores, actualiza la lista de opciones visibles y notifica // al renderer de cualquier cambio de layout que pueda haber ocurrido. updateMenu(); +} + +// Método para registrar callback +void ServiceMenu::setStateChangeCallback(StateChangeCallback callback) { + state_change_callback_ = callback; +} + +// Método interno que cambia estado y notifica +void ServiceMenu::setEnabledInternal(bool enabled) { + if (enabled_ != enabled) { // Solo si realmente cambia + enabled_ = enabled; + + // Notifica el cambio si hay callback registrado + if (state_change_callback_) { + state_change_callback_(enabled_); + } + } } \ No newline at end of file diff --git a/source/ui/service_menu.h b/source/ui/service_menu.h index 4e7202d..1caaea0 100644 --- a/source/ui/service_menu.h +++ b/source/ui/service_menu.h @@ -1,27 +1,40 @@ #pragma once #include +#include #include #include #include #include -#include "ui_message.h" #include "define_buttons.h" +#include "ui_message.h" class MenuOption; class MenuRenderer; class ServiceMenu { public: - // ... (enums y constantes sin cambios) - enum class SettingsGroup { CONTROLS, VIDEO, AUDIO, SETTINGS, SYSTEM, MAIN }; - enum class GroupAlignment { CENTERED, LEFT }; + // --- Enums y constantes --- + enum class SettingsGroup { + CONTROLS, + VIDEO, + AUDIO, + SETTINGS, + SYSTEM, + MAIN + }; + enum class GroupAlignment { + CENTERED, + LEFT + }; static constexpr size_t OPTIONS_HORIZONTAL_PADDING = 20; static constexpr size_t MIN_WIDTH = 240; static constexpr size_t MIN_GAP_OPTION_VALUE = 30; static constexpr size_t SETTINGS_GROUP_SIZE = 6; + using StateChangeCallback = std::function; + // --- Métodos de singleton --- static void init(); static void destroy(); @@ -47,15 +60,17 @@ class ServiceMenu { bool checkInput(); // --- Método principal para refresco externo --- - void refresh(); // Refresca los valores y el layout del menú bajo demanda - + void refresh(); // Refresca los valores y el layout del menú bajo demanda + + // --- Método para registrar el callback --- + void setStateChangeCallback(StateChangeCallback callback); + // --- Getters para el estado --- [[nodiscard]] auto isDefiningButtons() const -> bool; - [[nodiscard]] auto isAnimating() const -> bool; // Nuevo getter + [[nodiscard]] auto isAnimating() const -> bool; // Nuevo getter // --- Getters para que el Renderer pueda leer el estado --- [[nodiscard]] auto isEnabled() const -> bool { return enabled_; } - // ... (resto de getters sin cambios) [[nodiscard]] auto getTitle() const -> const std::string & { return title_; } [[nodiscard]] auto getCurrentGroup() const -> SettingsGroup { return current_settings_group_; } [[nodiscard]] auto getCurrentGroupAlignment() const -> GroupAlignment; @@ -66,7 +81,6 @@ class ServiceMenu { [[nodiscard]] auto countOptionsInGroup(SettingsGroup group) const -> size_t; private: - // ... (resto de miembros privados sin cambios) bool enabled_ = false; std::vector> options_; std::vector display_options_; @@ -80,6 +94,7 @@ class ServiceMenu { bool last_pending_changes_ = false; std::unique_ptr define_buttons_; std::unique_ptr renderer_; + StateChangeCallback state_change_callback_; // --- Métodos de lógica interna --- void updateDisplayOptions(); @@ -99,6 +114,7 @@ class ServiceMenu { static void playBackSound(); [[nodiscard]] static auto settingsGroupToString(SettingsGroup group) -> std::string; void setHiddenOptions(); + void setEnabledInternal(bool enabled); // Método privado para cambiar estado y notificar // --- Constructores y destructor privados (singleton) --- ServiceMenu();