From ba909074dcfe01110a39e8db2e1ac0d03fb73f1b Mon Sep 17 00:00:00 2001 From: niuhuan Date: Wed, 3 Apr 2024 16:02:35 +0800 Subject: [PATCH] :sparkles: batch delete downloads --- ci/version.code.txt | 2 +- ci/version.info.txt | 3 + lib/screens/DownloadListScreen.dart | 138 +++++++++++++++++++++++++--- 3 files changed, 131 insertions(+), 12 deletions(-) diff --git a/ci/version.code.txt b/ci/version.code.txt index 1b66f1b..01990b4 100644 --- a/ci/version.code.txt +++ b/ci/version.code.txt @@ -1 +1 @@ -v1.7.8 \ No newline at end of file +v1.7.9 \ No newline at end of file diff --git a/ci/version.info.txt b/ci/version.info.txt index 32df20a..27a96d0 100644 --- a/ci/version.info.txt +++ b/ci/version.info.txt @@ -1,3 +1,6 @@ +v1.7.9 +- [x] ✨ 下载批量删除 + v1.7.8 - [x] ♻️ iOS可以使用FaceID进行解锁App - [x] ✨ 音量键快速翻阅下一章节(设置中默认开启) diff --git a/lib/screens/DownloadListScreen.dart b/lib/screens/DownloadListScreen.dart index 7fbc63d..da0d81d 100644 --- a/lib/screens/DownloadListScreen.dart +++ b/lib/screens/DownloadListScreen.dart @@ -26,20 +26,34 @@ class DownloadListScreen extends StatefulWidget { class _DownloadListScreenState extends State { String _search = ""; + bool _selecting = false; + List _selectingList = []; + late final SearchBar _searchBar = SearchBar( hintText: '搜索下载', inBar: false, setState: setState, onSubmitted: (value) { _search = value; - _f = method.allDownloads(_search); + _reloadList(); + setState(() {}); _searchBar.controller.text = value; }, buildDefaultAppBar: (BuildContext context) { + if (_selecting) { + return AppBar( + title: const Text("删除下载"), + actions: [ + _selectingCancelButton(), + _selectingDeleteButton(), + ], + ); + } return AppBar( title: Text(_search == "" ? "下载列表" : ('搜索下载 - $_search')), actions: [ _searchBar.getSearchAction(context), + _toSelectingButton(), exportButton(), importButton(), resetFailedButton(), @@ -51,7 +65,14 @@ class _DownloadListScreenState extends State { DownloadComic? _downloading; late bool _downloadRunning = false; - late Future> _f = method.allDownloads(_search); + late Future> _f = + method.allDownloads(_search).then((value) { + setState(() { + _selecting = false; + _selectingList = []; + }); + return value; + }); void _onMessageChange(String event) { print("EVENT"); @@ -113,11 +134,18 @@ class _DownloadListScreenState extends State { } } + if (_selecting) { + return ListView( + children: [ + ...data.map(selectingWidget), + ], + ); + } + return RefreshIndicator( onRefresh: () async { - setState(() { - _f = method.allDownloads(_search); - }); + _reloadList(); + setState(() {}); }, child: PikaListView( children: [ @@ -165,6 +193,41 @@ class _DownloadListScreenState extends State { ); } + Widget selectingWidget(DownloadComic e) { + return InkWell( + onTap: () { + if (e.deleting) { + defaultToast(context, "该下载已经在删除队列中"); + return; + } else { + if (_selectingList.contains(e.id)) { + setState(() { + _selectingList.remove(e.id); + }); + } else { + setState(() { + _selectingList.add(e.id); + }); + } + } + }, + child: Stack( + children: [ + DownloadInfoCard( + task: e, + downloading: _downloading != null && _downloading!.id == e.id, + ), + Icon( + _selectingList.contains(e.id) + ? Icons.check_circle + : Icons.radio_button_unchecked, + color: Colors.green, + ), + ], + ), + ); + } + Widget exportButton() { return IconButton( onPressed: () async { @@ -201,9 +264,8 @@ class _DownloadListScreenState extends State { builder: (context) => const DownloadImportScreen(), ), ); - setState(() { - _f = method.allDownloads(_search); - }); + _reloadList(); + setState(() {}); }, icon: Column( children: [ @@ -280,9 +342,8 @@ class _DownloadListScreenState extends State { return IconButton( onPressed: () async { await method.resetFailed(); - setState(() { - _f = method.allDownloads(_search); - }); + _reloadList(); + setState(() {}); defaultToast(context, "所有失败的下载已经恢复"); }, icon: Column( @@ -301,4 +362,59 @@ class _DownloadListScreenState extends State { ], )); } + + void _reloadList() { + _f = method.allDownloads(_search).then((value) { + setState(() { + _selecting = false; + _selectingList = []; + }); + return value; + }); + } + + Widget _selectingCancelButton() { + return IconButton( + onPressed: () { + setState(() { + _selecting = false; + _selectingList = []; + }); + }, + icon: const Icon(Icons.cancel), + ); + } + + Widget _selectingDeleteButton() { + return IconButton( + onPressed: () async { + var tmp = _selectingList; + _selecting = false; + _selectingList = []; + setState(() {}); + if (tmp.isEmpty) { + defaultToast(context, "请选择要删除的下载"); + } else { + for (var id in tmp) { + await method.deleteDownloadComic(id); + } + _reloadList(); + setState(() {}); + } + }, + icon: const Icon(Icons.delete), + ); + } + + Widget _toSelectingButton() { + return IconButton( + onPressed: () { + setState(() { + _selecting = true; + _selectingList = []; + }); + }, + icon: const Icon(Icons.delete), + ); + } }