block comics

This commit is contained in:
nyne
2024-10-28 09:47:40 +08:00
parent 467dacdf79
commit 8b04584aa1
4 changed files with 119 additions and 36 deletions

View File

@@ -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": "閱讀後移動收藏"
}
}

View File

@@ -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) {
State<SliverGridComics> createState() => _SliverGridComicsState();
}
class _SliverGridComicsState extends State<SliverGridComics> {
List<Comic> comics = [];
for (var comic in this.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);
}
}
});
}
@override
Widget build(BuildContext context) {
return _SliverGridComics(
comics: comics,
onLastItemBuild: onLastItemBuild,
badgeBuilder: badgeBuilder,
menuBuilder: menuBuilder,
onTap: onTap,
);
},
onLastItemBuild: widget.onLastItemBuild,
badgeBuilder: widget.badgeBuilder,
menuBuilder: widget.menuBuilder,
onTap: widget.onTap,
);
}
}

View File

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

View File

@@ -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",