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

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../models/kanji_item.dart';
import '../services/deck_repository.dart';
import 'settings_screen.dart';
class BrowseScreen extends StatefulWidget {
const BrowseScreen({super.key});
@@ -10,8 +11,7 @@ class BrowseScreen extends StatefulWidget {
State<BrowseScreen> createState() => _BrowseScreenState();
}
class _BrowseScreenState extends State<BrowseScreen>
with SingleTickerProviderStateMixin {
class _BrowseScreenState extends State<BrowseScreen> with SingleTickerProviderStateMixin {
late TabController _tabController;
late PageController _kanjiPageController;
late PageController _vocabPageController;
@@ -27,6 +27,7 @@ class _BrowseScreenState extends State<BrowseScreen>
String _status = 'Loading...';
int _currentKanjiPage = 0;
int _currentVocabPage = 0;
bool _apiKeyMissing = false;
@override
void initState() {
@@ -58,6 +59,14 @@ class _BrowseScreenState extends State<BrowseScreen>
_loadDecks();
}
@override
void dispose() {
_tabController.dispose();
_kanjiPageController.dispose();
_vocabPageController.dispose();
super.dispose();
}
Future<void> _loadDecks() async {
setState(() => _loading = true);
try {
@@ -67,7 +76,7 @@ class _BrowseScreenState extends State<BrowseScreen>
if (apiKey == null || apiKey.isEmpty) {
setState(() {
_status = 'API key not set.';
_apiKeyMissing = true;
_loading = false;
});
return;
@@ -93,6 +102,7 @@ class _BrowseScreenState extends State<BrowseScreen>
_loading = false;
_status =
'Loaded ${_kanjiDeck.length} kanji and ${_vocabDeck.length} vocabulary.';
_apiKeyMissing = false;
});
} catch (e) {
setState(() {
@@ -122,23 +132,42 @@ class _BrowseScreenState extends State<BrowseScreen>
@override
Widget build(BuildContext context) {
if (_apiKeyMissing) {
return Scaffold(
appBar: AppBar(title: const Text('Browse')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('WaniKani API key is not set.', style: TextStyle(color: Colors.white)),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () async {
await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const SettingsScreen()),
);
_loadDecks();
},
child: const Text('Go to Settings'),
),
],
),
),
);
}
return Scaffold(
backgroundColor: const Color(0xFF121212),
appBar: AppBar(
title: const Text('Browse Items'),
backgroundColor: const Color(0xFF1F1F1F),
foregroundColor: Colors.white,
title: const Text('Browse'),
bottom: TabBar(
controller: _tabController,
tabs: const [
Tab(text: 'Kanji'),
Tab(text: 'Vocabulary'),
],
labelColor: Colors.blueAccent,
unselectedLabelColor: Colors.grey,
indicatorColor: Colors.blueAccent,
),
),
backgroundColor: const Color(0xFF121212),
body: _loading
? Center(
child: Column(
@@ -438,12 +467,4 @@ class _BrowseScreenState extends State<BrowseScreen>
},
);
}
@override
void dispose() {
_tabController.dispose();
_kanjiPageController.dispose();
_vocabPageController.dispose();
super.dispose();
}
}
}