batch delete downloads

This commit is contained in:
niuhuan 2024-04-03 16:02:35 +08:00
parent e3789875aa
commit ba909074dc
3 changed files with 131 additions and 12 deletions

View File

@ -1 +1 @@
v1.7.8 v1.7.9

View File

@ -1,3 +1,6 @@
v1.7.9
- [x] ✨ 下载批量删除
v1.7.8 v1.7.8
- [x] ♻️ iOS可以使用FaceID进行解锁App - [x] ♻️ iOS可以使用FaceID进行解锁App
- [x] ✨ 音量键快速翻阅下一章节(设置中默认开启) - [x] ✨ 音量键快速翻阅下一章节(设置中默认开启)

View File

@ -26,20 +26,34 @@ class DownloadListScreen extends StatefulWidget {
class _DownloadListScreenState extends State<DownloadListScreen> { class _DownloadListScreenState extends State<DownloadListScreen> {
String _search = ""; String _search = "";
bool _selecting = false;
List<String> _selectingList = [];
late final SearchBar _searchBar = SearchBar( late final SearchBar _searchBar = SearchBar(
hintText: '搜索下载', hintText: '搜索下载',
inBar: false, inBar: false,
setState: setState, setState: setState,
onSubmitted: (value) { onSubmitted: (value) {
_search = value; _search = value;
_f = method.allDownloads(_search); _reloadList();
setState(() {});
_searchBar.controller.text = value; _searchBar.controller.text = value;
}, },
buildDefaultAppBar: (BuildContext context) { buildDefaultAppBar: (BuildContext context) {
if (_selecting) {
return AppBar(
title: const Text("删除下载"),
actions: [
_selectingCancelButton(),
_selectingDeleteButton(),
],
);
}
return AppBar( return AppBar(
title: Text(_search == "" ? "下载列表" : ('搜索下载 - $_search')), title: Text(_search == "" ? "下载列表" : ('搜索下载 - $_search')),
actions: [ actions: [
_searchBar.getSearchAction(context), _searchBar.getSearchAction(context),
_toSelectingButton(),
exportButton(), exportButton(),
importButton(), importButton(),
resetFailedButton(), resetFailedButton(),
@ -51,7 +65,14 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
DownloadComic? _downloading; DownloadComic? _downloading;
late bool _downloadRunning = false; late bool _downloadRunning = false;
late Future<List<DownloadComic>> _f = method.allDownloads(_search); late Future<List<DownloadComic>> _f =
method.allDownloads(_search).then((value) {
setState(() {
_selecting = false;
_selectingList = [];
});
return value;
});
void _onMessageChange(String event) { void _onMessageChange(String event) {
print("EVENT"); print("EVENT");
@ -113,11 +134,18 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
} }
} }
if (_selecting) {
return ListView(
children: [
...data.map(selectingWidget),
],
);
}
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async { onRefresh: () async {
setState(() { _reloadList();
_f = method.allDownloads(_search); setState(() {});
});
}, },
child: PikaListView( child: PikaListView(
children: [ children: [
@ -165,6 +193,41 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
); );
} }
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() { Widget exportButton() {
return IconButton( return IconButton(
onPressed: () async { onPressed: () async {
@ -201,9 +264,8 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
builder: (context) => const DownloadImportScreen(), builder: (context) => const DownloadImportScreen(),
), ),
); );
setState(() { _reloadList();
_f = method.allDownloads(_search); setState(() {});
});
}, },
icon: Column( icon: Column(
children: [ children: [
@ -280,9 +342,8 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
return IconButton( return IconButton(
onPressed: () async { onPressed: () async {
await method.resetFailed(); await method.resetFailed();
setState(() { _reloadList();
_f = method.allDownloads(_search); setState(() {});
});
defaultToast(context, "所有失败的下载已经恢复"); defaultToast(context, "所有失败的下载已经恢复");
}, },
icon: Column( icon: Column(
@ -301,4 +362,59 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
], ],
)); ));
} }
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),
);
}
} }