289 lines
4.8 KiB
Markdown
289 lines
4.8 KiB
Markdown
# Ticket #016
|
|
|
|
## Titre
|
|
|
|
Structurer le `Workspace` avec `GtkStack`.
|
|
|
|
---
|
|
|
|
## Objectif
|
|
|
|
Remplacer la gestion manuelle de visibilité des pages du `Workspace` par un
|
|
`GtkStack`.
|
|
|
|
Le `Workspace` doit pouvoir afficher proprement plusieurs pages internes sans
|
|
modifier son API publique actuelle.
|
|
|
|
Ce ticket prépare l'ajout futur de nouvelles vues :
|
|
|
|
- aperçu texte ;
|
|
- aperçu image ;
|
|
- aperçu PDF ;
|
|
- chronologie ;
|
|
- fiches d'entités ;
|
|
- rapports.
|
|
|
|
---
|
|
|
|
## Architecture
|
|
|
|
```text
|
|
Workspace
|
|
└── GtkStack
|
|
├── WelcomePage
|
|
└── NodeInformationPage
|
|
```
|
|
|
|
Plus tard :
|
|
|
|
```text
|
|
Workspace
|
|
└── GtkStack
|
|
├── WelcomePage
|
|
├── NodeInformationPage
|
|
├── TextPreviewPage
|
|
├── ImagePreviewPage
|
|
├── PdfPreviewPage
|
|
└── EntityPage
|
|
```
|
|
|
|
Le `Workspace` reste responsable de son affichage interne.
|
|
|
|
---
|
|
|
|
## Responsabilités
|
|
|
|
Le module `Workspace` doit :
|
|
|
|
- créer un `GtkStack` comme widget racine interne ;
|
|
- ajouter une page d'accueil ;
|
|
- ajouter une page d'informations sur le nœud sélectionné ;
|
|
- afficher la page d'accueil lorsqu'aucun nœud n'est sélectionné ;
|
|
- afficher la page d'informations lorsqu'un nœud est sélectionné ;
|
|
- conserver l'API publique existante.
|
|
|
|
---
|
|
|
|
## API publique conservée
|
|
|
|
Aucune nouvelle fonction publique n'est requise.
|
|
|
|
L'API reste :
|
|
|
|
```c
|
|
Workspace *workspace_new(void);
|
|
|
|
GtkWidget *workspace_get_widget(
|
|
const Workspace *workspace
|
|
);
|
|
|
|
void workspace_set_selected_node(
|
|
Workspace *workspace,
|
|
const InvestigationNode *node
|
|
);
|
|
|
|
void workspace_free(
|
|
Workspace *workspace
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## Fichiers concernés
|
|
|
|
```text
|
|
src/widgets/workspace.c
|
|
```
|
|
|
|
Éventuellement :
|
|
|
|
```text
|
|
include/widgets/workspace.h
|
|
```
|
|
|
|
uniquement pour mettre à jour la documentation.
|
|
|
|
Aucun autre module ne doit être modifié.
|
|
|
|
---
|
|
|
|
## Structure interne attendue
|
|
|
|
```c
|
|
struct Workspace
|
|
{
|
|
GtkWidget *root_widget;
|
|
GtkWidget *stack;
|
|
|
|
GtkWidget *welcome_page;
|
|
GtkWidget *welcome_title_label;
|
|
GtkWidget *welcome_status_label;
|
|
GtkWidget *welcome_instruction_label;
|
|
|
|
GtkWidget *node_page;
|
|
GtkWidget *node_name_label;
|
|
GtkWidget *node_type_label;
|
|
GtkWidget *node_parent_label;
|
|
GtkWidget *node_children_label;
|
|
};
|
|
```
|
|
|
|
Les noms exacts peuvent varier, mais doivent rester explicites.
|
|
|
|
---
|
|
|
|
## Pages attendues
|
|
|
|
### Page d'accueil
|
|
|
|
Nom interne :
|
|
|
|
```text
|
|
welcome
|
|
```
|
|
|
|
Contenu :
|
|
|
|
```text
|
|
Labfy Investigation
|
|
|
|
Aucune enquête ouverte
|
|
|
|
Sélectionnez ou créez une enquête
|
|
```
|
|
|
|
### Page d'informations
|
|
|
|
Nom interne :
|
|
|
|
```text
|
|
node-information
|
|
```
|
|
|
|
Contenu pour un dossier :
|
|
|
|
```text
|
|
00_BaseDeDonnees
|
|
|
|
Type : dossier
|
|
Parent : Template
|
|
Enfants : 2
|
|
```
|
|
|
|
Contenu pour un fichier :
|
|
|
|
```text
|
|
Enquete.sqlite
|
|
|
|
Type : fichier
|
|
Parent : 00_BaseDeDonnees
|
|
```
|
|
|
|
---
|
|
|
|
## Comportement attendu
|
|
|
|
Lorsque :
|
|
|
|
```c
|
|
workspace_set_selected_node(workspace, NULL);
|
|
```
|
|
|
|
le `GtkStack` doit afficher :
|
|
|
|
```text
|
|
welcome
|
|
```
|
|
|
|
Lorsqu'un nœud valide est transmis :
|
|
|
|
```c
|
|
workspace_set_selected_node(workspace, node);
|
|
```
|
|
|
|
le `GtkStack` doit afficher :
|
|
|
|
```text
|
|
node-information
|
|
```
|
|
|
|
---
|
|
|
|
## Hors périmètre
|
|
|
|
Ce ticket ne doit pas :
|
|
|
|
- ouvrir un fichier ;
|
|
- afficher son contenu ;
|
|
- ajouter une barre de navigation ;
|
|
- ajouter une animation personnalisée ;
|
|
- afficher plusieurs nœuds simultanément ;
|
|
- modifier le Core ;
|
|
- communiquer avec SQLite.
|
|
|
|
---
|
|
|
|
## Contraintes techniques
|
|
|
|
- GTK4 uniquement ;
|
|
- utiliser `GtkStack` ;
|
|
- aucune gestion manuelle de visibilité entre les pages ;
|
|
- aucun état global ;
|
|
- aucun changement de propriété des nœuds ;
|
|
- documentation cohérente ;
|
|
- compilation sans warning ;
|
|
- aucun `Gtk-CRITICAL`.
|
|
|
|
---
|
|
|
|
## Gestion de la propriété
|
|
|
|
Le `Workspace` possède uniquement sa structure d'encapsulation.
|
|
|
|
Les widgets sont gérés par l'arbre GTK une fois intégrés dans la fenêtre.
|
|
|
|
Le nœud reçu reste la propriété du `InvestigationTreeModel`.
|
|
|
|
Le `Workspace` ne doit jamais appeler :
|
|
|
|
```c
|
|
investigation_node_free(node);
|
|
```
|
|
|
|
---
|
|
|
|
## Critères d'acceptation
|
|
|
|
- [ ] Le projet compile sans warning.
|
|
- [ ] `make test` reste entièrement valide.
|
|
- [ ] `GtkStack` est utilisé.
|
|
- [ ] La page d'accueil apparaît sans sélection.
|
|
- [ ] La page d'informations apparaît après sélection.
|
|
- [ ] Le passage d'une page à l'autre fonctionne.
|
|
- [ ] Aucun appel manuel à `gtk_widget_set_visible()` n'est utilisé pour changer de page.
|
|
- [ ] L'API publique de `Workspace` reste stable.
|
|
- [ ] Aucun autre module n'est modifié.
|
|
- [ ] Aucun `Gtk-CRITICAL`.
|
|
|
|
---
|
|
|
|
## Tests manuels
|
|
|
|
1. Lancer l'application.
|
|
2. Ouvrir une enquête.
|
|
3. Vérifier que la page d'accueil est affichée sans sélection.
|
|
4. Sélectionner un dossier.
|
|
5. Vérifier l'affichage de la page d'informations.
|
|
6. Sélectionner un fichier.
|
|
7. Vérifier la mise à jour de la même page.
|
|
8. Changer d'enquête.
|
|
9. Vérifier le retour à la page d'accueil.
|
|
10. Lancer `make test`.
|
|
|
|
---
|
|
|
|
## Commit attendu
|
|
|
|
```text
|
|
refactor(gui): use GtkStack in workspace
|
|
```
|