pikapika/lib/screens/DownloadExportToFileScreen....

466 lines
13 KiB
Dart
Raw Normal View History

2021-09-29 23:57:09 +00:00
import 'dart:async';
import 'package:flutter/material.dart';
2021-11-11 03:00:38 +00:00
import 'package:pikapika/basic/Channels.dart';
import 'package:pikapika/basic/Common.dart';
import 'package:pikapika/basic/Entities.dart';
import 'package:pikapika/basic/Method.dart';
2022-02-25 10:46:11 +00:00
import 'package:pikapika/basic/config/ExportRename.dart';
2021-11-11 03:00:38 +00:00
import 'package:pikapika/screens/DownloadExportToSocketScreen.dart';
2023-03-30 14:38:28 +00:00
import '../basic/config/ExportPath.dart';
2023-01-31 10:50:51 +00:00
import '../basic/config/IconLoading.dart';
2023-03-30 14:38:28 +00:00
import '../basic/config/IsPro.dart';
2021-09-29 23:57:09 +00:00
import 'components/ContentError.dart';
import 'components/ContentLoading.dart';
import 'components/DownloadInfoCard.dart';
2023-05-08 09:57:28 +00:00
import 'components/ListView.dart';
2022-03-25 14:57:30 +00:00
import 'components/RightClickPop.dart';
2021-09-29 23:57:09 +00:00
// 导出
class DownloadExportToFileScreen extends StatefulWidget {
final String comicId;
final String comicTitle;
2022-03-17 03:31:25 +00:00
const DownloadExportToFileScreen({
2021-09-29 23:57:09 +00:00
required this.comicId,
required this.comicTitle,
2022-03-17 03:31:25 +00:00
Key? key,
}) : super(key: key);
2021-09-29 23:57:09 +00:00
@override
State<StatefulWidget> createState() => _DownloadExportToFileScreenState();
}
class _DownloadExportToFileScreenState
extends State<DownloadExportToFileScreen> {
late DownloadComic _task;
late Future _future = _load();
late bool exporting = false;
late String exportMessage = "导出中";
late String exportResult = "";
Future _load() async {
_task = (await method.loadDownloadComic(widget.comicId))!;
}
@override
void initState() {
registerEvent(_onMessageChange, "EXPORT");
super.initState();
}
@override
void dispose() {
unregisterEvent(_onMessageChange);
super.dispose();
}
void _onMessageChange(event) {
setState(() {
exportMessage = event;
});
}
@override
2022-06-29 19:02:01 +00:00
Widget build(BuildContext context) {
2022-03-25 14:57:30 +00:00
return rightClickPop(
child: buildScreen(context),
context: context,
canPop: !exporting,
);
}
Widget buildScreen(BuildContext context) {
2021-09-29 23:57:09 +00:00
if (exporting) {
return Scaffold(
body: ContentLoading(label: exportMessage),
);
}
return Scaffold(
appBar: AppBar(
title: Text("导出 - " + widget.comicTitle),
),
body: FutureBuilder(
future: _future,
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.hasError) {
return ContentError(
error: snapshot.error,
stackTrace: snapshot.stackTrace,
onRefresh: () async {
setState(() {
_future = _load();
});
});
}
if (snapshot.connectionState != ConnectionState.done) {
2022-03-19 04:12:27 +00:00
return const ContentLoading(label: '加载中');
2021-09-29 23:57:09 +00:00
}
2023-05-08 09:57:28 +00:00
return PikaListView(
2021-09-29 23:57:09 +00:00
children: [
DownloadInfoCard(task: _task),
Container(
2022-03-19 04:12:27 +00:00
padding: const EdgeInsets.all(8),
2021-09-29 23:57:09 +00:00
child: exportResult != "" ? Text(exportResult) : Container(),
),
2023-03-30 14:38:28 +00:00
displayExportPathInfo(),
Container(height: 15),
_exportPkzButton(),
Container(height: 10),
_exportPkiButton(),
Container(height: 10),
_exportHtmlZipButton(),
Container(height: 10),
_exportToHtmlJPEGButton(),
Container(height: 10),
_exportToJPEGSZIPButton(),
Container(height: 10),
_exportToHtmlJPEGNotDownOverButton(),
Container(height: 10),
2021-09-29 23:57:09 +00:00
MaterialButton(
onPressed: () async {
Navigator.of(context).push(
2023-01-31 10:50:51 +00:00
mixRoute(
2021-09-29 23:57:09 +00:00
builder: (context) => DownloadExportToSocketScreen(
task: _task,
comicId: widget.comicId,
comicTitle: widget.comicTitle,
),
),
);
},
child: _buildButtonInner('传输到其他设备'),
),
2023-03-30 14:38:28 +00:00
Container(height: 40),
2021-09-29 23:57:09 +00:00
],
);
},
),
);
}
2023-03-30 14:38:28 +00:00
Widget _exportPkzButton() {
return MaterialButton(
onPressed: () async {
var name = "";
if (currentExportRename()) {
var rename = await inputString(
context,
"请输入保存后的名称",
defaultValue: _task.title,
);
if (rename != null && rename.isNotEmpty) {
name = rename;
} else {
2023-02-25 10:05:37 +00:00
return;
}
2023-03-30 14:38:28 +00:00
} else {
if (!await confirmDialog(
context, "导出确认", "将您所选的漫画导出PKZ${showExportPath()}")) {
2023-02-25 10:05:37 +00:00
return;
}
2023-03-30 14:38:28 +00:00
}
try {
setState(() {
exporting = true;
});
await method.exportComicDownloadToPkz(
[widget.comicId],
await attachExportPath(),
name,
);
setState(() {
exportResult = "导出成功";
});
} catch (e) {
setState(() {
exportResult = "导出失败 $e";
});
} finally {
setState(() {
exporting = false;
});
}
},
child: _buildButtonInner(
'导出到xxx.pkz\n(可直接打开观看的格式,不支持导入)\n(可以躲避网盘或者聊天软件的扫描)',
),
);
}
Widget _exportPkiButton() {
return MaterialButton(
onPressed: () async {
var name = "";
if (currentExportRename()) {
var rename = await inputString(
context,
"请输入保存后的名称",
defaultValue: _task.title,
);
if (rename != null && rename.isNotEmpty) {
name = rename;
} else {
2023-02-25 10:05:37 +00:00
return;
}
2023-03-30 14:38:28 +00:00
} else {
if (!await confirmDialog(
context, "导出确认", "将您所选的漫画导出PKI${showExportPath()}")) {
2023-02-25 10:05:37 +00:00
return;
}
2023-03-30 14:38:28 +00:00
}
try {
setState(() {
exporting = true;
});
await method.exportComicDownloadToPki(
widget.comicId,
await attachExportPath(),
name,
);
setState(() {
exportResult = "导出成功";
});
} catch (e) {
setState(() {
exportResult = "导出失败 $e";
});
} finally {
setState(() {
exporting = false;
});
}
},
child: _buildButtonInner(
'导出到xxx.pki\n(只支持导入, 不支持直接阅读)\n(可以躲避网盘或者聊天软件的扫描)\n(后期版本可能支持直接阅读)',
),
);
}
Widget _exportHtmlZipButton() {
return MaterialButton(
onPressed: () async {
if (!isPro) {
defaultToast(context, "请先发电鸭");
return;
}
var name = "";
if (currentExportRename()) {
var rename = await inputString(
context,
"请输入保存后的名称",
defaultValue: _task.title,
);
if (rename != null && rename.isNotEmpty) {
name = rename;
} else {
2023-02-25 10:05:37 +00:00
return;
}
2023-03-30 14:38:28 +00:00
} else {
if (!await confirmDialog(
context, "导出确认", "将您所选的漫画导出HTML+ZIP${showExportPath()}")) {
2023-02-25 10:05:37 +00:00
return;
}
2023-03-30 14:38:28 +00:00
}
try {
setState(() {
exporting = true;
});
await method.exportComicDownload(
widget.comicId,
await attachExportPath(),
name,
);
setState(() {
exportResult = "导出成功";
});
} catch (e) {
setState(() {
exportResult = "导出失败 $e";
});
} finally {
setState(() {
exporting = false;
});
}
},
child: _buildButtonInner(
'导出到HTML.zip\n(可从其他设备导入 / 解压后可阅读)' + (!isPro ? "\n(发电后使用)" : ""),
),
);
2023-02-25 10:05:37 +00:00
}
2023-03-30 14:38:28 +00:00
Widget _exportToHtmlJPEGButton() {
return MaterialButton(
onPressed: () async {
if (!isPro) {
defaultToast(context, "请先发电鸭");
return;
}
var name = "";
if (currentExportRename()) {
var rename = await inputString(
context,
"请输入保存后的名称",
defaultValue: _task.title,
);
if (rename != null && rename.isNotEmpty) {
name = rename;
} else {
2023-02-25 10:05:37 +00:00
return;
}
2023-03-30 14:38:28 +00:00
} else {
if (!await confirmDialog(
context, "导出确认", "将您所选的漫画导出HTML+JPEG${showExportPath()}")) {
2022-06-29 19:02:01 +00:00
return;
}
2023-03-30 14:38:28 +00:00
}
try {
setState(() {
exporting = true;
});
await method.exportComicDownloadToJPG(
widget.comicId,
await attachExportPath(),
name,
);
setState(() {
exportResult = "导出成功";
});
} catch (e) {
setState(() {
exportResult = "导出失败 $e";
});
} finally {
setState(() {
exporting = false;
});
}
},
child: _buildButtonInner('导出到HTML+JPG\n(可直接在相册中打开观看)'),
);
}
Widget _exportToJPEGSZIPButton() {
return MaterialButton(
onPressed: () async {
if (!isPro) {
defaultToast(context, "请先发电鸭");
return;
}
var name = "";
if (currentExportRename()) {
var rename = await inputString(
context,
"请输入保存后的名称",
defaultValue: _task.title,
);
if (rename != null && rename.isNotEmpty) {
name = rename;
} else {
return;
}
2023-03-30 14:38:28 +00:00
} else {
if (!await confirmDialog(
context, "导出确认", "将您所选的漫画导出JPEGS.zip${showExportPath()}")) {
return;
}
2023-03-30 14:38:28 +00:00
}
try {
setState(() {
exporting = true;
});
await method.exportComicDownloadJpegZip(
widget.comicId,
await attachExportPath(),
name,
);
setState(() {
exportResult = "导出成功";
});
} catch (e) {
setState(() {
exportResult = "导出失败 $e";
});
} finally {
setState(() {
exporting = false;
});
}
},
child: _buildButtonInner(
'导出阅读器用JPGS.zip\n(不可再导入)' + (!isPro ? "\n(发电后使用)" : ""),
),
);
}
Widget _exportToHtmlJPEGNotDownOverButton() {
return MaterialButton(
onPressed: () async {
if (!isPro) {
defaultToast(context, "请先发电鸭");
return;
}
var name = "";
if (currentExportRename()) {
var rename = await inputString(
context,
"请输入保存后的名称",
defaultValue: _task.title,
);
if (rename != null && rename.isNotEmpty) {
name = rename;
} else {
2021-10-14 10:12:36 +00:00
return;
}
2023-03-30 14:38:28 +00:00
} else {
if (!await confirmDialog(context, "导出确认",
"将您所选的漫画导出HTML+JPEGS(即使没有下载完成)${showExportPath()}")) {
2022-03-17 03:31:25 +00:00
return;
2021-10-14 10:12:36 +00:00
}
2023-03-30 14:38:28 +00:00
}
try {
setState(() {
exporting = true;
});
await method.exportComicJpegsEvenNotFinish(
widget.comicId,
await attachExportPath(),
name,
);
setState(() {
exportResult = "导出成功";
});
} catch (e) {
setState(() {
exportResult = "导出失败 $e";
});
} finally {
setState(() {
exporting = false;
});
}
},
child: _buildButtonInner(
'导出到HTML+JPG\n(即使没有下载成功)' + (!isPro ? "\n(发电后使用)" : ""),
),
);
2021-09-29 23:57:09 +00:00
}
Widget _buildButtonInner(String text) {
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Container(
width: constraints.maxWidth,
2023-03-30 14:38:28 +00:00
padding: const EdgeInsets.all(15),
2021-09-29 23:57:09 +00:00
color: (Theme.of(context).textTheme.bodyText1?.color ?? Colors.black)
.withOpacity(.05),
child: Text(
text,
textAlign: TextAlign.center,
),
);
},
);
}
}