#pragma once #include #include #include #include // Forward declaration class TextRenderer; /** * @brief Sistema de notificaciones estilo iOS/Android * * Maneja notificaciones temporales con animaciones suaves: * - Slide-in desde arriba * - Fade-out al desaparecer * - Cola FIFO de mensajes * - Fondo semitransparente * - Texto de tamaño fijo independiente de resolución */ class Notifier { public: enum class NotificationState { SLIDING_IN, // Animación de entrada desde arriba VISIBLE, // Visible estático FADING_OUT, // Animación de salida (fade) DONE // Completado, listo para eliminar }; struct Notification { std::string text; Uint64 created_time; Uint64 duration; NotificationState state; float alpha; // Opacidad 0.0-1.0 float y_offset; // Offset Y para animación slide (píxeles) SDL_Color color; SDL_Color bg_color; // Color de fondo de la notificación (RGB) }; Notifier(); ~Notifier(); /** * @brief Inicializa el notifier con un TextRenderer * @param renderer SDL renderer para dibujar * @param text_renderer TextRenderer configurado con tamaño absoluto * @return true si inicialización exitosa */ bool init(SDL_Renderer* renderer, TextRenderer* text_renderer, int window_width, int window_height); /** * @brief Actualiza las dimensiones de la ventana (llamar en resize) * @param window_width Nuevo ancho de ventana física * @param window_height Nuevo alto de ventana física */ void updateWindowSize(int window_width, int window_height); /** * @brief Muestra una nueva notificación * @param text Texto a mostrar * @param duration Duración en milisegundos (0 = usar default) * @param color Color del texto * @param bg_color Color de fondo de la notificación */ void show(const std::string& text, Uint64 duration = 0, SDL_Color color = {255, 255, 255, 255}, SDL_Color bg_color = {0, 0, 0, 255}); /** * @brief Actualiza las animaciones de notificaciones * @param current_time Tiempo actual en ms (SDL_GetTicks()) */ void update(Uint64 current_time); /** * @brief Renderiza la notificación activa */ void render(); /** * @brief Verifica si hay una notificación activa (visible) * @return true si hay notificación mostrándose */ bool isActive() const; /** * @brief Limpia todas las notificaciones pendientes */ void clear(); private: SDL_Renderer* renderer_; TextRenderer* text_renderer_; int window_width_; int window_height_; std::queue notification_queue_; std::unique_ptr current_notification_; /** * @brief Procesa la cola y activa la siguiente notificación si es posible */ void processQueue(); /** * @brief Dibuja el fondo semitransparente de la notificación */ void renderBackground(int x, int y, int width, int height, float alpha, SDL_Color bg_color); };