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, )