diff --git a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt
index 600450c41..64cf3249b 100644
--- a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt
+++ b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt
@@ -6,6 +6,8 @@ import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.FilterChip
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -35,6 +37,7 @@ import tachiyomi.domain.library.model.sort
import tachiyomi.domain.library.service.LibraryPreferences
import tachiyomi.i18n.MR
import tachiyomi.i18n.sy.SYMR
+import tachiyomi.presentation.core.components.BaseSortItem
import tachiyomi.presentation.core.components.CheckboxItem
import tachiyomi.presentation.core.components.HeadingItem
import tachiyomi.presentation.core.components.IconItem
@@ -222,6 +225,7 @@ private fun ColumnScope.SortPage(
MR.strings.action_sort_latest_chapter to LibrarySort.Type.LatestChapter,
MR.strings.action_sort_chapter_fetch_date to LibrarySort.Type.ChapterFetchDate,
MR.strings.action_sort_date_added to LibrarySort.Type.DateAdded,
+ MR.strings.action_sort_random to LibrarySort.Type.Random,
// SY -->
if (hasSortTags) {
SYMR.strings.tag_sorting to LibrarySort.Type.TagList
@@ -230,6 +234,17 @@ private fun ColumnScope.SortPage(
},
// SY <--
).plus(trackerSortOption).map { (titleRes, mode) ->
+ if (mode == LibrarySort.Type.Random) {
+ BaseSortItem(
+ label = stringResource(titleRes),
+ icon = Icons.Default.Refresh
+ .takeIf { sortingMode == LibrarySort.Type.Random },
+ onClick = {
+ screenModel.setSort(category, mode, LibrarySort.Direction.Ascending)
+ },
+ )
+ return@map
+ }
SortItem(
label = stringResource(titleRes),
sortDescending = sortDescending.takeIf { sortingMode == mode },
@@ -241,7 +256,11 @@ private fun ColumnScope.SortPage(
} else {
LibrarySort.Direction.Descending
}
- else -> if (sortDescending) LibrarySort.Direction.Descending else LibrarySort.Direction.Ascending
+ else -> if (sortDescending) {
+ LibrarySort.Direction.Descending
+ } else {
+ LibrarySort.Direction.Ascending
+ }
}
screenModel.setSort(category, mode, direction)
},
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt
index 3fc4811cc..f178ebecf 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt
@@ -117,6 +117,7 @@ import tachiyomi.source.local.LocalSource
import tachiyomi.source.local.isLocal
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
+import kotlin.random.Random
/**
* Typealias for the library manga, using the category as keys, and list of manga as values.
@@ -447,6 +448,9 @@ class LibraryScreenModel(
val item2Score = trackerScores[i2.libraryManga.id] ?: defaultTrackerScoreSortValue
item1Score.compareTo(item2Score)
}
+ LibrarySort.Type.Random -> {
+ error("Why Are We Still Here? Just To Suffer?")
+ }
// SY -->
LibrarySort.Type.TagList -> {
val manga1IndexOfTag = listOfTags.indexOfFirst {
@@ -463,10 +467,13 @@ class LibraryScreenModel(
return mapValues { (key, value) ->
// SY -->
- val isAscending = groupSort?.isAscending ?: key.sort.isAscending
- // SY <--
- val comparator = key.sort.comparator()
- .let { if (/* SY --> */ isAscending /* SY <-- */) it else it.reversed() }
+ val sort = groupSort ?: key.sort
+ if (sort.type == LibrarySort.Type.Random) {
+ return@mapValues value.shuffled(Random(libraryPreferences.randomSortSeed().get()))
+ }
+ val comparator = sort.comparator()
+ // SY <--
+ .let { if (/* SY --> */ sort.isAscending /* SY <-- */) it else it.reversed() }
.thenComparator(sortAlphabetically)
value.sortedWith(comparator)
diff --git a/domain/src/main/java/tachiyomi/domain/category/interactor/SetSortModeForCategory.kt b/domain/src/main/java/tachiyomi/domain/category/interactor/SetSortModeForCategory.kt
index db923561b..70fc057ec 100644
--- a/domain/src/main/java/tachiyomi/domain/category/interactor/SetSortModeForCategory.kt
+++ b/domain/src/main/java/tachiyomi/domain/category/interactor/SetSortModeForCategory.kt
@@ -7,6 +7,7 @@ import tachiyomi.domain.library.model.LibraryGroup
import tachiyomi.domain.library.model.LibrarySort
import tachiyomi.domain.library.model.plus
import tachiyomi.domain.library.service.LibraryPreferences
+import kotlin.random.Random
class SetSortModeForCategory(
private val preferences: LibraryPreferences,
@@ -22,6 +23,9 @@ class SetSortModeForCategory(
// SY <--
val category = categoryId?.let { categoryRepository.get(it) }
val flags = (category?.flags ?: 0) + type + direction
+ if (type == LibrarySort.Type.Random) {
+ preferences.randomSortSeed().set(Random.nextInt())
+ }
if (category != null && preferences.categorizedDisplaySettings().get()) {
categoryRepository.updatePartial(
CategoryUpdate(
diff --git a/domain/src/main/java/tachiyomi/domain/library/model/LibrarySortMode.kt b/domain/src/main/java/tachiyomi/domain/library/model/LibrarySortMode.kt
index ea79cbba7..d77775d56 100644
--- a/domain/src/main/java/tachiyomi/domain/library/model/LibrarySortMode.kt
+++ b/domain/src/main/java/tachiyomi/domain/library/model/LibrarySortMode.kt
@@ -30,7 +30,8 @@ data class LibrarySort(
data object LatestChapter : Type(0b00010100)
data object ChapterFetchDate : Type(0b00011000)
data object DateAdded : Type(0b00011100)
- data object TrackerMean : Type(0b000100000)
+ data object TrackerMean : Type(0b00100000)
+ data object Random : Type(0b00111100)
// SY -->
data object TagList : Type(0b00100100)
@@ -81,6 +82,7 @@ data class LibrarySort(
Type.ChapterFetchDate,
Type.DateAdded,
Type.TrackerMean,
+ Type.Random,
/* SY -->*/ Type.TagList, /* SY <--*/
)
}
@@ -109,6 +111,7 @@ data class LibrarySort(
"CHAPTER_FETCH_DATE" -> Type.ChapterFetchDate
"DATE_ADDED" -> Type.DateAdded
"TRACKER_MEAN" -> Type.TrackerMean
+ "RANDOM" -> Type.Random
// SY -->
"TAG_LIST" -> Type.TagList
// SY <--
@@ -133,6 +136,7 @@ data class LibrarySort(
Type.ChapterFetchDate -> "CHAPTER_FETCH_DATE"
Type.DateAdded -> "DATE_ADDED"
Type.TrackerMean -> "TRACKER_MEAN"
+ Type.Random -> "RANDOM"
// SY -->
Type.TagList -> "TAG_LIST"
// SY <--
diff --git a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt
index 535bcf9e3..0de5abf90 100644
--- a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt
+++ b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt
@@ -28,6 +28,8 @@ class LibraryPreferences(
LibrarySort.Serializer::deserialize,
)
+ fun randomSortSeed() = preferenceStore.getInt("library_random_sort_seed", 0)
+
fun portraitColumns() = preferenceStore.getInt("pref_library_columns_portrait_key", 0)
fun landscapeColumns() = preferenceStore.getInt("pref_library_columns_landscape_key", 0)
diff --git a/domain/src/test/java/tachiyomi/domain/library/model/LibraryFlagsTest.kt b/domain/src/test/java/tachiyomi/domain/library/model/LibraryFlagsTest.kt
index a3a223782..11af8ebfb 100644
--- a/domain/src/test/java/tachiyomi/domain/library/model/LibraryFlagsTest.kt
+++ b/domain/src/test/java/tachiyomi/domain/library/model/LibraryFlagsTest.kt
@@ -12,7 +12,7 @@ class LibraryFlagsTest {
@Test
fun `Check the amount of flags`() {
LibraryDisplayMode.values.size shouldBe 4
- LibrarySort.types.size shouldBe 9
+ LibrarySort.types.size shouldBe 10
LibrarySort.directions.size shouldBe 2
}
diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml
index c298d62f0..54649d69e 100755
--- a/i18n/src/commonMain/moko-resources/base/strings.xml
+++ b/i18n/src/commonMain/moko-resources/base/strings.xml
@@ -69,6 +69,7 @@
Chapter fetch date
Date added
Tracker score
+ Random
Search
Search…
Search settings
diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt
index 6cc5cd8e6..185d95ae4 100644
--- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt
+++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt
@@ -99,12 +99,21 @@ fun SortItem(label: String, sortDescending: Boolean?, onClick: () -> Unit) {
null -> null
}
+ BaseSortItem(
+ label = label,
+ icon = arrowIcon,
+ onClick = onClick,
+ )
+}
+
+@Composable
+fun BaseSortItem(label: String, icon: ImageVector?, onClick: () -> Unit) {
BaseSettingsItem(
label = label,
widget = {
- if (arrowIcon != null) {
+ if (icon != null) {
Icon(
- imageVector = arrowIcon,
+ imageVector = icon,
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
)