diff --git a/lib/src/screens/browse_screen.dart b/lib/src/screens/browse_screen.dart index 0c516f7..d8284ae 100644 --- a/lib/src/screens/browse_screen.dart +++ b/lib/src/screens/browse_screen.dart @@ -173,11 +173,22 @@ class _BrowseScreenState extends State itemBuilder: (context, index) { final level = sortedLevels[index]; final levelItems = groupedItems[level]!; - final bool isDisabled = levelItems.every( - (item) => (item as dynamic).srsItems.values.every( - (srs) => (srs as SrsItem).disabled, - ), - ); + final bool isDisabled; + if (repository is DeckRepository) { + isDisabled = levelItems.every( + (item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast().every( + (srs) => srs.disabled, + ), + ); + } else if (repository is VocabDeckRepository) { + isDisabled = levelItems.every( + (item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast().every( + (srs) => srs.disabled, + ), + ); + } else { + isDisabled = false; // Default to false if repository type is unknown + } return Column( children: [ @@ -197,7 +208,7 @@ class _BrowseScreenState extends State Checkbox( value: !isDisabled, onChanged: (value) { - _toggleLevelExclusion(level, repository); + _toggleLevelExclusion(level, repository, index, pageController); }, ), ], @@ -227,13 +238,20 @@ class _BrowseScreenState extends State final level = levels[index]; final isSelected = index == currentPage; final items = isKanji ? _kanjiByLevel[level] : _vocabByLevel[level]; - final bool isDisabled = - items?.every( - (item) => (item as dynamic).srsItems.values.every( - (srs) => (srs as SrsItem).disabled, - ), - ) ?? - false; + final bool isDisabled; + if (isKanji) { + isDisabled = items?.every( + (item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast().every( + (srs) => srs.disabled, + ), ) ?? + false; + } else { + isDisabled = items?.every( + (item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast().every( + (srs) => srs.disabled, + ), ) ?? + false; + } return Expanded( child: Padding( @@ -636,14 +654,20 @@ class _BrowseScreenState extends State _vocabSortedLevels = _vocabByLevel.keys.toList()..sort(); } - Future _toggleLevelExclusion(int level, dynamic repository) async { + Future _toggleLevelExclusion( + int level, + dynamic repository, + int currentPageIndex, + PageController pageController, + ) async { final List itemsToUpdate = []; - final bool currentlyDisabled; + List items = []; + bool currentlyDisabled = false; if (repository is DeckRepository) { - final items = _kanjiByLevel[level] ?? []; + items = _kanjiByLevel[level] ?? []; currentlyDisabled = items.every( - (item) => item.srsItems.values.every((srs) => srs.disabled), + (item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast().every((srs) => srs.disabled), ); for (final item in items) { for (final srsItem in item.srsItems.values) { @@ -651,9 +675,9 @@ class _BrowseScreenState extends State } } } else if (repository is VocabDeckRepository) { - final items = _vocabByLevel[level] ?? []; + items = _vocabByLevel[level] ?? []; currentlyDisabled = items.every( - (item) => item.srsItems.values.every((srs) => srs.disabled), + (item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast().every((srs) => srs.disabled), ); for (final item in items) { for (final srsItem in item.srsItems.values) { @@ -664,12 +688,70 @@ class _BrowseScreenState extends State return; } - for (final item in itemsToUpdate) { - item.disabled = !currentlyDisabled; + if (itemsToUpdate.isEmpty) { + // No SrsItems exist for this level, so create them and set their disabled status + for (final item in items) { // 'items' contains KanjiItem or VocabularyItem + // Determine quiz modes based on repository type + List quizModes = []; + if (repository is DeckRepository) { + quizModes = [QuizMode.kanjiToEnglish, QuizMode.englishToKanji, QuizMode.reading]; + } else if (repository is VocabDeckRepository) { + quizModes = [QuizMode.vocabToEnglish, QuizMode.englishToVocab, QuizMode.audioToEnglish]; + } + + for (final mode in quizModes) { + String? readingType; + if (mode == QuizMode.reading && repository is DeckRepository) { + // For reading mode, create SrsItems for both onyomi and kunyomi if they exist + if ((item as KanjiItem).onyomi.isNotEmpty) { + readingType = 'onyomi'; + itemsToUpdate.add(SrsItem( + subjectId: item.id, + quizMode: mode, + readingType: readingType, + disabled: !currentlyDisabled, + )); + } + if ((item as KanjiItem).kunyomi.isNotEmpty) { + readingType = 'kunyomi'; + itemsToUpdate.add(SrsItem( + subjectId: item.id, + quizMode: mode, + readingType: readingType, + disabled: !currentlyDisabled, + )); + } + } else { + itemsToUpdate.add(SrsItem( + subjectId: item.id, + quizMode: mode, + disabled: !currentlyDisabled, + )); + } + } + } + // Now insert these newly created SrsItems + if (repository is DeckRepository) { + for (final srsItem in itemsToUpdate) { + await (repository as DeckRepository).insertSrsItem(srsItem); + } + } else if (repository is VocabDeckRepository) { + for (final srsItem in itemsToUpdate) { + await (repository as VocabDeckRepository).insertVocabSrsItem(srsItem); + } + } + } else { + // Existing SrsItems, so update them + for (final item in itemsToUpdate) { + item.disabled = !currentlyDisabled; + } + await repository.updateSrsItems(itemsToUpdate); } - await repository.updateSrsItems(itemsToUpdate); - _loadDecks(); + setState(() {}); + if (pageController.hasClients) { + pageController.jumpToPage(currentPageIndex); + } } @override