feat(gui): integrate investigation tree into sidebar

This commit is contained in:
grayTerminal-sh 2026-07-14 09:08:22 +02:00
parent d9ba83b683
commit efe032eefc
4 changed files with 265 additions and 1 deletions

View file

@ -0,0 +1,217 @@
# Ticket #013
## Titre
Intégrer `InvestigationTreeView` dans la `Sidebar`.
---
## Objectif
Afficher dans la barre latérale l'arborescence complète de l'enquête ouverte.
Le composant `InvestigationTreeView` existe déjà. Ce ticket consiste uniquement à l'intégrer dans `Sidebar` et à lui transmettre le modèle métier reçu.
---
## Architecture
```text
Application
MainWindow
Sidebar
InvestigationTreeView
GtkTreeListModel
```
La `Sidebar` héberge la vue.
Elle ne parcourt jamais directement le système de fichiers.
---
## Responsabilités
### Sidebar
Le module `Sidebar` doit :
- créer un `InvestigationTreeView` ;
- intégrer son widget racine sous le titre ;
- transmettre le `InvestigationTreeModel` au composant ;
- libérer la structure `InvestigationTreeView` lors de sa propre destruction.
### InvestigationTreeView
Le composant conserve ses responsabilités actuelles :
- adapter le modèle métier à GTK4 ;
- afficher les nœuds ;
- gérer l'ouverture et le repli des dossiers.
---
## Principe de propriété
`Sidebar` est propriétaire de :
```text
InvestigationTreeView
```
Elle doit donc appeler :
```c
investigation_tree_view_free(...)
```
lors de sa destruction.
En revanche, ni `Sidebar` ni `InvestigationTreeView` ne possèdent :
```text
InvestigationTreeModel
```
Le modèle reste la propriété de `Application`.
---
## Fichiers concernés
```text
src/widgets/sidebar.c
```
Éventuellement :
```text
include/widgets/sidebar.h
```
uniquement si l'API publique doit être précisée.
Aucun changement du Core n'est nécessaire.
---
## Modifications attendues
La structure privée `Sidebar` doit contenir :
```c
InvestigationTreeView *tree_view;
```
Le constructeur doit :
1. créer le composant ;
2. récupérer son widget racine ;
3. l'ajouter sous le titre ;
4. lui permettre d'occuper l'espace disponible.
La fonction :
```c
sidebar_set_tree_model(...)
```
doit transmettre le modèle à :
```c
investigation_tree_view_set_model(...)
```
Le titre de la `Sidebar` peut continuer à afficher le nom du nœud racine.
---
## Interface graphique attendue
```text
Template
▸ 00_BaseDeDonnees
▸ 01_Preuves_Originales
▸ 02_Preuves_traitees
▸ 03_Chronologie
▸ 04_Entites
...
```
Les dossiers peuvent être développés et repliés.
Les fichiers apparaissent dans les branches développées.
---
## Hors périmètre
Ce ticket ne doit pas :
- permettre la sélection d'un nœud ;
- afficher des icônes ;
- ouvrir un fichier ;
- ajouter un menu contextuel ;
- rafraîchir automatiquement l'arbre ;
- modifier le système de fichiers ;
- communiquer avec SQLite.
---
## Contraintes techniques
- GTK4 uniquement ;
- aucun `GtkTreeView` ;
- aucune lecture directe du disque dans `Sidebar` ;
- aucun transfert de propriété du modèle métier ;
- aucun état global ;
- documentation cohérente ;
- compilation sans warning ;
- aucun `Gtk-CRITICAL`.
---
## Critères d'acceptation
- [ ] Le projet compile sans warning.
- [ ] `make test` reste entièrement valide.
- [ ] La vue est intégrée dans la `Sidebar`.
- [ ] Le titre affiche le nom de l'enquête.
- [ ] Tous les dossiers racine apparaissent.
- [ ] Les branches peuvent être développées et repliées.
- [ ] Les fichiers apparaissent dans les branches.
- [ ] L'ouverture successive de deux enquêtes reconstruit correctement l'affichage.
- [ ] La fermeture ne produit aucun warning critique.
- [ ] Le Core n'est pas modifié.
---
## Tests manuels
1. Lancer l'application.
2. Ouvrir le dossier `Template`.
3. Vérifier l'affichage des dossiers racine.
4. Développer `00_BaseDeDonnees`.
5. Vérifier la présence de `Enquete.sqlite`.
6. Développer plusieurs niveaux.
7. Fermer l'application.
8. Rouvrir avec une autre enquête.
9. Vérifier que l'ancien arbre a disparu.
10. Lancer `make test`.
---
## Commit attendu
```text
feat(gui): integrate investigation tree into sidebar
```

Binary file not shown.

View file

@ -5,6 +5,7 @@
#include "widgets/sidebar.h" #include "widgets/sidebar.h"
#include "core/investigation_node.h" #include "core/investigation_node.h"
#include "widgets/investigation_tree_view.h"
#include <glib.h> #include <glib.h>
@ -24,13 +25,14 @@ struct Sidebar
{ {
GtkWidget *root_widget; GtkWidget *root_widget;
GtkWidget *title_label; GtkWidget *title_label;
InvestigationTreeView *tree_view;
}; };
Sidebar *sidebar_new(void) Sidebar *sidebar_new(void)
{ {
Sidebar *sidebar = NULL; Sidebar *sidebar = NULL;
sidebar = g_new0(Sidebar, 1); sidebar = g_new0(Sidebar, 1);
GtkWidget *tree_view_widget = NULL;
sidebar->root_widget = gtk_box_new( sidebar->root_widget = gtk_box_new(
GTK_ORIENTATION_VERTICAL, GTK_ORIENTATION_VERTICAL,
@ -83,6 +85,39 @@ Sidebar *sidebar_new(void)
sidebar->title_label sidebar->title_label
); );
sidebar->tree_view = investigation_tree_view_new();
if (sidebar->tree_view == NULL)
{
sidebar_free(sidebar);
return NULL;
}
tree_view_widget = investigation_tree_view_get_widget(
sidebar->tree_view
);
if (tree_view_widget == NULL)
{
sidebar_free(sidebar);
return NULL;
}
gtk_widget_set_hexpand(
tree_view_widget,
TRUE
);
gtk_widget_set_vexpand(
tree_view_widget,
TRUE
);
gtk_box_append(
GTK_BOX(sidebar->root_widget),
tree_view_widget
);
return sidebar; return sidebar;
} }
@ -111,6 +146,16 @@ void sidebar_set_tree_model(
return; return;
} }
if (sidebar == NULL)
{
return;
}
investigation_tree_view_set_model(
sidebar->tree_view,
tree_model
);
if (tree_model == NULL) if (tree_model == NULL)
{ {
gtk_label_set_text( gtk_label_set_text(
@ -158,6 +203,8 @@ void sidebar_free(Sidebar *sidebar)
return; return;
} }
investigation_tree_view_free(sidebar->tree_view);
/* /*
* Les widgets GTK sont intégrés dans l'arbre de widgets de la fenêtre. * Les widgets GTK sont intégrés dans l'arbre de widgets de la fenêtre.
* GTK gère leur destruction lorsque la fenêtre est détruite. * GTK gère leur destruction lorsque la fenêtre est détruite.