finish custom srs for now

This commit is contained in:
Rene Kievits
2025-10-30 17:41:53 +01:00
parent ee4fd7ffc1
commit d8a5c27fb3
2 changed files with 87 additions and 35 deletions

View File

@@ -530,13 +530,21 @@ class _BrowseScreenState extends State<BrowseScreen> with SingleTickerProviderSt
onPressed: _deleteSelected, onPressed: _deleteSelected,
), ),
IconButton( IconButton(
icon: const Icon(Icons.timer_off), icon: Icon(_toggleIntervalIcon),
onPressed: _toggleIntervalForSelected, onPressed: _toggleIntervalForSelected,
), ),
], ],
); );
} }
IconData get _toggleIntervalIcon {
if (_selectedItems.isEmpty) {
return Icons.timer_off;
}
final bool willEnable = _selectedItems.any((item) => !item.useInterval);
return willEnable ? Icons.timer : Icons.timer_off;
}
void _selectAll() { void _selectAll() {
setState(() { setState(() {
if (_selectedItems.length == _customDeck.length) { if (_selectedItems.length == _customDeck.length) {
@@ -577,23 +585,40 @@ class _BrowseScreenState extends State<BrowseScreen> with SingleTickerProviderSt
); );
} }
void _toggleIntervalForSelected() { Future<void> _toggleIntervalForSelected() async {
if (_selectedItems.isEmpty) {
return;
}
final bool targetState = _selectedItems.any((item) => !item.useInterval);
final selectedCharacters = _selectedItems.map((item) => item.characters).toSet();
final List<CustomKanjiItem> updatedItems = [];
for (final item in _selectedItems) { for (final item in _selectedItems) {
final updatedItem = CustomKanjiItem( final updatedItem = CustomKanjiItem(
characters: item.characters, characters: item.characters,
meaning: item.meaning, meaning: item.meaning,
kanji: item.kanji, kanji: item.kanji,
useInterval: !item.useInterval, useInterval: targetState,
srsLevel: item.srsLevel, srsLevel: item.srsLevel,
nextReview: item.nextReview, nextReview: item.nextReview,
); );
_customDeckRepository.updateCard(updatedItem); updatedItems.add(updatedItem);
} }
await _customDeckRepository.updateCards(updatedItems);
await _loadCustomDeck();
final newSelectedItems = _customDeck
.where((item) => selectedCharacters.contains(item.characters))
.toList();
setState(() { setState(() {
_selectedItems = newSelectedItems;
if (_selectedItems.isEmpty) {
_isSelectionMode = false; _isSelectionMode = false;
_selectedItems.clear(); }
}); });
_loadCustomDeck();
} }
Widget _buildCustomGridView(List<CustomKanjiItem> items) { Widget _buildCustomGridView(List<CustomKanjiItem> items) {
@@ -639,12 +664,18 @@ class _BrowseScreenState extends State<BrowseScreen> with SingleTickerProviderSt
} }
}, },
child: Card( child: Card(
shape: RoundedRectangleBorder(
side: isSelected
? const BorderSide(color: Colors.blue, width: 2.0)
: BorderSide.none,
borderRadius: BorderRadius.circular(12.0),
),
color: isSelected color: isSelected
? Colors.blue.withOpacity(0.5) ? Colors.blue.withOpacity(0.5)
: item.useInterval
? Color.lerp(const Color(0xFF1E1E1E), Colors.blue, 0.1)
: const Color(0xFF1E1E1E), : const Color(0xFF1E1E1E),
child: Padding( child: Stack(
children: [
Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@@ -669,12 +700,22 @@ class _BrowseScreenState extends State<BrowseScreen> with SingleTickerProviderSt
], ],
), ),
), ),
if (item.useInterval)
Positioned(
top: 4,
right: 4,
child: Icon(
Icons.timer,
color: Colors.green,
size: 16,
),
),
],
),
), ),
); );
}, },
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
); );
} }
} }

View File

@@ -31,6 +31,17 @@ class CustomDeckRepository {
} }
} }
Future<void> updateCards(List<CustomKanjiItem> itemsToUpdate) async {
final deck = await getCustomDeck();
for (var item in itemsToUpdate) {
final index = deck.indexWhere((element) => element.characters == item.characters);
if (index != -1) {
deck[index] = item;
}
}
await saveDeck(deck);
}
Future<void> deleteCard(CustomKanjiItem item) async { Future<void> deleteCard(CustomKanjiItem item) async {
final deck = await getCustomDeck(); final deck = await getCustomDeck();
deck.removeWhere((element) => element.characters == item.characters); deck.removeWhere((element) => element.characters == item.characters);