From 90f0c9dab38372c3758546df1a79e5554863be2f Mon Sep 17 00:00:00 2001 From: buste <32890006+bustesoul@users.noreply.github.com> Date: Tue, 18 Feb 2025 23:11:51 +0800 Subject: [PATCH] Fix comic menu cannot work in history_page when use mobile device (#204) --- lib/foundation/history.dart | 1 - lib/pages/history_page.dart | 141 +++++++++++++++++++----------------- 2 files changed, 73 insertions(+), 69 deletions(-) diff --git a/lib/foundation/history.dart b/lib/foundation/history.dart index a8a0e01..87edb15 100644 --- a/lib/foundation/history.dart +++ b/lib/foundation/history.dart @@ -7,7 +7,6 @@ import 'dart:ffi' as ffi; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart' show ChangeNotifier; -import 'package:sqlite3/common.dart'; import 'package:sqlite3/sqlite3.dart'; import 'package:venera/foundation/comic_source/comic_source.dart'; import 'package:venera/foundation/comic_type.dart'; diff --git a/lib/pages/history_page.dart b/lib/pages/history_page.dart index f813d1a..049021e 100644 --- a/lib/pages/history_page.dart +++ b/lib/pages/history_page.dart @@ -29,12 +29,18 @@ class _HistoryPageState extends State { void onUpdate() { setState(() { comics = HistoryManager().getAll(); + if (multiSelectMode) { + selectedComics.removeWhere((comic, _) => !comics.contains(comic)); + if (selectedComics.isEmpty) { + multiSelectMode = false; + } + } }); } var comics = HistoryManager().getAll(); var controller = FlyoutController(); - + bool multiSelectMode = false; Map selectedComics = {}; @@ -59,55 +65,72 @@ class _HistoryPageState extends State { }); } + void _removeHistory(History comic) { + if (comic.sourceKey.startsWith("Unknown")) { + HistoryManager().remove( + comic.id, + ComicType(int.parse(comic.sourceKey.split(':')[1])), + ); + } else if (comic.sourceKey == 'local') { + HistoryManager().remove( + comic.id, + ComicType.local, + ); + } else { + HistoryManager().remove( + comic.id, + ComicType(comic.sourceKey.hashCode), + ); + } + } + @override Widget build(BuildContext context) { List selectActions = [ IconButton( - icon: const Icon(Icons.select_all), - tooltip: "Select All".tl, - onPressed: selectAll + icon: const Icon(Icons.select_all), + tooltip: "Select All".tl, + onPressed: selectAll ), IconButton( - icon: const Icon(Icons.deselect), - tooltip: "Deselect".tl, - onPressed: deSelect + icon: const Icon(Icons.deselect), + tooltip: "Deselect".tl, + onPressed: deSelect ), IconButton( - icon: const Icon(Icons.flip), - tooltip: "Invert Selection".tl, - onPressed: invertSelection + icon: const Icon(Icons.flip), + tooltip: "Invert Selection".tl, + onPressed: invertSelection ), IconButton( icon: const Icon(Icons.delete), tooltip: "Delete".tl, - onPressed: selectedComics.isEmpty ? null : () { - for (final comic in selectedComics.keys) { - if (comic.sourceKey.startsWith("Unknown")) { - HistoryManager().remove( - comic.id, - ComicType(int.parse(comic.sourceKey.split(':')[1])), - ); - } else if (comic.sourceKey == 'local') { - HistoryManager().remove( - comic.id, - ComicType.local, - ); - } else { - HistoryManager().remove( - comic.id, - ComicType(comic.sourceKey.hashCode), - ); - } - } - setState(() { - multiSelectMode = false; - selectedComics.clear(); - }); - }, + onPressed: selectedComics.isEmpty + ? null + : () { + final comicsToDelete = List.from(selectedComics.keys); + setState(() { + multiSelectMode = false; + selectedComics.clear(); + }); + + for (final comic in comicsToDelete) { + _removeHistory(comic); + } + }, ), ]; List normalActions = [ + IconButton( + icon: const Icon(Icons.checklist), + tooltip: multiSelectMode ? "Exit Multi-Select".tl : "Multi-Select".tl, + onPressed: () { + setState(() { + multiSelectMode = !multiSelectMode; + }); + }, + ), Tooltip( message: 'Clear History'.tl, child: Flyout( @@ -178,24 +201,21 @@ class _HistoryPageState extends State { SliverGridComics( comics: comics, selections: selectedComics, - onLongPressed: (c) { - setState(() { - multiSelectMode = true; - selectedComics[c as History] = true; - }); - }, - onTap: multiSelectMode ? (c) { - setState(() { - if (selectedComics.containsKey(c as History)) { - selectedComics.remove(c); - } else { - selectedComics[c] = true; - } - if (selectedComics.isEmpty) { - multiSelectMode = false; - } - }); - } : null, + onLongPressed: null, + onTap: multiSelectMode + ? (c) { + setState(() { + if (selectedComics.containsKey(c as History)) { + selectedComics.remove(c); + } else { + selectedComics[c] = true; + } + if (selectedComics.isEmpty) { + multiSelectMode = false; + } + }); + } + : null, badgeBuilder: (c) { return ComicSource.find(c.sourceKey)?.name; }, @@ -206,22 +226,7 @@ class _HistoryPageState extends State { text: 'Remove'.tl, color: context.colorScheme.error, onClick: () { - if (c.sourceKey.startsWith("Unknown")) { - HistoryManager().remove( - c.id, - ComicType(int.parse(c.sourceKey.split(':')[1])), - ); - } else if (c.sourceKey == 'local') { - HistoryManager().remove( - c.id, - ComicType.local, - ); - } else { - HistoryManager().remove( - c.id, - ComicType(c.sourceKey.hashCode), - ); - } + _removeHistory(c as History); }, ), ];