generated from dellevin/template
新增游戏功能记录模块
This commit is contained in:
@@ -12,7 +12,7 @@ class RecycleBinPage extends StatefulWidget {
|
||||
State<RecycleBinPage> createState() => _RecycleBinPageState();
|
||||
}
|
||||
|
||||
enum _ItemType { movie, book, note, movieReview, bookReview, bookExcerpt }
|
||||
enum _ItemType { movie, book, note, game, movieReview, bookReview, bookExcerpt, gameReview }
|
||||
|
||||
class _DeletedItem {
|
||||
final _ItemType type;
|
||||
@@ -70,6 +70,22 @@ class _DeletedItem {
|
||||
icon = Icons.format_quote_outlined,
|
||||
typeLabel = '书摘';
|
||||
|
||||
_DeletedItem.game(Game g)
|
||||
: type = _ItemType.game,
|
||||
id = g.id,
|
||||
title = g.title,
|
||||
subtitle = '删除于 ${g.updatedAt.year}.${g.updatedAt.month.toString().padLeft(2, '0')}.${g.updatedAt.day.toString().padLeft(2, '0')}',
|
||||
icon = Icons.sports_esports_outlined,
|
||||
typeLabel = '游戏';
|
||||
|
||||
_DeletedItem.gameReview(GameReview r)
|
||||
: type = _ItemType.gameReview,
|
||||
id = r.id,
|
||||
title = r.content.isNotEmpty ? r.content : '游戏评价',
|
||||
subtitle = '删除于 ${r.updatedAt.year}.${r.updatedAt.month.toString().padLeft(2, '0')}.${r.updatedAt.day.toString().padLeft(2, '0')}',
|
||||
icon = Icons.rate_review_outlined,
|
||||
typeLabel = '游戏评价';
|
||||
|
||||
}
|
||||
|
||||
class _RecycleBinPageState extends State<RecycleBinPage> {
|
||||
@@ -92,18 +108,22 @@ class _RecycleBinPageState extends State<RecycleBinPage> {
|
||||
final movies = await provider.getDeletedMovies();
|
||||
final books = await provider.getDeletedBooks();
|
||||
final notes = await provider.getDeletedNotes();
|
||||
final games = await provider.getDeletedGames();
|
||||
final movieReviews = await provider.getDeletedMovieReviews();
|
||||
final bookReviews = await provider.getDeletedBookReviews();
|
||||
final bookExcerpts = await provider.getDeletedBookExcerpts();
|
||||
final gameReviews = await provider.getDeletedGameReviews();
|
||||
if (!mounted) return;
|
||||
setState(() {
|
||||
_allItems = [
|
||||
for (final m in movies) _DeletedItem.movie(m),
|
||||
for (final b in books) _DeletedItem.book(b),
|
||||
for (final n in notes) _DeletedItem.note(n),
|
||||
for (final g in games) _DeletedItem.game(g),
|
||||
for (final r in movieReviews) _DeletedItem.movieReview(r),
|
||||
for (final r in bookReviews) _DeletedItem.bookReview(r),
|
||||
for (final e in bookExcerpts) _DeletedItem.bookExcerpt(e),
|
||||
for (final r in gameReviews) _DeletedItem.gameReview(r),
|
||||
];
|
||||
_isLoading = false;
|
||||
});
|
||||
@@ -175,9 +195,11 @@ class _RecycleBinPageState extends State<RecycleBinPage> {
|
||||
_filterChip('影视', _ItemType.movie),
|
||||
_filterChip('书籍', _ItemType.book),
|
||||
_filterChip('笔记', _ItemType.note),
|
||||
_filterChip('游戏', _ItemType.game),
|
||||
_filterChip('影评', _ItemType.movieReview),
|
||||
_filterChip('书评', _ItemType.bookReview),
|
||||
_filterChip('书摘', _ItemType.bookExcerpt),
|
||||
_filterChip('游戏评价', _ItemType.gameReview),
|
||||
],
|
||||
),
|
||||
);
|
||||
@@ -391,6 +413,9 @@ class _RecycleBinPageState extends State<RecycleBinPage> {
|
||||
case _ItemType.note:
|
||||
await provider.restoreNote(item.id);
|
||||
if (mounted) ToastUtil.show(context, '笔记已恢复');
|
||||
case _ItemType.game:
|
||||
await provider.restoreGame(item.id);
|
||||
if (mounted) ToastUtil.show(context, '游戏已恢复');
|
||||
case _ItemType.movieReview:
|
||||
await provider.restoreMovieReview(item.id);
|
||||
if (mounted) ToastUtil.show(context, '影评已恢复');
|
||||
@@ -400,6 +425,9 @@ class _RecycleBinPageState extends State<RecycleBinPage> {
|
||||
case _ItemType.bookExcerpt:
|
||||
await provider.restoreBookExcerpt(item.id);
|
||||
if (mounted) ToastUtil.show(context, '书摘已恢复');
|
||||
case _ItemType.gameReview:
|
||||
await provider.restoreGameReview(item.id);
|
||||
if (mounted) ToastUtil.show(context, '游戏评价已恢复');
|
||||
}
|
||||
_loadDeletedItems();
|
||||
}
|
||||
@@ -415,12 +443,16 @@ class _RecycleBinPageState extends State<RecycleBinPage> {
|
||||
await provider.permanentDeleteBook(item.id);
|
||||
case _ItemType.note:
|
||||
await provider.permanentDeleteNote(item.id);
|
||||
case _ItemType.game:
|
||||
await provider.permanentDeleteGame(item.id);
|
||||
case _ItemType.movieReview:
|
||||
await provider.permanentDeleteMovieReview(item.id);
|
||||
case _ItemType.bookReview:
|
||||
await provider.permanentDeleteBookReview(item.id);
|
||||
case _ItemType.bookExcerpt:
|
||||
await provider.permanentDeleteBookExcerpt(item.id);
|
||||
case _ItemType.gameReview:
|
||||
await provider.permanentDeleteGameReview(item.id);
|
||||
}
|
||||
_loadDeletedItems();
|
||||
if (mounted) ToastUtil.show(context, '已彻底删除');
|
||||
|
||||
@@ -15,9 +15,9 @@ class _TagManagementPageState extends State<TagManagementPage> {
|
||||
int _currentIndex = 0;
|
||||
bool _isSyncing = false;
|
||||
|
||||
static const _tabTypes = ['movie_genre', 'book_genre', 'note_tag'];
|
||||
static const _typeLabels = ['影视类型', '书籍类型', '笔记标签'];
|
||||
static const _typeIcons = [Icons.movie_outlined, Icons.menu_book_outlined, Icons.note_outlined];
|
||||
static const _tabTypes = ['movie_genre', 'book_genre', 'note_tag', 'game_genre'];
|
||||
static const _typeLabels = ['影视类型', '书籍类型', '笔记标签', '游戏类型'];
|
||||
static const _typeIcons = [Icons.movie_outlined, Icons.menu_book_outlined, Icons.note_outlined, Icons.sports_esports_outlined];
|
||||
|
||||
final Map<String, List<Map<String, dynamic>>> _tagCache = {};
|
||||
Map<String, int> _usageCounts = {};
|
||||
@@ -63,6 +63,11 @@ class _TagManagementPageState extends State<TagManagementPage> {
|
||||
counts[t] = (counts[t] ?? 0) + 1;
|
||||
}
|
||||
}
|
||||
for (final g in provider.games.where((g) => !g.isDeleted)) {
|
||||
for (final genre in g.genres) {
|
||||
counts[genre] = (counts[genre] ?? 0) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
_usageCounts = counts;
|
||||
}
|
||||
@@ -121,7 +126,7 @@ class _TagManagementPageState extends State<TagManagementPage> {
|
||||
children: [
|
||||
// 弹出的类别胶囊按钮
|
||||
if (_showTypePicker) ...[
|
||||
...[0, 1, 2].where((i) => i != _currentIndex).map((i) => Padding(
|
||||
...[0, 1, 2, 3].where((i) => i != _currentIndex).map((i) => Padding(
|
||||
padding: const EdgeInsets.only(bottom: 8),
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
@@ -420,7 +425,7 @@ class _TagManagementPageState extends State<TagManagementPage> {
|
||||
final idx = _tabTypes.indexOf(type);
|
||||
final icon = _typeIcons[idx];
|
||||
final label = _typeLabels[idx];
|
||||
final hints = ['同步或手动添加影视类型', '同步或手动添加书籍类型', '同步或手动添加笔记标签'];
|
||||
final hints = ['同步或手动添加影视类型', '同步或手动添加书籍类型', '同步或手动添加笔记标签', '同步或手动添加游戏类型'];
|
||||
|
||||
return Center(
|
||||
key: ValueKey('empty_$type'),
|
||||
@@ -544,6 +549,10 @@ class _TagManagementPageState extends State<TagManagementPage> {
|
||||
for (final b in provider.books.where((b) => !b.isDeleted && b.genres.contains(tagName))) {
|
||||
items.add((title: b.title, subtitle: b.authors.take(2).join(' / '), type: '书籍'));
|
||||
}
|
||||
} else if (_currentType == 'game_genre') {
|
||||
for (final g in provider.games.where((g) => !g.isDeleted && g.genres.contains(tagName))) {
|
||||
items.add((title: g.title, subtitle: g.platforms.take(2).join(' / '), type: '游戏'));
|
||||
}
|
||||
} else {
|
||||
for (final n in provider.notes.where((n) => !n.isDeleted && n.tags.contains(tagName))) {
|
||||
items.add((title: n.title.isNotEmpty ? n.title : '随手记', subtitle: null, type: '笔记'));
|
||||
|
||||
Reference in New Issue
Block a user