From 4ec7de611cce07d106240ab6d95e8bd863c0dc44 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Mon, 6 May 2024 21:24:31 +0800 Subject: [PATCH] Introduce `DropdownFilterChip` for `SearchFilter` --- .../hippo/ehviewer/ui/main/SearchFilter.kt | 74 ++++++++----------- .../ehviewer/ui/tools/DropdownFilterChip.kt | 48 ++++++++++++ app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-th/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values-zh-rHK/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 13 files changed, 91 insertions(+), 53 deletions(-) create mode 100644 app/src/main/kotlin/com/hippo/ehviewer/ui/tools/DropdownFilterChip.kt diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt index 1f20b9622..df4a85089 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt @@ -12,9 +12,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.FilterAlt import androidx.compose.material.icons.filled.Info -import androidx.compose.material.icons.outlined.FilterAlt import androidx.compose.material3.FilterChip import androidx.compose.material3.Icon import androidx.compose.material3.ListItem @@ -39,8 +37,9 @@ import com.hippo.ehviewer.Settings import com.hippo.ehviewer.asMutableState import com.hippo.ehviewer.client.EhTagDatabase import com.hippo.ehviewer.client.EhUtils -import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.client.data.GalleryInfo.Companion.S_LANG_TAGS import com.hippo.ehviewer.collectAsState +import com.hippo.ehviewer.ui.tools.DropdownFilterChip import com.hippo.ehviewer.ui.tools.LocalDialogState import com.hippo.ehviewer.ui.tools.thenIf import com.hippo.ehviewer.util.toIntOrDefault @@ -89,40 +88,44 @@ fun SearchFilter( ) } } - 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 - } - } - } - } Row( modifier = Modifier.horizontalScroll(rememberScrollState()).padding(horizontal = 16.dp, vertical = 8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), ) { val any = stringResource(id = R.string.any) val languageStr = stringResource(id = R.string.key_language) - FilterChip( - selected = languageFilter != -1, - onClick = { - scope.launch { - val items = listOf(any, *languages.toTypedArray()) - languageFilter = dialogState.awaitSingleChoice(items, languageFilter + 1) - 1 + val languages = remember { + val translatable = EhTagDatabase.initialized && EhTagDatabase.isTranslatable(context) + List(S_LANG_TAGS.size + 1) { i -> + if (i == 0) { + any + } else { + val tag = S_LANG_TAGS[i - 1].substringAfter(':') + if (translatable) { + EhTagDatabase.getTranslation("l", tag) ?: tag + } else { + tag + } } + } + } + var languageFilter by Settings.languageFilter.asMutableState() + DropdownFilterChip( + label = languageStr, + menuItems = languages, + selectedItemIndex = languageFilter + 1, + onSelectedItemIndexChange = { + languageFilter = it - 1 }, - label = { - Text(text = if (languageFilter == -1) languageStr else languages[languageFilter]) - }, - trailingIcon = { - Icon( - imageVector = if (languageFilter == -1) Icons.Outlined.FilterAlt else Icons.Default.FilterAlt, - contentDescription = null, - ) + ) + val minRatingItems = stringArrayResource(id = R.array.search_min_rating) + val minRatingStr = stringResource(id = R.string.search_sr) + DropdownFilterChip( + label = minRatingStr, + menuItems = minRatingItems.asList(), + selectedItemIndex = (advancedOption.minRating - 1).coerceAtLeast(0), + onSelectedItemIndexChange = { + onAdvancedOptionChanged(advancedOption.copy(minRating = if (it == 0) 0 else it + 1)) }, ) val pageErr1 = stringResource(R.string.search_sp_err1) @@ -204,19 +207,6 @@ fun SearchFilter( }, label = { Text(text = pagesText) }, ) - val minRatingItems = stringArrayResource(id = R.array.search_min_rating) - val minRatingStr = stringResource(id = R.string.search_sr) - val minRatingIndex = (advancedOption.minRating - 1).coerceAtLeast(0) - FilterChip( - selected = advancedOption.minRating != 0, - onClick = { - scope.launch { - val selected = dialogState.awaitSingleChoice(minRatingItems.toList(), minRatingIndex) - onAdvancedOptionChanged(advancedOption.copy(minRating = if (selected == 0) 0 else selected + 1)) - } - }, - label = { Text(text = minRatingStr + minRatingItems[minRatingIndex]) }, - ) fun checked(bit: Int) = advancedOption.advanceSearch and bit != 0 fun AdvancedSearchOption.inv(bit: Int) = onAdvancedOptionChanged(copy(advanceSearch = advanceSearch xor bit)) FilterChip( diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/DropdownFilterChip.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/DropdownFilterChip.kt new file mode 100644 index 000000000..7a9a5c4ad --- /dev/null +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/DropdownFilterChip.kt @@ -0,0 +1,48 @@ +package com.hippo.ehviewer.ui.tools + +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.FilterChip +import androidx.compose.material3.MenuAnchorType +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier + +@Composable +fun DropdownFilterChip( + label: String, + menuItems: List, + selectedItemIndex: Int, + onSelectedItemIndexChange: (Int) -> Unit, + modifier: Modifier = Modifier, +) { + var expanded by remember { mutableStateOf(false) } + ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = it }, modifier = modifier) { + FilterChip( + selected = selectedItemIndex != 0, + onClick = {}, + label = { + Text(text = if (selectedItemIndex == 0) label else menuItems[selectedItemIndex]) + }, + modifier = Modifier.menuAnchor(MenuAnchorType.PrimaryNotEditable), + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + ) + ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { + menuItems.forEachIndexed { index, item -> + DropdownMenuItem( + text = { Text(text = item) }, + onClick = { + expanded = false + onSelectedItemIndexChange(index) + }, + contentPadding = ExposedDropdownMenuDefaults.ItemContentPadding, + ) + } + } + } +} diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5593742f0..46ded7886 100755 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -54,7 +54,7 @@ Suche nach einem Bild Gelöschte Galerien anzeigen Nur die Galerien mit Torrentdateien anzeigen - Mindestpunktzahl: + Mindestpunktzahl zu Standard-Filter deaktivieren für: Sprache diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d0c506fe2..13f7163d0 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -67,7 +67,7 @@ Mostrar galerías borradas Mostrar solo galerías con torrents - Valoración mínima: + Valoración mínima Seleccionar imagen Seleccione la imagen primero hasta diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index bd61eff65..4a87e478c 100755 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -70,7 +70,7 @@ Montrer les galeries supprimées Seulement montrer galeries avec des fiches torrent - Minimum note : + Minimum note à Désactiver le filtre par défaut pour les items suivants : Langue diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index c44b9ab95..835852526 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -68,7 +68,7 @@ 削除済みのギャラリーを表示 Torrentのあるギャラリーのみを表示 - 評価の下限: + 評価の下限 から まで 既定フィルターから下記のものを例外とする: diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 107ce8dbb..790e7e329 100755 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -71,7 +71,7 @@ Expunged 갤러리 표시 토렌트 파일이 있는 갤러리만 검색 - 최소 평점: + 최소 평점 이미지 선택 먼저 이미지를 선택해 주세요. diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 2173e7ef2..5fd0ef80d 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -71,7 +71,7 @@ แสดงแกลเลอรี่ที่ถูกลบออก แสดงผลเฉพาะแกลเลอรี่ที่มีไฟล์ Torrents - เรตติ้งขั้นต่ำ: + เรตติ้งขั้นต่ำ เลือกรูปภาพ โปรดเลือกรูปภาพก่อน diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 516de4c2d..dda096400 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -37,7 +37,7 @@ Görsel Arama Yalnızca Silinen Galerileri Gösteri Yalnızca Torrent\'li Galerileri Göster - En Az Derecelendirme: + En Az Derecelendirme / Sayfa oranı en az 20 olmalı Varsayılan filtreleri şunlar için devre dışı bırak: diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 830232a64..e63d1d6d2 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -61,7 +61,7 @@ 图片搜索 已删除 有种子 - 最低评分: + 最低评分 到 页数最大值至少为 10 页数范围差至少为 20 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 188983815..93b23da2c 100755 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -73,7 +73,7 @@ 已刪除 有種子 - 最低評分: + 最低評分 到 禁用排除項: 語言 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 78a9550f3..96a2eb66c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -61,7 +61,7 @@ 圖片搜尋 已被移除 有種子 - 最低評分: + 最低評分 到 頁數最大值至少為 10 頁數範圍差至少為 20 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 58f290734..9200ea07b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -99,7 +99,7 @@ Image Search Expunged Has Torrent - Minimum Rating: + Minimum Rating to The page range maximum cannot be below 10 The page range must be at least 20