#pragma once #include #include #include #include // Forward declarations class TextRenderer; class ThemeManager; /** * @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) // NOTA: Los colores se obtienen dinámicamente desde ThemeManager en render() }; Notifier(); ~Notifier(); /** * @brief Inicializa el notifier con un TextRenderer y ThemeManager * @param renderer SDL renderer para dibujar * @param text_renderer TextRenderer configurado con tamaño absoluto * @param theme_manager ThemeManager para obtener colores dinámicos con LERP * @param window_width Ancho de ventana física * @param window_height Alto de ventana física * @return true si inicialización exitosa */ bool init(SDL_Renderer* renderer, TextRenderer* text_renderer, ThemeManager* theme_manager, 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) * @note Los colores se obtienen dinámicamente desde ThemeManager cada frame */ void show(const std::string& text, Uint64 duration = 0); /** * @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_; ThemeManager* theme_manager_; // Gestor de temas para obtener colores dinámicos con LERP 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); };