From fc3b9d73ec613424044740b1178729494cb02492 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:44:00 +0800 Subject: [PATCH] Add language filter for search (#428) * Add language filter for search * Refine * Refine --- .../kotlin/com/hippo/ehviewer/Settings.kt | 1 + .../hippo/ehviewer/client/data/GalleryInfo.kt | 2 +- .../ehviewer/client/data/ListUrlBuilder.kt | 22 ++++------ .../ehviewer/ui/screen/DownloadsScreen.kt | 2 +- .../ehviewer/ui/screen/GalleryListScreen.kt | 11 ++--- .../ehviewer/ui/screen/SearchBarScreen.kt | 43 +++++++++++++++++++ .../com/hippo/ehviewer/ui/tools/Dialog.kt | 6 ++- app/src/main/res/values-nb-rNO/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/arrays.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 12 files changed, 69 insertions(+), 28 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt index ea22574c3..cf0e2c946 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt @@ -105,6 +105,7 @@ object Settings : DataStorePreferences(null) { val detailSize = intPref("detail_size_2", 0) val thumbColumns = intPref("thumb_columns", 3) val listThumbSize = intPref("list_tile_size", 40) + val languageFilter = intPref("language_filter", -1) val meteredNetworkWarning = boolPref("cellular_network_warning", false) val predictiveNavAnim = boolPref("predictive_nav_anim", true) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/data/GalleryInfo.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/data/GalleryInfo.kt index e0ca060a9..6b8acf2ab 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/data/GalleryInfo.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/data/GalleryInfo.kt @@ -93,7 +93,7 @@ interface GalleryInfo { Pattern.compile("[(\\[]hun(?:garian)?[)\\]]|ハンガリー翻訳", Pattern.CASE_INSENSITIVE), Pattern.compile("[(\\[]dutch[)\\]]|オランダ翻訳", Pattern.CASE_INSENSITIVE), ) - private val S_LANG_TAGS = arrayOf( + val S_LANG_TAGS = arrayOf( "language:english", "language:chinese", "language:spanish", diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/data/ListUrlBuilder.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/data/ListUrlBuilder.kt index 98ac103ef..5885117f5 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/data/ListUrlBuilder.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/data/ListUrlBuilder.kt @@ -17,6 +17,7 @@ package com.hippo.ehviewer.client.data import android.os.Parcelable import androidx.annotation.IntDef +import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.addQueryParameterIfNotBlank @@ -258,24 +259,17 @@ data class ListUrlBuilder( if (category != EhUtils.NONE) { addEncodedQueryParameter("f_cats", (category.inv() and EhUtils.ALL_CATEGORY).toString()) } + val query = mKeyword?.let { + val index = Settings.languageFilter.value + GalleryInfo.S_LANG_TAGS.getOrNull(index)?.let { lang -> + "$it $lang" + } ?: it + } + addQueryParameterIfNotBlank("f_search", query) addQueryParameterIfNotBlank("f_shash", hash) addQueryParameterIfNotBlank("prev", mPrev) addQueryParameterIfNotBlank("next", mNext) addQueryParameterIfNotBlank("seek", mJumpTo) - // Search key - // the settings of ub:UrlBuilder may be overwritten by following Advance search - mKeyword?.split('|')?.forEachIndexed { idx, kwd -> - val keyword = kwd.trim { it <= ' ' } - when (idx) { - 0 -> addQueryParameterIfNotBlank("f_search", keyword) - - else -> keyword.indexOf(':').takeIf { it >= 0 }?.run { - val key = keyword.substring(0, this).trim { it <= ' ' } - val value = keyword.substring(this + 1).trim { it <= ' ' } - addQueryParameterIfNotBlank(key, value) - } - } - } // Advance search if (advanceSearch != -1) { addQueryParameter("advsearch", "1") diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt index 7bd0da12e..e0b3e5503 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt @@ -327,7 +327,7 @@ fun DownloadsScreen(navigator: DestinationsNavigator) { onClick = { expanded = false coroutineScope.launch { - filterType = dialogState.showSingleChoice(states, filterType + 1) - 1 + filterType = dialogState.showSingleChoice(*states, selected = filterType + 1) - 1 } }, ) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt index 5f633d405..72f8fc5ea 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt @@ -541,6 +541,7 @@ fun GalleryListScreen(lub: ListUrlBuilder, navigator: DestinationsNavigator) { title = suitableTitle, searchFieldState = searchFieldState, searchFieldHint = searchBarHint, + showLanguageFilter = true, showSearchFab = showSearchLayout, onApplySearch = { query -> val builder = ListUrlBuilder() @@ -552,11 +553,11 @@ fun GalleryListScreen(lub: ListUrlBuilder, navigator: DestinationsNavigator) { builder.keyword = query } else { if (searchNormalMode) { - when (searchMethod) { - 1 -> builder.mode = MODE_NORMAL - 2 -> builder.mode = MODE_SUBSCRIPTION - 3 -> builder.mode = MODE_UPLOADER - 4 -> builder.mode = MODE_TAG + builder.mode = when (searchMethod) { + 2 -> MODE_SUBSCRIPTION + 3 -> MODE_UPLOADER + 4 -> MODE_TAG + else -> MODE_NORMAL } builder.keyword = query builder.category = category diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt index c011ce901..3feb60422 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt @@ -29,8 +29,11 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.automirrored.filled.MenuBook import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.FilterAlt import androidx.compose.material.icons.filled.Menu import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.outlined.FilterAlt +import androidx.compose.material3.FilterChip import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -64,12 +67,15 @@ import androidx.compose.ui.util.lerp import com.hippo.ehviewer.EhApplication.Companion.searchDatabase import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings +import com.hippo.ehviewer.asMutableState import com.hippo.ehviewer.client.EhTagDatabase +import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.dao.Search import com.hippo.ehviewer.dao.SearchDao import com.hippo.ehviewer.ui.LocalNavDrawerState import com.hippo.ehviewer.ui.LockDrawer import com.hippo.ehviewer.ui.main.FAB_ANIMATE_TIME +import com.hippo.ehviewer.ui.tools.IconFix import com.hippo.ehviewer.ui.tools.LocalDialogState import com.jamal.composeprefs3.ui.ifNotNullThen import com.jamal.composeprefs3.ui.ifTrueThen @@ -101,6 +107,7 @@ fun SearchBarScreen( title: String? = null, searchFieldState: TextFieldState, searchFieldHint: String? = null, + showLanguageFilter: Boolean = false, showSearchFab: Boolean = false, onApplySearch: suspend (String) -> Unit, onSearchExpanded: () -> Unit, @@ -314,6 +321,42 @@ fun SearchBarScreen( } }, ) { + if (showLanguageFilter) { + var languageFilter by Settings.languageFilter.asMutableState() + val languages = remember { + GalleryInfo.S_LANG_TAGS.map { tag -> + tag.substringAfter(':').let { + if (EhTagDatabase.initialized && EhTagDatabase.isTranslatable(context)) { + EhTagDatabase.getTranslation("l", it) ?: it + } else { + it + } + } + }.toTypedArray() + } + Row(modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)) { + val any = stringResource(id = R.string.any) + val languageStr = stringResource(id = R.string.key_language) + FilterChip( + selected = languageFilter != -1, + onClick = { + scope.launch { + languageFilter = + dialogState.showSingleChoice(any, *languages, selected = languageFilter + 1) - 1 + } + }, + label = { + Text(text = if (languageFilter == -1) languageStr else languages[languageFilter]) + }, + trailingIcon = { + IconFix( + imageVector = if (languageFilter == -1) Icons.Outlined.FilterAlt else Icons.Default.FilterAlt, + contentDescription = null, + ) + }, + ) + } + } LazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = WindowInsets.navigationBars.union(WindowInsets.ime).asPaddingValues(), diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt index 68108a2ef..030411577 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt @@ -18,8 +18,10 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Info @@ -389,10 +391,10 @@ class DialogState { } suspend fun showSingleChoice( - items: Array, + vararg items: String, selected: Int, ): Int = showNoButton { - Column(modifier = Modifier.padding(vertical = 8.dp)) { + Column(modifier = Modifier.verticalScroll(rememberScrollState()).padding(vertical = 8.dp)) { items.forEachIndexed { index, text -> Row( modifier = Modifier.clickable { dismissWith(index) }.fillMaxWidth() diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 7a39cd986..08f544851 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -66,7 +66,7 @@ Nøkkelordssøk Sider: Etiketter - Ubegrenset + Ubegrenset %d side %d sider diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9eb92e228..5d2132906 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -118,7 +118,7 @@ 删除快速搜索“%s”? 第 %1$d 页,共 %2$d 页 - 不限 + 不限 2 星 3 星 4 星 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b439e73be..9a91b22ce 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -118,7 +118,7 @@ 刪除快速搜尋“%s”? 第 %1$d 頁,共 %2$d 頁 - 不限 + 不限 2 星 3 星 4 星 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index df59a8291..e66589da2 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -87,7 +87,7 @@ - @string/unlimited + @string/any @string/star_2 @string/star_3 @string/star_4 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c64acbddb..919c928fc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -158,7 +158,7 @@ Delete quick search \"%s\"? Page %1$d, total %2$d pages - Unlimited + Any 2 stars 3 stars 4 stars