mirror of
https://github.com/venera-app/venera.git
synced 2025-09-27 07:47:24 +00:00
block comics
This commit is contained in:
@@ -57,7 +57,7 @@
|
||||
"Password": "密码",
|
||||
"Continue": "继续",
|
||||
"Create Account": "创建账户",
|
||||
"Next": "下一步",
|
||||
"Next": "前进",
|
||||
"Login with webview": "通过网页登录",
|
||||
"Read": "阅读",
|
||||
"Download": "下载",
|
||||
@@ -122,7 +122,11 @@
|
||||
"Proxy": "代理",
|
||||
"Venera is a free and open-source app for comic reading.": "Venera是一个免费的开源漫画阅读应用。",
|
||||
"Check for updates": "检查更新",
|
||||
"Check": "检查"
|
||||
"Check": "检查",
|
||||
"Network Favorite Pages": "网络收藏页面",
|
||||
"Block": "屏蔽",
|
||||
"Add new favorite to": "添加新收藏到",
|
||||
"Move favorite after reading": "阅读后移动收藏"
|
||||
},
|
||||
"zh_TW": {
|
||||
"Home": "首頁",
|
||||
@@ -182,7 +186,7 @@
|
||||
"Password": "密碼",
|
||||
"Continue": "繼續",
|
||||
"Create Account": "創建帳戶",
|
||||
"Next": "下一步",
|
||||
"Next": "前進",
|
||||
"Login with webview": "通過網頁登錄",
|
||||
"Read": "閱讀",
|
||||
"Download": "下載",
|
||||
@@ -247,6 +251,10 @@
|
||||
"Proxy": "代理",
|
||||
"Venera is a free and open-source app for comic reading.": "Venera是一個免費的開源漫畫閱讀應用。",
|
||||
"Check for updates": "檢查更新",
|
||||
"Check": "檢查"
|
||||
"Check": "檢查",
|
||||
"Network Favorite Pages": "網路收藏頁面",
|
||||
"Block": "屏蔽",
|
||||
"Add new favorite to": "添加新收藏到",
|
||||
"Move favorite after reading": "閱讀後移動收藏"
|
||||
}
|
||||
}
|
@@ -35,14 +35,14 @@ class ComicTile extends StatelessWidget {
|
||||
var location = renderBox.localToGlobal(
|
||||
Offset(size.width / 2, size.height / 2),
|
||||
);
|
||||
showMenu(location);
|
||||
showMenu(location, context);
|
||||
}
|
||||
|
||||
void onSecondaryTap(TapDownDetails details) {
|
||||
showMenu(details.globalPosition);
|
||||
void onSecondaryTap(TapDownDetails details, BuildContext context) {
|
||||
showMenu(details.globalPosition, context);
|
||||
}
|
||||
|
||||
void showMenu(Offset location) {
|
||||
void showMenu(Offset location, BuildContext context) {
|
||||
showMenuX(
|
||||
App.rootContext,
|
||||
location,
|
||||
@@ -70,6 +70,11 @@ class ComicTile extends StatelessWidget {
|
||||
addFavorite(comic);
|
||||
},
|
||||
),
|
||||
MenuEntry(
|
||||
icon: Icons.block,
|
||||
text: 'Block'.tl,
|
||||
onClick: () => block(context),
|
||||
),
|
||||
...?menuOptions,
|
||||
],
|
||||
);
|
||||
@@ -172,7 +177,7 @@ class ComicTile extends StatelessWidget {
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
onTap: _onTap,
|
||||
onLongPress: enableLongPressed ? () => onLongPress(context) : null,
|
||||
onSecondaryTapDown: onSecondaryTap,
|
||||
onSecondaryTapDown: (detail) => onSecondaryTap(detail, context),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.fromLTRB(16, 8, 24, 8),
|
||||
child: Row(
|
||||
@@ -272,7 +277,7 @@ class ComicTile extends StatelessWidget {
|
||||
onTap: _onTap,
|
||||
onLongPress:
|
||||
enableLongPressed ? () => onLongPress(context) : null,
|
||||
onSecondaryTapDown: onSecondaryTap,
|
||||
onSecondaryTapDown: (detail) => onSecondaryTap(detail, context),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
child: const SizedBox.expand(),
|
||||
),
|
||||
@@ -283,6 +288,61 @@ class ComicTile extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void block(BuildContext comicTileContext) {
|
||||
showDialog(
|
||||
context: App.rootContext,
|
||||
builder: (context) {
|
||||
var words = <String>[];
|
||||
var all = <String>[];
|
||||
all.addAll(comic.title.split(' ').where((element) => element != ''));
|
||||
if(comic.subtitle != null && comic.subtitle != "") {
|
||||
all.add(comic.subtitle!);
|
||||
}
|
||||
all.addAll(comic.tags ?? []);
|
||||
return StatefulBuilder(builder: (context, setState) {
|
||||
return ContentDialog(
|
||||
title: 'Block'.tl,
|
||||
content: Wrap(
|
||||
runSpacing: 8,
|
||||
spacing: 8,
|
||||
children: [
|
||||
for (var word in all)
|
||||
OptionChip(
|
||||
text: word,
|
||||
isSelected: words.contains(word),
|
||||
onTap: () {
|
||||
setState(() {
|
||||
if (!words.contains(word)) {
|
||||
words.add(word);
|
||||
} else {
|
||||
words.remove(word);
|
||||
}
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
).paddingHorizontal(16),
|
||||
actions: [
|
||||
Button.filled(
|
||||
onPressed: () {
|
||||
context.pop();
|
||||
for (var word in words) {
|
||||
appdata.settings['blockedWords'].add(word);
|
||||
}
|
||||
appdata.saveData();
|
||||
context.showMessage(message: 'Blocked'.tl);
|
||||
comicTileContext.findAncestorStateOfType<_SliverGridComicsState>()!
|
||||
.update();
|
||||
},
|
||||
child: Text('Block'.tl),
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _ComicDescription extends StatelessWidget {
|
||||
@@ -480,9 +540,7 @@ class _ReadingHistoryPainter extends CustomPainter {
|
||||
}
|
||||
}
|
||||
|
||||
class SliverGridComicsController extends StateController {}
|
||||
|
||||
class SliverGridComics extends StatelessWidget {
|
||||
class SliverGridComics extends StatefulWidget {
|
||||
const SliverGridComics({
|
||||
super.key,
|
||||
required this.comics,
|
||||
@@ -503,24 +561,41 @@ class SliverGridComics extends StatelessWidget {
|
||||
final void Function(Comic)? onTap;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return StateBuilder<SliverGridComicsController>(
|
||||
init: SliverGridComicsController(),
|
||||
builder: (controller) {
|
||||
List<Comic> comics = [];
|
||||
for (var comic in this.comics) {
|
||||
if (isBlocked(comic) == null) {
|
||||
comics.add(comic);
|
||||
}
|
||||
State<SliverGridComics> createState() => _SliverGridComicsState();
|
||||
}
|
||||
|
||||
class _SliverGridComicsState extends State<SliverGridComics> {
|
||||
List<Comic> comics = [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
for (var comic in widget.comics) {
|
||||
if (isBlocked(comic) == null) {
|
||||
comics.add(comic);
|
||||
}
|
||||
}
|
||||
super.initState();
|
||||
}
|
||||
|
||||
void update() {
|
||||
setState(() {
|
||||
comics.clear();
|
||||
for (var comic in widget.comics) {
|
||||
if (isBlocked(comic) == null) {
|
||||
comics.add(comic);
|
||||
}
|
||||
return _SliverGridComics(
|
||||
comics: comics,
|
||||
onLastItemBuild: onLastItemBuild,
|
||||
badgeBuilder: badgeBuilder,
|
||||
menuBuilder: menuBuilder,
|
||||
onTap: onTap,
|
||||
);
|
||||
},
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return _SliverGridComics(
|
||||
comics: comics,
|
||||
onLastItemBuild: widget.onLastItemBuild,
|
||||
badgeBuilder: widget.badgeBuilder,
|
||||
menuBuilder: widget.menuBuilder,
|
||||
onTap: widget.onTap,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -61,7 +61,7 @@ class _ExploreSettingsState extends State<ExploreSettings> {
|
||||
},
|
||||
).toSliver(),
|
||||
_PopupWindowSetting(
|
||||
title: "Explore Pages".tl,
|
||||
title: "Network Favorite Pages".tl,
|
||||
builder: () {
|
||||
var pages = <String, String>{};
|
||||
for (var c in ComicSource.all()) {
|
||||
|
@@ -13,16 +13,16 @@ class _LocalFavoritesSettingsState extends State<LocalFavoritesSettings> {
|
||||
return SmoothCustomScrollView(
|
||||
slivers: [
|
||||
SliverAppbar(title: Text("Local Favorites".tl)),
|
||||
const SelectSetting(
|
||||
title: "Add new favorite to",
|
||||
SelectSetting(
|
||||
title: "Add new favorite to".tl,
|
||||
settingKey: "newFavoriteAddTo",
|
||||
optionTranslation: {
|
||||
optionTranslation: const {
|
||||
"start": "Start",
|
||||
"end": "End",
|
||||
},
|
||||
).toSliver(),
|
||||
const SelectSetting(
|
||||
title: "Move favorite after read",
|
||||
SelectSetting(
|
||||
title: "Move favorite after reading".tl,
|
||||
settingKey: "moveFavoriteAfterRead",
|
||||
optionTranslation: {
|
||||
"none": "None",
|
||||
|
Reference in New Issue
Block a user