NoAnimation and ShadowMode
This commit is contained in:
parent
aa9a9e91da
commit
f3905d44c3
|
@ -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(() {});
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
|
@ -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>[]));
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
import 'package:event/event.dart';
|
||||
|
||||
var shadowCategoriesEvent = Event<EventArgs>();
|
|
@ -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(() {});
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
|
@ -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;
|
||||
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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
Loading…
Reference in New Issue