diff --git a/ci/version.info.txt b/ci/version.info.txt index 32c8ca7..0fcc057 100644 --- a/ci/version.info.txt +++ b/ci/version.info.txt @@ -1,3 +1,4 @@ v1.7.3 -- [x] ✨ 可以隐藏发电图标 -- [x] ✨ 可以给阅读器加灰度滤镜(设置项)(墨水屏下或许有用) +- [x] ✨ 可以隐藏发电图标(设置项) +- [x] ✨ 可以给阅读器加灰度滤镜(设置项)(彩色墨水屏下或许有用) +- [x] ✨ 可以选择阅读器背景色(设置项)(白色可防止墨水屏下拖影) diff --git a/lib/basic/config/ImageFilter.dart b/lib/basic/config/ImageFilter.dart index 506fbe2..b1b253c 100644 --- a/lib/basic/config/ImageFilter.dart +++ b/lib/basic/config/ImageFilter.dart @@ -84,7 +84,7 @@ Future chooseImageFilter(BuildContext context) async { ImageFilter? result = await chooseMapDialog( context, map, - "选择全屏UI", + "选择阅读器图片滤镜", ); if (result != null) { await method.saveProperty(_propertyName, result.name); @@ -96,7 +96,7 @@ Widget imageFilterSetting() { return StatefulBuilder( builder: (BuildContext context, void Function(void Function()) setState) { return ListTile( - title: const Text("阅读器滤镜"), + title: const Text("阅读器图片滤镜"), subtitle: Text(imageFilter.name), onTap: () async { await chooseImageFilter(context); diff --git a/lib/basic/config/ReaderBackgroundColor.dart b/lib/basic/config/ReaderBackgroundColor.dart new file mode 100644 index 0000000..e942fc1 --- /dev/null +++ b/lib/basic/config/ReaderBackgroundColor.dart @@ -0,0 +1,81 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +import '../Common.dart'; +import '../Method.dart'; + +const _propertyName = "readerBackgroundColor"; +late ReaderBackgroundColor readerBackgroundColor; + +Color get readerBackgroundColorObj => readerBackgroundColor.color; + +Future initReaderBackgroundColor() async { + readerBackgroundColor = + _readerBackgroundColorFromString(await method.loadProperty( + _propertyName, + _colors[0].name, + )); +} + +ReaderBackgroundColor _readerBackgroundColorFromString(String string) { + for (var value in _colors) { + if (string == value.name) { + return value; + } + } + return _colors[0]; +} + +class ReaderBackgroundColor { + final String name; + final Color color; + + ReaderBackgroundColor(this.name, this.color); +} + +final List _colors = [ + ReaderBackgroundColor( + "黑色", + Colors.black, + ), + ReaderBackgroundColor( + "灰度", + Colors.grey, + ), + ReaderBackgroundColor( + "白色", + Colors.white, + ), +]; + +Future chooseReaderBackgroundColor(BuildContext context) async { + Map map = {}; + for (var element in _colors) { + map[element.name] = element; + } + ReaderBackgroundColor? result = await chooseMapDialog( + context, + map, + "选择阅读器背景色", + ); + if (result != null) { + await method.saveProperty(_propertyName, result.name); + readerBackgroundColor = result; + } +} + +Widget readerBackgroundColorSetting() { + return StatefulBuilder( + builder: (BuildContext context, void Function(void Function()) setState) { + return ListTile( + title: const Text("阅读器背景色"), + subtitle: Text(readerBackgroundColor.name), + onTap: () async { + await chooseReaderBackgroundColor(context); + setState(() {}); + }, + ); + }, + ); +} diff --git a/lib/screens/InitScreen.dart b/lib/screens/InitScreen.dart index fba46a8..058e62e 100644 --- a/lib/screens/InitScreen.dart +++ b/lib/screens/InitScreen.dart @@ -49,6 +49,7 @@ import '../basic/config/ExportRename.dart'; import '../basic/config/HiddenFdIcon.dart'; import '../basic/config/IconLoading.dart'; import '../basic/config/IsPro.dart'; +import '../basic/config/ReaderBackgroundColor.dart'; import '../basic/config/WebDav.dart'; import 'AccountScreen.dart'; import 'AppScreen.dart'; @@ -117,6 +118,7 @@ class _InitScreenState extends State { await initUseApiLoadImage(); await initWebDav(); await initImageFilter(); + await initReaderBackgroundColor(); String? initUrl; if (Platform.isAndroid || Platform.isIOS) { diff --git a/lib/screens/SettingsScreen.dart b/lib/screens/SettingsScreen.dart index 44df987..1bc5e1d 100644 --- a/lib/screens/SettingsScreen.dart +++ b/lib/screens/SettingsScreen.dart @@ -19,6 +19,7 @@ import 'package:pikapika/basic/config/KeyboardController.dart'; import 'package:pikapika/basic/config/NoAnimation.dart'; import 'package:pikapika/basic/config/PagerAction.dart'; import 'package:pikapika/basic/config/Quality.dart'; +import 'package:pikapika/basic/config/ReaderBackgroundColor.dart'; import 'package:pikapika/basic/config/ReaderDirection.dart'; import 'package:pikapika/basic/config/ReaderSliderPosition.dart'; import 'package:pikapika/basic/config/ReaderType.dart'; @@ -161,6 +162,7 @@ class _SettingsScreenState extends State { keyboardControllerSetting(), const Divider(), imageFilterSetting(), + readerBackgroundColorSetting(), const Divider(), const Padding(padding: EdgeInsets.only(top: 15)), ]), diff --git a/lib/screens/components/ImageReader.dart b/lib/screens/components/ImageReader.dart index 96a78b2..a38878f 100644 --- a/lib/screens/components/ImageReader.dart +++ b/lib/screens/components/ImageReader.dart @@ -25,6 +25,7 @@ import 'package:pikapika/basic/config/VolumeController.dart'; import 'package:pikapika/screens/components/PkzImages.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import '../../basic/config/IconLoading.dart'; +import '../../basic/config/ReaderBackgroundColor.dart'; import '../../basic/config/UseApiLoadImage.dart'; import '../FilePhotoViewScreen.dart'; import 'gesture_zoom_box.dart'; @@ -1052,8 +1053,8 @@ class _WebToonReaderState extends _ImageReaderContentState { @override Widget _buildViewer() { return Container( - decoration: const BoxDecoration( - color: Colors.black, + decoration: BoxDecoration( + color: readerBackgroundColorObj, ), child: _buildList(), ); @@ -1180,7 +1181,7 @@ class _WebToonReaderState extends _ImageReaderContentState { Navigator.of(context).pop(); } }, - textColor: Colors.white, + textColor: invertColor(readerBackgroundColorObj), child: Container( padding: const EdgeInsets.only(top: 40, bottom: 40), child: Text(super._hasNextEp() ? '下一章' : '结束阅读'), @@ -1396,8 +1397,8 @@ class _ListViewReaderState extends _ImageReaderContentState @override Widget _buildViewer() { return Container( - decoration: const BoxDecoration( - color: Colors.black, + decoration: BoxDecoration( + color: readerBackgroundColorObj, ), child: _buildList(), ); @@ -1531,7 +1532,7 @@ class _ListViewReaderState extends _ImageReaderContentState Navigator.of(context).pop(); } }, - textColor: Colors.white, + textColor: invertColor(readerBackgroundColorObj), child: Container( padding: const EdgeInsets.only(top: 40, bottom: 40), child: Text(super._hasNextEp() ? '下一章' : '结束阅读'), @@ -1611,7 +1612,7 @@ class _GalleryReaderState extends _ImageReaderContentState { ? Axis.vertical : Axis.horizontal, reverse: widget.pagerDirection == ReaderDirection.RIGHT_TO_LEFT, - backgroundDecoration: const BoxDecoration(color: Colors.black), + backgroundDecoration: BoxDecoration(color: readerBackgroundColorObj), loadingBuilder: (context, event) => LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { return buildLoading(constraints.maxWidth, constraints.maxHeight); @@ -1754,8 +1755,10 @@ class _GalleryReaderState extends _ImageReaderContentState { Navigator.of(context).pop(); } }, - child: Text(_hasNextEp() ? '下一章' : '结束阅读', - style: const TextStyle(color: Colors.white)), + child: Text( + _hasNextEp() ? '下一章' : '结束阅读', + style: const TextStyle(color: Colors.white), + ), ), ), ), @@ -1763,4 +1766,13 @@ class _GalleryReaderState extends _ImageReaderContentState { } } +Color invertColor(Color color) { + return Color.fromRGBO( + 255 - color.red, + 255 - color.green, + 255 - color.blue, + 1.0, + ); +} + ///////////////////////////////////////////////////////////////////////////////