feat(gui): integrate investigation tree into sidebar
This commit is contained in:
parent
d9ba83b683
commit
efe032eefc
4 changed files with 265 additions and 1 deletions
217
docs/tickets/closed/TICKET-013.md
Normal file
217
docs/tickets/closed/TICKET-013.md
Normal 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.
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include "widgets/sidebar.h"
|
||||
#include "core/investigation_node.h"
|
||||
#include "widgets/investigation_tree_view.h"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in a new issue