#pragma once #include #include #include #include #include #include // Alias de paleta (igual que en surface.hpp; evita incluir todo el header) using Palette = std::array; class Surface; // Modo de ordenación de paletas enum class PaletteSortMode : int { ORIGINAL = 0, // Paleta tal cual viene del fichero OPTIMAL = 1, // Asignación óptima a la paleta por defecto (Hungarian algorithm) REFERENCE = 2, // Asignación greedy a la paleta por defecto COUNT = 3 }; // Conversión string ↔ PaletteSortMode auto sortModeFromString(const std::string& str) -> PaletteSortMode; auto sortModeToString(PaletteSortMode mode) -> std::string; class PaletteManager { public: using OnChangeCallback = std::function; PaletteManager( std::vector raw_paths, const std::string& initial_name, PaletteSortMode initial_sort_mode, std::shared_ptr game_surface, std::shared_ptr border_surface, OnChangeCallback on_change = nullptr); void next(); // Avanza a la siguiente paleta void previous(); // Retrocede a la paleta anterior auto setByName(const std::string& name) -> bool; // Cambia a paleta por nombre; false si no existe [[nodiscard]] auto getNames() const -> std::vector; // Nombres disponibles (minúsculas, sin .pal) [[nodiscard]] auto getCurrentName() const -> std::string; // Nombre de la paleta actual (minúsculas, sin .pal) [[nodiscard]] auto getPrettyName() const -> std::string; // Nombre actual con guiones sustituidos por espacios void nextSortMode(); // Cicla al siguiente modo de ordenación void setSortMode(PaletteSortMode mode); // Establece un modo de ordenación concreto [[nodiscard]] auto getSortMode() const -> PaletteSortMode; // Devuelve el modo de ordenación actual [[nodiscard]] auto getSortModeName() const -> std::string; // Nombre del modo actual ("ORIGINAL", etc.) private: void apply(); // Aplica la paleta actual a ambas surfaces [[nodiscard]] auto findIndex(const std::string& name) const -> size_t; // Localiza paleta por nombre en el vector void processPathList(); // Extrae nombres de archivo de las rutas completas static auto sortPalette(const Palette& palette, PaletteSortMode mode, const Palette& reference) -> Palette; std::vector palettes_; Palette reference_palette_{}; // Paleta de referencia para el modo REFERENCE size_t current_{0}; PaletteSortMode sort_mode_{PaletteSortMode::ORIGINAL}; std::shared_ptr game_surface_; std::shared_ptr border_surface_; OnChangeCallback on_change_; };