- Add HistoryWindowController for native macOS window management
- Update MenuBarManager to support window opening
- Modify sidebar to open history in separate window instead of inline
- Update navigation handlers to use window controller
- Settings remains inline as before
Migrates vocabulary words and word replacements from UserDefaults to SwiftData for better data management and persistence.
Changes:
- Create VocabularyWord and WordReplacement SwiftData models
- Add dual ModelConfiguration setup (default.store for transcripts, dictionary.store for dictionary data)
- Implement DictionaryMigrationService for one-time UserDefaults→SwiftData migration
- Rename "Correct Spellings" to "Vocabulary" for clearer terminology
- Update all dictionary views to use @Query instead of manager classes
- Update all services to fetch from SwiftData using FetchDescriptor
- Enhance word replacement duplicate detection (now checks during add AND edit)
- Update import/export services to work with SwiftData
- Preserve all existing functionality with improved data integrity
Technical details:
- Separate store files: default.store (transcripts) + dictionary.store (vocabulary + replacements)
- Migration flag: "HasMigratedDictionaryToSwiftData_v2"
- All CRUD operations properly implemented with duplicate detection
This commit provides comprehensive documentation and source files for 5 critical quality of life improvements:
1. Recording duration indicator with real-time timer
2. Enhanced status display with visual feedback
3. Visible cancel button during recording
4. Keyboard shortcut cheat sheet (Cmd+?)
5. Structured logging system (AppLogger)
Included Files:
- Complete source files for new features
- Step-by-step application guide
- Detailed technical documentation
- Full analysis with 40+ improvement ideas
See APPLYING_QOL_IMPROVEMENTS.md for instructions on how to apply these improvements to the codebase.
All changes are backward compatible with no breaking changes.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>