New alphabetical chapter sort (#10073)
* added alphabetical chapter sorting * Deleted sort_by_alphabet and re-utilized action_sort_alpha * Accidentally deleted wrong string. Now solved * Accidentally deleted wrong string. Now solved Deleted sort_by_source instead of sort_by_alphabet in strings.xml. Now reverted. * Alphabetical sorting now uses Collator * Clean up repeated Collator instances --------- Co-authored-by: arkon <eugcheung94@gmail.com>
This commit is contained in:
parent
5d91b77c93
commit
f30ab56fd0
6 changed files with 26 additions and 14 deletions
|
@ -3,12 +3,11 @@ package eu.kanade.domain.source.interactor
|
||||||
import eu.kanade.domain.source.service.SourcePreferences
|
import eu.kanade.domain.source.service.SourcePreferences
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
|
import tachiyomi.core.util.lang.compareToWithCollator
|
||||||
import tachiyomi.domain.source.model.Source
|
import tachiyomi.domain.source.model.Source
|
||||||
import tachiyomi.domain.source.repository.SourceRepository
|
import tachiyomi.domain.source.repository.SourceRepository
|
||||||
import tachiyomi.source.local.isLocal
|
import tachiyomi.source.local.isLocal
|
||||||
import java.text.Collator
|
|
||||||
import java.util.Collections
|
import java.util.Collections
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class GetSourcesWithFavoriteCount(
|
class GetSourcesWithFavoriteCount(
|
||||||
private val repository: SourceRepository,
|
private val repository: SourceRepository,
|
||||||
|
@ -31,17 +30,13 @@ class GetSourcesWithFavoriteCount(
|
||||||
direction: SetMigrateSorting.Direction,
|
direction: SetMigrateSorting.Direction,
|
||||||
sorting: SetMigrateSorting.Mode,
|
sorting: SetMigrateSorting.Mode,
|
||||||
): java.util.Comparator<Pair<Source, Long>> {
|
): java.util.Comparator<Pair<Source, Long>> {
|
||||||
val locale = Locale.getDefault()
|
|
||||||
val collator = Collator.getInstance(locale).apply {
|
|
||||||
strength = Collator.PRIMARY
|
|
||||||
}
|
|
||||||
val sortFn: (Pair<Source, Long>, Pair<Source, Long>) -> Int = { a, b ->
|
val sortFn: (Pair<Source, Long>, Pair<Source, Long>) -> Int = { a, b ->
|
||||||
when (sorting) {
|
when (sorting) {
|
||||||
SetMigrateSorting.Mode.ALPHABETICAL -> {
|
SetMigrateSorting.Mode.ALPHABETICAL -> {
|
||||||
when {
|
when {
|
||||||
a.first.isStub && b.first.isStub.not() -> -1
|
a.first.isStub && b.first.isStub.not() -> -1
|
||||||
b.first.isStub && a.first.isStub.not() -> 1
|
b.first.isStub && a.first.isStub.not() -> 1
|
||||||
else -> collator.compare(a.first.name.lowercase(locale), b.first.name.lowercase(locale))
|
else -> a.first.name.lowercase().compareToWithCollator(b.first.name.lowercase())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SetMigrateSorting.Mode.TOTAL -> {
|
SetMigrateSorting.Mode.TOTAL -> {
|
||||||
|
|
|
@ -144,6 +144,7 @@ private fun ColumnScope.SortPage(
|
||||||
R.string.sort_by_source to Manga.CHAPTER_SORTING_SOURCE,
|
R.string.sort_by_source to Manga.CHAPTER_SORTING_SOURCE,
|
||||||
R.string.sort_by_number to Manga.CHAPTER_SORTING_NUMBER,
|
R.string.sort_by_number to Manga.CHAPTER_SORTING_NUMBER,
|
||||||
R.string.sort_by_upload_date to Manga.CHAPTER_SORTING_UPLOAD_DATE,
|
R.string.sort_by_upload_date to Manga.CHAPTER_SORTING_UPLOAD_DATE,
|
||||||
|
R.string.action_sort_alpha to Manga.CHAPTER_SORTING_ALPHABET,
|
||||||
).map { (titleRes, mode) ->
|
).map { (titleRes, mode) ->
|
||||||
SortItem(
|
SortItem(
|
||||||
label = stringResource(titleRes),
|
label = stringResource(titleRes),
|
||||||
|
|
|
@ -41,6 +41,7 @@ import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.flow.update
|
import kotlinx.coroutines.flow.update
|
||||||
import tachiyomi.core.preference.CheckboxState
|
import tachiyomi.core.preference.CheckboxState
|
||||||
import tachiyomi.core.preference.TriState
|
import tachiyomi.core.preference.TriState
|
||||||
|
import tachiyomi.core.util.lang.compareToWithCollator
|
||||||
import tachiyomi.core.util.lang.launchIO
|
import tachiyomi.core.util.lang.launchIO
|
||||||
import tachiyomi.core.util.lang.launchNonCancellable
|
import tachiyomi.core.util.lang.launchNonCancellable
|
||||||
import tachiyomi.core.util.lang.withIOContext
|
import tachiyomi.core.util.lang.withIOContext
|
||||||
|
@ -65,9 +66,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 java.text.Collator
|
|
||||||
import java.util.Collections
|
import java.util.Collections
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
|
@ -243,12 +242,8 @@ class LibraryScreenModel(
|
||||||
// Map<MangaId, List<Track>>
|
// Map<MangaId, List<Track>>
|
||||||
trackMap: Map<Long, List<Track>>,
|
trackMap: Map<Long, List<Track>>,
|
||||||
): LibraryMap {
|
): LibraryMap {
|
||||||
val locale = Locale.getDefault()
|
|
||||||
val collator = Collator.getInstance(locale).apply {
|
|
||||||
strength = Collator.PRIMARY
|
|
||||||
}
|
|
||||||
val sortAlphabetically: (LibraryItem, LibraryItem) -> Int = { i1, i2 ->
|
val sortAlphabetically: (LibraryItem, LibraryItem) -> Int = { i1, i2 ->
|
||||||
collator.compare(i1.libraryManga.manga.title.lowercase(locale), i2.libraryManga.manga.title.lowercase(locale))
|
i1.libraryManga.manga.title.lowercase().compareToWithCollator(i2.libraryManga.manga.title.lowercase())
|
||||||
}
|
}
|
||||||
|
|
||||||
val defaultTrackerScoreSortValue = -1.0
|
val defaultTrackerScoreSortValue = -1.0
|
||||||
|
|
15
core/src/main/java/tachiyomi/core/util/lang/SortUtil.kt
Normal file
15
core/src/main/java/tachiyomi/core/util/lang/SortUtil.kt
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
package tachiyomi.core.util.lang
|
||||||
|
|
||||||
|
import java.text.Collator
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
private val collator by lazy {
|
||||||
|
val locale = Locale.getDefault()
|
||||||
|
Collator.getInstance(locale).apply {
|
||||||
|
strength = Collator.PRIMARY
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun String.compareToWithCollator(other: String): Int {
|
||||||
|
return collator.compare(this, other)
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package tachiyomi.domain.chapter.service
|
package tachiyomi.domain.chapter.service
|
||||||
|
|
||||||
|
import tachiyomi.core.util.lang.compareToWithCollator
|
||||||
import tachiyomi.domain.chapter.model.Chapter
|
import tachiyomi.domain.chapter.model.Chapter
|
||||||
import tachiyomi.domain.manga.model.Manga
|
import tachiyomi.domain.manga.model.Manga
|
||||||
|
|
||||||
|
@ -23,6 +24,10 @@ fun getChapterSort(
|
||||||
true -> { c1, c2 -> c2.dateUpload.compareTo(c1.dateUpload) }
|
true -> { c1, c2 -> c2.dateUpload.compareTo(c1.dateUpload) }
|
||||||
false -> { c1, c2 -> c1.dateUpload.compareTo(c2.dateUpload) }
|
false -> { c1, c2 -> c1.dateUpload.compareTo(c2.dateUpload) }
|
||||||
}
|
}
|
||||||
|
Manga.CHAPTER_SORTING_ALPHABET -> when (sortDescending) {
|
||||||
|
true -> { c1, c2 -> c2.name.compareToWithCollator(c1.name) }
|
||||||
|
false -> { c1, c2 -> c1.name.compareToWithCollator(c2.name) }
|
||||||
|
}
|
||||||
else -> throw NotImplementedError("Invalid chapter sorting method: ${manga.sorting}")
|
else -> throw NotImplementedError("Invalid chapter sorting method: ${manga.sorting}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,7 @@ data class Manga(
|
||||||
const val CHAPTER_SORTING_SOURCE = 0x00000000L
|
const val CHAPTER_SORTING_SOURCE = 0x00000000L
|
||||||
const val CHAPTER_SORTING_NUMBER = 0x00000100L
|
const val CHAPTER_SORTING_NUMBER = 0x00000100L
|
||||||
const val CHAPTER_SORTING_UPLOAD_DATE = 0x00000200L
|
const val CHAPTER_SORTING_UPLOAD_DATE = 0x00000200L
|
||||||
|
const val CHAPTER_SORTING_ALPHABET = 0x00000300L
|
||||||
const val CHAPTER_SORTING_MASK = 0x00000300L
|
const val CHAPTER_SORTING_MASK = 0x00000300L
|
||||||
|
|
||||||
const val CHAPTER_DISPLAY_NAME = 0x00000000L
|
const val CHAPTER_DISPLAY_NAME = 0x00000000L
|
||||||
|
|
Reference in a new issue