#pragma once #ifdef _DEBUG #include #include // Para function #include // Para shared_ptr #include // Para string class Surface; /** * @brief Selector visual de tiles de un tileset * * Muestra el tileset centrado en el play area. * Hover ilumina el tile bajo el cursor. * Click selecciona el tile y cierra el picker. * Mouse wheel para scroll si el tileset es más alto que el play area. * ESC o click derecho para cancelar. */ class TilePicker { public: TilePicker() = default; ~TilePicker() = default; // Abre el picker con un tileset // bg_color: color de fondo del panel (-1 = negro) // source_color/target_color: sustitución de color (-1 = sin sustitución) // tile_spacing_in: pixels de separación entre tiles en el fichero fuente // tile_spacing_out: pixels de separación visual entre tiles al mostrar void open(const std::string& tileset_name, int current_tile = -1, int bg_color = -1, int source_color = -1, int target_color = -1, int tile_spacing_in = 0, int tile_spacing_out = 1); void close(); [[nodiscard]] auto isOpen() const -> bool { return open_; } void render(); void handleEvent(const SDL_Event& event); // Callback al seleccionar un tile (índice del tile) std::function on_select; private: void updateMousePosition(); bool open_{false}; std::shared_ptr tileset_; // Surface del tileset original std::shared_ptr frame_surface_; // Surface compuesta: borde + tileset SDL_FRect frame_dst_{}; // Posición del frame en pantalla int tileset_width_{0}; // Ancho del tileset en tiles int tileset_height_{0}; // Alto del tileset en tiles int current_tile_{-1}; // Tile actualmente seleccionado (highlight) int hover_tile_{-1}; // Tile bajo el cursor // Spacing int spacing_in_{0}; // Spacing en el fichero fuente int spacing_out_{1}; // Spacing visual al mostrar // Scroll y posicionamiento int scroll_y_{0}; // Scroll vertical en pixels int offset_x_{0}; // Offset X para centrar en pantalla int visible_height_{0}; // Altura visible en pixels }; #endif // _DEBUG