diff --git a/ci/version.info.txt b/ci/version.info.txt index 3a2e932..32df20a 100644 --- a/ci/version.info.txt +++ b/ci/version.info.txt @@ -1,6 +1,7 @@ v1.7.8 - [x] ♻️ iOS可以使用FaceID进行解锁App -- [x] ✨ 音量键快速翻阅下一章节(设置中开启) +- [x] ✨ 音量键快速翻阅下一章节(设置中默认开启) +- [x] ✨ 长按复制不需要确认(设置中默认关闭) v1.7.7 - [x] 🐛 修复一些极端情况下崩溃 diff --git a/lib/basic/Cross.dart b/lib/basic/Cross.dart index 5b76bd2..8fb09b3 100644 --- a/lib/basic/Cross.dart +++ b/lib/basic/Cross.dart @@ -6,6 +6,7 @@ import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:pikapika/basic/Common.dart'; +import 'package:pikapika/basic/config/CopySkipConfirm.dart'; import 'package:pikapika/basic/config/Platform.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -18,6 +19,11 @@ void copyToClipBoard(BuildContext context, String string) { defaultToast(context, "已复制到剪切板"); } +void copyToClipBoardTips(BuildContext context, String string) { + FlutterClipboard.copy(string); + defaultToast(context, "已复制到剪切板 :\n$string"); +} + /// 打开web页面 Future openUrl(String url) async { if (await canLaunch(url)) { @@ -72,7 +78,7 @@ Future _saveImageAndroid(String path, BuildContext context) async { late bool g; if (androidVersion < 30) { g = await Permission.storage.request().isGranted; - }else{ + } else { g = await Permission.manageExternalStorage.request().isGranted; } if (!g) { @@ -85,16 +91,18 @@ Future _saveImageAndroid(String path, BuildContext context) async { Future chooseFolder(BuildContext context) async { return FilePicker.platform.getDirectoryPath( dialogTitle: "选择一个文件夹, 将文件保存到这里", - initialDirectory: Directory - .fromUri(Uri.file(await currentChooserRoot())) - .absolute - .path, + initialDirectory: + Directory.fromUri(Uri.file(await currentChooserRoot())).absolute.path, ); } /// 复制对话框 void confirmCopy(BuildContext context, String content) async { - if (await confirmDialog(context, "复制", content)) { - copyToClipBoard(context, content); + if (copySkipConfirm()) { + copyToClipBoardTips(context, content); + } else { + if (await confirmDialog(context, "复制", content)) { + copyToClipBoard(context, content); + } } } diff --git a/lib/basic/config/CopySkipConfirm.dart b/lib/basic/config/CopySkipConfirm.dart new file mode 100644 index 0000000..eefc35b --- /dev/null +++ b/lib/basic/config/CopySkipConfirm.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import '../Method.dart'; + +const _propertyName = "copySkipConfirm"; + +late bool _copySkipConfirm; + +Future initCopySkipConfirm() async { + _copySkipConfirm = (await method.loadProperty(_propertyName, "false")) == "true"; +} + +bool copySkipConfirm() { + return _copySkipConfirm; +} + +Widget copySkipConfirmSetting() { + return StatefulBuilder( + builder: (BuildContext context, void Function(void Function()) setState) { + return SwitchListTile( + title: const Text("长按复制不需要确认"), + value: _copySkipConfirm, + onChanged: (value) async { + await method.saveProperty(_propertyName, "$value"); + _copySkipConfirm = value; + setState(() {}); + }, + ); + }, + ); +} diff --git a/lib/screens/InitScreen.dart b/lib/screens/InitScreen.dart index 56c4173..45b8e06 100644 --- a/lib/screens/InitScreen.dart +++ b/lib/screens/InitScreen.dart @@ -11,6 +11,7 @@ import 'package:pikapika/basic/config/AutoFullScreen.dart'; import 'package:pikapika/basic/config/CategoriesColumnCount.dart'; import 'package:pikapika/basic/config/ChooserRoot.dart'; import 'package:pikapika/basic/config/ContentFailedReloadAction.dart'; +import 'package:pikapika/basic/config/CopySkipConfirm.dart'; import 'package:pikapika/basic/config/DownloadAndExportPath.dart'; import 'package:pikapika/basic/config/DownloadThreadCount.dart'; import 'package:pikapika/basic/config/EBookScrolling.dart'; @@ -127,6 +128,7 @@ class _InitScreenState extends State { await initEBookScrollingRange(); await initEBookScrollingTrigger(); await initVolumeNextChapter(); + await initCopySkipConfirm(); String? initUrl; if (Platform.isAndroid || Platform.isIOS) { diff --git a/lib/screens/SettingsScreen.dart b/lib/screens/SettingsScreen.dart index 9ffd568..ddad628 100644 --- a/lib/screens/SettingsScreen.dart +++ b/lib/screens/SettingsScreen.dart @@ -8,6 +8,7 @@ import 'package:pikapika/basic/config/AutoClean.dart'; import 'package:pikapika/basic/config/AutoFullScreen.dart'; import 'package:pikapika/basic/config/ChooserRoot.dart'; import 'package:pikapika/basic/config/ContentFailedReloadAction.dart'; +import 'package:pikapika/basic/config/CopySkipConfirm.dart'; import 'package:pikapika/basic/config/DownloadAndExportPath.dart'; import 'package:pikapika/basic/config/DownloadThreadCount.dart'; import 'package:pikapika/basic/config/EBookScrollingRange.dart'; @@ -101,6 +102,7 @@ class _SettingsScreenState extends State { androidSecureFlagSetting(), authenticationSetting(), const Divider(), + copySkipConfirmSetting(), iconLoadingSetting(), eBookScrollingSetting(), eBookScrollingRangeSetting(),