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 9f9ac84..65b1d25 100755 Binary files a/labfy-investigation and b/labfy-investigation differ diff --git a/src/widgets/sidebar.c b/src/widgets/sidebar.c index 78f3651..cdaff3e 100644 --- a/src/widgets/sidebar.c +++ b/src/widgets/sidebar.c @@ -5,6 +5,7 @@ #include "widgets/sidebar.h" #include "core/investigation_node.h" +#include "widgets/investigation_tree_view.h" #include @@ -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.