NoAnimation and ShadowMode

This commit is contained in:
niuhuan 2021-11-24 21:22:22 +08:00
parent aa9a9e91da
commit f3905d44c3
11 changed files with 189 additions and 16 deletions

View File

@ -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<void> _chooseNoAnimation(BuildContext context) async {
String? result =
await chooseListDialog<String>(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(() {});
},
);
},
);
}

View File

@ -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<String> shadowCategories;
var shadowCategoriesEvent = Event<EventArgs>();
///
Future<List<String>> _loadShadowCategories() async {
var value = await method.loadProperty(_propertyName, jsonEncode(<String>[]));

View File

@ -0,0 +1,4 @@
import 'package:event/event.dart';
var shadowCategoriesEvent = Event<EventArgs>();

View File

@ -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<String, ShadowCategoriesMode> _fullScreenActionMap = {
"黑名单": ShadowCategoriesMode.BLACK_LIST,
"白名单": ShadowCategoriesMode.WHITE_LIST,
};
const _propertyName = "shadowCategoriesMode";
late ShadowCategoriesMode _shadowCategoriesMode;
Future<void> 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<void> _chooseShadowCategoriesMode(BuildContext context) async {
ShadowCategoriesMode? result = await chooseMapDialog<ShadowCategoriesMode>(
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(() {});
},
);
},
);
}

View File

@ -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<CategoriesScreen> {
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,

View File

@ -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<ComicsScreen> {
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) {

View File

@ -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<InitScreen> {
await initAutoFullScreen();
await initFullScreenAction();
await initPagerAction();
await initShadowCategoriesMode();
await initShadowCategories();
await initFullScreenUI();
switchFullScreenUI();

View File

@ -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(),

View File

@ -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<ComicList> {
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<ComicList> {
List<Widget> wraps = [];
List<Widget> 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<ComicList> {
List<Widget> wraps = [];
List<Widget> 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(

View File

@ -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';

View File

@ -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';