change a bunch of stuff, seperate tracking for progress, updated custom srs layout

This commit is contained in:
Rene Kievits
2025-10-31 07:16:44 +01:00
parent cafec12888
commit d8edfa1686
12 changed files with 1378 additions and 661 deletions

View File

@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import '../models/custom_kanji_item.dart';
import '../services/custom_deck_repository.dart';
import 'add_card_screen.dart';
import 'custom_quiz_screen.dart';
class CustomSrsScreen extends StatefulWidget {
@@ -15,7 +14,6 @@ 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>(),
@@ -45,17 +43,8 @@ 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;
});
}
@@ -64,7 +53,6 @@ class _CustomSrsScreenState extends State<CustomSrsScreen> with SingleTickerProv
if (index != -1) {
setState(() {
_deck[index] = item;
_reviewDeck.removeWhere((element) => element.characters == item.characters);
});
await _deckRepository.saveDeck(_deck);
}
@@ -72,6 +60,29 @@ class _CustomSrsScreenState extends State<CustomSrsScreen> with SingleTickerProv
@override
Widget build(BuildContext context) {
final now = DateTime.now();
final jpnToEngReviewDeck = _deck.where((item) {
if (!item.useInterval) return true;
return item.srsData.japaneseToEnglishNextReview == null ||
item.srsData.japaneseToEnglishNextReview!.isBefore(now);
}).toList();
final engToJpnReviewDeck = _deck.where((item) {
if (!item.useInterval) return true;
return item.srsData.englishToJapaneseNextReview == null ||
item.srsData.englishToJapaneseNextReview!.isBefore(now);
}).toList();
final listeningReviewDeck = _deck.where((item) {
if (!item.useInterval) return true;
return item.srsData.listeningComprehensionNextReview == null ||
item.srsData.listeningComprehensionNextReview!.isBefore(now);
}).toList();
final allDecksEmpty = jpnToEngReviewDeck.isEmpty &&
engToJpnReviewDeck.isEmpty &&
listeningReviewDeck.isEmpty;
return Scaffold(
appBar: AppBar(
title: const Text('Custom SRS'),
@@ -102,43 +113,37 @@ class _CustomSrsScreenState extends State<CustomSrsScreen> with SingleTickerProv
),
body: _deck.isEmpty
? const Center(child: Text('Add cards to start quizzing!'))
: _reviewDeck.isEmpty
: allDecksEmpty
? const Center(child: Text('No cards due for review.'))
: TabBarView(
controller: _tabController,
children: [
CustomQuizScreen(
key: _quizScreenKeys[0],
deck: _reviewDeck,
deck: jpnToEngReviewDeck,
quizMode: CustomQuizMode.japaneseToEnglish,
onCardReviewed: _updateCard,
useKanji: _useKanji,
isActive: _tabController.index == 0,
),
CustomQuizScreen(
key: _quizScreenKeys[1],
deck: _reviewDeck,
deck: engToJpnReviewDeck,
quizMode: CustomQuizMode.englishToJapanese,
onCardReviewed: _updateCard,
useKanji: _useKanji,
isActive: _tabController.index == 1,
),
CustomQuizScreen(
key: _quizScreenKeys[2],
deck: _reviewDeck,
deck: listeningReviewDeck,
quizMode: CustomQuizMode.listeningComprehension,
onCardReviewed: _updateCard,
useKanji: _useKanji,
isActive: _tabController.index == 2,
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const AddCardScreen()),
);
_loadDeck();
},
child: const Icon(Icons.add),
),
);
}
}