mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2024-11-09 19:25:10 +01:00
Long press in global search to add to/remove from library
This commit is contained in:
parent
a33f339c19
commit
9e813f773b
@ -18,6 +18,8 @@ import eu.kanade.tachiyomi.source.SourceManager
|
|||||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
||||||
import eu.kanade.tachiyomi.ui.main.BottomNavBarInterface
|
import eu.kanade.tachiyomi.ui.main.BottomNavBarInterface
|
||||||
import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationListController
|
import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationListController
|
||||||
|
import eu.kanade.tachiyomi.ui.source.browse.BrowseSourceItem
|
||||||
|
import eu.kanade.tachiyomi.ui.source.global_search.GlobalSearchCardAdapter
|
||||||
import eu.kanade.tachiyomi.ui.source.global_search.GlobalSearchController
|
import eu.kanade.tachiyomi.ui.source.global_search.GlobalSearchController
|
||||||
import eu.kanade.tachiyomi.ui.source.global_search.GlobalSearchPresenter
|
import eu.kanade.tachiyomi.ui.source.global_search.GlobalSearchPresenter
|
||||||
import eu.kanade.tachiyomi.util.view.withFadeTransaction
|
import eu.kanade.tachiyomi.util.view.withFadeTransaction
|
||||||
@ -126,8 +128,9 @@ class SearchController(
|
|||||||
dialog.showDialog(router)
|
dialog.showDialog(router)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMangaLongClick(manga: Manga) {
|
override fun onMangaLongClick(position: Int, adapter: GlobalSearchCardAdapter) {
|
||||||
// Call parent's default click listener
|
// Call parent's default click listener
|
||||||
|
val manga = adapter.getItem(position)?.manga ?: return
|
||||||
super.onMangaClick(manga)
|
super.onMangaClick(manga)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,6 +22,6 @@ class GlobalSearchCardAdapter(controller: GlobalSearchController) :
|
|||||||
*/
|
*/
|
||||||
interface OnMangaClickListener {
|
interface OnMangaClickListener {
|
||||||
fun onMangaClick(manga: Manga)
|
fun onMangaClick(manga: Manga)
|
||||||
fun onMangaLongClick(manga: Manga)
|
fun onMangaLongClick(position: Int, adapter: GlobalSearchCardAdapter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,17 +7,23 @@ import android.view.MenuInflater
|
|||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.appcompat.widget.SearchView
|
import androidx.appcompat.widget.SearchView
|
||||||
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents
|
import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.databinding.SourceGlobalSearchControllerBinding
|
import eu.kanade.tachiyomi.databinding.SourceGlobalSearchControllerBinding
|
||||||
import eu.kanade.tachiyomi.source.CatalogueSource
|
import eu.kanade.tachiyomi.source.CatalogueSource
|
||||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
|
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
|
||||||
|
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||||
import eu.kanade.tachiyomi.ui.manga.MangaDetailsController
|
import eu.kanade.tachiyomi.ui.manga.MangaDetailsController
|
||||||
|
import eu.kanade.tachiyomi.util.addOrRemoveToFavorites
|
||||||
import eu.kanade.tachiyomi.util.view.activityBinding
|
import eu.kanade.tachiyomi.util.view.activityBinding
|
||||||
import eu.kanade.tachiyomi.util.view.scrollViewWith
|
import eu.kanade.tachiyomi.util.view.scrollViewWith
|
||||||
|
import eu.kanade.tachiyomi.util.view.snack
|
||||||
import eu.kanade.tachiyomi.util.view.updatePaddingRelative
|
import eu.kanade.tachiyomi.util.view.updatePaddingRelative
|
||||||
import eu.kanade.tachiyomi.util.view.withFadeTransaction
|
import eu.kanade.tachiyomi.util.view.withFadeTransaction
|
||||||
|
import uy.kohesive.injekt.injectLazy
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This controller shows and manages the different search result in global search.
|
* This controller shows and manages the different search result in global search.
|
||||||
@ -30,6 +36,11 @@ open class GlobalSearchController(
|
|||||||
) : NucleusController<SourceGlobalSearchControllerBinding, GlobalSearchPresenter>(),
|
) : NucleusController<SourceGlobalSearchControllerBinding, GlobalSearchPresenter>(),
|
||||||
GlobalSearchCardAdapter.OnMangaClickListener {
|
GlobalSearchCardAdapter.OnMangaClickListener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Preferences helper.
|
||||||
|
*/
|
||||||
|
private val preferences: PreferencesHelper by injectLazy()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adapter containing search results grouped by lang.
|
* Adapter containing search results grouped by lang.
|
||||||
*/
|
*/
|
||||||
@ -37,6 +48,11 @@ open class GlobalSearchController(
|
|||||||
|
|
||||||
private var customTitle: String? = null
|
private var customTitle: String? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Snackbar containing an error message when a request fails.
|
||||||
|
*/
|
||||||
|
private var snack: Snackbar? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when controller is initialized.
|
* Called when controller is initialized.
|
||||||
*/
|
*/
|
||||||
@ -79,9 +95,27 @@ open class GlobalSearchController(
|
|||||||
*
|
*
|
||||||
* @param manga clicked item containing manga information.
|
* @param manga clicked item containing manga information.
|
||||||
*/
|
*/
|
||||||
override fun onMangaLongClick(manga: Manga) {
|
override fun onMangaLongClick(position: Int, adapter: GlobalSearchCardAdapter) {
|
||||||
// Delegate to single click by default.
|
val manga = adapter.getItem(position)?.manga ?: return
|
||||||
onMangaClick(manga)
|
|
||||||
|
val view = view ?: return
|
||||||
|
val activity = activity ?: return
|
||||||
|
snack?.dismiss()
|
||||||
|
snack = manga.addOrRemoveToFavorites(
|
||||||
|
presenter.db,
|
||||||
|
preferences,
|
||||||
|
view,
|
||||||
|
activity,
|
||||||
|
onMangaAdded = {
|
||||||
|
adapter.notifyItemChanged(position)
|
||||||
|
snack = view.snack(R.string.added_to_library)
|
||||||
|
},
|
||||||
|
onMangaMoved = { adapter.notifyItemChanged(position) },
|
||||||
|
onMangaDeleted = { presenter.confirmDeletion(manga) }
|
||||||
|
)
|
||||||
|
if (snack?.duration == Snackbar.LENGTH_INDEFINITE) {
|
||||||
|
(activity as? MainActivity)?.setUndoSnackBar(snack)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,10 +24,7 @@ class GlobalSearchMangaHolder(view: View, adapter: GlobalSearchCardAdapter) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
itemView.setOnLongClickListener {
|
itemView.setOnLongClickListener {
|
||||||
val item = adapter.getItem(flexibleAdapterPosition)
|
adapter.mangaClickListener.onMangaLongClick(flexibleAdapterPosition, adapter)
|
||||||
if (item != null) {
|
|
||||||
adapter.mangaClickListener.onMangaLongClick(item.manga)
|
|
||||||
}
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package eu.kanade.tachiyomi.ui.source.global_search
|
package eu.kanade.tachiyomi.ui.source.global_search
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import eu.kanade.tachiyomi.data.cache.CoverCache
|
||||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
|
import eu.kanade.tachiyomi.data.download.DownloadManager
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
||||||
import eu.kanade.tachiyomi.extension.ExtensionManager
|
import eu.kanade.tachiyomi.extension.ExtensionManager
|
||||||
@ -38,7 +40,8 @@ open class GlobalSearchPresenter(
|
|||||||
private val sourcesToUse: List<CatalogueSource>? = null,
|
private val sourcesToUse: List<CatalogueSource>? = null,
|
||||||
val sourceManager: SourceManager = Injekt.get(),
|
val sourceManager: SourceManager = Injekt.get(),
|
||||||
val db: DatabaseHelper = Injekt.get(),
|
val db: DatabaseHelper = Injekt.get(),
|
||||||
private val preferencesHelper: PreferencesHelper = Injekt.get()
|
private val preferencesHelper: PreferencesHelper = Injekt.get(),
|
||||||
|
private val coverCache: CoverCache = Injekt.get()
|
||||||
) : BasePresenter<GlobalSearchController>() {
|
) : BasePresenter<GlobalSearchController>() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -146,6 +149,14 @@ open class GlobalSearchPresenter(
|
|||||||
return GlobalSearchItem(source, results)
|
return GlobalSearchItem(source, results)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun confirmDeletion(manga: Manga) {
|
||||||
|
coverCache.deleteFromCache(manga)
|
||||||
|
val downloadManager: DownloadManager = Injekt.get()
|
||||||
|
sourceManager.get(manga.source)?.let { source ->
|
||||||
|
downloadManager.deleteManga(manga, source)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initiates a search for manga per catalogue.
|
* Initiates a search for manga per catalogue.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user