From 3dc094c8916852f404d463302ebe9c4e9062cfdd Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 18 Jul 2025 14:52:30 +0300 Subject: feat: export all cards from anki_cards folder, not just current session MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Changed GUI export to scan entire anki_cards directory - Uses GenerateFromDirectory to load all cards from subdirectories - Shows accurate count of total cards with audio/image stats - Works for both APKG and CSV export formats - No longer limited to cards from current session (savedCards) This ensures users can export their complete collection at any time, even after restarting the application. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- internal/gui/app.go | 52 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/internal/gui/app.go b/internal/gui/app.go index 84cf611..b84a917 100644 --- a/internal/gui/app.go +++ b/internal/gui/app.go @@ -806,10 +806,25 @@ func (a *Application) onRegenerateAll() { }() } -// onExportToAnki exports saved cards to Anki with format selection +// onExportToAnki exports all cards from anki_cards folder to Anki with format selection func (a *Application) onExportToAnki() { - if len(a.savedCards) == 0 { - dialog.ShowInformation("No Cards", "No cards to export. Generate some cards first!", a.window) + // Check if anki_cards directory exists and has content + entries, err := os.ReadDir(a.config.OutputDir) + if err != nil || len(entries) == 0 { + dialog.ShowInformation("No Cards", "No cards found in anki_cards folder. Generate some cards first!", a.window) + return + } + + // Count subdirectories (excluding hidden ones) + cardCount := 0 + for _, entry := range entries { + if entry.IsDir() && !strings.HasPrefix(entry.Name(), ".") { + cardCount++ + } + } + + if cardCount == 0 { + dialog.ShowInformation("No Cards", "No cards found in anki_cards folder. Generate some cards first!", a.window) return } @@ -850,10 +865,13 @@ func (a *Application) onExportToAnki() { filename = fmt.Sprintf("%s.apkg", sanitizeFilename(deckName)) outputPath = filepath.Join(a.config.OutputDir, filename) - // Generate APKG + // Generate APKG from all cards in directory gen := anki.NewGenerator(nil) - for _, card := range a.savedCards { - gen.AddCard(card) + + // Load all cards from the anki_cards directory + if err := gen.GenerateFromDirectory(a.config.OutputDir); err != nil { + dialog.ShowError(fmt.Errorf("Failed to load cards: %w", err), a.window) + return } if err := gen.GenerateAPKG(outputPath, deckName); err != nil { @@ -861,15 +879,18 @@ func (a *Application) onExportToAnki() { return } + // Get actual card count + total, withAudio, withImages := gen.Stats() + dialog.ShowInformation("Export Complete", - fmt.Sprintf("Exported %d cards to:\n%s\n\nThe APKG file includes all media and can be imported directly into Anki.", - len(a.savedCards), outputPath), + fmt.Sprintf("Exported %d cards to:\n%s\n(%d with audio, %d with images)\n\nThe APKG file includes all media and can be imported directly into Anki.", + total, outputPath, withAudio, withImages), a.window) } else { filename = "anki_import.csv" outputPath = filepath.Join(a.config.OutputDir, filename) - // Generate CSV + // Generate CSV from all cards in directory gen := anki.NewGenerator(&anki.GeneratorOptions{ OutputPath: outputPath, MediaFolder: a.config.OutputDir, @@ -877,8 +898,10 @@ func (a *Application) onExportToAnki() { AudioFormat: a.config.AudioFormat, }) - for _, card := range a.savedCards { - gen.AddCard(card) + // Load all cards from the anki_cards directory + if err := gen.GenerateFromDirectory(a.config.OutputDir); err != nil { + dialog.ShowError(fmt.Errorf("Failed to load cards: %w", err), a.window) + return } if err := gen.GenerateCSV(); err != nil { @@ -886,9 +909,12 @@ func (a *Application) onExportToAnki() { return } + // Get actual card count + total, withAudio, withImages := gen.Stats() + dialog.ShowInformation("Export Complete", - 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), + fmt.Sprintf("Exported %d cards to:\n%s\n(%d with audio, %d with images)\n\nNote: The CSV file should be in the same directory as your media files (%s) for Anki import to work correctly.", + total, outputPath, withAudio, withImages, a.config.OutputDir), a.window) } }, a.window) -- cgit v1.2.3