mirror of
https://git.mihon.tech/mihonapp/mihon
synced 2024-11-24 14:15:54 +03:00
Added random library sort (#1317)
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
This commit is contained in:
parent
6b2bba4e54
commit
a72db41bf1
8 changed files with 47 additions and 4 deletions
|
@ -6,6 +6,8 @@ import androidx.compose.foundation.layout.ColumnScope
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.rememberScrollState
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.verticalScroll
|
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.FilterChip
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
@ -27,6 +29,7 @@ import tachiyomi.domain.library.model.LibrarySort
|
||||||
import tachiyomi.domain.library.model.sort
|
import tachiyomi.domain.library.model.sort
|
||||||
import tachiyomi.domain.library.service.LibraryPreferences
|
import tachiyomi.domain.library.service.LibraryPreferences
|
||||||
import tachiyomi.i18n.MR
|
import tachiyomi.i18n.MR
|
||||||
|
import tachiyomi.presentation.core.components.BaseSortItem
|
||||||
import tachiyomi.presentation.core.components.CheckboxItem
|
import tachiyomi.presentation.core.components.CheckboxItem
|
||||||
import tachiyomi.presentation.core.components.HeadingItem
|
import tachiyomi.presentation.core.components.HeadingItem
|
||||||
import tachiyomi.presentation.core.components.SettingsChipRow
|
import tachiyomi.presentation.core.components.SettingsChipRow
|
||||||
|
@ -178,7 +181,19 @@ private fun ColumnScope.SortPage(
|
||||||
MR.strings.action_sort_latest_chapter to LibrarySort.Type.LatestChapter,
|
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_chapter_fetch_date to LibrarySort.Type.ChapterFetchDate,
|
||||||
MR.strings.action_sort_date_added to LibrarySort.Type.DateAdded,
|
MR.strings.action_sort_date_added to LibrarySort.Type.DateAdded,
|
||||||
|
MR.strings.action_sort_random to LibrarySort.Type.Random,
|
||||||
).plus(trackerSortOption).map { (titleRes, mode) ->
|
).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(
|
SortItem(
|
||||||
label = stringResource(titleRes),
|
label = stringResource(titleRes),
|
||||||
sortDescending = sortDescending.takeIf { sortingMode == mode },
|
sortDescending = sortDescending.takeIf { sortingMode == mode },
|
||||||
|
|
|
@ -72,6 +72,7 @@ import tachiyomi.domain.track.model.Track
|
||||||
import tachiyomi.source.local.isLocal
|
import tachiyomi.source.local.isLocal
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
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.
|
* Typealias for the library manga, using the category as keys, and list of manga as values.
|
||||||
|
@ -300,10 +301,17 @@ class LibraryScreenModel(
|
||||||
val item2Score = trackerScores[i2.libraryManga.id] ?: defaultTrackerScoreSortValue
|
val item2Score = trackerScores[i2.libraryManga.id] ?: defaultTrackerScoreSortValue
|
||||||
item1Score.compareTo(item2Score)
|
item1Score.compareTo(item2Score)
|
||||||
}
|
}
|
||||||
|
LibrarySort.Type.Random -> {
|
||||||
|
error("Why Are We Still Here? Just To Suffer?")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return mapValues { (key, value) ->
|
return mapValues { (key, value) ->
|
||||||
|
if (key.sort.type == LibrarySort.Type.Random) {
|
||||||
|
return@mapValues value.shuffled(Random(libraryPreferences.randomSortSeed().get()))
|
||||||
|
}
|
||||||
|
|
||||||
val comparator = key.sort.comparator()
|
val comparator = key.sort.comparator()
|
||||||
.let { if (key.sort.isAscending) it else it.reversed() }
|
.let { if (key.sort.isAscending) it else it.reversed() }
|
||||||
.thenComparator(sortAlphabetically)
|
.thenComparator(sortAlphabetically)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import tachiyomi.domain.category.repository.CategoryRepository
|
||||||
import tachiyomi.domain.library.model.LibrarySort
|
import tachiyomi.domain.library.model.LibrarySort
|
||||||
import tachiyomi.domain.library.model.plus
|
import tachiyomi.domain.library.model.plus
|
||||||
import tachiyomi.domain.library.service.LibraryPreferences
|
import tachiyomi.domain.library.service.LibraryPreferences
|
||||||
|
import kotlin.random.Random
|
||||||
|
|
||||||
class SetSortModeForCategory(
|
class SetSortModeForCategory(
|
||||||
private val preferences: LibraryPreferences,
|
private val preferences: LibraryPreferences,
|
||||||
|
@ -15,6 +16,9 @@ class SetSortModeForCategory(
|
||||||
suspend fun await(categoryId: Long?, type: LibrarySort.Type, direction: LibrarySort.Direction) {
|
suspend fun await(categoryId: Long?, type: LibrarySort.Type, direction: LibrarySort.Direction) {
|
||||||
val category = categoryId?.let { categoryRepository.get(it) }
|
val category = categoryId?.let { categoryRepository.get(it) }
|
||||||
val flags = (category?.flags ?: 0) + type + direction
|
val flags = (category?.flags ?: 0) + type + direction
|
||||||
|
if (type == LibrarySort.Type.Random) {
|
||||||
|
preferences.randomSortSeed().set(Random.nextInt())
|
||||||
|
}
|
||||||
if (category != null && preferences.categorizedDisplaySettings().get()) {
|
if (category != null && preferences.categorizedDisplaySettings().get()) {
|
||||||
categoryRepository.updatePartial(
|
categoryRepository.updatePartial(
|
||||||
CategoryUpdate(
|
CategoryUpdate(
|
||||||
|
|
|
@ -30,7 +30,8 @@ data class LibrarySort(
|
||||||
data object LatestChapter : Type(0b00010100)
|
data object LatestChapter : Type(0b00010100)
|
||||||
data object ChapterFetchDate : Type(0b00011000)
|
data object ChapterFetchDate : Type(0b00011000)
|
||||||
data object DateAdded : Type(0b00011100)
|
data object DateAdded : Type(0b00011100)
|
||||||
data object TrackerMean : Type(0b000100000)
|
data object TrackerMean : Type(0b00100000)
|
||||||
|
data object Random : Type(0b00111100)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun valueOf(flag: Long): Type {
|
fun valueOf(flag: Long): Type {
|
||||||
|
@ -77,6 +78,7 @@ data class LibrarySort(
|
||||||
Type.ChapterFetchDate,
|
Type.ChapterFetchDate,
|
||||||
Type.DateAdded,
|
Type.DateAdded,
|
||||||
Type.TrackerMean,
|
Type.TrackerMean,
|
||||||
|
Type.Random,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
val directions by lazy { setOf(Direction.Ascending, Direction.Descending) }
|
val directions by lazy { setOf(Direction.Ascending, Direction.Descending) }
|
||||||
|
@ -104,6 +106,7 @@ data class LibrarySort(
|
||||||
"CHAPTER_FETCH_DATE" -> Type.ChapterFetchDate
|
"CHAPTER_FETCH_DATE" -> Type.ChapterFetchDate
|
||||||
"DATE_ADDED" -> Type.DateAdded
|
"DATE_ADDED" -> Type.DateAdded
|
||||||
"TRACKER_MEAN" -> Type.TrackerMean
|
"TRACKER_MEAN" -> Type.TrackerMean
|
||||||
|
"RANDOM" -> Type.Random
|
||||||
else -> Type.Alphabetical
|
else -> Type.Alphabetical
|
||||||
}
|
}
|
||||||
val ascending = if (values[1] == "ASCENDING") Direction.Ascending else Direction.Descending
|
val ascending = if (values[1] == "ASCENDING") Direction.Ascending else Direction.Descending
|
||||||
|
@ -125,6 +128,7 @@ data class LibrarySort(
|
||||||
Type.ChapterFetchDate -> "CHAPTER_FETCH_DATE"
|
Type.ChapterFetchDate -> "CHAPTER_FETCH_DATE"
|
||||||
Type.DateAdded -> "DATE_ADDED"
|
Type.DateAdded -> "DATE_ADDED"
|
||||||
Type.TrackerMean -> "TRACKER_MEAN"
|
Type.TrackerMean -> "TRACKER_MEAN"
|
||||||
|
Type.Random -> "RANDOM"
|
||||||
}
|
}
|
||||||
val direction = if (direction == Direction.Ascending) "ASCENDING" else "DESCENDING"
|
val direction = if (direction == Direction.Ascending) "ASCENDING" else "DESCENDING"
|
||||||
return "$type,$direction"
|
return "$type,$direction"
|
||||||
|
|
|
@ -26,6 +26,8 @@ class LibraryPreferences(
|
||||||
LibrarySort.Serializer::deserialize,
|
LibrarySort.Serializer::deserialize,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fun randomSortSeed() = preferenceStore.getInt("library_random_sort_seed", 0)
|
||||||
|
|
||||||
fun portraitColumns() = preferenceStore.getInt("pref_library_columns_portrait_key", 0)
|
fun portraitColumns() = preferenceStore.getInt("pref_library_columns_portrait_key", 0)
|
||||||
|
|
||||||
fun landscapeColumns() = preferenceStore.getInt("pref_library_columns_landscape_key", 0)
|
fun landscapeColumns() = preferenceStore.getInt("pref_library_columns_landscape_key", 0)
|
||||||
|
|
|
@ -12,7 +12,7 @@ class LibraryFlagsTest {
|
||||||
@Test
|
@Test
|
||||||
fun `Check the amount of flags`() {
|
fun `Check the amount of flags`() {
|
||||||
LibraryDisplayMode.values.size shouldBe 4
|
LibraryDisplayMode.values.size shouldBe 4
|
||||||
LibrarySort.types.size shouldBe 9
|
LibrarySort.types.size shouldBe 10
|
||||||
LibrarySort.directions.size shouldBe 2
|
LibrarySort.directions.size shouldBe 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
<string name="action_sort_chapter_fetch_date">Chapter fetch date</string>
|
<string name="action_sort_chapter_fetch_date">Chapter fetch date</string>
|
||||||
<string name="action_sort_date_added">Date added</string>
|
<string name="action_sort_date_added">Date added</string>
|
||||||
<string name="action_sort_tracker_score">Tracker score</string>
|
<string name="action_sort_tracker_score">Tracker score</string>
|
||||||
|
<string name="action_sort_random">Random</string>
|
||||||
<string name="action_search">Search</string>
|
<string name="action_search">Search</string>
|
||||||
<string name="action_search_hint">Search…</string>
|
<string name="action_search_hint">Search…</string>
|
||||||
<string name="action_search_settings">Search settings</string>
|
<string name="action_search_settings">Search settings</string>
|
||||||
|
|
|
@ -98,12 +98,21 @@ fun SortItem(label: String, sortDescending: Boolean?, onClick: () -> Unit) {
|
||||||
null -> null
|
null -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BaseSortItem(
|
||||||
|
label = label,
|
||||||
|
icon = arrowIcon,
|
||||||
|
onClick = onClick,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun BaseSortItem(label: String, icon: ImageVector?, onClick: () -> Unit) {
|
||||||
BaseSettingsItem(
|
BaseSettingsItem(
|
||||||
label = label,
|
label = label,
|
||||||
widget = {
|
widget = {
|
||||||
if (arrowIcon != null) {
|
if (icon != null) {
|
||||||
Icon(
|
Icon(
|
||||||
imageVector = arrowIcon,
|
imageVector = icon,
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
tint = MaterialTheme.colorScheme.primary,
|
tint = MaterialTheme.colorScheme.primary,
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue