mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Use same chapter sorting logic in manga and reader views
This commit is contained in:
		@@ -1020,23 +1020,11 @@ class MangaController :
 | 
			
		||||
 | 
			
		||||
    // OVERFLOW MENU DIALOGS
 | 
			
		||||
 | 
			
		||||
    private fun getUnreadChaptersSorted(): List<ChapterItem> {
 | 
			
		||||
        val chapters = presenter.chapters
 | 
			
		||||
            .sortedWith(presenter.getChapterSort())
 | 
			
		||||
            .filter { !it.read && it.status == Download.State.NOT_DOWNLOADED }
 | 
			
		||||
            .distinctBy { it.name }
 | 
			
		||||
        return if (presenter.sortDescending()) {
 | 
			
		||||
            chapters.reversed()
 | 
			
		||||
        } else {
 | 
			
		||||
            chapters
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun downloadChapters(choice: Int) {
 | 
			
		||||
        val chaptersToDownload = when (choice) {
 | 
			
		||||
            R.id.download_next -> getUnreadChaptersSorted().take(1)
 | 
			
		||||
            R.id.download_next_5 -> getUnreadChaptersSorted().take(5)
 | 
			
		||||
            R.id.download_next_10 -> getUnreadChaptersSorted().take(10)
 | 
			
		||||
            R.id.download_next -> presenter.getUnreadChaptersSorted().take(1)
 | 
			
		||||
            R.id.download_next_5 -> presenter.getUnreadChaptersSorted().take(5)
 | 
			
		||||
            R.id.download_next_10 -> presenter.getUnreadChaptersSorted().take(10)
 | 
			
		||||
            R.id.download_custom -> {
 | 
			
		||||
                showCustomDownloadDialog()
 | 
			
		||||
                return
 | 
			
		||||
@@ -1059,7 +1047,7 @@ class MangaController :
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun downloadCustomChapters(amount: Int) {
 | 
			
		||||
        val chaptersToDownload = getUnreadChaptersSorted().take(amount)
 | 
			
		||||
        val chaptersToDownload = presenter.getUnreadChaptersSorted().take(amount)
 | 
			
		||||
        if (chaptersToDownload.isNotEmpty()) {
 | 
			
		||||
            downloadChapters(chaptersToDownload)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.chapter.ChapterItem
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.track.TrackItem
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.ChapterSettingsHelper
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.getChapterSort
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithTrackServiceTwoWay
 | 
			
		||||
import eu.kanade.tachiyomi.util.isLocal
 | 
			
		||||
@@ -433,25 +434,7 @@ class MangaPresenter(
 | 
			
		||||
            observable = observable.filter { !it.bookmark }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return observable.toSortedList(getChapterSort())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getChapterSort(): (Chapter, Chapter) -> Int {
 | 
			
		||||
        return when (manga.sorting) {
 | 
			
		||||
            Manga.CHAPTER_SORTING_SOURCE -> when (sortDescending()) {
 | 
			
		||||
                true -> { c1, c2 -> c1.source_order.compareTo(c2.source_order) }
 | 
			
		||||
                false -> { c1, c2 -> c2.source_order.compareTo(c1.source_order) }
 | 
			
		||||
            }
 | 
			
		||||
            Manga.CHAPTER_SORTING_NUMBER -> when (sortDescending()) {
 | 
			
		||||
                true -> { c1, c2 -> c2.chapter_number.compareTo(c1.chapter_number) }
 | 
			
		||||
                false -> { c1, c2 -> c1.chapter_number.compareTo(c2.chapter_number) }
 | 
			
		||||
            }
 | 
			
		||||
            Manga.CHAPTER_SORTING_UPLOAD_DATE -> when (sortDescending()) {
 | 
			
		||||
                true -> { c1, c2 -> c2.date_upload.compareTo(c1.date_upload) }
 | 
			
		||||
                false -> { c1, c2 -> c1.date_upload.compareTo(c2.date_upload) }
 | 
			
		||||
            }
 | 
			
		||||
            else -> throw NotImplementedError("Unimplemented sorting method")
 | 
			
		||||
        }
 | 
			
		||||
        return observable.toSortedList(getChapterSort(manga))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -478,7 +461,7 @@ class MangaPresenter(
 | 
			
		||||
     * Returns the next unread chapter or null if everything is read.
 | 
			
		||||
     */
 | 
			
		||||
    fun getNextUnreadChapter(): ChapterItem? {
 | 
			
		||||
        val chapters = chapters.sortedWith(getChapterSort())
 | 
			
		||||
        val chapters = chapters.sortedWith(getChapterSort(manga))
 | 
			
		||||
        return if (sortDescending()) {
 | 
			
		||||
            return chapters.findLast { !it.read }
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -486,6 +469,18 @@ class MangaPresenter(
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getUnreadChaptersSorted(): List<ChapterItem> {
 | 
			
		||||
        val chapters = chapters
 | 
			
		||||
            .sortedWith(getChapterSort(manga))
 | 
			
		||||
            .filter { !it.read && it.status == Download.State.NOT_DOWNLOADED }
 | 
			
		||||
            .distinctBy { it.name }
 | 
			
		||||
        return if (sortDescending()) {
 | 
			
		||||
            chapters.reversed()
 | 
			
		||||
        } else {
 | 
			
		||||
            chapters
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Mark the selected chapter list as read/unread.
 | 
			
		||||
     * @param selectedChapters the list of selected chapters.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,46 +0,0 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.reader
 | 
			
		||||
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Chapter
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Load strategy using the source order. This is the default ordering.
 | 
			
		||||
 */
 | 
			
		||||
class ChapterLoadBySource {
 | 
			
		||||
    fun get(allChapters: List<Chapter>): List<Chapter> {
 | 
			
		||||
        return allChapters.sortedByDescending { it.source_order }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Load strategy using unique chapter numbers with same scanlator preference.
 | 
			
		||||
 */
 | 
			
		||||
class ChapterLoadByNumber {
 | 
			
		||||
    fun get(allChapters: List<Chapter>, selectedChapter: Chapter): List<Chapter> {
 | 
			
		||||
        val chapters = mutableListOf<Chapter>()
 | 
			
		||||
        val chaptersByNumber = allChapters.groupBy { it.chapter_number }
 | 
			
		||||
 | 
			
		||||
        for ((number, chaptersForNumber) in chaptersByNumber) {
 | 
			
		||||
            val preferredChapter = when {
 | 
			
		||||
                // Make sure the selected chapter is always present
 | 
			
		||||
                number == selectedChapter.chapter_number -> selectedChapter
 | 
			
		||||
                // If there is only one chapter for this number, use it
 | 
			
		||||
                chaptersForNumber.size == 1 -> chaptersForNumber.first()
 | 
			
		||||
                // Prefer a chapter of the same scanlator as the selected
 | 
			
		||||
                else ->
 | 
			
		||||
                    chaptersForNumber.find { it.scanlator == selectedChapter.scanlator }
 | 
			
		||||
                        ?: chaptersForNumber.first()
 | 
			
		||||
            }
 | 
			
		||||
            chapters.add(preferredChapter)
 | 
			
		||||
        }
 | 
			
		||||
        return chapters.sortedBy { it.chapter_number }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Load strategy using the chapter upload date. This ordering ignores scanlators
 | 
			
		||||
 */
 | 
			
		||||
class ChapterLoadByUploadDate {
 | 
			
		||||
    fun get(allChapters: List<Chapter>): List<Chapter> {
 | 
			
		||||
        return allChapters.sortedBy { it.date_upload }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -23,6 +23,7 @@ import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.getChapterSort
 | 
			
		||||
import eu.kanade.tachiyomi.util.isLocal
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.byteSize
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.launchIO
 | 
			
		||||
@@ -123,12 +124,9 @@ class ReaderPresenter(
 | 
			
		||||
            else -> dbChapters
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        when (manga.sorting) {
 | 
			
		||||
            Manga.CHAPTER_SORTING_SOURCE -> ChapterLoadBySource().get(chaptersForReader)
 | 
			
		||||
            Manga.CHAPTER_SORTING_NUMBER -> ChapterLoadByNumber().get(chaptersForReader, selectedChapter)
 | 
			
		||||
            Manga.CHAPTER_SORTING_UPLOAD_DATE -> ChapterLoadByUploadDate().get(chaptersForReader)
 | 
			
		||||
            else -> error("Unknown sorting method")
 | 
			
		||||
        }.map(::ReaderChapter)
 | 
			
		||||
        chaptersForReader
 | 
			
		||||
            .sortedWith(getChapterSort(manga))
 | 
			
		||||
            .map(::ReaderChapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private var hasTrackers: Boolean = false
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
package eu.kanade.tachiyomi.util.chapter
 | 
			
		||||
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Chapter
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
 | 
			
		||||
fun getChapterSort(manga: Manga): (Chapter, Chapter) -> Int {
 | 
			
		||||
    val sortDescending = manga.sortDescending()
 | 
			
		||||
 | 
			
		||||
    return when (manga.sorting) {
 | 
			
		||||
        Manga.CHAPTER_SORTING_SOURCE -> when (sortDescending) {
 | 
			
		||||
            true -> { c1, c2 -> c1.source_order.compareTo(c2.source_order) }
 | 
			
		||||
            false -> { c1, c2 -> c2.source_order.compareTo(c1.source_order) }
 | 
			
		||||
        }
 | 
			
		||||
        Manga.CHAPTER_SORTING_NUMBER -> when (sortDescending) {
 | 
			
		||||
            true -> { c1, c2 -> c2.chapter_number.compareTo(c1.chapter_number) }
 | 
			
		||||
            false -> { c1, c2 -> c1.chapter_number.compareTo(c2.chapter_number) }
 | 
			
		||||
        }
 | 
			
		||||
        Manga.CHAPTER_SORTING_UPLOAD_DATE -> when (sortDescending) {
 | 
			
		||||
            true -> { c1, c2 -> c2.date_upload.compareTo(c1.date_upload) }
 | 
			
		||||
            false -> { c1, c2 -> c1.date_upload.compareTo(c2.date_upload) }
 | 
			
		||||
        }
 | 
			
		||||
        else -> throw NotImplementedError("Unimplemented sorting method")
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user