added settings to toggle the audio

This commit is contained in:
Rene Kievits
2025-10-28 18:55:38 +01:00
parent a572a6e6fc
commit 4d6ec05162
3 changed files with 144 additions and 31 deletions

View File

@@ -1,6 +1,7 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../models/kanji_item.dart';
import '../services/deck_repository.dart';
import '../services/distractor_generator.dart';
@@ -39,13 +40,22 @@ class _HomeScreenState extends State<HomeScreen> {
String _readingHint = '';
int _score = 0;
int _asked = 0;
bool _playCorrectSound = true;
@override
void initState() {
super.initState();
_loadSettings();
_loadDeck();
}
Future<void> _loadSettings() async {
final prefs = await SharedPreferences.getInstance();
setState(() {
_playCorrectSound = prefs.getBool('playCorrectSound') ?? true;
});
}
Future<void> _loadDeck() async {
setState(() {
_loading = true;
@@ -112,8 +122,22 @@ class _HomeScreenState extends State<HomeScreen> {
void _nextQuestion() {
_deck.sort((a, b) {
final aSrsItem = a.srsItems[_mode.toString()];
final bSrsItem = b.srsItems[_mode.toString()];
String srsKey(KanjiItem item) {
var key = _mode.toString();
if (_mode == QuizMode.reading) {
if (item.onyomi.isNotEmpty && item.kunyomi.isNotEmpty) {
key += _random.nextBool() ? 'onyomi' : 'kunyomi';
} else if (item.onyomi.isNotEmpty) {
key += 'onyomi';
} else {
key += 'kunyomi';
}
}
return key;
}
final aSrsItem = a.srsItems[srsKey(a)];
final bSrsItem = b.srsItems[srsKey(b)];
final aStage = aSrsItem?.srsStage ?? 0;
final bStage = bSrsItem?.srsStage ?? 0;
@@ -122,10 +146,16 @@ class _HomeScreenState extends State<HomeScreen> {
return aStage.compareTo(bStage);
}
final aLastAsked = aSrsItem?.lastAsked ?? DateTime.fromMillisecondsSinceEpoch(0);
final bLastAsked = bSrsItem?.lastAsked ?? DateTime.fromMillisecondsSinceEpoch(0);
final aLastAsked =
aSrsItem?.lastAsked ?? DateTime.fromMillisecondsSinceEpoch(0);
final bLastAsked =
bSrsItem?.lastAsked ?? DateTime.fromMillisecondsSinceEpoch(0);
return aLastAsked.compareTo(bLastAsked);
if (aLastAsked != bLastAsked) {
return aLastAsked.compareTo(bLastAsked);
}
return _random.nextDouble().compareTo(_random.nextDouble());
});
_current = _deck.first;
@@ -199,7 +229,10 @@ class _HomeScreenState extends State<HomeScreen> {
_asked += 1;
if (isCorrect) {
_score += 1;
_audioPlayer.play(AssetSource('sfx/confirm.mp3'));
srsItemForUpdate.srsStage += 1;
if (_playCorrectSound) {
_audioPlayer.play(AssetSource('sfx/confirm.mp3'));
}
} else {
srsItemForUpdate.srsStage = max(0, srsItemForUpdate.srsStage - 1);
}
@@ -265,10 +298,11 @@ class _HomeScreenState extends State<HomeScreen> {
actions: [
IconButton(
icon: const Icon(Icons.settings),
onPressed: () {
Navigator.of(context).push(
onPressed: () async {
await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const SettingsScreen()),
);
_loadSettings();
},
)
],