|
@@ -11,9 +11,13 @@ import cafe.adriel.voyager.core.model.screenModelScope
|
|
|
import eu.kanade.core.preference.asState
|
|
|
import eu.kanade.core.util.addOrRemove
|
|
|
import eu.kanade.core.util.insertSeparators
|
|
|
+import eu.kanade.domain.chapter.interactor.GetAvailableScanlators
|
|
|
import eu.kanade.domain.chapter.interactor.SetReadStatus
|
|
|
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
|
|
|
+import eu.kanade.domain.manga.interactor.GetExcludedScanlators
|
|
|
+import eu.kanade.domain.manga.interactor.SetExcludedScanlators
|
|
|
import eu.kanade.domain.manga.interactor.UpdateManga
|
|
|
+import eu.kanade.domain.manga.model.chaptersFiltered
|
|
|
import eu.kanade.domain.manga.model.downloadedFilter
|
|
|
import eu.kanade.domain.manga.model.toSManga
|
|
|
import eu.kanade.domain.track.interactor.AddTracks
|
|
@@ -92,6 +96,9 @@ class MangaScreenModel(
|
|
|
private val downloadCache: DownloadCache = Injekt.get(),
|
|
|
private val getMangaAndChapters: GetMangaWithChapters = Injekt.get(),
|
|
|
private val getDuplicateLibraryManga: GetDuplicateLibraryManga = Injekt.get(),
|
|
|
+ private val getAvailableScanlators: GetAvailableScanlators = Injekt.get(),
|
|
|
+ private val getExcludedScanlators: GetExcludedScanlators = Injekt.get(),
|
|
|
+ private val setExcludedScanlators: SetExcludedScanlators = Injekt.get(),
|
|
|
private val setMangaChapterFlags: SetMangaChapterFlags = Injekt.get(),
|
|
|
private val setMangaDefaultChapterFlags: SetMangaDefaultChapterFlags = Injekt.get(),
|
|
|
private val setReadStatus: SetReadStatus = Injekt.get(),
|
|
@@ -154,7 +161,7 @@ class MangaScreenModel(
|
|
|
init {
|
|
|
screenModelScope.launchIO {
|
|
|
combine(
|
|
|
- getMangaAndChapters.subscribe(mangaId).distinctUntilChanged(),
|
|
|
+ getMangaAndChapters.subscribe(mangaId, applyScanlatorFilter = true).distinctUntilChanged(),
|
|
|
downloadCache.changes,
|
|
|
downloadManager.queueState,
|
|
|
) { mangaAndChapters, _, _ -> mangaAndChapters }
|
|
@@ -168,11 +175,31 @@ class MangaScreenModel(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ screenModelScope.launchIO {
|
|
|
+ getExcludedScanlators.subscribe(mangaId)
|
|
|
+ .distinctUntilChanged()
|
|
|
+ .collectLatest { excludedScanlators ->
|
|
|
+ updateSuccessState {
|
|
|
+ it.copy(excludedScanlators = excludedScanlators)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ screenModelScope.launchIO {
|
|
|
+ getAvailableScanlators.subscribe(mangaId)
|
|
|
+ .distinctUntilChanged()
|
|
|
+ .collectLatest { availableScanlators ->
|
|
|
+ updateSuccessState {
|
|
|
+ it.copy(availableScanlators = availableScanlators)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
observeDownloads()
|
|
|
|
|
|
screenModelScope.launchIO {
|
|
|
val manga = getMangaAndChapters.awaitManga(mangaId)
|
|
|
- val chapters = getMangaAndChapters.awaitChapters(mangaId)
|
|
|
+ val chapters = getMangaAndChapters.awaitChapters(mangaId, applyScanlatorFilter = true)
|
|
|
.toChapterListItems(manga)
|
|
|
|
|
|
if (!manga.favorite) {
|
|
@@ -189,6 +216,8 @@ class MangaScreenModel(
|
|
|
source = Injekt.get<SourceManager>().getOrStub(manga.source),
|
|
|
isFromSource = isFromSource,
|
|
|
chapters = chapters,
|
|
|
+ availableScanlators = getAvailableScanlators.await(mangaId),
|
|
|
+ excludedScanlators = getExcludedScanlators.await(mangaId),
|
|
|
isRefreshingData = needRefreshInfo || needRefreshChapter,
|
|
|
dialog = null,
|
|
|
)
|
|
@@ -995,6 +1024,12 @@ class MangaScreenModel(
|
|
|
updateSuccessState { it.copy(dialog = Dialog.FullCover) }
|
|
|
}
|
|
|
|
|
|
+ fun setExcludedScanlators(excludedScanlators: Set<String>) {
|
|
|
+ screenModelScope.launchIO {
|
|
|
+ setExcludedScanlators.await(mangaId, excludedScanlators)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
sealed interface State {
|
|
|
@Immutable
|
|
|
data object Loading : State
|
|
@@ -1005,12 +1040,13 @@ class MangaScreenModel(
|
|
|
val source: Source,
|
|
|
val isFromSource: Boolean,
|
|
|
val chapters: List<ChapterList.Item>,
|
|
|
+ val availableScanlators: Set<String>,
|
|
|
+ val excludedScanlators: Set<String>,
|
|
|
val trackItems: List<TrackItem> = emptyList(),
|
|
|
val isRefreshingData: Boolean = false,
|
|
|
val dialog: Dialog? = null,
|
|
|
val hasPromptedToAddBefore: Boolean = false,
|
|
|
) : State {
|
|
|
-
|
|
|
val processedChapters by lazy {
|
|
|
chapters.applyFilters(manga).toList()
|
|
|
}
|
|
@@ -1042,6 +1078,12 @@ class MangaScreenModel(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ val scanlatorFilterActive: Boolean
|
|
|
+ get() = excludedScanlators.intersect(availableScanlators).isNotEmpty()
|
|
|
+
|
|
|
+ val filterActive: Boolean
|
|
|
+ get() = scanlatorFilterActive || manga.chaptersFiltered()
|
|
|
+
|
|
|
val trackingAvailable: Boolean
|
|
|
get() = trackItems.isNotEmpty()
|
|
|
|