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:
Ota 2023-11-05 04:47:32 +09:00 committed by GitHub
parent 5d91b77c93
commit f30ab56fd0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 26 additions and 14 deletions

View file

@ -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 -> {

View file

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

View file

@ -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

View 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)
}

View file

@ -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}")
} }
} }

View file

@ -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