244 lines
4.7 KiB
Markdown
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
|
|
```
|