summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-02 07:45:23 +0300
committerPaul Buetow <paul@buetow.org>2026-04-02 07:45:23 +0300
commit0f2b16d1ccf461b706dd426727ed188c4ea3b60a (patch)
tree5f02fc3c9c543c2ae8191814e6652155b7afd0c5
parentf623b64d083d52cc9a278e9d229215a6686c6b29 (diff)
Fix GUI selector sync and audio metadata model
-rw-r--r--internal/gui/app.go20
-rw-r--r--internal/gui/audio_paths_test.go3
-rw-r--r--internal/gui/generator.go17
-rw-r--r--internal/gui/generator_test.go13
-rw-r--r--internal/gui/navigation.go12
5 files changed, 52 insertions, 13 deletions
diff --git a/internal/gui/app.go b/internal/gui/app.go
index a5924fc..7c9ecd7 100644
--- a/internal/gui/app.go
+++ b/internal/gui/app.go
@@ -1879,6 +1879,26 @@ func (a *Application) setActionButtonsEnabled(enabled bool) {
}
}
+func (a *Application) syncCardTypeSelection(cardType internal.CardType) {
+ if a.cardTypeSelect == nil {
+ return
+ }
+
+ selected := "English → Bulgarian"
+ if cardType.IsBgBg() {
+ selected = "Bulgarian → Bulgarian"
+ }
+
+ if a.window == nil {
+ a.cardTypeSelect.SetSelected(selected)
+ return
+ }
+
+ fyne.Do(func() {
+ a.cardTypeSelect.SetSelected(selected)
+ })
+}
+
func (a *Application) showProgress(message string) {
// Check if we're already processing something
a.mu.Lock()
diff --git a/internal/gui/audio_paths_test.go b/internal/gui/audio_paths_test.go
index d412004..cf9046c 100644
--- a/internal/gui/audio_paths_test.go
+++ b/internal/gui/audio_paths_test.go
@@ -173,6 +173,9 @@ func TestCompletedBgBgJobKeepsBackAudioForSessionNavigation(t *testing.T) {
if app.currentCardType != "bg-bg" {
t.Fatalf("currentCardType = %q, want %q", app.currentCardType, "bg-bg")
}
+ if got := app.cardTypeSelect.Selected; got != "Bulgarian → Bulgarian" {
+ t.Fatalf("cardTypeSelect.Selected = %q, want %q", got, "Bulgarian → Bulgarian")
+ }
}
func TestResolveBgBgAudioFilesFindLegacyMp3Files(t *testing.T) {
diff --git a/internal/gui/generator.go b/internal/gui/generator.go
index f409216..704020d 100644
--- a/internal/gui/generator.go
+++ b/internal/gui/generator.go
@@ -473,10 +473,19 @@ func (a *Application) saveAudioMetadata(cardDir string, audioConfig audio.Config
metadata := strings.Builder{}
fmt.Fprintf(&metadata, "provider=%s\n", audioConfig.Provider)
- if strings.TrimSpace(audioConfig.GeminiTTSModel) != "" {
- fmt.Fprintf(&metadata, "model=%s\n", audioConfig.GeminiTTSModel)
- } else if strings.TrimSpace(audioConfig.OpenAIModel) != "" {
- fmt.Fprintf(&metadata, "model=%s\n", audioConfig.OpenAIModel)
+ switch strings.ToLower(strings.TrimSpace(audioConfig.Provider)) {
+ case "gemini":
+ model := strings.TrimSpace(audioConfig.GeminiTTSModel)
+ if model == "" {
+ model = audio.DefaultProviderConfig().GeminiTTSModel
+ }
+ fmt.Fprintf(&metadata, "model=%s\n", model)
+ default:
+ model := strings.TrimSpace(audioConfig.OpenAIModel)
+ if model == "" {
+ model = audio.DefaultProviderConfig().OpenAIModel
+ }
+ fmt.Fprintf(&metadata, "model=%s\n", model)
}
fmt.Fprintf(&metadata, "voice=%s\n", voice)
fmt.Fprintf(&metadata, "speed=%.2f\n", speed)
diff --git a/internal/gui/generator_test.go b/internal/gui/generator_test.go
index a6e3742..f9cb2a0 100644
--- a/internal/gui/generator_test.go
+++ b/internal/gui/generator_test.go
@@ -191,6 +191,7 @@ func TestGenerateAudioUsesSharedOpenAIVoices(t *testing.T) {
Provider: "openai",
OutputDir: tempDir,
OpenAIModel: "gpt-4o-mini-tts",
+ GeminiTTSModel: "sentinel-gemini-model",
OpenAIInstruction: "Speak clearly.",
},
}
@@ -218,6 +219,18 @@ func TestGenerateAudioUsesSharedOpenAIVoices(t *testing.T) {
if !strings.HasSuffix(outputPath, "audio.mp3") {
t.Fatalf("outputPath = %q, want shared audio filename", outputPath)
}
+
+ metadataData, err := os.ReadFile(filepath.Join(cardDir, "audio_metadata.txt"))
+ if err != nil {
+ t.Fatalf("expected metadata file: %v", err)
+ }
+ metadata := string(metadataData)
+ if !strings.Contains(metadata, "model=gpt-4o-mini-tts") {
+ t.Fatalf("openai metadata missing active model: %q", metadata)
+ }
+ if strings.Contains(metadata, "sentinel-gemini-model") {
+ t.Fatalf("openai metadata should not use Gemini model when provider is OpenAI: %q", metadata)
+ }
}
func TestGenerateAudioUsesGeminiModelDefaultVoiceAndAttribution(t *testing.T) {
diff --git a/internal/gui/navigation.go b/internal/gui/navigation.go
index 4acbb50..c58251c 100644
--- a/internal/gui/navigation.go
+++ b/internal/gui/navigation.go
@@ -301,6 +301,7 @@ func (a *Application) loadWordByIndex(index int) {
a.currentAudioFileBack = job.AudioFileBack
a.currentImage = job.ImageFile
a.currentCardType = job.CardType
+ a.syncCardTypeSelection(internal.CardType(job.CardType))
fyne.Do(func() {
if job.Translation != "" {
@@ -425,15 +426,8 @@ func (a *Application) loadExistingFiles(word string) {
fmt.Printf("DEBUG (loadExistingFiles): Loaded card type: %s (isBgBg: %v)\n", cardType, cardType.IsBgBg())
// Update UI card type selector
- fyne.Do(func() {
- if cardType.IsBgBg() {
- fmt.Printf("DEBUG (loadExistingFiles): Setting UI to bg-bg (Bulgarian → Bulgarian)\n")
- a.cardTypeSelect.SetSelected("Bulgarian → Bulgarian")
- } else {
- fmt.Printf("DEBUG (loadExistingFiles): Setting UI to en-bg (English → Bulgarian)\n")
- a.cardTypeSelect.SetSelected("English → Bulgarian")
- }
- })
+ fmt.Printf("DEBUG (loadExistingFiles): Syncing UI card type selector to %s\n", cardType)
+ a.syncCardTypeSelection(cardType)
// Load audio file(s)
if cardType.IsBgBg() {