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 'dart:convert';
|
||||||
|
|
||||||
import 'package:event/event.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:multi_select_flutter/dialog/mult_select_dialog.dart';
|
import 'package:multi_select_flutter/dialog/mult_select_dialog.dart';
|
||||||
import 'package:multi_select_flutter/multi_select_flutter.dart';
|
import 'package:multi_select_flutter/multi_select_flutter.dart';
|
||||||
|
|
||||||
import '../Method.dart';
|
import '../Method.dart';
|
||||||
import '../store/Categories.dart';
|
import '../store/Categories.dart';
|
||||||
|
import 'ShadowCategoriesEvent.dart';
|
||||||
|
|
||||||
const _propertyName = "shadowCategories";
|
const _propertyName = "shadowCategories";
|
||||||
late List<String> shadowCategories;
|
late List<String> shadowCategories;
|
||||||
|
|
||||||
var shadowCategoriesEvent = Event<EventArgs>();
|
|
||||||
|
|
||||||
/// 获取封印的类型
|
/// 获取封印的类型
|
||||||
Future<List<String>> _loadShadowCategories() async {
|
Future<List<String>> _loadShadowCategories() async {
|
||||||
var value = await method.loadProperty(_propertyName, jsonEncode(<String>[]));
|
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/material.dart';
|
||||||
import 'package:flutter_search_bar/flutter_search_bar.dart';
|
import 'package:flutter_search_bar/flutter_search_bar.dart';
|
||||||
import 'package:pikapika/basic/Entities.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/store/Categories.dart';
|
||||||
import 'package:pikapika/basic/config/ShadowCategories.dart';
|
import 'package:pikapika/basic/config/ShadowCategories.dart';
|
||||||
import 'package:pikapika/screens/RankingsScreen.dart';
|
import 'package:pikapika/screens/RankingsScreen.dart';
|
||||||
|
@ -183,7 +185,14 @@ class _CategoriesScreenState extends State<CategoriesScreen> {
|
||||||
for (var i = 0; i < cList.length; i++) {
|
for (var i = 0; i < cList.length; i++) {
|
||||||
var c = cList[i];
|
var c = cList[i];
|
||||||
if (c.isWeb) continue;
|
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(
|
append(
|
||||||
RemoteImage(
|
RemoteImage(
|
||||||
fileServer: c.thumb.fileServer,
|
fileServer: c.thumb.fileServer,
|
||||||
|
|
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_search_bar/flutter_search_bar.dart';
|
import 'package:flutter_search_bar/flutter_search_bar.dart';
|
||||||
import 'package:pikapika/basic/Common.dart';
|
import 'package:pikapika/basic/Common.dart';
|
||||||
import 'package:pikapika/basic/config/ShadowCategories.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/store/Categories.dart';
|
||||||
import 'package:pikapika/basic/config/ListLayout.dart';
|
import 'package:pikapika/basic/config/ListLayout.dart';
|
||||||
import 'package:pikapika/basic/Method.dart';
|
import 'package:pikapika/basic/Method.dart';
|
||||||
|
@ -65,7 +66,17 @@ class _ComicsScreenState extends State<ComicsScreen> {
|
||||||
categoryTitle(null),
|
categoryTitle(null),
|
||||||
...filteredList(
|
...filteredList(
|
||||||
storedCategories,
|
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) {
|
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/TimeOffsetHour.dart';
|
||||||
import 'package:pikapika/basic/config/Version.dart';
|
import 'package:pikapika/basic/config/Version.dart';
|
||||||
import 'package:pikapika/basic/config/VolumeController.dart';
|
import 'package:pikapika/basic/config/VolumeController.dart';
|
||||||
|
import 'package:pikapika/basic/config/shadowCategoriesMode.dart';
|
||||||
|
|
||||||
import 'AccountScreen.dart';
|
import 'AccountScreen.dart';
|
||||||
import 'AppScreen.dart';
|
import 'AppScreen.dart';
|
||||||
|
@ -58,6 +59,7 @@ class _InitScreenState extends State<InitScreen> {
|
||||||
await initAutoFullScreen();
|
await initAutoFullScreen();
|
||||||
await initFullScreenAction();
|
await initFullScreenAction();
|
||||||
await initPagerAction();
|
await initPagerAction();
|
||||||
|
await initShadowCategoriesMode();
|
||||||
await initShadowCategories();
|
await initShadowCategories();
|
||||||
await initFullScreenUI();
|
await initFullScreenUI();
|
||||||
switchFullScreenUI();
|
switchFullScreenUI();
|
||||||
|
|
|
@ -24,6 +24,7 @@ import 'package:pikapika/basic/config/Themes.dart';
|
||||||
import 'package:pikapika/basic/config/TimeOffsetHour.dart';
|
import 'package:pikapika/basic/config/TimeOffsetHour.dart';
|
||||||
import 'package:pikapika/basic/config/Version.dart';
|
import 'package:pikapika/basic/config/Version.dart';
|
||||||
import 'package:pikapika/basic/config/VolumeController.dart';
|
import 'package:pikapika/basic/config/VolumeController.dart';
|
||||||
|
import 'package:pikapika/basic/config/shadowCategoriesMode.dart';
|
||||||
import 'package:pikapika/screens/components/NetworkSetting.dart';
|
import 'package:pikapika/screens/components/NetworkSetting.dart';
|
||||||
|
|
||||||
import 'CleanScreen.dart';
|
import 'CleanScreen.dart';
|
||||||
|
@ -48,6 +49,7 @@ class SettingsScreen extends StatelessWidget {
|
||||||
keyboardControllerSetting(),
|
keyboardControllerSetting(),
|
||||||
noAnimationSetting(),
|
noAnimationSetting(),
|
||||||
Divider(),
|
Divider(),
|
||||||
|
shadowCategoriesModeSetting(),
|
||||||
shadowCategoriesSetting(),
|
shadowCategoriesSetting(),
|
||||||
pagerActionSetting(),
|
pagerActionSetting(),
|
||||||
fullScreenUISetting(),
|
fullScreenUISetting(),
|
||||||
|
|
|
@ -6,6 +6,7 @@ import 'package:pikapika/basic/Common.dart';
|
||||||
import 'package:pikapika/basic/Entities.dart';
|
import 'package:pikapika/basic/Entities.dart';
|
||||||
import 'package:pikapika/basic/config/ShadowCategories.dart';
|
import 'package:pikapika/basic/config/ShadowCategories.dart';
|
||||||
import 'package:pikapika/basic/config/ListLayout.dart';
|
import 'package:pikapika/basic/config/ListLayout.dart';
|
||||||
|
import 'package:pikapika/basic/config/shadowCategoriesMode.dart';
|
||||||
|
|
||||||
import 'ComicInfoCard.dart';
|
import 'ComicInfoCard.dart';
|
||||||
import 'Images.dart';
|
import 'Images.dart';
|
||||||
|
@ -60,9 +61,19 @@ class _ComicListState extends State<ComicList> {
|
||||||
physics: const AlwaysScrollableScrollPhysics(),
|
physics: const AlwaysScrollableScrollPhysics(),
|
||||||
children: [
|
children: [
|
||||||
...widget.comicList.map((e) {
|
...widget.comicList.map((e) {
|
||||||
var shadow = e.categories
|
var shadow = e.categories.map(
|
||||||
.map((e) => shadowCategories.contains(e))
|
(c) {
|
||||||
.reduce((value, element) => value || element);
|
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) {
|
if (shadow) {
|
||||||
return InkWell(
|
return InkWell(
|
||||||
onTap: () {},
|
onTap: () {},
|
||||||
|
@ -117,9 +128,19 @@ class _ComicListState extends State<ComicList> {
|
||||||
List<Widget> wraps = [];
|
List<Widget> wraps = [];
|
||||||
List<Widget> tmp = [];
|
List<Widget> tmp = [];
|
||||||
widget.comicList.forEach((e) {
|
widget.comicList.forEach((e) {
|
||||||
var shadow = e.categories
|
var shadow = e.categories.map(
|
||||||
.map((e) => shadowCategories.contains(e))
|
(c) {
|
||||||
.reduce((value, element) => value || element);
|
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) {
|
if (shadow) {
|
||||||
tmp.add(
|
tmp.add(
|
||||||
Container(
|
Container(
|
||||||
|
@ -215,9 +236,19 @@ class _ComicListState extends State<ComicList> {
|
||||||
List<Widget> wraps = [];
|
List<Widget> wraps = [];
|
||||||
List<Widget> tmp = [];
|
List<Widget> tmp = [];
|
||||||
widget.comicList.forEach((e) {
|
widget.comicList.forEach((e) {
|
||||||
var shadow = e.categories
|
var shadow = e.categories.map(
|
||||||
.map((e) => shadowCategories.contains(e))
|
(c) {
|
||||||
.reduce((value, element) => value || element);
|
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) {
|
if (shadow) {
|
||||||
tmp.add(
|
tmp.add(
|
||||||
Container(
|
Container(
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:event/event.dart';
|
import 'package:event/event.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:pikapika/basic/Entities.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/ComicList.dart';
|
||||||
import 'package:pikapika/screens/components/FitButton.dart';
|
import 'package:pikapika/screens/components/FitButton.dart';
|
||||||
import 'ContentBuilder.dart';
|
import 'ContentBuilder.dart';
|
||||||
|
|
|
@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:pikapika/basic/Entities.dart';
|
import 'package:pikapika/basic/Entities.dart';
|
||||||
import 'package:pikapika/basic/config/PagerAction.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/basic/enum/Sort.dart';
|
||||||
import 'package:pikapika/screens/components/ComicList.dart';
|
import 'package:pikapika/screens/components/ComicList.dart';
|
||||||
import 'package:pikapika/screens/components/ContentError.dart';
|
import 'package:pikapika/screens/components/ContentError.dart';
|
||||||
|
|
Loading…
Reference in New Issue