Extract badge data separately when forming LibraryItem (#3382)

This commit is contained in:
AntsyLich
2026-06-05 00:25:42 +06:00
committed by GitHub
parent a1ad33baef
commit c612a6ca8d
7 changed files with 53 additions and 47 deletions
@@ -4,18 +4,15 @@ import eu.kanade.tachiyomi.source.getNameForMangaInfo
import tachiyomi.domain.library.model.LibraryManga
import tachiyomi.domain.source.service.SourceManager
import tachiyomi.source.local.LocalSource
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
private const val LOCAL_SOURCE_ID_ALIAS = "local"
data class LibraryItem(
val libraryManga: LibraryManga,
val downloadCount: Long = -1,
val unreadCount: Long = -1,
val isLocal: Boolean = false,
val sourceLanguage: String = "",
private val sourceManager: SourceManager = Injekt.get(),
val downloadCount: Int,
val unreadCount: Long,
val isLocal: Boolean,
val badges: Badges,
) {
val id: Long = libraryManga.id
@@ -25,7 +22,7 @@ data class LibraryItem(
* @param constraint the query to check.
* @return true if the manga matches the query, false otherwise.
*/
fun matches(constraint: String): Boolean {
fun matches(constraint: String, sourceManager: SourceManager): Boolean {
val source = sourceManager.getOrStub(libraryManga.manga.source)
val sourceName by lazy { source.getNameForMangaInfo() }
if (constraint.startsWith("id:", true)) {
@@ -68,4 +65,11 @@ data class LibraryItem(
predicate(constraint)
}
}
data class Badges(
val downloadCount: Int,
val unreadCount: Long,
val isLocal: Boolean,
val sourceLanguage: String,
)
}
@@ -100,7 +100,7 @@ class LibraryScreenModel(
val showSystemCategory = favorites.any { it.libraryManga.categories.contains(0) }
val filteredFavorites = favorites
.applyFilters(tracksMap, trackingFilters, itemPreferences)
.let { if (searchQuery == null) it else it.filter { m -> m.matches(searchQuery) } }
.let { if (searchQuery == null) it else it.filter { m -> m.matches(searchQuery, sourceManager) } }
LibraryData(
isInitialized = true,
@@ -200,11 +200,7 @@ class LibraryScreenModel(
val trackFiltersIsIgnored = includedTracks.isEmpty() && excludedTracks.isEmpty()
val filterFnDownloaded: (LibraryItem) -> Boolean = {
applyFilter(filterDownloaded) {
it.libraryManga.manga.isLocal() ||
it.downloadCount > 0 ||
downloadManager.getDownloadCount(it.libraryManga.manga) > 0
}
applyFilter(filterDownloaded) { it.isLocal || it.downloadCount > 0 }
}
val filterFnUnread: (LibraryItem) -> Boolean = {
@@ -390,26 +386,31 @@ class LibraryScreenModel(
libraryManga.map { manga ->
LibraryItem(
libraryManga = manga,
downloadCount = if (preferences.downloadBadge) {
downloadManager.getDownloadCount(manga.manga).toLong()
} else {
0
},
unreadCount = if (preferences.unreadBadge) {
manga.unreadCount
} else {
0
},
isLocal = if (preferences.localBadge) {
manga.manga.isLocal()
} else {
false
},
sourceLanguage = if (preferences.languageBadge) {
sourceManager.getOrStub(manga.manga.source).lang
} else {
""
},
downloadCount = downloadManager.getDownloadCount(manga.manga),
unreadCount = manga.unreadCount,
isLocal = manga.manga.isLocal(),
badges = LibraryItem.Badges(
downloadCount = if (preferences.downloadBadge) {
downloadManager.getDownloadCount(manga.manga)
} else {
0
},
unreadCount = if (preferences.unreadBadge) {
manga.unreadCount
} else {
0
},
isLocal = if (preferences.localBadge) {
manga.manga.isLocal()
} else {
false
},
sourceLanguage = if (preferences.languageBadge) {
sourceManager.getOrStub(manga.manga.source).lang
} else {
""
},
),
)
}
}