diff --git a/changelog/v7.5.3.md b/changelog/v7.5.3.md index 4b572300..8616b575 100644 --- a/changelog/v7.5.3.md +++ b/changelog/v7.5.3.md @@ -2,6 +2,7 @@ - 支持为本地阅读设置预载图片数量 - 下载页支持显示分组下画廊数量 - Sad Panda异常支持直接跳转Wiki +- 优化搜索弹窗category选择 - 修复部分场景下下载图片错误的bug ------------------------------------------------------------------------------------------ @@ -10,4 +11,5 @@ - Support setting the number of preloaded images for local reading - Supports displaying the number of galleries in download group - Lead to Wiki when Sad Panda occurs +- Optimize the category selection of the search dialog - Fix bug that cannot download images in some scenarios \ No newline at end of file diff --git a/lib/src/model/search_config.dart b/lib/src/model/search_config.dart index 879a59f4..6dff107c 100644 --- a/lib/src/model/search_config.dart +++ b/lib/src/model/search_config.dart @@ -75,6 +75,19 @@ class SearchConfig { this.searchFavoriteCategoryIndex, }); + void disableAllCategories() { + includeDoujinshi = false; + includeManga = false; + includeArtistCG = false; + includeGameCg = false; + includeWestern = false; + includeNonH = false; + includeImageSet = false; + includeCosplay = false; + includeAsianPorn = false; + includeMisc = false; + } + /// search path String toPath() { switch (searchType) { diff --git a/lib/src/widget/eh_gallery_category_tag.dart b/lib/src/widget/eh_gallery_category_tag.dart index 0c6452d9..8e4122a1 100644 --- a/lib/src/widget/eh_gallery_category_tag.dart +++ b/lib/src/widget/eh_gallery_category_tag.dart @@ -12,6 +12,8 @@ class EHGalleryCategoryTag extends StatelessWidget { final EdgeInsets padding; final TextStyle textStyle; final VoidCallback? onTap; + final VoidCallback? onLongPress; + final VoidCallback? onSecondaryTap; const EHGalleryCategoryTag({ Key? key, @@ -24,12 +26,16 @@ class EHGalleryCategoryTag extends StatelessWidget { this.padding = const EdgeInsets.only(top: 3, bottom: 4, left: 6, right: 6), this.textStyle = const TextStyle(height: 1, fontSize: 15, color: UIConfig.galleryCategoryTagTextColor), this.onTap, + this.onLongPress, + this.onSecondaryTap, }) : super(key: key); @override Widget build(BuildContext context) { return GestureDetector( onTap: onTap, + onLongPress: onLongPress, + onSecondaryTap: onSecondaryTap, child: Container( alignment: Alignment.center, height: height, diff --git a/lib/src/widget/eh_search_config_dialog.dart b/lib/src/widget/eh_search_config_dialog.dart index 89b4acc0..eb2c5aa3 100644 --- a/lib/src/widget/eh_search_config_dialog.dart +++ b/lib/src/widget/eh_search_config_dialog.dart @@ -323,11 +323,35 @@ class _EHSearchConfigDialogState extends State { category: 'Doujinshi', enabled: searchConfig.includeDoujinshi, onTap: () => setState(() => searchConfig.includeDoujinshi = !searchConfig.includeDoujinshi), + onLongPress: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeDoujinshi = true; + }); + }, + onSecondaryTap: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeDoujinshi = true; + }); + }, ), _buildTag( category: 'Manga', enabled: searchConfig.includeManga, onTap: () => setState(() => searchConfig.includeManga = !searchConfig.includeManga), + onLongPress: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeManga = true; + }); + }, + onSecondaryTap: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeManga = true; + }); + }, ), ], ), @@ -338,11 +362,35 @@ class _EHSearchConfigDialogState extends State { category: 'Image Set', enabled: searchConfig.includeImageSet, onTap: () => setState(() => searchConfig.includeImageSet = !searchConfig.includeImageSet), + onLongPress: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeImageSet = true; + }); + }, + onSecondaryTap: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeImageSet = true; + }); + }, ), _buildTag( category: 'Game CG', enabled: searchConfig.includeGameCg, onTap: () => setState(() => searchConfig.includeGameCg = !searchConfig.includeGameCg), + onLongPress: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeGameCg = true; + }); + }, + onSecondaryTap: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeGameCg = true; + }); + }, ), ], ).marginOnly(top: 4), @@ -353,11 +401,35 @@ class _EHSearchConfigDialogState extends State { category: 'Artist CG', enabled: searchConfig.includeArtistCG, onTap: () => setState(() => searchConfig.includeArtistCG = !searchConfig.includeArtistCG), + onLongPress: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeArtistCG = true; + }); + }, + onSecondaryTap: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeArtistCG = true; + }); + }, ), _buildTag( category: 'Cosplay', enabled: searchConfig.includeCosplay, onTap: () => setState(() => searchConfig.includeCosplay = !searchConfig.includeCosplay), + onLongPress: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeCosplay = true; + }); + }, + onSecondaryTap: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeCosplay = true; + }); + }, ), ], ).marginOnly(top: 4), @@ -368,11 +440,35 @@ class _EHSearchConfigDialogState extends State { category: 'Non-H', enabled: searchConfig.includeNonH, onTap: () => setState(() => searchConfig.includeNonH = !searchConfig.includeNonH), + onLongPress: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeNonH = true; + }); + }, + onSecondaryTap: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeNonH = true; + }); + }, ), _buildTag( category: 'Asian Porn', enabled: searchConfig.includeAsianPorn, onTap: () => setState(() => searchConfig.includeAsianPorn = !searchConfig.includeAsianPorn), + onLongPress: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeAsianPorn = true; + }); + }, + onSecondaryTap: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeAsianPorn = true; + }); + }, ), ], ).marginOnly(top: 4), @@ -383,11 +479,35 @@ class _EHSearchConfigDialogState extends State { category: 'Western', enabled: searchConfig.includeWestern, onTap: () => setState(() => searchConfig.includeWestern = !searchConfig.includeWestern), + onLongPress: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeWestern = true; + }); + }, + onSecondaryTap: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeWestern = true; + }); + }, ), _buildTag( category: 'Misc', enabled: searchConfig.includeMisc, onTap: () => setState(() => searchConfig.includeMisc = !searchConfig.includeMisc), + onLongPress: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeMisc = true; + }); + }, + onSecondaryTap: () { + setState(() { + searchConfig.disableAllCategories(); + searchConfig.includeMisc = true; + }); + }, ), ], ).marginOnly(top: 4), @@ -562,7 +682,14 @@ class _EHSearchConfigDialogState extends State { ); } - Widget _buildTag({required String category, required bool enabled, Color? color, VoidCallback? onTap}) { + Widget _buildTag({ + required String category, + required bool enabled, + Color? color, + VoidCallback? onTap, + VoidCallback? onLongPress, + VoidCallback? onSecondaryTap, + }) { return EHGalleryCategoryTag( category: category, width: 115, @@ -571,6 +698,8 @@ class _EHSearchConfigDialogState extends State { color: color, textStyle: const TextStyle(height: 1, fontSize: 16, color: UIConfig.galleryCategoryTagTextColor), onTap: onTap, + onLongPress: onLongPress, + onSecondaryTap: onSecondaryTap, ); }