From efe032eefcb467fb5751b1d0c739c8297f01a024 Mon Sep 17 00:00:00 2001 From: grayTerminal-sh Date: Tue, 14 Jul 2026 09:08:22 +0200 Subject: [PATCH] feat(gui): integrate investigation tree into sidebar --- docs/tickets/{open => closed}/TICKET-012.md | 0 docs/tickets/closed/TICKET-013.md | 217 ++++++++++++++++++++ labfy-investigation | Bin 88216 -> 88504 bytes src/widgets/sidebar.c | 49 ++++- 4 files changed, 265 insertions(+), 1 deletion(-) rename docs/tickets/{open => closed}/TICKET-012.md (100%) create mode 100644 docs/tickets/closed/TICKET-013.md diff --git a/docs/tickets/open/TICKET-012.md b/docs/tickets/closed/TICKET-012.md similarity index 100% rename from docs/tickets/open/TICKET-012.md rename to docs/tickets/closed/TICKET-012.md diff --git a/docs/tickets/closed/TICKET-013.md b/docs/tickets/closed/TICKET-013.md new file mode 100644 index 0000000..e42ce0e --- /dev/null +++ b/docs/tickets/closed/TICKET-013.md @@ -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 +``` diff --git a/labfy-investigation b/labfy-investigation index 9f9ac84df521a22ff12bbd1f810754d4ec9a3734..65b1d25b18d81ca7913011dfc09e309fae38b5c7 100755 GIT binary patch delta 9072 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 jyDF9@e2U_as%E|TE4}<9s#zb)D @@ -24,13 +25,14 @@ struct Sidebar { GtkWidget *root_widget; GtkWidget *title_label; + InvestigationTreeView *tree_view; }; Sidebar *sidebar_new(void) { Sidebar *sidebar = NULL; - sidebar = g_new0(Sidebar, 1); + GtkWidget *tree_view_widget = NULL; sidebar->root_widget = gtk_box_new( GTK_ORIENTATION_VERTICAL, @@ -83,6 +85,39 @@ Sidebar *sidebar_new(void) 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; } @@ -111,6 +146,16 @@ void sidebar_set_tree_model( return; } + if (sidebar == NULL) + { + return; + } + + investigation_tree_view_set_model( + sidebar->tree_view, + tree_model + ); + if (tree_model == NULL) { gtk_label_set_text( @@ -158,6 +203,8 @@ void sidebar_free(Sidebar *sidebar) return; } + investigation_tree_view_free(sidebar->tree_view); + /* * 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.