#pragma once #include // Para SDL_FRect, SDL_Renderer #include // Para shared_ptr #include // Para basic_string, string #include // Para vector #include "utils.h" // Para stringInVector, Color class Sprite; class Text; class Texture; // --- Clase Notifier: gestiona las notificaciones en pantalla (singleton) --- class Notifier { public: // --- Métodos de singleton --- static void init(const std::string &icon_file, std::shared_ptr text); // Inicializa el singleton static void destroy(); // Libera el singleton static Notifier *get(); // Obtiene la instancia // --- Métodos principales --- void render(); // Dibuja las notificaciones por pantalla void update(); // Actualiza el estado de las notificaciones // --- Gestión de notificaciones --- void show(std::vector texts, int icon = -1, const std::string &code = std::string()); // Muestra una notificación de texto por pantalla bool isActive() const { return !notifications_.empty(); } // Indica si hay notificaciones activas std::vector getCodes(); // Obtiene los códigos de las notificaciones activas bool checkCode(const std::string &code) { return stringInVector(getCodes(), code); } // Comprueba si hay alguna notificación con un código concreto private: // --- Singleton --- static Notifier *instance_; // --- Tipos internos --- enum class NotificationStatus { RISING, STAY, VANISHING, FINISHED, }; enum class NotificationShape { ROUNDED, SQUARED, }; // --- Estructura Notification --- struct Notification { std::shared_ptr texture; // Textura de la notificación std::shared_ptr sprite; // Sprite asociado std::vector texts; // Textos a mostrar int counter; // Contador de tiempo NotificationStatus state; // Estado de la notificación NotificationShape shape; // Forma de la notificación SDL_FRect rect; // Rectángulo de la notificación int y; // Posición vertical int travel_dist; // Distancia a recorrer std::string code; // Código identificador de la notificación // Constructor explicit Notification() : texture(nullptr), sprite(nullptr), texts(), counter(0), state(NotificationStatus::RISING), shape(NotificationShape::SQUARED), rect{0, 0, 0, 0}, y(0), travel_dist(0), code("") {} }; // --- Objetos y punteros --- SDL_Renderer *renderer_; // El renderizador de la ventana std::shared_ptr icon_texture_; // Textura para los iconos de las notificaciones std::shared_ptr text_; // Objeto para dibujar texto // --- Variables de estado --- Color bg_color_; // Color de fondo de las notificaciones int wait_time_; // Tiempo que se ve la notificación std::vector notifications_; // Lista de notificaciones activas bool stack_; // Indica si las notificaciones se apilan bool has_icons_; // Indica si el notificador tiene textura para iconos // --- Métodos internos --- void clearFinishedNotifications(); // Elimina las notificaciones finalizadas void clearAllNotifications(); // Finaliza y elimina todas las notificaciones activas // --- Constructor y destructor --- Notifier(std::string icon_file, std::shared_ptr text); // Constructor privado ~Notifier() = default; // Destructor privado };