Simplify filter logic (#9141)
* Remove unnecessary else branch * Add TriStateFilter applyFilter * Simplify filterFnTracking filter logic
This commit is contained in:
@@ -59,6 +59,7 @@ import tachiyomi.domain.manga.interactor.GetLibraryManga
|
||||
import tachiyomi.domain.manga.model.Manga
|
||||
import tachiyomi.domain.manga.model.MangaUpdate
|
||||
import tachiyomi.domain.manga.model.TriStateFilter
|
||||
import tachiyomi.domain.manga.model.applyFilter
|
||||
import tachiyomi.domain.track.interactor.GetTracksPerManga
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
@@ -171,7 +172,8 @@ class LibraryScreenModel(
|
||||
): LibraryMap {
|
||||
val prefs = getLibraryItemPreferencesFlow().first()
|
||||
val downloadedOnly = prefs.globalFilterDownloaded
|
||||
val filterDownloaded = prefs.filterDownloaded
|
||||
val filterDownloaded =
|
||||
if (downloadedOnly) TriStateFilter.ENABLED_IS else prefs.filterDownloaded
|
||||
val filterUnread = prefs.filterUnread
|
||||
val filterStarted = prefs.filterStarted
|
||||
val filterBookmarked = prefs.filterBookmarked
|
||||
@@ -183,61 +185,28 @@ class LibraryScreenModel(
|
||||
val includedTracks = loggedInTrackServices.mapNotNull { if (it.value == TriStateFilter.ENABLED_IS) it.key else null }
|
||||
val trackFiltersIsIgnored = includedTracks.isEmpty() && excludedTracks.isEmpty()
|
||||
|
||||
val filterFnDownloaded: (LibraryItem) -> Boolean = downloaded@{
|
||||
if (!downloadedOnly && filterDownloaded == TriStateFilter.DISABLED) return@downloaded true
|
||||
|
||||
val isDownloaded = it.libraryManga.manga.isLocal() ||
|
||||
it.downloadCount > 0 ||
|
||||
downloadManager.getDownloadCount(it.libraryManga.manga) > 0
|
||||
return@downloaded if (downloadedOnly || filterDownloaded == TriStateFilter.ENABLED_IS) {
|
||||
isDownloaded
|
||||
} else {
|
||||
!isDownloaded
|
||||
val filterFnDownloaded: (LibraryItem) -> Boolean = {
|
||||
applyFilter(filterDownloaded) {
|
||||
it.libraryManga.manga.isLocal() ||
|
||||
it.downloadCount > 0 ||
|
||||
downloadManager.getDownloadCount(it.libraryManga.manga) > 0
|
||||
}
|
||||
}
|
||||
|
||||
val filterFnUnread: (LibraryItem) -> Boolean = unread@{
|
||||
if (filterUnread == TriStateFilter.DISABLED) return@unread true
|
||||
|
||||
val isUnread = it.libraryManga.unreadCount > 0
|
||||
return@unread if (filterUnread == TriStateFilter.ENABLED_IS) {
|
||||
isUnread
|
||||
} else {
|
||||
!isUnread
|
||||
}
|
||||
val filterFnUnread: (LibraryItem) -> Boolean = {
|
||||
applyFilter(filterUnread) { it.libraryManga.unreadCount > 0 }
|
||||
}
|
||||
|
||||
val filterFnStarted: (LibraryItem) -> Boolean = started@{
|
||||
if (filterStarted == TriStateFilter.DISABLED) return@started true
|
||||
|
||||
val hasStarted = it.libraryManga.hasStarted
|
||||
return@started if (filterStarted == TriStateFilter.ENABLED_IS) {
|
||||
hasStarted
|
||||
} else {
|
||||
!hasStarted
|
||||
}
|
||||
val filterFnStarted: (LibraryItem) -> Boolean = {
|
||||
applyFilter(filterStarted) { it.libraryManga.hasStarted }
|
||||
}
|
||||
|
||||
val filterFnBookmarked: (LibraryItem) -> Boolean = bookmarked@{
|
||||
if (filterBookmarked == TriStateFilter.DISABLED) return@bookmarked true
|
||||
|
||||
val hasBookmarks = it.libraryManga.hasBookmarks
|
||||
return@bookmarked if (filterBookmarked == TriStateFilter.ENABLED_IS) {
|
||||
hasBookmarks
|
||||
} else {
|
||||
!hasBookmarks
|
||||
}
|
||||
val filterFnBookmarked: (LibraryItem) -> Boolean = {
|
||||
applyFilter(filterBookmarked) { it.libraryManga.hasBookmarks }
|
||||
}
|
||||
|
||||
val filterFnCompleted: (LibraryItem) -> Boolean = completed@{
|
||||
if (filterCompleted == TriStateFilter.DISABLED) return@completed true
|
||||
|
||||
val isCompleted = it.libraryManga.manga.status.toInt() == SManga.COMPLETED
|
||||
return@completed if (filterCompleted == TriStateFilter.ENABLED_IS) {
|
||||
isCompleted
|
||||
} else {
|
||||
!isCompleted
|
||||
}
|
||||
val filterFnCompleted: (LibraryItem) -> Boolean = {
|
||||
applyFilter(filterCompleted) { it.libraryManga.manga.status.toInt() == SManga.COMPLETED }
|
||||
}
|
||||
|
||||
val filterFnTracking: (LibraryItem) -> Boolean = tracking@{ item ->
|
||||
@@ -245,30 +214,19 @@ class LibraryScreenModel(
|
||||
|
||||
val mangaTracks = trackMap[item.libraryManga.id].orEmpty()
|
||||
|
||||
val exclude = mangaTracks.fastFilter { it in excludedTracks }
|
||||
val include = mangaTracks.fastFilter { it in includedTracks }
|
||||
val isExcluded = excludedTracks.isNotEmpty() && mangaTracks.fastAny { it in excludedTracks }
|
||||
val isIncluded = includedTracks.isEmpty() || mangaTracks.fastAny { it in includedTracks }
|
||||
|
||||
// TODO: Simplify the filter logic
|
||||
if (includedTracks.isNotEmpty() && excludedTracks.isNotEmpty()) {
|
||||
return@tracking if (exclude.isNotEmpty()) false else include.isNotEmpty()
|
||||
}
|
||||
|
||||
if (excludedTracks.isNotEmpty()) return@tracking exclude.isEmpty()
|
||||
|
||||
if (includedTracks.isNotEmpty()) return@tracking include.isNotEmpty()
|
||||
|
||||
return@tracking false
|
||||
return@tracking !isExcluded && isIncluded
|
||||
}
|
||||
|
||||
val filterFn: (LibraryItem) -> Boolean = filter@{
|
||||
return@filter !(
|
||||
!filterFnDownloaded(it) ||
|
||||
!filterFnUnread(it) ||
|
||||
!filterFnStarted(it) ||
|
||||
!filterFnBookmarked(it) ||
|
||||
!filterFnCompleted(it) ||
|
||||
!filterFnTracking(it)
|
||||
)
|
||||
val filterFn: (LibraryItem) -> Boolean = {
|
||||
filterFnDownloaded(it) &&
|
||||
filterFnUnread(it) &&
|
||||
filterFnStarted(it) &&
|
||||
filterFnBookmarked(it) &&
|
||||
filterFnCompleted(it) &&
|
||||
filterFnTracking(it)
|
||||
}
|
||||
|
||||
return this.mapValues { entry -> entry.value.fastFilter(filterFn) }
|
||||
|
||||
Reference in New Issue
Block a user