Ajouter la sélection d'un nœud dans l'arborescence. #15

Closed
opened 2026-07-18 08:34:21 +02:00 by fy59 · 0 comments
Owner

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
## 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 - [x] Le projet compile sans warning. - [x] `make test` reste entièrement valide. - [x] Un seul nœud peut être sélectionné. - [x] La sélection d'un dossier est détectée. - [x] La sélection d'un fichier est détectée. - [x] Le bon `InvestigationNode` est transmis au callback. - [x] `Application` reçoit l'événement. - [x] Le nom et le type sont affichés dans le terminal. - [x] Le changement d'enquête efface l'ancienne sélection. - [x] Aucun module graphique ne libère le nœud. - [x] 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 ```
fy59 closed this issue 2026-07-18 08:34:40 +02:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: fy59/labfy-investigation#15
No description provided.