Local genre tag searching (#2423)
Using the search bar in My Library, you can search tags for manga (ie. "Romance") or exclude (ie. "-Comedy") You can also search multiple by seperating by commas (ie. "Romance, -Comedy") Clicking the tag in manga info from the library also performs a local serach
This commit is contained in:
parent
8b0458cdf6
commit
01f9b25be2
4 changed files with 42 additions and 3 deletions
|
@ -342,6 +342,10 @@ class LibraryController(
|
||||||
searchItem.fixExpand(onExpand = { invalidateMenuOnExpand() })
|
searchItem.fixExpand(onExpand = { invalidateMenuOnExpand() })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun search(query:String) {
|
||||||
|
this.query = query
|
||||||
|
}
|
||||||
|
|
||||||
override fun onPrepareOptionsMenu(menu: Menu) {
|
override fun onPrepareOptionsMenu(menu: Menu) {
|
||||||
val navView = navView ?: return
|
val navView = navView ?: return
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,22 @@ class LibraryItem(val manga: LibraryManga, private val libraryAsList: Preference
|
||||||
*/
|
*/
|
||||||
override fun filter(constraint: String): Boolean {
|
override fun filter(constraint: String): Boolean {
|
||||||
return manga.title.contains(constraint, true) ||
|
return manga.title.contains(constraint, true) ||
|
||||||
(manga.author?.contains(constraint, true) ?: false)
|
(manga.author?.contains(constraint, true) ?: false) ||
|
||||||
|
if (constraint.contains(",")) {
|
||||||
|
val genres = manga.genre?.split(", ")
|
||||||
|
constraint.split(",").all { containsGenre(it.trim(), genres) }
|
||||||
|
}
|
||||||
|
else containsGenre(constraint, manga.genre?.split(", "))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun containsGenre(tag: String, genres: List<String>?): Boolean {
|
||||||
|
return if (tag.startsWith("-"))
|
||||||
|
genres?.find {
|
||||||
|
it.trim().toLowerCase() == tag.substringAfter("-").toLowerCase()
|
||||||
|
} == null
|
||||||
|
else
|
||||||
|
genres?.find {
|
||||||
|
it.trim().toLowerCase() == tag.toLowerCase() } != null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
|
|
|
@ -350,6 +350,11 @@ class ChaptersController : NucleusController<ChaptersPresenter>(),
|
||||||
actionMode = null
|
actionMode = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onDetach(view: View) {
|
||||||
|
destroyActionModeIfNeeded()
|
||||||
|
super.onDetach(view)
|
||||||
|
}
|
||||||
|
|
||||||
override fun onMenuItemClick(position: Int, item: MenuItem) {
|
override fun onMenuItemClick(position: Int, item: MenuItem) {
|
||||||
val chapter = adapter?.getItem(position) ?: return
|
val chapter = adapter?.getItem(position) ?: return
|
||||||
val chapters = listOf(chapter)
|
val chapters = listOf(chapter)
|
||||||
|
|
|
@ -38,6 +38,7 @@ import eu.kanade.tachiyomi.ui.base.controller.NucleusController
|
||||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
|
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
|
||||||
import eu.kanade.tachiyomi.ui.catalogue.global_search.CatalogueSearchController
|
import eu.kanade.tachiyomi.ui.catalogue.global_search.CatalogueSearchController
|
||||||
import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog
|
import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog
|
||||||
|
import eu.kanade.tachiyomi.ui.library.LibraryController
|
||||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||||
import eu.kanade.tachiyomi.ui.manga.MangaController
|
import eu.kanade.tachiyomi.ui.manga.MangaController
|
||||||
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
|
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
|
||||||
|
@ -121,7 +122,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
|
||||||
copyToClipboard(view.context.getString(R.string.description), manga_summary.text.toString())
|
copyToClipboard(view.context.getString(R.string.description), manga_summary.text.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
//manga_genres_tags.setOnTagClickListener { tag -> performGlobalSearch(tag) }
|
manga_genres_tags.setOnTagClickListener { tag -> performLocalSearch(tag) }
|
||||||
|
|
||||||
manga_cover.longClicks().subscribeUntilDestroy {
|
manga_cover.longClicks().subscribeUntilDestroy {
|
||||||
copyToClipboard(view.context.getString(R.string.title), presenter.manga.title)
|
copyToClipboard(view.context.getString(R.string.title), presenter.manga.title)
|
||||||
|
@ -525,11 +526,25 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
|
||||||
*
|
*
|
||||||
* @param query the search query to pass to the search controller
|
* @param query the search query to pass to the search controller
|
||||||
*/
|
*/
|
||||||
fun performGlobalSearch(query: String) {
|
private fun performGlobalSearch(query: String) {
|
||||||
val router = parentController?.router ?: return
|
val router = parentController?.router ?: return
|
||||||
router.pushController(CatalogueSearchController(query).withFadeTransaction())
|
router.pushController(CatalogueSearchController(query).withFadeTransaction())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a local search using the provided query.
|
||||||
|
*
|
||||||
|
* @param query the search query to pass to the library controller
|
||||||
|
*/
|
||||||
|
private fun performLocalSearch(query: String) {
|
||||||
|
val router = parentController?.router ?: return
|
||||||
|
val firstController = router.backstack.first()?.controller()
|
||||||
|
if (firstController is LibraryController && router.backstack.size == 2) {
|
||||||
|
router.handleBack()
|
||||||
|
firstController.search(query)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create shortcut using ShortcutManager.
|
* Create shortcut using ShortcutManager.
|
||||||
*
|
*
|
||||||
|
|
Reference in a new issue