diff --git a/app/src/main/kotlin/com/hippo/ehviewer/download/SortMode.kt b/app/src/main/kotlin/com/hippo/ehviewer/download/SortMode.kt index 9709a9916..e0021c072 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/download/SortMode.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/download/SortMode.kt @@ -3,9 +3,9 @@ package com.hippo.ehviewer.download import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.dao.DownloadInfo -data class SortMode(val field: Field, val order: Order) { +data class SortMode(val field: Field, val order: Order, val groupByDownloadLabel: Boolean = false) { val flag - get() = field.value shl 1 or order.value + get() = groupByDownloadLabel.compareTo(false) shl 4 or (field.value shl 1) or order.value enum class Field(val value: Int) { GID(0), @@ -21,22 +21,28 @@ data class SortMode(val field: Field, val order: Order) { } fun comparator(): Comparator { - val comparator = when (field) { + var comparator = when (field) { Field.GID -> compareBy { it.gid } - Field.TITLE -> compareBy { EhUtils.getSuitableTitle(it) } + Field.TITLE, Field.LABEL -> compareBy { EhUtils.getSuitableTitle(it) } Field.TIME -> compareBy { it.time } - Field.LABEL -> compareBy { it.label }.thenBy { EhUtils.getSuitableTitle(it) } Field.PAGES -> compareBy { it.pages }.thenBy { EhUtils.getSuitableTitle(it) } } - return if (order == Order.ASC) comparator else comparator.reversed() + if (order == Order.DESC) { + comparator = comparator.reversed() + } + if (groupByDownloadLabel) { + comparator = compareBy { it.label }.then(comparator) + } + return comparator } companion object { fun from(flag: Int): SortMode { - val field = flag shr 1 - val order = flag and 1 + val field = flag and 0xF shr 1 + val order = flag and 0x1 + val groupByDownloadLabel = flag shr 4 == 1 require(field in Field.entries.indices && order in Order.entries.indices) - return SortMode(Field.entries[field], Order.entries[order]) + return SortMode(Field.entries[field], Order.entries[order], groupByDownloadLabel) } val Default = SortMode(Field.TIME, Order.DESC) val All = listOf( @@ -46,8 +52,6 @@ data class SortMode(val field: Field, val order: Order) { SortMode(Field.GID, Order.ASC), SortMode(Field.TITLE, Order.ASC), SortMode(Field.TITLE, Order.DESC), - SortMode(Field.LABEL, Order.ASC), - SortMode(Field.LABEL, Order.DESC), SortMode(Field.PAGES, Order.ASC), SortMode(Field.PAGES, Order.DESC), ) 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 1744d189f..528268d49 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 @@ -564,12 +564,15 @@ fun DownloadsScreen(navigator: DestinationsNavigator) = composing(navigator) { withUIContext { navToReader(list.random().galleryInfo) } } onClick(Icons.AutoMirrored.Default.Sort) { - val selected = showSingleChoice( + val oldMode = SortMode.from(sortMode) + val (selected, checked) = showSelectItemWithCheckBox( sortModes.toList(), - SortMode.All.indexOfFirst { it.flag == sortMode }, R.string.sort_by, + R.string.group_by_download_label, + SortMode.All.indexOfFirst { it.field == oldMode.field && it.order == oldMode.order }, + oldMode.groupByDownloadLabel, ) - val mode = SortMode.All[selected] + val mode = SortMode.All[selected].copy(groupByDownloadLabel = checked) DownloadManager.sortDownloads(mode) sortMode = mode.flag invalidateKey = !invalidateKey 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 3178deb75..92a6a7dd6 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 @@ -22,6 +22,7 @@ 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.Check import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Info import androidx.compose.material3.AlertDialog @@ -487,8 +488,12 @@ class DialogState { items: List, @StringRes title: Int, @StringRes checkBoxText: Int, + selected: Int = -1, + initialChecked: Boolean = false, ): Pair = showNoButton { - var checked by remember { mutableStateOf(false) } + var checked by remember { mutableStateOf(initialChecked) } + val textStyle = MaterialTheme.typography.titleMedium + val selectedColor = MaterialTheme.colorScheme.tertiary Column(modifier = Modifier.padding(vertical = 8.dp)) { Text( text = stringResource(id = title), @@ -497,14 +502,20 @@ class DialogState { ) LazyColumn { itemsIndexed(items) { index, text -> - CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.tertiary) { - Text( - text = text, - modifier = Modifier.clickable { dismissWith(index to checked) }.fillMaxWidth() - .padding(horizontal = 24.dp, vertical = 16.dp), - style = MaterialTheme.typography.titleMedium, - ) - } + ListItem( + headlineContent = { + Text( + text = text, + style = if (index == selected) textStyle.copy(color = selectedColor) else textStyle, + ) + }, + modifier = Modifier.clickable { dismissWith(index to checked) }.fillMaxWidth(), + trailingContent = { + if (index == selected) { + Icon(imageVector = Icons.Default.Check, contentDescription = null, tint = selectedColor) + } + }, + ) } } LabeledCheckbox( diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5809c4ac0..77e59a739 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -462,10 +462,9 @@ 上传时间(升序) 标题(升序) 标题(降序) - 下载标签(升序) - 下载标签(降序) 页数(升序) 页数(降序) + 按下载标签分组 过滤 全部 全部开始(倒序) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d1c0f07ac..a2667edf4 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -461,10 +461,9 @@ 上傳時間 (遞增) 標題 (遞減) 標題 (遞增) - 下載標籤 (遞減) - 下載標籤 (遞增) 頁數 (遞減) 頁數 (遞增) + 按下載標籤分組 過濾 全部 全部開始(倒序) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 4464dd101..09ecae1ba 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -235,8 +235,6 @@ @string/uploaded_time_asc @string/title_asc @string/title_desc - @string/download_label_asc - @string/download_label_desc @string/page_count_asc @string/page_count_desc diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b37abd31d..5545ea540 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -527,10 +527,9 @@ Uploaded time (ascending) Title (ascending) Title (descending) - Download label (ascending) - Download label (descending) Page count (ascending) Page count (descending) + Group by download label Filter All Start all (reversed)