#pragma once #include #include "defines.hpp" // for Color, ThemeKeyframe /** * Theme: Interfaz polimórfica para todos los temas (estáticos y dinámicos) * * Responsabilidades: * - Proporcionar información básica del tema (nombre, color de texto) * - Generar colores interpolados para pelotas y fondo * - Actualizar estado interno si es animado (solo dinámicos) * * Implementaciones: * - StaticTheme: 1 keyframe, sin animación, colores fijos * - DynamicTheme: N keyframes, animación continua con loop */ class Theme { public: virtual ~Theme() = default; // ======================================== // QUERIES BÁSICAS (implementar en derivadas) // ======================================== virtual const char* getNameEN() const = 0; virtual const char* getNameES() const = 0; virtual void getTextColor(int& r, int& g, int& b) const = 0; virtual void getNotificationBackgroundColor(int& r, int& g, int& b) const = 0; // ======================================== // CORE: OBTENER COLORES (polimórfico) // ======================================== /** * Obtiene color de pelota según índice y progreso de animación * @param ball_index: Índice de pelota (para seleccionar color de paleta) * @param progress: Progreso 0.0-1.0 si hay transición LERP externa (PHASE 3) * @return Color interpolado para esta pelota */ virtual Color getBallColor(size_t ball_index, float progress) const = 0; /** * Obtiene colores de fondo degradado (top/bottom) * @param progress: Progreso 0.0-1.0 si hay transición LERP externa (PHASE 3) * @param tr, tg, tb: Color superior (out) * @param br, bg, bb: Color inferior (out) */ virtual void getBackgroundColors(float progress, float& tr, float& tg, float& tb, float& br, float& bg, float& bb) const = 0; // ======================================== // ANIMACIÓN (solo temas dinámicos) // ======================================== /** * Actualiza progreso de animación interna (solo dinámicos) * @param delta_time: Tiempo transcurrido desde último frame */ virtual void update(float delta_time) { } /** * ¿Este tema necesita update() cada frame? * @return false para estáticos, true para dinámicos */ virtual bool needsUpdate() const { return false; } /** * Obtiene progreso actual de animación interna * @return 0.0 para estáticos, 0.0-1.0 para dinámicos */ virtual float getProgress() const { return 0.0f; } /** * Reinicia progreso de animación a 0.0 (usado al activar tema) */ virtual void resetProgress() { } // ======================================== // PAUSA (solo temas dinámicos) // ======================================== /** * ¿Está pausado? (solo dinámicos) * @return false para estáticos, true/false para dinámicos */ virtual bool isPaused() const { return false; } /** * Toggle pausa de animación (solo dinámicos, tecla Shift+D) */ virtual void togglePause() { } };