2.8 KiB
2.8 KiB
Design : affichage de l'image originale sur la page solution
Date : 2026-05-20
Contexte
La page solution affiche actuellement la grille remplie (cellules noires). L'utilisateur souhaite voir également l'image d'origine dont la grille est issue, pour faciliter la vérification et enrichir le rendu visuel.
Mise en page choisie
Page portrait A4. La page solution est divisée en deux colonnes égales :
- Colonne gauche : grille solution (indices + cellules remplies) — identique à aujourd'hui mais réduite pour tenir dans la moitié de la largeur
- Colonne droite : image originale redimensionnée à la même hauteur et largeur que la grille, centrée verticalement
Espacement entre les deux colonnes : gouttière fixe de 10 mm.
Si image_bytes est None, la page solution se comporte comme avant (grille seule, pleine largeur).
Changements requis
1. src/logimage/domain/entities/puzzle.py
Ajouter un champ image_bytes: bytes | None = None à NonogramPuzzle :
@dataclass(frozen=True)
class NonogramPuzzle:
grid: Grid
row_clues: tuple[Clue, ...]
col_clues: tuple[Clue, ...]
title: str
image_bytes: bytes | None = None
Étendre from_grid() pour accepter et transmettre ce paramètre :
@classmethod
def from_grid(cls, grid: Grid, title: str, image_bytes: bytes | None = None) -> "NonogramPuzzle":
...
return cls(grid=grid, row_clues=row_clues, col_clues=col_clues, title=title, image_bytes=image_bytes)
2. src/logimage/application/use_cases/generate_puzzles.py
Passer image_data.content lors de la construction du puzzle :
puzzle = NonogramPuzzle.from_grid(grid, image_data.title, image_data.content)
3. src/logimage/infrastructure/pdf/reportlab_exporter.py
Modifier _draw_page() pour la page solution (filled=True) :
- Si
puzzle.image_bytesestNone: comportement actuel inchangé. - Si
puzzle.image_bytesest présent : calculer la largeur disponible en divisant en deux colonnes ((avail_w - gutter) / 2). Réduire la grille à cette demi-largeur. Rendre l'image dans la colonne droite viareportlab.lib.utils.ImageReaderaveccanvas.drawImage(), aux mêmes dimensions que la grille (même x, y, width, height).
Ce qui ne change pas
- La page puzzle (non solution) reste inchangée
- Le port
PdfExporterreste inchangé (signature deexport()inchangée) - Le port
ImageSourcereste inchangé - Les tests existants restent valides (le champ
image_bytesest optionnel)
Tests
NonogramPuzzle.from_grid()avec et sansimage_bytesReportLabPdfExporter: vérifier que le PDF généré avecwith_solution=Trueet des bytes image est plus grand (taille fichier) que sans image- Vérifier que
with_solution=Truesansimage_bytesse comporte comme avant (rétrocompatibilité)