From bcbf990a5f0fa2ef77f7565bb09063a0e4b956fc Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 30 Apr 2026 09:36:24 +0200 Subject: [PATCH] feat(editor): tilepicker respecta l'amplada del tileset si hi cap --- source/game/editor/editor.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/source/game/editor/editor.cpp b/source/game/editor/editor.cpp index 5a26db9..431d9f5 100644 --- a/source/game/editor/editor.cpp +++ b/source/game/editor/editor.cpp @@ -22,10 +22,11 @@ namespace { // Geometria del TilePicker en espai canvas. `cols × rows_visible` tiles - // encapsulats dins d'un rectangle amb `PICKER_MARGIN` per vora. Com que - // el tileset real (p.ex. 32×16 tiles de 16 px = 512×256) no cabria a - // 1× dins del canvas 336×240, linealitzem els índexs i els repartim - // en una graella que SÍ cap, amb scroll vertical per veure la resta. + // encapsulats dins d'un rectangle amb `PICKER_MARGIN` per vora. Si el + // tileset cap en amplada (TCOLS·tile_size ≤ INNER_W), en respectem la + // graella natural — els tiles surten ordenats igual que al GIF, només + // amb scroll vertical si cal. Si no, linealitzem els índexs en una + // graella més ampla que sí cap, amb scroll vertical per veure la resta. struct PickerLayout { int x{0}; int y{0}; @@ -45,18 +46,25 @@ namespace { const int INNER_W = GameCanvas::WIDTH - (2 * M); const int INNER_H = GameCanvas::HEIGHT - (2 * M); if (lay.tile_size <= 0) { return lay; } - lay.cols = INNER_W / lay.tile_size; + const int MAX_COLS = INNER_W / lay.tile_size; lay.rows_visible = INNER_H / lay.tile_size; - lay.x = M; - lay.y = M; - lay.w = lay.cols * lay.tile_size; - lay.h = lay.rows_visible * lay.tile_size; + int tcols = 0; const auto TILESET = Resource::Cache::get().getSurface(tm.getTilesetPath()); if (TILESET != nullptr) { - const int TCOLS = TILESET->getWidth() / lay.tile_size; + tcols = TILESET->getWidth() / lay.tile_size; const int TROWS = TILESET->getHeight() / lay.tile_size; - lay.total_tiles = TCOLS * TROWS; + lay.total_tiles = tcols * TROWS; } + // Com que els índexs del tileset són row-major (idx = row·TCOLS + col), + // fer servir cols = TCOLS reprodueix exactament la disposició del GIF. + const bool FITS_W = (tcols > 0 && tcols <= MAX_COLS); + lay.cols = FITS_W ? tcols : MAX_COLS; + lay.w = lay.cols * lay.tile_size; + lay.h = lay.rows_visible * lay.tile_size; + // Centrat horitzontalment quan la graella natural és més estreta; + // verticalment mantenim el marge superior i deixem scroll si cal. + lay.x = M + ((INNER_W - lay.w) / 2); + lay.y = M; const int TOTAL_ROWS = (lay.cols > 0) ? ((lay.total_tiles + lay.cols - 1) / lay.cols) : 0; lay.max_scroll = std::max(0, TOTAL_ROWS - lay.rows_visible); return lay;