map_editor:

- tilepicker s'obri ara amb la T
- brush de varios tiles
- eyedropper amb botó dret (de uno o varios tiles)
This commit is contained in:
2026-04-10 21:33:57 +02:00
parent 342b46ca32
commit fadc3b03c9
5 changed files with 363 additions and 88 deletions

View File

@@ -16,6 +16,7 @@ class Surface;
* Muestra el tileset centrado en el play area.
* Hover ilumina el tile bajo el cursor.
* Click selecciona el tile y cierra el picker.
* Si allow_rect_selection es true, click + drag selecciona un rect de tiles.
* Mouse wheel para scroll si el tileset es más alto que el play area.
* ESC o click derecho para cancelar.
*/
@@ -29,15 +30,17 @@ class TilePicker {
// 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);
// allow_rect_selection: si true, permite arrastrar para seleccionar varios tiles
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, bool allow_rect_selection = false);
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<void(int)> on_select;
// Callback al seleccionar (col, row, w, h dentro del tileset).
// Para selección de un solo tile: w=h=1.
std::function<void(int, int, int, int)> on_select;
private:
void updateMousePosition();
@@ -50,6 +53,12 @@ class TilePicker {
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
int last_valid_hover_{-1}; // Último hover_tile_ válido (para soltar sobre spacing)
// Selección rectangular
bool allow_rect_{false}; // ¿Se permite drag para seleccionar rect?
bool selecting_rect_{false}; // ¿Hay un drag activo?
int rect_start_tile_{-1}; // Tile donde empezó el drag
// Spacing
int spacing_in_{0}; // Spacing en el fichero fuente