diff --git a/lib/basic/config/NoAnimation.dart b/lib/basic/config/NoAnimation.dart new file mode 100644 index 0000000..b59501c --- /dev/null +++ b/lib/basic/config/NoAnimation.dart @@ -0,0 +1,43 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import '../Common.dart'; +import '../Method.dart'; + +const _propertyName = "noAnimation"; + +late bool _noAnimation; + +Future initNoAnimation() async { + _noAnimation = (await method.loadProperty(_propertyName, "false")) == "true"; +} + +bool noAnimation() { + return _noAnimation; +} + +Future _chooseNoAnimation(BuildContext context) async { + String? result = + await chooseListDialog(context, "取消翻页动画", ["是", "否"]); + if (result != null) { + var target = result == "是"; + await method.saveProperty(_propertyName, "$target"); + _noAnimation = target; + } +} + +Widget noAnimationSetting() { + return StatefulBuilder( + builder: (BuildContext context, void Function(void Function()) setState) { + return ListTile( + title: Text("取消翻页动画"), + subtitle: Text(_noAnimation ? "是" : "否"), + onTap: () async { + await _chooseNoAnimation(context); + setState(() {}); + }, + ); + }, + ); +} diff --git a/lib/basic/config/ShadowCategories.dart b/lib/basic/config/ShadowCategories.dart index f5235ec..1b6302d 100644 --- a/lib/basic/config/ShadowCategories.dart +++ b/lib/basic/config/ShadowCategories.dart @@ -2,19 +2,17 @@ import 'dart:convert'; -import 'package:event/event.dart'; import 'package:flutter/material.dart'; import 'package:multi_select_flutter/dialog/mult_select_dialog.dart'; import 'package:multi_select_flutter/multi_select_flutter.dart'; import '../Method.dart'; import '../store/Categories.dart'; +import 'ShadowCategoriesEvent.dart'; const _propertyName = "shadowCategories"; late List shadowCategories; -var shadowCategoriesEvent = Event(); - /// 获取封印的类型 Future> _loadShadowCategories() async { var value = await method.loadProperty(_propertyName, jsonEncode([])); diff --git a/lib/basic/config/ShadowCategoriesEvent.dart b/lib/basic/config/ShadowCategoriesEvent.dart new file mode 100644 index 0000000..e998c6f --- /dev/null +++ b/lib/basic/config/ShadowCategoriesEvent.dart @@ -0,0 +1,4 @@ + +import 'package:event/event.dart'; + +var shadowCategoriesEvent = Event(); diff --git a/lib/basic/config/shadowCategoriesMode.dart b/lib/basic/config/shadowCategoriesMode.dart new file mode 100644 index 0000000..285be21 --- /dev/null +++ b/lib/basic/config/shadowCategoriesMode.dart @@ -0,0 +1,73 @@ +/// 屏蔽方式 + +import 'package:flutter/material.dart'; +import '../Common.dart'; +import '../Method.dart'; +import 'ShadowCategoriesEvent.dart'; + +enum ShadowCategoriesMode { + BLACK_LIST, + WHITE_LIST, +} + +Map _fullScreenActionMap = { + "黑名单": ShadowCategoriesMode.BLACK_LIST, + "白名单": ShadowCategoriesMode.WHITE_LIST, +}; + +const _propertyName = "shadowCategoriesMode"; +late ShadowCategoriesMode _shadowCategoriesMode; + +Future initShadowCategoriesMode() async { + _shadowCategoriesMode = _shadowCategoriesModeFromString(await method.loadProperty( + _propertyName, + ShadowCategoriesMode.BLACK_LIST.toString(), + )); +} + +ShadowCategoriesMode currentShadowCategoriesMode() { + return _shadowCategoriesMode; +} + +ShadowCategoriesMode _shadowCategoriesModeFromString(String string) { + for (var value in ShadowCategoriesMode.values) { + if (string == value.toString()) { + return value; + } + } + return ShadowCategoriesMode.BLACK_LIST; +} + +String _currentShadowCategoriesMode() { + for (var e in _fullScreenActionMap.entries) { + if (e.value == _shadowCategoriesMode) { + return e.key; + } + } + return ''; +} + +Future _chooseShadowCategoriesMode(BuildContext context) async { + ShadowCategoriesMode? result = await chooseMapDialog( + context, _fullScreenActionMap, "封印模式"); + if (result != null) { + await method.saveProperty(_propertyName, result.toString()); + _shadowCategoriesMode = result; + shadowCategoriesEvent.broadcast(); + } +} + +Widget shadowCategoriesModeSetting() { + return StatefulBuilder( + builder: (BuildContext context, void Function(void Function()) setState) { + return ListTile( + title: Text("封印模式"), + subtitle: Text(_currentShadowCategoriesMode()), + onTap: () async { + await _chooseShadowCategoriesMode(context); + setState(() {}); + }, + ); + }, + ); +} diff --git a/lib/screens/CategoriesScreen.dart b/lib/screens/CategoriesScreen.dart index defca59..ff91521 100644 --- a/lib/screens/CategoriesScreen.dart +++ b/lib/screens/CategoriesScreen.dart @@ -2,6 +2,8 @@ import 'package:event/event.dart'; import 'package:flutter/material.dart'; import 'package:flutter_search_bar/flutter_search_bar.dart'; import 'package:pikapika/basic/Entities.dart'; +import 'package:pikapika/basic/config/ShadowCategoriesEvent.dart'; +import 'package:pikapika/basic/config/shadowCategoriesMode.dart'; import 'package:pikapika/basic/store/Categories.dart'; import 'package:pikapika/basic/config/ShadowCategories.dart'; import 'package:pikapika/screens/RankingsScreen.dart'; @@ -183,7 +185,14 @@ class _CategoriesScreenState extends State { for (var i = 0; i < cList.length; i++) { var c = cList[i]; if (c.isWeb) continue; - if (shadowCategories.contains(c.title)) continue; + switch (currentShadowCategoriesMode()) { + case ShadowCategoriesMode.BLACK_LIST: + if (shadowCategories.contains(c.title)) continue; + break; + case ShadowCategoriesMode.WHITE_LIST: + if (!shadowCategories.contains(c.title)) continue; + break; + } append( RemoteImage( fileServer: c.thumb.fileServer, diff --git a/lib/screens/ComicsScreen.dart b/lib/screens/ComicsScreen.dart index 2285ab7..273abdc 100644 --- a/lib/screens/ComicsScreen.dart +++ b/lib/screens/ComicsScreen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_search_bar/flutter_search_bar.dart'; import 'package:pikapika/basic/Common.dart'; import 'package:pikapika/basic/config/ShadowCategories.dart'; +import 'package:pikapika/basic/config/shadowCategoriesMode.dart'; import 'package:pikapika/basic/store/Categories.dart'; import 'package:pikapika/basic/config/ListLayout.dart'; import 'package:pikapika/basic/Method.dart'; @@ -65,7 +66,17 @@ class _ComicsScreenState extends State { categoryTitle(null), ...filteredList( storedCategories, - (c) => !shadowCategories.contains(c), + (c) { + switch (currentShadowCategoriesMode()) { + case ShadowCategoriesMode.BLACK_LIST: + if (shadowCategories.contains(c)) return false; + break; + case ShadowCategoriesMode.WHITE_LIST: + if (!shadowCategories.contains(c)) return false; + break; + } + return true; + }, ), ]); if (category != null) { diff --git a/lib/screens/InitScreen.dart b/lib/screens/InitScreen.dart index 2d9cc9c..1338802 100644 --- a/lib/screens/InitScreen.dart +++ b/lib/screens/InitScreen.dart @@ -26,6 +26,7 @@ import 'package:pikapika/basic/config/ListLayout.dart'; import 'package:pikapika/basic/config/TimeOffsetHour.dart'; import 'package:pikapika/basic/config/Version.dart'; import 'package:pikapika/basic/config/VolumeController.dart'; +import 'package:pikapika/basic/config/shadowCategoriesMode.dart'; import 'AccountScreen.dart'; import 'AppScreen.dart'; @@ -58,6 +59,7 @@ class _InitScreenState extends State { await initAutoFullScreen(); await initFullScreenAction(); await initPagerAction(); + await initShadowCategoriesMode(); await initShadowCategories(); await initFullScreenUI(); switchFullScreenUI(); diff --git a/lib/screens/SettingsScreen.dart b/lib/screens/SettingsScreen.dart index ba586fd..138056a 100644 --- a/lib/screens/SettingsScreen.dart +++ b/lib/screens/SettingsScreen.dart @@ -24,6 +24,7 @@ import 'package:pikapika/basic/config/Themes.dart'; import 'package:pikapika/basic/config/TimeOffsetHour.dart'; import 'package:pikapika/basic/config/Version.dart'; import 'package:pikapika/basic/config/VolumeController.dart'; +import 'package:pikapika/basic/config/shadowCategoriesMode.dart'; import 'package:pikapika/screens/components/NetworkSetting.dart'; import 'CleanScreen.dart'; @@ -48,6 +49,7 @@ class SettingsScreen extends StatelessWidget { keyboardControllerSetting(), noAnimationSetting(), Divider(), + shadowCategoriesModeSetting(), shadowCategoriesSetting(), pagerActionSetting(), fullScreenUISetting(), diff --git a/lib/screens/components/ComicList.dart b/lib/screens/components/ComicList.dart index 07c783d..e42eeb3 100644 --- a/lib/screens/components/ComicList.dart +++ b/lib/screens/components/ComicList.dart @@ -6,6 +6,7 @@ import 'package:pikapika/basic/Common.dart'; import 'package:pikapika/basic/Entities.dart'; import 'package:pikapika/basic/config/ShadowCategories.dart'; import 'package:pikapika/basic/config/ListLayout.dart'; +import 'package:pikapika/basic/config/shadowCategoriesMode.dart'; import 'ComicInfoCard.dart'; import 'Images.dart'; @@ -60,9 +61,19 @@ class _ComicListState extends State { physics: const AlwaysScrollableScrollPhysics(), children: [ ...widget.comicList.map((e) { - var shadow = e.categories - .map((e) => shadowCategories.contains(e)) - .reduce((value, element) => value || element); + var shadow = e.categories.map( + (c) { + switch (currentShadowCategoriesMode()) { + case ShadowCategoriesMode.BLACK_LIST: + if (shadowCategories.contains(c)) return true; + break; + case ShadowCategoriesMode.WHITE_LIST: + if (!shadowCategories.contains(c)) return true; + break; + } + return false; + }, + ).reduce((value, element) => value || element); if (shadow) { return InkWell( onTap: () {}, @@ -117,9 +128,19 @@ class _ComicListState extends State { List wraps = []; List tmp = []; widget.comicList.forEach((e) { - var shadow = e.categories - .map((e) => shadowCategories.contains(e)) - .reduce((value, element) => value || element); + var shadow = e.categories.map( + (c) { + switch (currentShadowCategoriesMode()) { + case ShadowCategoriesMode.BLACK_LIST: + if (shadowCategories.contains(c)) return true; + break; + case ShadowCategoriesMode.WHITE_LIST: + if (!shadowCategories.contains(c)) return true; + break; + } + return false; + }, + ).reduce((value, element) => value || element); if (shadow) { tmp.add( Container( @@ -215,9 +236,19 @@ class _ComicListState extends State { List wraps = []; List tmp = []; widget.comicList.forEach((e) { - var shadow = e.categories - .map((e) => shadowCategories.contains(e)) - .reduce((value, element) => value || element); + var shadow = e.categories.map( + (c) { + switch (currentShadowCategoriesMode()) { + case ShadowCategoriesMode.BLACK_LIST: + if (shadowCategories.contains(c)) return true; + break; + case ShadowCategoriesMode.WHITE_LIST: + if (!shadowCategories.contains(c)) return true; + break; + } + return false; + }, + ).reduce((value, element) => value || element); if (shadow) { tmp.add( Container( diff --git a/lib/screens/components/ComicListBuilder.dart b/lib/screens/components/ComicListBuilder.dart index e2f926b..77c0125 100644 --- a/lib/screens/components/ComicListBuilder.dart +++ b/lib/screens/components/ComicListBuilder.dart @@ -1,7 +1,7 @@ import 'package:event/event.dart'; import 'package:flutter/material.dart'; import 'package:pikapika/basic/Entities.dart'; -import 'package:pikapika/basic/config/ShadowCategories.dart'; +import 'package:pikapika/basic/config/ShadowCategoriesEvent.dart'; import 'package:pikapika/screens/components/ComicList.dart'; import 'package:pikapika/screens/components/FitButton.dart'; import 'ContentBuilder.dart'; diff --git a/lib/screens/components/ComicPager.dart b/lib/screens/components/ComicPager.dart index 15ef5fa..e04b0b0 100644 --- a/lib/screens/components/ComicPager.dart +++ b/lib/screens/components/ComicPager.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:pikapika/basic/Entities.dart'; import 'package:pikapika/basic/config/PagerAction.dart'; -import 'package:pikapika/basic/config/ShadowCategories.dart'; +import 'package:pikapika/basic/config/ShadowCategoriesEvent.dart'; import 'package:pikapika/basic/enum/Sort.dart'; import 'package:pikapika/screens/components/ComicList.dart'; import 'package:pikapika/screens/components/ContentError.dart';