finish custom srs for now
This commit is contained in:
@@ -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),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user