Skip to content

Latest commit

Β 

History

History
469 lines (360 loc) Β· 13.8 KB

File metadata and controls

469 lines (360 loc) Β· 13.8 KB

Conception de l'interface graphique - Nonogram Solver

Version: 0.8.0
Bibliothèque: Slint
Date: 23 novembre 2025


🎯 Objectifs

L'interface graphique doit permettre Γ  l'utilisateur de:

  1. Charger une image de nonogramme
  2. Visualiser la grille dΓ©tectΓ©e
  3. Lancer la rΓ©solution avec diffΓ©rents solveurs
  4. Voir les dΓ©ductions en temps rΓ©el
  5. Sauvegarder le rΓ©sultat

🎨 Design de l'interface

FenΓͺtre principale

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Nonogram Solver                                    [_][β–‘][X]β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚                 β”‚  β”‚                                   β”‚ β”‚
β”‚ β”‚                 β”‚  β”‚                                   β”‚ β”‚
β”‚ β”‚     Image       β”‚  β”‚         RΓ©sultat                  β”‚ β”‚
β”‚ β”‚    d'entrΓ©e     β”‚  β”‚       (avec dΓ©ductions)           β”‚ β”‚
β”‚ β”‚                 β”‚  β”‚                                   β”‚ β”‚
β”‚ β”‚                 β”‚  β”‚                                   β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                             β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
│ │ Paramètres                                              │ │
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ β”‚ β”‚ Fichier image: [/path/to/image.png]  [Parcourir...] β”‚ β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚ β”‚                                                         β”‚ β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ β”‚ β”‚ Solveur: β—‹ Basique  β—‹ AvancΓ©  ● Ultime              β”‚ β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚ β”‚                                                         β”‚ β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ β”‚ β”‚ β˜‘ DΓ©tection automatique  ☐ ParamΓ¨tres manuels      β”‚ β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                             β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Progression                                             β”‚ β”‚
β”‚ β”‚ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘  42%          β”‚ β”‚
β”‚ β”‚ Phase 2/3: ParallΓ©lisation - 17 dΓ©ductions trouvΓ©es    β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                             β”‚
β”‚          [Charger]  [RΓ©soudre]  [Sauvegarder]              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ Composants

1. Zone d'affichage d'image (gauche)

Fonction: Affiche l'image d'entrΓ©e

PropriΓ©tΓ©s:

  • Taille: 400x400 px
  • Aspect ratio: prΓ©servΓ©
  • Zoom: auto-fit

2. Zone de rΓ©sultat (droite)

Fonction: Affiche l'image avec les dΓ©ductions marquΓ©es en rouge

PropriΓ©tΓ©s:

  • Taille: 400x400 px
  • Aspect ratio: prΓ©servΓ©
  • Mise Γ  jour en temps rΓ©el pendant la rΓ©solution

3. Panneau de paramètres

a) SΓ©lection de fichier

Fichier image: [/path/to/image.png]  [Parcourir...]

Fonction: Permet de sΓ©lectionner l'image d'entrΓ©e

Comportement:

  • Bouton "Parcourir..." ouvre un dialogue de sΓ©lection de fichier
  • Formats supportΓ©s: PNG, JPEG, BMP, GIF, TIFF, WebP
  • Affiche le chemin complet

b) Choix du solveur

Solveur: β—‹ Basique  β—‹ AvancΓ©  ● Ultime

Options:

  • Basique: Line solving uniquement
  • AvancΓ©: Line solving + analyse croisΓ©e + heuristiques
  • Ultime: Tout + parallΓ©lisation + backtracking

DΓ©faut: Ultime


c) Mode de dΓ©tection

β˜‘ DΓ©tection automatique  ☐ ParamΓ¨tres manuels

DΓ©tection automatique (par dΓ©faut):

  • DΓ©tecte automatiquement la taille des cellules et les marges
  • Pas de configuration nΓ©cessaire

Paramètres manuels:

  • Affiche des champs supplΓ©mentaires:
    Taille de cellule: [100] px
    Marge gauche:     [50]  px
    Marge haute:      [50]  px
    

4. Barre de progression

β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘  42%
Phase 2/3: ParallΓ©lisation - 17 dΓ©ductions trouvΓ©es

Fonction: Affiche la progression de la rΓ©solution

Informations:

  • Pourcentage de cases rΓ©solues
  • Phase actuelle (1: AvancΓ©, 2: ParallΓ¨le, 3: Backtracking)
  • Nombre de dΓ©ductions trouvΓ©es

5. Boutons d'action

[Charger]  [RΓ©soudre]  [Sauvegarder]

Charger:

  • Charge l'image sΓ©lectionnΓ©e
  • Affiche l'image dans la zone gauche
  • Active le bouton "RΓ©soudre"

RΓ©soudre:

  • Lance la rΓ©solution avec le solveur sΓ©lectionnΓ©
  • DΓ©sactive pendant la rΓ©solution
  • Affiche la progression en temps rΓ©el

Sauvegarder:

  • Ouvre un dialogue de sauvegarde
  • Sauvegarde l'image de rΓ©sultat
  • DΓ©sactivΓ© si pas de rΓ©sultat

🎨 Style

Palette de couleurs

Utilise le style natif de la plateforme (Slint Fluent/Material/Cupertino)

Couleurs personnalisΓ©es:

  • DΓ©ductions: #FF0000 (rouge)
  • Progression: #0078D4 (bleu Windows)
  • SuccΓ¨s: #10893E (vert)
  • Erreur: #D13438 (rouge foncΓ©)

Typographie

Police: Système (Segoe UI sur Windows, Roboto sur Linux, SF Pro sur macOS)

Tailles:

  • Titre: 20px
  • Texte normal: 14px
  • Texte secondaire: 12px

πŸ”„ Flux d'utilisation

ScΓ©nario 1: Utilisation simple

  1. Utilisateur clique sur "Parcourir..."
  2. SΓ©lectionne une image
  3. Clique sur "Charger"
  4. L'image s'affiche Γ  gauche
  5. Clique sur "Résoudre" (avec paramètres par défaut)
  6. La rΓ©solution se lance
  7. La progression s'affiche en temps rΓ©el
  8. Le rΓ©sultat s'affiche Γ  droite
  9. Clique sur "Sauvegarder"
  10. SΓ©lectionne l'emplacement de sauvegarde
  11. TerminΓ© !

Temps estimΓ©: 30 secondes


ScΓ©nario 2: Utilisation avancΓ©e

1-4. Comme scénario 1 5. Désactive "Détection automatique" 6. Ajuste les paramètres manuels 7. Sélectionne "Avancé" comme solveur 8-11. Comme scénario 1


πŸ“± Responsive

L'interface s'adapte Γ  la taille de la fenΓͺtre:

  • Minimum: 800x600 px
  • RecommandΓ©: 1000x700 px
  • Maximum: IllimitΓ©

Comportement:

  • Les images se redimensionnent proportionnellement
  • Les boutons restent visibles
  • Le texte ne se tronque pas

β™Ώ AccessibilitΓ©

Support des lecteurs d'Γ©cran:

  • Tous les boutons ont des labels
  • Les images ont des descriptions alt
  • La progression est annoncΓ©e

Navigation au clavier:

  • Tab: Passer au champ suivant
  • Espace/EntrΓ©e: Activer le bouton
  • FlΓ¨ches: Changer les options radio

πŸ§ͺ Tests

Tests fonctionnels

  1. βœ… Chargement d'image
  2. βœ… DΓ©tection automatique
  3. βœ… RΓ©solution avec solveur basique
  4. βœ… RΓ©solution avec solveur avancΓ©
  5. βœ… RΓ©solution avec solveur ultime
  6. βœ… Sauvegarde du rΓ©sultat
  7. βœ… ParamΓ¨tres manuels
  8. βœ… Progression en temps rΓ©el

Tests d'accessibilitΓ©

  1. βœ… Navigation au clavier
  2. βœ… Lecteur d'Γ©cran (Windows Narrator)
  3. βœ… Contraste des couleurs

πŸš€ ImplΓ©mentation

Structure des fichiers

src/
β”œβ”€β”€ main.rs                  # Point d'entrΓ©e (CLI + GUI)
β”œβ”€β”€ gui/
β”‚   β”œβ”€β”€ mod.rs              # Module GUI
β”‚   β”œβ”€β”€ app.slint           # Interface Slint
β”‚   └── logic.rs            # Logique GUI (callbacks)
β”œβ”€β”€ solver/                  # Modules existants
β”œβ”€β”€ grid/
β”œβ”€β”€ image_parser/
└── image_generator/

Fichier Slint (app.slint)

import { Button, VerticalBox, HorizontalBox, Image, LineEdit, CheckBox, RadioButton, ProgressIndicator } from "std-widgets.slint";

export component MainWindow inherits Window {
    title: "Nonogram Solver";
    preferred-width: 1000px;
    preferred-height: 700px;
    
    // PropriΓ©tΓ©s
    in-out property <image> input-image;
    in-out property <image> result-image;
    in-out property <string> file-path: "";
    in-out property <int> solver-mode: 2; // 0: basique, 1: avancΓ©, 2: ultime
    in-out property <bool> auto-detect: true;
    in-out property <int> progress: 0;
    in-out property <string> status: "";
    
    // Callbacks
    callback load-image();
    callback solve();
    callback save-result();
    callback browse-file();
    
    VerticalBox {
        // Images
        HorizontalBox {
            // Image d'entrΓ©e
            Rectangle {
                border-width: 1px;
                border-color: #ccc;
                Image {
                    source: input-image;
                    width: 400px;
                    height: 400px;
                    image-fit: contain;
                }
            }
            
            // Image de rΓ©sultat
            Rectangle {
                border-width: 1px;
                border-color: #ccc;
                Image {
                    source: result-image;
                    width: 400px;
                    height: 400px;
                    image-fit: contain;
                }
            }
        }
        
        // Paramètres
        GroupBox {
            title: "Paramètres";
            
            VerticalBox {
                // SΓ©lection de fichier
                HorizontalBox {
                    Text { text: "Fichier image:"; }
                    LineEdit {
                        text: file-path;
                        read-only: true;
                    }
                    Button {
                        text: "Parcourir...";
                        clicked => { browse-file(); }
                    }
                }
                
                // Choix du solveur
                HorizontalBox {
                    Text { text: "Solveur:"; }
                    RadioButton { text: "Basique"; checked: solver-mode == 0; }
                    RadioButton { text: "AvancΓ©"; checked: solver-mode == 1; }
                    RadioButton { text: "Ultime"; checked: solver-mode == 2; }
                }
                
                // DΓ©tection automatique
                CheckBox {
                    text: "DΓ©tection automatique";
                    checked: auto-detect;
                }
            }
        }
        
        // Progression
        GroupBox {
            title: "Progression";
            
            VerticalBox {
                ProgressIndicator {
                    progress: progress;
                }
                Text {
                    text: status;
                }
            }
        }
        
        // Boutons
        HorizontalBox {
            Button {
                text: "Charger";
                clicked => { load-image(); }
            }
            Button {
                text: "RΓ©soudre";
                clicked => { solve(); }
            }
            Button {
                text: "Sauvegarder";
                clicked => { save-result(); }
            }
        }
    }
}

πŸ“ Notes d'implΓ©mentation

Callbacks Rust

Les callbacks Slint seront implΓ©mentΓ©s en Rust:

app.on_browse_file(move || {
    // Ouvrir dialogue de sΓ©lection de fichier
});

app.on_load_image(move || {
    // Charger l'image et l'afficher
});

app.on_solve(move || {
    // Lancer la résolution en arrière-plan
    // Mettre Γ  jour la progression
});

app.on_save_result(move || {
    // Ouvrir dialogue de sauvegarde
});

Threads

La rΓ©solution sera lancΓ©e dans un thread sΓ©parΓ© pour ne pas bloquer l'interface:

std::thread::spawn(move || {
    // RΓ©solution
    // Mise Γ  jour de la progression via channels
});

🎯 Prochaines étapes

  1. βœ… Audit des bibliothΓ¨ques GUI
  2. βœ… SΓ©lection de Slint
  3. βœ… Conception de l'interface
  4. ⏭️ Implémentation
  5. ⏭️ Tests
  6. ⏭️ Documentation et déploiement