From 6b0b4c9ce28b88ab0abbff03c5f367d89ba97c89 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 16 Jul 2025 21:27:08 +0300 Subject: fix: update button labels to show lowercase hotkeys and improve export location MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change all button labels to show lowercase letters (g, n, i, a, r, d, p) - Update delete confirmation dialog to show lowercase y/n - Set default export location to anki_cards directory - Add note about CSV needing to be in same directory as media files - Fix prompt generation to remove Bulgarian word reference 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- internal/gui/app.go | 23 ++++++++++++++++------- internal/gui/audio_player.go | 8 ++++---- internal/gui/navigation.go | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) (limited to 'internal/gui') diff --git a/internal/gui/app.go b/internal/gui/app.go index 3783eb9..836ebca 100644 --- a/internal/gui/app.go +++ b/internal/gui/app.go @@ -157,7 +157,7 @@ func (a *Application) setupUI() { a.wordInput.SetPlaceHolder("Enter Bulgarian word...") a.wordInput.OnSubmitted = func(string) { a.onSubmit() } - a.submitButton = widget.NewButton("Generate (G)", a.onSubmit) + a.submitButton = widget.NewButton("Generate (g)", a.onSubmit) a.prevWordBtn = widget.NewButton("◀ Prev (←)", a.onPrevWord) a.nextWordBtn = widget.NewButton("Next (→) ▶", a.onNextWord) @@ -203,11 +203,11 @@ func (a *Application) setupUI() { ) // Create action buttons - a.keepButton = widget.NewButton("New Word (N)", a.onKeepAndContinue) - a.regenerateImageBtn = widget.NewButton("Regenerate Image (I)", a.onRegenerateImage) - a.regenerateAudioBtn = widget.NewButton("Regenerate Audio (A)", a.onRegenerateAudio) - a.regenerateAllBtn = widget.NewButton("Regenerate All (R)", a.onRegenerateAll) - a.deleteButton = widget.NewButton("Delete (D)", a.onDelete) + a.keepButton = widget.NewButton("New Word (n)", a.onKeepAndContinue) + a.regenerateImageBtn = widget.NewButton("Regenerate Image (i)", a.onRegenerateImage) + a.regenerateAudioBtn = widget.NewButton("Regenerate Audio (a)", a.onRegenerateAudio) + a.regenerateAllBtn = widget.NewButton("Regenerate All (r)", a.onRegenerateAll) + a.deleteButton = widget.NewButton("Delete (d)", a.onDelete) a.deleteButton.Importance = widget.DangerImportance // Initially disable action buttons @@ -561,12 +561,21 @@ func (a *Application) onExportToAnki() { } dialog.ShowInformation("Export Complete", - fmt.Sprintf("Exported %d cards to:\n%s", len(a.savedCards), outputPath), + fmt.Sprintf("Exported %d cards to:\n%s\n\nNote: The CSV file should be in the same directory as your media files (%s) for Anki import to work correctly.", + len(a.savedCards), outputPath, a.config.OutputDir), a.window) }, a.window) saveDialog.SetFileName("anki_import.csv") saveDialog.SetFilter(storage.NewExtensionFileFilter([]string{".csv"})) + + // Try to set the default location to the anki_cards directory + if uri, err := storage.ParseURI("file://" + a.config.OutputDir); err == nil { + if listableURI, ok := uri.(fyne.ListableURI); ok { + saveDialog.SetLocation(listableURI) + } + } + saveDialog.Show() } diff --git a/internal/gui/audio_player.go b/internal/gui/audio_player.go index 2d4b2da..f36eddf 100644 --- a/internal/gui/audio_player.go +++ b/internal/gui/audio_player.go @@ -31,7 +31,7 @@ func NewAudioPlayer() *AudioPlayer { p := &AudioPlayer{} // Create controls - p.playButton = widget.NewButton("▶ Play (P)", p.onPlay) + p.playButton = widget.NewButton("▶ Play (p)", p.onPlay) p.stopButton = widget.NewButton("■ Stop", p.onStop) p.statusLabel = widget.NewLabel("No audio loaded") @@ -98,7 +98,7 @@ func (p *AudioPlayer) onPlay() { } p.isPlaying = true - p.playButton.SetText("⏸ Pause (P)") + p.playButton.SetText("⏸ Pause (p)") p.stopButton.Enable() p.statusLabel.SetText("Playing: " + filepath.Base(p.audioFile)) } @@ -111,7 +111,7 @@ func (p *AudioPlayer) onStop() { } p.isPlaying = false - p.playButton.SetText("▶ Play (P)") + p.playButton.SetText("▶ Play (p)") p.stopButton.Disable() p.statusLabel.SetText("Stopped: " + filepath.Base(p.audioFile)) } @@ -164,7 +164,7 @@ func (p *AudioPlayer) startPlayback() error { // Playback finished normally fyne.Do(func() { p.isPlaying = false - p.playButton.SetText("▶ Play (P)") + p.playButton.SetText("▶ Play (p)") p.stopButton.Disable() p.statusLabel.SetText("Finished: " + filepath.Base(p.audioFile)) }) diff --git a/internal/gui/navigation.go b/internal/gui/navigation.go index e59b817..05bf988 100644 --- a/internal/gui/navigation.go +++ b/internal/gui/navigation.go @@ -294,7 +294,7 @@ func (a *Application) onDelete() { } // Create custom confirmation dialog with keyboard support - message := fmt.Sprintf("Delete all files for '%s'?\n\nPress Y to confirm or N to cancel", a.currentWord) + message := fmt.Sprintf("Delete all files for '%s'?\n\nPress y to confirm or n to cancel", a.currentWord) confirmDialog := dialog.NewConfirm("Delete Word", message, func(confirm bool) { a.deleteConfirming = false if confirm { -- cgit v1.2.3