Просмотр исходного кода

Merge pull request #1811 from woruteyqi/feat/font-sort

添加对字体选择的排序支持
Kudomaga 3 месяцев назад
Родитель
Сommit
1d958c2a2d

+ 1 - 0
app/src/main/java/io/legado/app/constant/PreferKey.kt

@@ -66,6 +66,7 @@ object PreferKey {
     const val processText = "process_text"
     const val saveTabPosition = "saveTabPosition"
     const val fontFolder = "fontFolder"
+    const val fontSort = "fontSort"
     const val backupPath = "backupUri"
     const val restoreIgnore = "restoreIgnore"
     const val threadCount = "threadCount"

+ 10 - 0
app/src/main/java/io/legado/app/ui/config/FontConfig.kt

@@ -0,0 +1,10 @@
+package io.legado.app.ui.config
+
+import androidx.compose.runtime.State
+import io.legado.app.constant.PreferKey
+
+object FontConfig {
+    private val _fontSort = prefStateDelegate(PreferKey.fontSort, 0)
+    var fontSort by _fontSort
+    val fontSortState: State<Int> get() = _fontSort.state
+}

+ 70 - 2
app/src/main/java/io/legado/app/ui/widget/components/FontSelectGrid.kt

@@ -2,6 +2,7 @@ package io.legado.app.ui.widget.components
 
 import android.graphics.Typeface
 import android.net.Uri
+import androidx.annotation.StringRes
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Arrangement
@@ -19,9 +20,13 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
 import androidx.compose.foundation.lazy.grid.items
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.filled.Sort
 import androidx.compose.material.icons.filled.Check
 import androidx.compose.material3.CircularProgressIndicator
+import androidx.compose.material3.DropdownMenu
+import androidx.compose.material3.DropdownMenuItem
 import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
@@ -42,14 +47,31 @@ import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.help.loadFontFiles
+import io.legado.app.ui.config.FontConfig
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.utils.FileDoc
+import io.legado.app.utils.cnCompare
 import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
 
 private val fontGridHeight = 360.dp
 
+enum class FontSort(@param:StringRes val labelRes: Int) {
+    NameAsc(R.string.sort_name_asc),
+    NameDesc(R.string.sort_name_desc),
+    SizeAsc(R.string.sort_size_asc),
+    SizeDesc(R.string.sort_size_desc),
+    DateAsc(R.string.sort_time_asc),
+    DateDesc(R.string.sort_time_desc);
+
+    companion object {
+        fun fromInt(value: Int): FontSort {
+            return entries.getOrElse(value) { NameAsc }
+        }
+    }
+}
+
 
 sealed interface FontFolderState {
     data object Loading : FontFolderState
@@ -75,6 +97,7 @@ fun FontSelectGrid(
     var fontItems by remember { mutableStateOf<List<FileDoc>>(emptyList()) }
     var filesLoading by remember { mutableStateOf(false) }
     var searchQuery by remember { mutableStateOf("") }
+    val fontSort by FontConfig.fontSortState
 
     LaunchedEffect(folderState) {
         if (folderState is FontFolderState.Loaded) {
@@ -89,9 +112,19 @@ fun FontSelectGrid(
         }
     }
 
-    val filteredItems = remember(fontItems, searchQuery) {
-        if (searchQuery.isBlank()) fontItems
+    val filteredItems = remember(fontItems, searchQuery, fontSort) {
+        val filtered = if (searchQuery.isBlank()) fontItems
         else fontItems.filter { it.name.contains(searchQuery, ignoreCase = true) }
+
+        val comparator = when (FontSort.fromInt(fontSort)) {
+            FontSort.NameAsc -> Comparator<FileDoc> { a, b -> a.name.cnCompare(b.name) }
+            FontSort.NameDesc -> Comparator<FileDoc> { a, b -> b.name.cnCompare(a.name) }
+            FontSort.SizeAsc -> compareBy<FileDoc> { it.size }
+            FontSort.SizeDesc -> compareByDescending<FileDoc> { it.size }
+            FontSort.DateAsc -> compareBy<FileDoc> { it.lastModified }
+            FontSort.DateDesc -> compareByDescending<FileDoc> { it.lastModified }
+        }
+        filtered.sortedWith(comparator)
     }
 
     val showLoading = folderState is FontFolderState.Loading || filesLoading
@@ -106,6 +139,41 @@ fun FontSelectGrid(
             onQueryChange = { searchQuery = it },
             placeholder = stringResource(R.string.search_placeholder),
             autoFocus = false,
+            trailingIcon = {
+                var expanded by remember { mutableStateOf(false) }
+                Box {
+                    IconButton(onClick = { expanded = true }) {
+                        Icon(
+                            imageVector = Icons.AutoMirrored.Filled.Sort,
+                            contentDescription = stringResource(R.string.sort),
+                            tint = LegadoTheme.colorScheme.onSurfaceVariant
+                        )
+                    }
+                    DropdownMenu(
+                        expanded = expanded,
+                        onDismissRequest = { expanded = false }
+                    ) {
+                        FontSort.entries.forEach { sort ->
+                            DropdownMenuItem(
+                                text = { Text(stringResource(sort.labelRes)) },
+                                onClick = {
+                                    FontConfig.fontSort = sort.ordinal
+                                    expanded = false
+                                },
+                                trailingIcon = if (fontSort == sort.ordinal) {
+                                    {
+                                        Icon(
+                                            imageVector = Icons.Default.Check,
+                                            contentDescription = null,
+                                            tint = LegadoTheme.colorScheme.primary
+                                        )
+                                    }
+                                } else null
+                            )
+                        }
+                    }
+                }
+            }
         )
 
         Spacer(Modifier.height(4.dp))

+ 4 - 0
app/src/main/res/values-zh-rCN/strings.xml

@@ -1674,6 +1674,10 @@
     <string name="sort_new_to_old">从新到旧</string>
     <string name="sort_name_asc">名称升序</string>
     <string name="sort_name_desc">名称降序</string>
+    <string name="sort_size_asc">大小升序</string>
+    <string name="sort_size_desc">大小降序</string>
+    <string name="sort_time_asc">时间升序</string>
+    <string name="sort_time_desc">时间降序</string>
     <string name="text_dottedline">下划虚线</string>
     <string name="jump_to_volume">跳转到卷</string>
     <string name="cancel_select">取消选择</string>

+ 4 - 0
app/src/main/res/values-zh-rHK/strings.xml

@@ -2055,6 +2055,10 @@
     <string name="slider">滑桿</string>
     <string name="sort_name_asc">名稱升序</string>
     <string name="sort_name_desc">名稱降序</string>
+    <string name="sort_size_asc">大小升序</string>
+    <string name="sort_size_desc">大小降序</string>
+    <string name="sort_time_asc">時間升序</string>
+    <string name="sort_time_desc">時間降序</string>
     <string name="sort_new_first">最新優先</string>
     <string name="sort_new_to_old">最新優先</string>
     <string name="sort_old_first">最舊優先</string>

+ 4 - 0
app/src/main/res/values-zh-rTW/strings.xml

@@ -1820,6 +1820,10 @@
     <string name="sort_new_to_old">最新到最舊</string>
     <string name="sort_name_asc">名稱升序</string>
     <string name="sort_name_desc">名稱降序</string>
+    <string name="sort_size_asc">大小升序</string>
+    <string name="sort_size_desc">大小降序</string>
+    <string name="sort_time_asc">時間升序</string>
+    <string name="sort_time_desc">時間降序</string>
     <string name="text_dottedline">圓點底線</string>
     <string name="jump_to_volume">跳轉到卷</string>
     <string name="cancel_select">取消選擇</string>

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -1723,6 +1723,10 @@
     <string name="sort_new_to_old">Newest First</string>
     <string name="sort_name_asc">Name Ascending</string>
     <string name="sort_name_desc">Name Descending</string>
+    <string name="sort_size_asc">Size Ascending</string>
+    <string name="sort_size_desc">Size Descending</string>
+    <string name="sort_time_asc">Time Ascending</string>
+    <string name="sort_time_desc">Time Descending</string>
     <string name="text_dottedline">Dotted Underline</string>
     <string name="jump_to_volume">Jump to Volume</string>
     <string name="cancel_select">Cancel Selection</string>