labfy-investigation/docs/tickets/closed/TICKET-016.md
2026-07-14 14:34:10 +02:00

289 lines
4.8 KiB
Markdown

# Ticket #016
## Titre
Structurer le `Workspace` avec `GtkStack`.
---
## Objectif
Remplacer la gestion manuelle de visibilité des pages du `Workspace` par un
`GtkStack`.
Le `Workspace` doit pouvoir afficher proprement plusieurs pages internes sans
modifier son API publique actuelle.
Ce ticket prépare l'ajout futur de nouvelles vues :
- aperçu texte ;
- aperçu image ;
- aperçu PDF ;
- chronologie ;
- fiches d'entités ;
- rapports.
---
## Architecture
```text
Workspace
└── GtkStack
├── WelcomePage
└── NodeInformationPage
```
Plus tard :
```text
Workspace
└── GtkStack
├── WelcomePage
├── NodeInformationPage
├── TextPreviewPage
├── ImagePreviewPage
├── PdfPreviewPage
└── EntityPage
```
Le `Workspace` reste responsable de son affichage interne.
---
## Responsabilités
Le module `Workspace` doit :
- créer un `GtkStack` comme widget racine interne ;
- ajouter une page d'accueil ;
- ajouter une page d'informations sur le nœud sélectionné ;
- afficher la page d'accueil lorsqu'aucun nœud n'est sélectionné ;
- afficher la page d'informations lorsqu'un nœud est sélectionné ;
- conserver l'API publique existante.
---
## API publique conservée
Aucune nouvelle fonction publique n'est requise.
L'API reste :
```c
Workspace *workspace_new(void);
GtkWidget *workspace_get_widget(
const Workspace *workspace
);
void workspace_set_selected_node(
Workspace *workspace,
const InvestigationNode *node
);
void workspace_free(
Workspace *workspace
);
```
---
## Fichiers concernés
```text
src/widgets/workspace.c
```
Éventuellement :
```text
include/widgets/workspace.h
```
uniquement pour mettre à jour la documentation.
Aucun autre module ne doit être modifié.
---
## Structure interne attendue
```c
struct Workspace
{
GtkWidget *root_widget;
GtkWidget *stack;
GtkWidget *welcome_page;
GtkWidget *welcome_title_label;
GtkWidget *welcome_status_label;
GtkWidget *welcome_instruction_label;
GtkWidget *node_page;
GtkWidget *node_name_label;
GtkWidget *node_type_label;
GtkWidget *node_parent_label;
GtkWidget *node_children_label;
};
```
Les noms exacts peuvent varier, mais doivent rester explicites.
---
## Pages attendues
### Page d'accueil
Nom interne :
```text
welcome
```
Contenu :
```text
Labfy Investigation
Aucune enquête ouverte
Sélectionnez ou créez une enquête
```
### Page d'informations
Nom interne :
```text
node-information
```
Contenu pour un dossier :
```text
00_BaseDeDonnees
Type : dossier
Parent : Template
Enfants : 2
```
Contenu pour un fichier :
```text
Enquete.sqlite
Type : fichier
Parent : 00_BaseDeDonnees
```
---
## Comportement attendu
Lorsque :
```c
workspace_set_selected_node(workspace, NULL);
```
le `GtkStack` doit afficher :
```text
welcome
```
Lorsqu'un nœud valide est transmis :
```c
workspace_set_selected_node(workspace, node);
```
le `GtkStack` doit afficher :
```text
node-information
```
---
## Hors périmètre
Ce ticket ne doit pas :
- ouvrir un fichier ;
- afficher son contenu ;
- ajouter une barre de navigation ;
- ajouter une animation personnalisée ;
- afficher plusieurs nœuds simultanément ;
- modifier le Core ;
- communiquer avec SQLite.
---
## Contraintes techniques
- GTK4 uniquement ;
- utiliser `GtkStack` ;
- aucune gestion manuelle de visibilité entre les pages ;
- aucun état global ;
- aucun changement de propriété des nœuds ;
- documentation cohérente ;
- compilation sans warning ;
- aucun `Gtk-CRITICAL`.
---
## Gestion de la propriété
Le `Workspace` possède uniquement sa structure d'encapsulation.
Les widgets sont gérés par l'arbre GTK une fois intégrés dans la fenêtre.
Le nœud reçu reste la propriété du `InvestigationTreeModel`.
Le `Workspace` ne doit jamais appeler :
```c
investigation_node_free(node);
```
---
## Critères d'acceptation
- [ ] Le projet compile sans warning.
- [ ] `make test` reste entièrement valide.
- [ ] `GtkStack` est utilisé.
- [ ] La page d'accueil apparaît sans sélection.
- [ ] La page d'informations apparaît après sélection.
- [ ] Le passage d'une page à l'autre fonctionne.
- [ ] Aucun appel manuel à `gtk_widget_set_visible()` n'est utilisé pour changer de page.
- [ ] L'API publique de `Workspace` reste stable.
- [ ] Aucun autre module n'est modifié.
- [ ] Aucun `Gtk-CRITICAL`.
---
## Tests manuels
1. Lancer l'application.
2. Ouvrir une enquête.
3. Vérifier que la page d'accueil est affichée sans sélection.
4. Sélectionner un dossier.
5. Vérifier l'affichage de la page d'informations.
6. Sélectionner un fichier.
7. Vérifier la mise à jour de la même page.
8. Changer d'enquête.
9. Vérifier le retour à la page d'accueil.
10. Lancer `make test`.
---
## Commit attendu
```text
refactor(gui): use GtkStack in workspace
```