Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
14ad880f79 |
@@ -173,11 +173,22 @@ class _BrowseScreenState extends State<BrowseScreen>
|
|||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final level = sortedLevels[index];
|
final level = sortedLevels[index];
|
||||||
final levelItems = groupedItems[level]!;
|
final levelItems = groupedItems[level]!;
|
||||||
final bool isDisabled = levelItems.every(
|
final bool isDisabled;
|
||||||
(item) => (item as dynamic).srsItems.values.every(
|
if (repository is DeckRepository) {
|
||||||
(srs) => (srs as SrsItem).disabled,
|
isDisabled = levelItems.every(
|
||||||
),
|
(item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast<SrsItem>().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<SrsItem>().every(
|
||||||
|
(srs) => srs.disabled,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
isDisabled = false; // Default to false if repository type is unknown
|
||||||
|
}
|
||||||
|
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
@@ -197,7 +208,7 @@ class _BrowseScreenState extends State<BrowseScreen>
|
|||||||
Checkbox(
|
Checkbox(
|
||||||
value: !isDisabled,
|
value: !isDisabled,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
_toggleLevelExclusion(level, repository);
|
_toggleLevelExclusion(level, repository, index, pageController);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -227,13 +238,20 @@ class _BrowseScreenState extends State<BrowseScreen>
|
|||||||
final level = levels[index];
|
final level = levels[index];
|
||||||
final isSelected = index == currentPage;
|
final isSelected = index == currentPage;
|
||||||
final items = isKanji ? _kanjiByLevel[level] : _vocabByLevel[level];
|
final items = isKanji ? _kanjiByLevel[level] : _vocabByLevel[level];
|
||||||
final bool isDisabled =
|
final bool isDisabled;
|
||||||
items?.every(
|
if (isKanji) {
|
||||||
(item) => (item as dynamic).srsItems.values.every(
|
isDisabled = items?.every(
|
||||||
(srs) => (srs as SrsItem).disabled,
|
(item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast<SrsItem>().every(
|
||||||
),
|
(srs) => srs.disabled,
|
||||||
) ??
|
), ) ??
|
||||||
false;
|
false;
|
||||||
|
} else {
|
||||||
|
isDisabled = items?.every(
|
||||||
|
(item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast<SrsItem>().every(
|
||||||
|
(srs) => srs.disabled,
|
||||||
|
), ) ??
|
||||||
|
false;
|
||||||
|
}
|
||||||
|
|
||||||
return Expanded(
|
return Expanded(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
@@ -636,14 +654,20 @@ class _BrowseScreenState extends State<BrowseScreen>
|
|||||||
_vocabSortedLevels = _vocabByLevel.keys.toList()..sort();
|
_vocabSortedLevels = _vocabByLevel.keys.toList()..sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _toggleLevelExclusion(int level, dynamic repository) async {
|
Future<void> _toggleLevelExclusion(
|
||||||
|
int level,
|
||||||
|
dynamic repository,
|
||||||
|
int currentPageIndex,
|
||||||
|
PageController pageController,
|
||||||
|
) async {
|
||||||
final List<SrsItem> itemsToUpdate = [];
|
final List<SrsItem> itemsToUpdate = [];
|
||||||
final bool currentlyDisabled;
|
List<dynamic> items = [];
|
||||||
|
bool currentlyDisabled = false;
|
||||||
|
|
||||||
if (repository is DeckRepository) {
|
if (repository is DeckRepository) {
|
||||||
final items = _kanjiByLevel[level] ?? [];
|
items = _kanjiByLevel[level] ?? [];
|
||||||
currentlyDisabled = items.every(
|
currentlyDisabled = items.every(
|
||||||
(item) => item.srsItems.values.every((srs) => srs.disabled),
|
(item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast<SrsItem>().every((srs) => srs.disabled),
|
||||||
);
|
);
|
||||||
for (final item in items) {
|
for (final item in items) {
|
||||||
for (final srsItem in item.srsItems.values) {
|
for (final srsItem in item.srsItems.values) {
|
||||||
@@ -651,9 +675,9 @@ class _BrowseScreenState extends State<BrowseScreen>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (repository is VocabDeckRepository) {
|
} else if (repository is VocabDeckRepository) {
|
||||||
final items = _vocabByLevel[level] ?? [];
|
items = _vocabByLevel[level] ?? [];
|
||||||
currentlyDisabled = items.every(
|
currentlyDisabled = items.every(
|
||||||
(item) => item.srsItems.values.every((srs) => srs.disabled),
|
(item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast<SrsItem>().every((srs) => srs.disabled),
|
||||||
);
|
);
|
||||||
for (final item in items) {
|
for (final item in items) {
|
||||||
for (final srsItem in item.srsItems.values) {
|
for (final srsItem in item.srsItems.values) {
|
||||||
@@ -664,12 +688,70 @@ class _BrowseScreenState extends State<BrowseScreen>
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (final item in itemsToUpdate) {
|
if (itemsToUpdate.isEmpty) {
|
||||||
item.disabled = !currentlyDisabled;
|
// 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<QuizMode> 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);
|
setState(() {});
|
||||||
_loadDecks();
|
if (pageController.hasClients) {
|
||||||
|
pageController.jumpToPage(currentPageIndex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
Reference in New Issue
Block a user