add a shit ton of feature for the custom srs

This commit is contained in:
Rene Kievits
2025-10-30 03:44:04 +01:00
parent b58a4020e1
commit ee4fd7ffc1
13 changed files with 787 additions and 311 deletions

View File

@@ -15,6 +15,8 @@ class _CustomSrsScreenState extends State<CustomSrsScreen> with SingleTickerProv
late TabController _tabController;
final _deckRepository = CustomDeckRepository();
List<CustomKanjiItem> _deck = [];
List<CustomKanjiItem> _reviewDeck = [];
bool _useKanji = false;
final _quizScreenKeys = [
GlobalKey<CustomQuizScreenState>(),
GlobalKey<CustomQuizScreenState>(),
@@ -30,6 +32,7 @@ class _CustomSrsScreenState extends State<CustomSrsScreen> with SingleTickerProv
final key = _quizScreenKeys[_tabController.index];
key.currentState?.playAudio();
}
setState(() {});
});
_loadDeck();
}
@@ -42,16 +45,52 @@ class _CustomSrsScreenState extends State<CustomSrsScreen> with SingleTickerProv
Future<void> _loadDeck() async {
final deck = await _deckRepository.getCustomDeck();
final now = DateTime.now();
final reviewDeck = deck.where((item) {
if (!item.useInterval) {
return true;
}
return item.nextReview == null || item.nextReview!.isBefore(now);
}).toList();
setState(() {
_deck = deck;
_reviewDeck = reviewDeck;
});
}
Future<void> _updateCard(CustomKanjiItem item) async {
final index = _deck.indexWhere((element) => element.characters == item.characters);
if (index != -1) {
setState(() {
_deck[index] = item;
_reviewDeck.removeWhere((element) => element.characters == item.characters);
});
await _deckRepository.saveDeck(_deck);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Custom SRS'),
actions: [
if (_tabController.index != 2)
Row(
children: [
const Text('Kanji'),
Switch(
value: _useKanji,
onChanged: (value) {
setState(() {
_useKanji = value;
});
},
),
],
),
],
bottom: TabBar(
controller: _tabController,
tabs: const [
@@ -62,13 +101,33 @@ class _CustomSrsScreenState extends State<CustomSrsScreen> with SingleTickerProv
),
),
body: _deck.isEmpty
? const Center(child: CircularProgressIndicator())
: TabBarView(
? const Center(child: Text('Add cards to start quizzing!'))
: _reviewDeck.isEmpty
? const Center(child: Text('No cards due for review.'))
: TabBarView(
controller: _tabController,
children: [
CustomQuizScreen(key: _quizScreenKeys[0], deck: _deck, quizMode: CustomQuizMode.japaneseToEnglish),
CustomQuizScreen(key: _quizScreenKeys[1], deck: _deck, quizMode: CustomQuizMode.englishToJapanese),
CustomQuizScreen(key: _quizScreenKeys[2], deck: _deck, quizMode: CustomQuizMode.listeningComprehension),
CustomQuizScreen(
key: _quizScreenKeys[0],
deck: _reviewDeck,
quizMode: CustomQuizMode.japaneseToEnglish,
onCardReviewed: _updateCard,
useKanji: _useKanji,
),
CustomQuizScreen(
key: _quizScreenKeys[1],
deck: _reviewDeck,
quizMode: CustomQuizMode.englishToJapanese,
onCardReviewed: _updateCard,
useKanji: _useKanji,
),
CustomQuizScreen(
key: _quizScreenKeys[2],
deck: _reviewDeck,
quizMode: CustomQuizMode.listeningComprehension,
onCardReviewed: _updateCard,
useKanji: _useKanji,
),
],
),
floatingActionButton: FloatingActionButton(