81330f8432
- Notifier singleton (System::init/get/destroy) que dibuixa un cuadre
centrat al centre-superior amb fons semitransparent (derivat oscur del
color del text) i bordes en línies.
- Màquina d'estats HIDDEN → ENTERING → HOLDING → EXITING amb easing
outCubic (entrada) i inCubic (sortida), slide de 300 ms.
- pushRect() afegit a GpuFrameRenderer (2 triangles, edge_dist=0) per
poder pintar el fons opac/semitransparent reutilitzant el pipeline de
línies — sense afegir cap pipeline nou.
- VectorText::render/renderCentered admeten color RGBA explícit
(default {0,0,0,0} preserva el comportament previ amb oscil·lador
global de color).
- Easing header-only a core/utils/easing.hpp (outCubic, inCubic).
- Director crea Notifier just després del DebugOverlay i el draweja com
a última capa per damunt de l'escena i el debug.
Encara cap consumer el crida; els F1-F5 i la doble pulsació d'ESC
arriben en commits posteriors.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
82 lines
3.0 KiB
C++
82 lines
3.0 KiB
C++
// notifier.hpp - Sistema de notificacions toast (singleton)
|
|
// © 2026 JailDesigner
|
|
//
|
|
// Mostra missatges curts en un cuadre centrat horitzontalment al centre
|
|
// superior de la pantalla. El cuadre entra des de fora amb easing outCubic,
|
|
// aguanta el temps demanat i surt amb inCubic. El color del text és
|
|
// configurable; el fondo es deriva oscurint el RGB del text i posant alpha
|
|
// 0.65 (semitransparent).
|
|
//
|
|
// API singleton (mateix patró que Audio i Input): Notifier::init() al startup,
|
|
// Notifier::get()->notify(...) des d'on calgui, Notifier::destroy() al teardown.
|
|
|
|
#pragma once
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include "core/graphics/vector_text.hpp"
|
|
#include "core/rendering/render_context.hpp"
|
|
|
|
namespace System {
|
|
|
|
class Notifier {
|
|
public:
|
|
// Inicialitza el singleton amb el renderer global. El renderer ha de
|
|
// viure tant com el Notifier (és del SDLManager, propietat del Director).
|
|
static void init(Rendering::Renderer* renderer);
|
|
static void destroy();
|
|
[[nodiscard]] static auto get() -> Notifier*;
|
|
|
|
// Mostra una notificació. Si ja n'hi ha una visible, es sobreescriu
|
|
// (reset a l'estat ENTERING des de la Y actual; mai s'apilen).
|
|
// - text: cadena a mostrar (sense salts de línia)
|
|
// - text_color: color RGBA del text i del borde
|
|
// - duration_s: temps que es queda visible (sense comptar entry/exit)
|
|
void notify(const std::string& text, SDL_Color text_color, float duration_s);
|
|
|
|
// Atajos semàntics amb colors i durada predefinits.
|
|
void notifyInfo(const std::string& text); // blanc, 2.0s
|
|
void notifyWarn(const std::string& text); // àmbar, 3.0s
|
|
void notifyExit(const std::string& text); // vermell, EXIT_WINDOW_S
|
|
|
|
void update(float delta_time);
|
|
void draw() const;
|
|
|
|
// Activa mentre el toast està entrant o aguantant. Quan està sortint
|
|
// o ja amagat, retorna false. Útil per a la lògica de doble-pulsació
|
|
// d'ESC: la segona pulsació només confirma sortida si encara aguanta.
|
|
[[nodiscard]] auto isActiveWindow() const -> bool;
|
|
|
|
private:
|
|
explicit Notifier(Rendering::Renderer* renderer);
|
|
|
|
enum class Status : std::uint8_t { HIDDEN,
|
|
ENTERING,
|
|
HOLDING,
|
|
EXITING };
|
|
|
|
Rendering::Renderer* renderer_;
|
|
Graphics::VectorText text_;
|
|
|
|
Status status_{Status::HIDDEN};
|
|
std::string current_text_;
|
|
SDL_Color current_color_{.r = 255, .g = 255, .b = 255, .a = 255};
|
|
float hold_remaining_s_{0.0F};
|
|
float slide_elapsed_s_{0.0F};
|
|
float y_current_{0.0F};
|
|
float y_off_{0.0F}; // posició Y fora de pantalla
|
|
float y_on_{0.0F}; // posició Y de descans (visible)
|
|
float box_w_{0.0F};
|
|
float box_h_{0.0F};
|
|
float text_x_{0.0F}; // X esquerre del text dins la caixa
|
|
float text_scale_{0.4F};
|
|
|
|
static std::unique_ptr<Notifier> instance;
|
|
};
|
|
|
|
} // namespace System
|