labfy-investigation/docs/tickets/closed/TICKET-014.md
2026-07-14 10:19:23 +02:00

244 lines
4.7 KiB
Markdown

# Ticket #014
## Titre
Ajouter la sélection d'un nœud dans l'arborescence.
---
## Objectif
Permettre à l'utilisateur de sélectionner un dossier ou un fichier dans
`InvestigationTreeView`.
Le nœud sélectionné doit être transmis jusqu'au module `Application`, qui
reste responsable de la coordination entre l'arborescence et le reste de
l'interface.
Ce ticket ne doit encore ouvrir aucun fichier.
---
## Architecture
```text
GtkListView
InvestigationTreeView
Sidebar
MainWindow
Application
```
Le Core reste indépendant de GTK.
---
## Responsabilités
### InvestigationTreeView
Le module doit :
- remplacer `GtkNoSelection` par `GtkSingleSelection` ;
- détecter les changements de sélection ;
- retrouver le `InvestigationNode` métier correspondant ;
- appeler un callback public avec le nœud sélectionné ;
- transmettre `NULL` lorsqu'aucun nœud n'est sélectionné.
### Sidebar
Le module doit :
- recevoir un callback de sélection ;
- le transmettre à `InvestigationTreeView` ;
- ne contenir aucune logique métier liée à la sélection.
### MainWindow
Le module doit :
- recevoir le callback depuis `Application` ;
- le transmettre à `Sidebar`.
### Application
Le module doit :
- recevoir le nœud sélectionné ;
- afficher temporairement son nom et son type dans le terminal ;
- ne pas modifier ni libérer le nœud reçu.
---
## Principe de propriété
Le nœud sélectionné appartient toujours au
`InvestigationTreeModel`, lui-même possédé par `Application`.
Le callback reçoit uniquement une référence non propriétaire :
```c
const InvestigationNode *node;
```
Le code appelé ne doit jamais faire :
```c
investigation_node_free(node);
```
La référence reste valide tant que le modèle courant n'est pas remplacé ou
détruit.
---
## Interfaces publiques à ajouter
### InvestigationTreeView
```c
typedef void (*InvestigationTreeViewSelectionCallback)(
const InvestigationNode *node,
gpointer user_data
);
```
```c
void investigation_tree_view_set_selection_callback(
InvestigationTreeView *tree_view,
InvestigationTreeViewSelectionCallback callback,
gpointer user_data
);
```
### Sidebar
```c
void sidebar_set_selection_callback(
Sidebar *sidebar,
InvestigationTreeViewSelectionCallback callback,
gpointer user_data
);
```
### MainWindow
```c
void main_window_set_tree_selection_callback(
MainWindow *main_window,
InvestigationTreeViewSelectionCallback callback,
gpointer user_data
);
```
---
## Comportement attendu
Lorsque l'utilisateur sélectionne :
```text
Enquete.sqlite
```
le terminal affiche temporairement :
```text
Nœud sélectionné : Enquete.sqlite
Type : fichier
```
Pour un dossier :
```text
Nœud sélectionné : 00_BaseDeDonnees
Type : dossier
```
Lorsqu'aucun élément n'est sélectionné, le callback reçoit `NULL`.
---
## Hors périmètre
Ce ticket ne doit pas :
- ouvrir un fichier ;
- modifier le Workspace ;
- afficher un aperçu ;
- sélectionner plusieurs nœuds ;
- ajouter un menu contextuel ;
- afficher des icônes ;
- modifier le Core ;
- modifier le système de fichiers.
---
## Contraintes techniques
- GTK4 uniquement ;
- utiliser `GtkSingleSelection` ;
- aucun `GtkTreeView` ;
- aucun état global ;
- callback documenté avec Doxygen ;
- aucune destruction du nœud sélectionné ;
- compilation sans warning ;
- aucun `Gtk-CRITICAL`.
---
## Gestion des changements de modèle
Lorsqu'un nouveau modèle est installé :
- la sélection précédente doit être supprimée ;
- aucun callback ne doit conserver une référence vers un nœud de l'ancien
modèle ;
- la nouvelle vue doit démarrer sans sélection.
---
## Critères d'acceptation
- [ ] Le projet compile sans warning.
- [ ] `make test` reste entièrement valide.
- [ ] Un seul nœud peut être sélectionné.
- [ ] La sélection d'un dossier est détectée.
- [ ] La sélection d'un fichier est détectée.
- [ ] Le bon `InvestigationNode` est transmis au callback.
- [ ] `Application` reçoit l'événement.
- [ ] Le nom et le type sont affichés dans le terminal.
- [ ] Le changement d'enquête efface l'ancienne sélection.
- [ ] Aucun module graphique ne libère le nœud.
- [ ] Aucun `Gtk-CRITICAL`.
---
## Tests manuels
1. Lancer l'application.
2. Ouvrir le dossier `Template`.
3. Développer `00_BaseDeDonnees`.
4. Sélectionner `Enquete.sqlite`.
5. Vérifier le nom et le type dans le terminal.
6. Sélectionner un dossier.
7. Vérifier que le type affiché est `dossier`.
8. Ouvrir une autre enquête.
9. Vérifier qu'aucune ancienne sélection n'est conservée.
10. Lancer `make test`.
---
## Commit attendu
```text
feat(gui): add investigation tree selection
```