diff --git a/assets/translation.json b/assets/translation.json index 207364f..782c9b2 100644 --- a/assets/translation.json +++ b/assets/translation.json @@ -261,7 +261,10 @@ "Enable DNS Overrides": "启用DNS覆写", "DNS Overrides": "DNS覆写", "Custom Image Processing": "自定义图片处理", - "Enable": "启用" + "Enable": "启用", + "Aggregated": "聚合", + "Default Search Target": "默认搜索目标", + "Auto Language Filters": "自动语言筛选" }, "zh_TW": { "Home": "首頁", @@ -525,6 +528,9 @@ "Enable DNS Overrides": "啟用DNS覆寫", "DNS Overrides": "DNS覆寫", "Custom Image Processing": "自定義圖片處理", - "Enable": "啟用" + "Enable": "啟用", + "Aggregated": "聚合", + "Default Search Target": "默認搜索目標", + "Auto Language Filters": "自動語言篩選" } } \ No newline at end of file diff --git a/lib/foundation/appdata.dart b/lib/foundation/appdata.dart index acb5468..bc4a4c3 100644 --- a/lib/foundation/appdata.dart +++ b/lib/foundation/appdata.dart @@ -150,6 +150,7 @@ class _Settings with ChangeNotifier { 'enableCustomImageProcessing': false, 'customImageProcessing': _defaultCustomImageProcessing, 'sni': true, + 'autoAddLanguageFilter': 'none', // none, chinese, english, japanese }; operator [](String key) { diff --git a/lib/pages/search_page.dart b/lib/pages/search_page.dart index 44bf020..bcaeb5b 100644 --- a/lib/pages/search_page.dart +++ b/lib/pages/search_page.dart @@ -139,7 +139,9 @@ class _SearchPageState extends State { @override void initState() { var defaultSearchTarget = appdata.settings['defaultSearchTarget']; - if (defaultSearchTarget != null && + if (defaultSearchTarget == "_aggregated_") { + aggregatedSearch = true; + } else if (defaultSearchTarget != null && ComicSource.find(defaultSearchTarget) != null) { searchTarget = defaultSearchTarget; } else { diff --git a/lib/pages/search_result_page.dart b/lib/pages/search_result_page.dart index 9543c0b..b5beac7 100644 --- a/lib/pages/search_result_page.dart +++ b/lib/pages/search_result_page.dart @@ -45,8 +45,9 @@ class _SearchResultPageState extends State { if (suggestionsController.entry != null) { suggestionsController.remove(); } + text = checkAutoLanguage(text); setState(() { - this.text = text; + this.text = text!; }); appdata.addSearchHistory(text); controller.currentText = text; @@ -92,13 +93,33 @@ class _SearchResultPageState extends State { super.dispose(); } + String checkAutoLanguage(String text) { + var setting = appdata.settings["autoAddLanguageFilter"] ?? 'none'; + if (setting == 'none') { + return text; + } + var searchSource = sourceKey; + // TODO: Move it to a better place + const enabledSources = [ + 'nhentai', + 'ehentai', + ]; + if (!enabledSources.contains(searchSource)) { + return text; + } + if (!text.contains('language:')) { + return '$text language:$setting'; + } + return text; + } + @override void initState() { + sourceKey = widget.sourceKey; controller = SearchBarController( - currentText: widget.text, + currentText: checkAutoLanguage(widget.text), onSearch: search, ); - sourceKey = widget.sourceKey; options = widget.options ?? const []; validateOptions(); text = widget.text; @@ -162,6 +183,12 @@ class _SearchResultPageState extends State { child: IconButton( icon: const Icon(Icons.tune), onPressed: () async { + if (suggestionOverlay != null) { + suggestionsController.remove(); + } + + var previousOptions = options; + var previousSourceKey = sourceKey; await showDialog( context: context, useRootNavigator: true, @@ -169,7 +196,11 @@ class _SearchResultPageState extends State { return _SearchSettingsDialog(state: this); }, ); - setState(() {}); + if (previousOptions != options || previousSourceKey != sourceKey) { + text = checkAutoLanguage(controller.text); + controller.currentText = text; + setState(() {}); + } }, ), ); diff --git a/lib/pages/settings/explore_settings.dart b/lib/pages/settings/explore_settings.dart index 8670927..459678b 100644 --- a/lib/pages/settings/explore_settings.dart +++ b/lib/pages/settings/explore_settings.dart @@ -88,6 +88,30 @@ class _ExploreSettingsState extends State { title: "Keyword blocking".tl, builder: () => const _ManageBlockingWordView(), ).toSliver(), + SelectSetting( + title: "Default Search Target".tl, + settingKey: "defaultSearchTarget", + optionTranslation: { + '_aggregated_': "Aggregated".tl, + ...((){ + var map = {}; + for (var c in ComicSource.all()) { + map[c.key] = c.name; + } + return map; + }()), + }, + ).toSliver(), + SelectSetting( + title: "Auto Language Filters".tl, + settingKey: "autoAddLanguageFilter", + optionTranslation: { + 'none': "None".tl, + 'chinese': "Chinese", + 'english': "English", + 'japanese': "Japanese", + }, + ).toSliver(), ], ); } @@ -150,7 +174,7 @@ class _ManageBlockingWordViewState extends State<_ManageBlockingWordView> { errorText: error, ), onChanged: (s) { - if(error != null){ + if (error != null) { setState(() { error = null; }); @@ -160,7 +184,8 @@ class _ManageBlockingWordViewState extends State<_ManageBlockingWordView> { actions: [ Button.filled( onPressed: () { - if(appdata.settings["blockedWords"].contains(controller.text)){ + if (appdata.settings["blockedWords"] + .contains(controller.text)) { setState(() { error = "Keyword already exists".tl; });