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 "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.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue