add custom srs

This commit is contained in:
Rene Kievits
2025-10-30 02:00:29 +01:00
parent fe5ac30294
commit b58a4020e1
12 changed files with 802 additions and 250 deletions

View File

@@ -0,0 +1,85 @@
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 {
const CustomSrsScreen({super.key});
@override
State<CustomSrsScreen> createState() => _CustomSrsScreenState();
}
class _CustomSrsScreenState extends State<CustomSrsScreen> with SingleTickerProviderStateMixin {
late TabController _tabController;
final _deckRepository = CustomDeckRepository();
List<CustomKanjiItem> _deck = [];
final _quizScreenKeys = [
GlobalKey<CustomQuizScreenState>(),
GlobalKey<CustomQuizScreenState>(),
GlobalKey<CustomQuizScreenState>(),
];
@override
void initState() {
super.initState();
_tabController = TabController(length: 3, vsync: this);
_tabController.addListener(() {
if (_tabController.indexIsChanging) {
final key = _quizScreenKeys[_tabController.index];
key.currentState?.playAudio();
}
});
_loadDeck();
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
Future<void> _loadDeck() async {
final deck = await _deckRepository.getCustomDeck();
setState(() {
_deck = deck;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Custom SRS'),
bottom: TabBar(
controller: _tabController,
tabs: const [
Tab(text: 'Jpn→Eng'),
Tab(text: 'Eng→Jpn'),
Tab(text: 'Listening'),
],
),
),
body: _deck.isEmpty
? const Center(child: CircularProgressIndicator())
: 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),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const AddCardScreen()),
);
_loadDeck();
},
child: const Icon(Icons.add),
),
);
}
}