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

6.3 KiB
Raw Blame History

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 :

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 :

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 :

include/views/main_window.h
src/views/main_window.c

Ajouter un bouton visible dans la barre dactions :

Ouvrir une enquête

La barre doit contenir au minimum :

[ Nouvelle enquête ] [ Ouvrir une enquête ]

Ajouter dans la structure privée :

GtkWidget *open_investigation_button;

2. Ajouter le type de callback

Dans include/views/main_window.h, ajouter :

typedef void (*MainWindowOpenInvestigationCallback)(
    gpointer user_data
);

Puis déclarer :

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 :

MainWindowOpenInvestigationCallback
    open_investigation_callback;

gpointer
    open_investigation_user_data;

Ajouter un callback privé :

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 :

#include "views/folder_dialog.h"

Ajouter :

static void application_on_open_investigation_requested(
    gpointer user_data
);

Cette fonction doit ouvrir le sélecteur avec :

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 :

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 :

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 :

aucun crash
aucun changement de session
aucun changement darbre

Dossier invalide

Sélectionner un dossier sans base SQLite.

Vérifier :

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

rg -n     'open_investigation|Ouvrir une enquête'     include/views/main_window.h     src/views/main_window.c     src/core/application.c
rg -n     'folder_dialog_select_folder'     src/core/application.c
rg -n     'sqlite3_|#include <sqlite3.h>'     src/core/application.c     src/views/main_window.c

Résultat attendu pour la dernière commande :

aucune sortie

Fichiers principalement concernés

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 :

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

make clean
make
make test
git diff --check
git status --short
git add     include/views/main_window.h     src/views/main_window.c     src/core/application.c
git commit -m "feat(ui): add investigation opening action"
git push