@ -6,17 +6,14 @@ import tachiyomi.domain.library.model.LibraryManga
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class LibraryItem (
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 ( ) ,
) {
var displayMode : Long = - 1
var downloadCount : Long = - 1
var unreadCount : Long = - 1
var isLocal = false
var sourceLanguage = " "
/ * *
* Checks if a query matches the manga
*
@ -25,73 +22,34 @@ class LibraryItem(
* /
fun matches ( constraint : String ) : Boolean {
val sourceName by lazy { sourceManager . getOrStub ( libraryManga . manga . source ) . getNameForMangaInfo ( ) }
val genres by lazy { libraryManga . manga . genre }
return libraryManga . manga . title . contains ( constraint , true ) ||
( libraryManga . manga . author ?. contains ( constraint , true ) ?: false ) ||
( libraryManga . manga . artist ?. contains ( constraint , true ) ?: false ) ||
( libraryManga . manga . description ?. contains ( constraint , true ) ?: false ) ||
if ( constraint . contains ( " , " ) ) {
constraint . split ( " , " ) . all { containsSourceOrGenre ( it . trim ( ) , sourceName , genres ) }
} else {
containsSourceOrGenre ( constraint , sourceName , genres )
constraint . split ( " , " ) . map { it . trim ( ) } . all { subconstraint ->
checkNegatableConstraint ( subconstraint ) {
sourceName . contains ( it , true ) ||
( libraryManga . manga . genre ?. any { genre -> genre . equals ( it , true ) } ?: false )
}
}
}
/ * *
* Filters a manga by checking whether the query is the manga ' s source OR part of
* the genres of the manga
* Checking for genre is done only if the query isn ' t part of the source name .
* Checks a predicate on a negatable constraint . If the constraint starts with a minus character ,
* the minus is stripped and the result of the predicate is inverted .
*
* @param query the query to check
* @param sourceName name of the manga ' s source
* @ param genres list containing manga ' s genres
* @param constraint the argument to the predicate . Inverts the predicate if it starts with '-' .
* @param predicate the check to be run against the constraint .
* @ return ! predicate ( x ) if constraint = " -x " , otherwise predicate ( constraint )
* /
private fun containsSourceOrGenre ( query : String , sourceName : String , genres : List < String > ? ) : Boolean {
val minus = query . startsWith ( " - " )
val tag = if ( minus ) { query . substringAfter ( " - " ) } else query
return when ( sourceName . contains ( tag , true ) ) {
false -> containsGenre ( query , genres )
else -> ! minus
}
}
private fun containsGenre ( tag : String , genres : List < String > ? ) : Boolean {
return if ( tag . startsWith ( " - " ) ) {
genres ?. find {
it . trim ( ) . equals ( tag . substringAfter ( " - " ) , ignoreCase = true )
} == null
private fun checkNegatableConstraint (
constraint : String ,
predicate : ( String ) -> Boolean ,
) : Boolean {
return if ( constraint . startsWith ( " - " ) ) {
! predicate ( constraint . substringAfter ( " - " ) . trimStart ( ) )
} else {
genres ?. find {
it . trim ( ) . equals ( tag , ignoreCase = true )
} != null
predicate ( constraint )
}
}
override fun equals ( other : Any ? ) : Boolean {
if ( this === other ) return true
if ( javaClass != other ?. javaClass ) return false
other as LibraryItem
if ( libraryManga != other . libraryManga ) return false
if ( sourceManager != other . sourceManager ) return false
if ( displayMode != other . displayMode ) return false
if ( downloadCount != other . downloadCount ) return false
if ( unreadCount != other . unreadCount ) return false
if ( isLocal != other . isLocal ) return false
if ( sourceLanguage != other . sourceLanguage ) return false
return true
}
override fun hashCode ( ) : Int {
var result = libraryManga . hashCode ( )
result = 31 * result + sourceManager . hashCode ( )
result = 31 * result + displayMode . hashCode ( )
result = 31 * result + downloadCount . toInt ( )
result = 31 * result + unreadCount . toInt ( )
result = 31 * result + isLocal . hashCode ( )
result = 31 * result + sourceLanguage . hashCode ( )
return result
}
}