labfy-investigation/docs/tickets/closed/TICKET-031.md
2026-07-17 09:00:18 +02:00

301 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Ticket #031 — Ouvrir une enquête existante depuis GTK
## Contexte
Les tickets #029 et #030 ont permis de :
- créer une enquête depuis GTK ;
- initialiser son arborescence et sa base SQLite ;
- ouvrir une `InvestigationSession` ;
- construire le `InvestigationTreeModel` ;
- installer la session dans `Application` ;
- afficher le nom et le chemin de lenquête dans `MainWindow`.
Lapplication ne permet cependant pas encore douvrir explicitement une enquête existante.
Lancien sélecteur automatique au démarrage a été supprimé afin de ne pas forcer lutilisateur à choisir un dossier à chaque lancement.
## Objectif
Ajouter un bouton :
```text
Ouvrir une enquête
```
Ce bouton doit permettre de sélectionner le dossier racine dune enquête existante, puis de louvrir avec le flux déjà présent :
```text
FolderDialog
investigation_session_open()
investigation_tree_builder_build()
application_install_session()
MainWindow mise à jour
```
La logique dinstallation dune session ne doit pas être dupliquée.
## Travail à réaliser
### 1. Ajouter le bouton dans `MainWindow`
Modifier :
```text
include/views/main_window.h
src/views/main_window.c
```
Ajouter un bouton visible dans la barre dactions :
```text
Ouvrir une enquête
```
La barre doit contenir au minimum :
```text
[ Nouvelle enquête ] [ Ouvrir une enquête ]
```
Ajouter dans la structure privée :
```c
GtkWidget *open_investigation_button;
```
### 2. Ajouter le type de callback
Dans `include/views/main_window.h`, ajouter :
```c
typedef void (*MainWindowOpenInvestigationCallback)(
gpointer user_data
);
```
Puis déclarer :
```c
void main_window_set_open_investigation_callback(
MainWindow *main_window,
MainWindowOpenInvestigationCallback callback,
gpointer user_data
);
```
### 3. Conserver le callback dans `MainWindow`
Ajouter dans la structure privée :
```c
MainWindowOpenInvestigationCallback
open_investigation_callback;
gpointer
open_investigation_user_data;
```
Ajouter un callback privé :
```c
static void main_window_on_open_investigation_clicked(
GtkButton *button,
gpointer user_data
);
```
Il doit appeler le callback configuré uniquement sil existe.
`MainWindow` ne doit pas ouvrir elle-même la session.
### 4. Relier le bouton à `Application`
Dans `src/core/application.c`, réactiver lutilisation de :
```c
#include "views/folder_dialog.h"
```
Ajouter :
```c
static void application_on_open_investigation_requested(
gpointer user_data
);
```
Cette fonction doit ouvrir le sélecteur avec :
```c
folder_dialog_select_folder(
main_window_get_window(application->main_window),
application_on_folder_selected,
application
);
```
### 5. Réutiliser `application_on_folder_selected()`
La fonction doit :
1. accepter lannulation ;
2. ouvrir la session avec `investigation_session_open()` ;
3. récupérer le chemin racine depuis `InvestigationProject` ;
4. construire larbre avec `investigation_tree_builder_build()` ;
5. installer les objets avec `application_install_session()`.
En cas déchec :
```text
ancienne session conservée
ancien arbre conservé
nouvelle session libérée
nouvel arbre libéré
warning explicite
```
### 6. Enregistrer le callback dans `application_on_activate()`
Après la création de `MainWindow`, appeler :
```c
main_window_set_open_investigation_callback(
application->main_window,
application_on_open_investigation_requested,
application
);
```
Le sélecteur ne doit pas être lancé automatiquement au démarrage.
## Tests manuels
### Ouverture valide
1. lancer lapplication ;
2. cliquer sur `Ouvrir une enquête` ;
3. sélectionner une enquête créée avec le ticket #030 ;
4. vérifier laffichage de larborescence ;
5. vérifier le titre ;
6. vérifier la barre détat ;
7. vérifier labsence derreur SQLite.
### Annulation
Ouvrir le sélecteur puis annuler.
Vérifier :
```text
aucun crash
aucun changement de session
aucun changement darbre
```
### Dossier invalide
Sélectionner un dossier sans base SQLite.
Vérifier :
```text
warning explicite
aucune base créée
ancienne session conservée
```
### Remplacement
1. ouvrir une enquête A ;
2. ouvrir une enquête B ;
3. vérifier que B remplace A.
### Échec pendant le remplacement
1. ouvrir une enquête valide A ;
2. tenter douvrir un dossier invalide ;
3. vérifier que A reste active.
## Critères dacceptation
- [ ] Le bouton `Ouvrir une enquête` est visible.
- [ ] Le bouton ouvre un sélecteur de dossier.
- [ ] Le sélecteur ne souvre pas automatiquement au démarrage.
- [ ] Une enquête valide peut être ouverte.
- [ ] Larborescence est affichée.
- [ ] Le titre est mis à jour.
- [ ] La barre détat est mise à jour.
- [ ] Lannulation ne modifie aucun état.
- [ ] Un dossier invalide est refusé.
- [ ] Une base absente nest pas créée.
- [ ] Lancienne session reste active en cas déchec.
- [ ] Lancien arbre reste actif en cas déchec.
- [ ] `application_install_session()` est réutilisée.
- [ ] Aucun appel SQLite direct nest ajouté.
- [ ] `make` réussit.
- [ ] `make test` réussit.
- [ ] `git diff --check` ne retourne aucune erreur.
## Audit attendu
```bash
rg -n 'open_investigation|Ouvrir une enquête' include/views/main_window.h src/views/main_window.c src/core/application.c
```
```bash
rg -n 'folder_dialog_select_folder' src/core/application.c
```
```bash
rg -n 'sqlite3_|#include <sqlite3.h>' src/core/application.c src/views/main_window.c
```
Résultat attendu pour la dernière commande :
```text
aucune sortie
```
## Fichiers principalement concernés
```text
include/views/main_window.h
src/views/main_window.c
src/core/application.c
```
## Résultat attendu
À la fin du ticket, lapplication doit proposer deux actions explicites :
```text
Nouvelle enquête
Ouvrir une enquête
```
Lutilisateur doit pouvoir créer une enquête, fermer lapplication, puis la rouvrir plus tard depuis GTK.
## Commit attendu
```bash
make clean
make
make test
git diff --check
git status --short
```
```bash
git add include/views/main_window.h src/views/main_window.c src/core/application.c
```
```bash
git commit -m "feat(ui): add investigation opening action"
git push
```