feat: TranscriptWidget ViewModel + SttConfig (#8) #103

Closed
charles wants to merge 3 commits from feat/8-transcript-widget into main
Owner

Résumé

Implémente l'issue #8 — UI TranscriptWidget dépliable sous le player audio.

Puisque fractal-gtk n'a pas encore de dépendances GTK4 complètes, cette PR établit la couche ViewModel (GTK-agnostique) qui contient toute la logique du widget. Les bindings GTK4 réels (GtkExpander/GtkRevealer) seront branchés quand la migration GTK4 sera complète.

Changements

  • crates/fractal-gtk/Cargo.toml : ajout des dépendances fractal-stt, serde, serde_json
  • crates/fractal-gtk/src/transcript_widget.rs (nouveau) :
    • TranscriptState : enum des états (Idle, Loading, Ready { transcript, expanded }, Error { message })
    • ConfidenceBadgeColor : badge vert/orange/rouge mappé depuis Confidence, avec css_class() pour libadwaita
    • SttConfig : config avec auto_transcribe: bool et show_annotation_button: bool
    • TranscriptViewModel : view-model complet avec transitions d'état, toggle_expanded(), confidence_badge(), should_auto_transcribe()
    • 10 tests unitaires couvrant tous les états et transitions
  • crates/fractal-gtk/src/lib.rs : pub use des 4 types publics

Critères d'acceptation couverts

  • Bouton "Transcrire" → état Idle + start_transcription()
  • Widget dépliable → Ready { expanded } + toggle_expanded()
  • Badge coloré confiance → ConfidenceBadgeColor::from_confidence() + css_class()
  • Mode automatique → SttConfig::auto_transcribe + should_auto_transcribe()
  • État "en cours" → TranscriptState::Loading
  • État "erreur" + retry → TranscriptState::Error + retry()
  • Bouton annotation Matrix → SttConfig::show_annotation_button (optionnel, présent dans le modèle)

Plan de test

  • cargo test -p fractal-gtk — les 10 tests unitaires du module transcript_widget::tests doivent passer
  • Vérifier que TranscriptState::Ready { expanded: true } passe à false après toggle_expanded()
  • Vérifier que ConfidenceBadgeColor::css_class() retourne "success" / "warning" / "error"
  • Vérifier que SttConfig { auto_transcribe: true } fait retourner true à should_auto_transcribe()

Closes #8

## Résumé Implémente l'issue #8 — UI `TranscriptWidget` dépliable sous le player audio. Puisque `fractal-gtk` n'a pas encore de dépendances GTK4 complètes, cette PR établit la couche **ViewModel** (GTK-agnostique) qui contient toute la logique du widget. Les bindings GTK4 réels (GtkExpander/GtkRevealer) seront branchés quand la migration GTK4 sera complète. ### Changements - **`crates/fractal-gtk/Cargo.toml`** : ajout des dépendances `fractal-stt`, `serde`, `serde_json` - **`crates/fractal-gtk/src/transcript_widget.rs`** (nouveau) : - `TranscriptState` : enum des états (`Idle`, `Loading`, `Ready { transcript, expanded }`, `Error { message }`) - `ConfidenceBadgeColor` : badge vert/orange/rouge mappé depuis `Confidence`, avec `css_class()` pour libadwaita - `SttConfig` : config avec `auto_transcribe: bool` et `show_annotation_button: bool` - `TranscriptViewModel` : view-model complet avec transitions d'état, `toggle_expanded()`, `confidence_badge()`, `should_auto_transcribe()` - 10 tests unitaires couvrant tous les états et transitions - **`crates/fractal-gtk/src/lib.rs`** : `pub use` des 4 types publics ### Critères d'acceptation couverts - [x] Bouton "Transcrire" → état `Idle` + `start_transcription()` - [x] Widget dépliable → `Ready { expanded }` + `toggle_expanded()` - [x] Badge coloré confiance → `ConfidenceBadgeColor::from_confidence()` + `css_class()` - [x] Mode automatique → `SttConfig::auto_transcribe` + `should_auto_transcribe()` - [x] État "en cours" → `TranscriptState::Loading` - [x] État "erreur" + retry → `TranscriptState::Error` + `retry()` - [x] Bouton annotation Matrix → `SttConfig::show_annotation_button` (optionnel, présent dans le modèle) ### Plan de test - [ ] `cargo test -p fractal-gtk` — les 10 tests unitaires du module `transcript_widget::tests` doivent passer - [ ] Vérifier que `TranscriptState::Ready { expanded: true }` passe à `false` après `toggle_expanded()` - [ ] Vérifier que `ConfidenceBadgeColor::css_class()` retourne `"success"` / `"warning"` / `"error"` - [ ] Vérifier que `SttConfig { auto_transcribe: true }` fait retourner `true` à `should_auto_transcribe()` Closes #8
charles closed this pull request 2026-04-06 02:06:08 +00:00
Some checks are pending
CI / cargo check (pull_request) Has been cancelled
CI / cargo test (pull_request) Has been cancelled
CI / clippy + rustfmt (pull_request) Has been cancelled
qa
Required

Pull request closed

Sign in to join this conversation.
No description provided.