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

4.7 KiB

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

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 :

const InvestigationNode *node;

Le code appelé ne doit jamais faire :

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

typedef void (*InvestigationTreeViewSelectionCallback)(
    const InvestigationNode *node,
    gpointer user_data
);
void investigation_tree_view_set_selection_callback(
    InvestigationTreeView *tree_view,
    InvestigationTreeViewSelectionCallback callback,
    gpointer user_data
);

Sidebar

void sidebar_set_selection_callback(
    Sidebar *sidebar,
    InvestigationTreeViewSelectionCallback callback,
    gpointer user_data
);

MainWindow

void main_window_set_tree_selection_callback(
    MainWindow *main_window,
    InvestigationTreeViewSelectionCallback callback,
    gpointer user_data
);

Comportement attendu

Lorsque l'utilisateur sélectionne :

Enquete.sqlite

le terminal affiche temporairement :

Nœud sélectionné : Enquete.sqlite
Type : fichier

Pour un dossier :

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

feat(gui): add investigation tree selection