✨ Import another application view logs
This commit is contained in:
parent
f92bedef05
commit
b0faaecbbd
|
@ -981,4 +981,8 @@ class Method {
|
||||||
Future<String> androidStorageRoot() async {
|
Future<String> androidStorageRoot() async {
|
||||||
return await _channel.invokeMethod("androidStorageRoot");
|
return await _channel.invokeMethod("androidStorageRoot");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future importComicViewFormOff(String dbPath) {
|
||||||
|
return _flatInvoke("importComicViewFormOff", dbPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,16 @@
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:file_picker/file_picker.dart';
|
||||||
|
import 'package:filesystem_picker/filesystem_picker.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:pikapika/basic/Common.dart';
|
import 'package:pikapika/basic/Common.dart';
|
||||||
import 'package:pikapika/basic/Cross.dart';
|
import 'package:pikapika/basic/Cross.dart';
|
||||||
|
|
||||||
|
import '../../screens/ImportFromOffScreen.dart';
|
||||||
import '../Method.dart';
|
import '../Method.dart';
|
||||||
|
import 'ChooserRoot.dart';
|
||||||
|
import 'IconLoading.dart';
|
||||||
|
|
||||||
late String _downloadCachePath;
|
late String _downloadCachePath;
|
||||||
|
|
||||||
|
@ -28,14 +33,14 @@ Widget downloadCachePathSetting() {
|
||||||
return StatefulBuilder(
|
return StatefulBuilder(
|
||||||
builder: (BuildContext context, void Function(void Function()) setState) {
|
builder: (BuildContext context, void Function(void Function()) setState) {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: const Text("使用下载缓存"),
|
title: const Text("使用其他程序的缓存下载加速"),
|
||||||
subtitle: Text(_downloadCachePath),
|
subtitle: Text(_downloadCachePath),
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
if (_downloadCachePath == "") {
|
if (_downloadCachePath == "") {
|
||||||
bool b = await confirmDialog(
|
bool b = await confirmDialog(
|
||||||
context,
|
context,
|
||||||
"使用其他软件的下载内容加速",
|
"使用其他程序的缓存下载加速",
|
||||||
"您即将选择一个目录, 这个目录拷贝自 ${base64Decode("L0FuZHJvaWQvZGF0YS9jb20ucGljYWNvbWljLmZyZWdhdGEvZmlsZXMv")}",
|
"您即将选择一个目录, 这个目录拷贝自以下目录才能使用。下载时将会作为缓存文件夹优先读取。 \n\n${String.fromCharCodes(base64Decode("L0FuZHJvaWQvZGF0YS9jb20ucGljYWNvbWljLmZyZWdhdGEvZmlsZXMv"))}",
|
||||||
);
|
);
|
||||||
if (b) {
|
if (b) {
|
||||||
late String? folder;
|
late String? folder;
|
||||||
|
@ -71,3 +76,68 @@ Widget downloadCachePathSetting() {
|
||||||
}
|
}
|
||||||
return Container();
|
return Container();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget importViewLogFromOff() {
|
||||||
|
if (Platform.isWindows ||
|
||||||
|
Platform.isMacOS ||
|
||||||
|
Platform.isAndroid ||
|
||||||
|
Platform.isLinux) {
|
||||||
|
return StatefulBuilder(
|
||||||
|
builder: (BuildContext context, void Function(void Function()) setState) {
|
||||||
|
return ListTile(
|
||||||
|
title: const Text("导入其他程序的历史记录"),
|
||||||
|
subtitle: Text(_downloadCachePath),
|
||||||
|
onTap: () async {
|
||||||
|
bool b = await confirmDialog(
|
||||||
|
context,
|
||||||
|
"导入其他程序的历史记录",
|
||||||
|
"您即将选择一个文件, 这个文件拷贝自以下路径才能使用。 \n\n${String.fromCharCodes(base64Decode("L2RhdGEvZGF0YS9jb20ucGljYWNvbWljLmdyZWdhdGEvZGF0YWJhc2VzL2NvbV9waWNhY29taWNfZnJlZ2F0YS5kYg=="))}",
|
||||||
|
);
|
||||||
|
if (b) {
|
||||||
|
late String chooseRoot;
|
||||||
|
try {
|
||||||
|
chooseRoot = await currentChooserRoot();
|
||||||
|
} catch (e) {
|
||||||
|
defaultToast(context, "$e");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String? path;
|
||||||
|
if (Platform.isAndroid) {
|
||||||
|
path = await FilesystemPicker.open(
|
||||||
|
title: 'Open file',
|
||||||
|
context: context,
|
||||||
|
rootDirectory: Directory(chooseRoot),
|
||||||
|
fsType: FilesystemType.file,
|
||||||
|
folderIconColor: Colors.teal,
|
||||||
|
allowedExtensions: ['.db'],
|
||||||
|
fileTileSelectMode: FileTileSelectMode.wholeTile,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
var ls = await FilePicker.platform.pickFiles(
|
||||||
|
dialogTitle: '选择要导入的文件',
|
||||||
|
allowMultiple: false,
|
||||||
|
initialDirectory: chooseRoot,
|
||||||
|
type: FileType.custom,
|
||||||
|
allowedExtensions: ['db'],
|
||||||
|
allowCompression: false,
|
||||||
|
);
|
||||||
|
path = ls != null && ls.count > 0 ? ls.paths[0] : null;
|
||||||
|
}
|
||||||
|
if (path != null) {
|
||||||
|
if (path.endsWith(".db")) {
|
||||||
|
Navigator.of(context).push(
|
||||||
|
mixRoute(
|
||||||
|
builder: (BuildContext context) =>
|
||||||
|
ImportFromOffScreen(dbPath: path!),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:pikapika/basic/Method.dart';
|
||||||
|
|
||||||
|
import '../basic/Channels.dart';
|
||||||
|
import 'components/ContentLoading.dart';
|
||||||
|
import 'components/RightClickPop.dart';
|
||||||
|
|
||||||
|
class ImportFromOffScreen extends StatefulWidget {
|
||||||
|
final String dbPath;
|
||||||
|
|
||||||
|
const ImportFromOffScreen({Key? key, required this.dbPath}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => _ImportFromOffScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ImportFromOffScreenState extends State<ImportFromOffScreen> {
|
||||||
|
bool _importing = false;
|
||||||
|
String _importMessage = "";
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
registerEvent(_onMessageChange, "EXPORT");
|
||||||
|
_process();
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
unregisterEvent(_onMessageChange);
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onMessageChange(event) {
|
||||||
|
if (event is String) {
|
||||||
|
setState(() {
|
||||||
|
_importMessage = event;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return rightClickPop(
|
||||||
|
child: buildScreen(context),
|
||||||
|
context: context,
|
||||||
|
canPop: !_importing,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget buildScreen(BuildContext context) {
|
||||||
|
if (_importing) {
|
||||||
|
return Scaffold(
|
||||||
|
body: ContentLoading(label: _importMessage),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text('导入'),
|
||||||
|
),
|
||||||
|
body: ListView(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.all(10),
|
||||||
|
child: Text(_importMessage),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
_process() async {
|
||||||
|
try {
|
||||||
|
setState(() {
|
||||||
|
_importing = true;
|
||||||
|
});
|
||||||
|
await method.importComicViewFormOff(widget.dbPath);
|
||||||
|
setState(() {
|
||||||
|
_importMessage = "导入成功";
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
setState(() {
|
||||||
|
_importMessage = "导入失败 $e";
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
setState(() {
|
||||||
|
_importing = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -180,9 +180,11 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||||
downloadThreadCountSetting(),
|
downloadThreadCountSetting(),
|
||||||
downloadAndExportPathSetting(),
|
downloadAndExportPathSetting(),
|
||||||
showCommentAtDownloadSetting(),
|
showCommentAtDownloadSetting(),
|
||||||
downloadCachePathSetting(),
|
|
||||||
exportRenameSetting(),
|
exportRenameSetting(),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
|
downloadCachePathSetting(),
|
||||||
|
importViewLogFromOff(),
|
||||||
|
const Divider(),
|
||||||
const Padding(padding: EdgeInsets.only(top: 15)),
|
const Padding(padding: EdgeInsets.only(top: 15)),
|
||||||
]),
|
]),
|
||||||
];
|
];
|
||||||
|
|
Loading…
Reference in New Issue