#pragma once #include #include #include #include #include "core/rendering/hud_constants.hpp" #include "core/rendering/surface.hpp" class Text; // Popup transitori a dalt i centrat. Entra lliscant des de dalt, es queda // visible el temps configurat i surt lliscant cap amunt. Comparteix la font // 8bithud i la paleta "ui" amb la resta d'overlays (carregades per RenderInfo // a l'arrencada; si Notifier::init() es crida primer, les carrega ell). // // API crua: Notifier::get().notify(text, text_color, bg_color, time_ms). // Per a treballar amb presets del joc, vegeu Notification::notify() a // game/ui/notification_presets.hpp. class Notifier { public: static auto get() -> Notifier&; Notifier(const Notifier&) = delete; Notifier(Notifier&&) = delete; auto operator=(const Notifier&) -> Notifier& = delete; auto operator=(Notifier&&) -> Notifier& = delete; // Injecta la font compartida i la paleta UI que usa la caixa de fons. // Així Notifier no depèn de cap string de recurs ni del cache global. void init(std::shared_ptr text, const Palette& ui_palette); void update(int delta_ms); void render(); void notify(const std::string& text, Uint8 text_color, Uint8 bg_color, int time_ms); static constexpr int PADDING_H = 6; static constexpr int PADDING_V = 3; static constexpr int HEIGHT = Rendering::Hud::FONT_SIZE_PX + (2 * PADDING_V); static constexpr int MARGIN_TOP = 2; // Separació amb la vora superior del canvas. static constexpr float SLIDE_SPEED = 120.0F; private: enum class Status : std::uint8_t { HIDDEN, RISING, ACTIVE, VANISHING }; Notifier() = default; ~Notifier(); std::shared_ptr text_; Palette ui_palette_{}; Status status_{Status::HIDDEN}; float y_{static_cast(-HEIGHT - MARGIN_TOP)}; std::string current_text_; Uint8 current_text_color_{0}; Uint8 current_bg_color_{0}; int remaining_ms_{0}; };