From b0faaecbbda641ef3cd7a4087d0b381d209416ac Mon Sep 17 00:00:00 2001 From: niuhuan Date: Mon, 27 Mar 2023 15:44:34 +0800 Subject: [PATCH] :sparkles: Import another application view logs --- lib/basic/Method.dart | 4 ++ lib/basic/config/DownloadCachePath.dart | 76 ++++++++++++++++++++- lib/screens/ImportFromOffScreen.dart | 91 +++++++++++++++++++++++++ lib/screens/SettingsScreen.dart | 4 +- 4 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 lib/screens/ImportFromOffScreen.dart diff --git a/lib/basic/Method.dart b/lib/basic/Method.dart index 308ff48..99cb39f 100644 --- a/lib/basic/Method.dart +++ b/lib/basic/Method.dart @@ -981,4 +981,8 @@ class Method { Future androidStorageRoot() async { return await _channel.invokeMethod("androidStorageRoot"); } + + Future importComicViewFormOff(String dbPath) { + return _flatInvoke("importComicViewFormOff", dbPath); + } } diff --git a/lib/basic/config/DownloadCachePath.dart b/lib/basic/config/DownloadCachePath.dart index dbf6eb2..41ad4f1 100644 --- a/lib/basic/config/DownloadCachePath.dart +++ b/lib/basic/config/DownloadCachePath.dart @@ -3,11 +3,16 @@ import 'dart:convert'; import 'dart:io'; +import 'package:file_picker/file_picker.dart'; +import 'package:filesystem_picker/filesystem_picker.dart'; import 'package:flutter/material.dart'; import 'package:pikapika/basic/Common.dart'; import 'package:pikapika/basic/Cross.dart'; +import '../../screens/ImportFromOffScreen.dart'; import '../Method.dart'; +import 'ChooserRoot.dart'; +import 'IconLoading.dart'; late String _downloadCachePath; @@ -28,14 +33,14 @@ Widget downloadCachePathSetting() { return StatefulBuilder( builder: (BuildContext context, void Function(void Function()) setState) { return ListTile( - title: const Text("使用下载缓存"), + title: const Text("使用其他程序的缓存下载加速"), subtitle: Text(_downloadCachePath), onTap: () async { if (_downloadCachePath == "") { bool b = await confirmDialog( context, - "使用其他软件的下载内容加速", - "您即将选择一个目录, 这个目录拷贝自 ${base64Decode("L0FuZHJvaWQvZGF0YS9jb20ucGljYWNvbWljLmZyZWdhdGEvZmlsZXMv")}", + "使用其他程序的缓存下载加速", + "您即将选择一个目录, 这个目录拷贝自以下目录才能使用。下载时将会作为缓存文件夹优先读取。 \n\n${String.fromCharCodes(base64Decode("L0FuZHJvaWQvZGF0YS9jb20ucGljYWNvbWljLmZyZWdhdGEvZmlsZXMv"))}", ); if (b) { late String? folder; @@ -71,3 +76,68 @@ Widget downloadCachePathSetting() { } 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(); +} diff --git a/lib/screens/ImportFromOffScreen.dart b/lib/screens/ImportFromOffScreen.dart new file mode 100644 index 0000000..3c3472c --- /dev/null +++ b/lib/screens/ImportFromOffScreen.dart @@ -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 createState() => _ImportFromOffScreenState(); +} + +class _ImportFromOffScreenState extends State { + 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; + }); + } + } +} diff --git a/lib/screens/SettingsScreen.dart b/lib/screens/SettingsScreen.dart index f677292..6d1ae3c 100644 --- a/lib/screens/SettingsScreen.dart +++ b/lib/screens/SettingsScreen.dart @@ -180,9 +180,11 @@ class _SettingsScreenState extends State { downloadThreadCountSetting(), downloadAndExportPathSetting(), showCommentAtDownloadSetting(), - downloadCachePathSetting(), exportRenameSetting(), const Divider(), + downloadCachePathSetting(), + importViewLogFromOff(), + const Divider(), const Padding(padding: EdgeInsets.only(top: 15)), ]), ];