Updating logic of hopper
Also empty categories now show catergory is empty, even if filter is on
This commit is contained in:
parent
6f9a437bb9
commit
45fc923f34
@ -175,16 +175,8 @@ class LibraryController(
|
|||||||
category_hopper_frame.translationY += dy
|
category_hopper_frame.translationY += dy
|
||||||
category_hopper_frame.translationY =
|
category_hopper_frame.translationY =
|
||||||
category_hopper_frame.translationY.coerceIn(0f, 60f.dpToPx)
|
category_hopper_frame.translationY.coerceIn(0f, 60f.dpToPx)
|
||||||
up_category.alpha = if (!recycler.canScrollVertically(-1)) {
|
up_category.alpha = if (isAtTop()) 0.25f else 1f
|
||||||
0.25f
|
down_category.alpha = if (isAtBottom()) 0.25f else 1f
|
||||||
} else {
|
|
||||||
1f
|
|
||||||
}
|
|
||||||
down_category.alpha = if (!recycler.canScrollVertically(1)) {
|
|
||||||
0.25f
|
|
||||||
} else {
|
|
||||||
1f
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (!filter_bottom_sheet.sheetBehavior.isHidden()) {
|
if (!filter_bottom_sheet.sheetBehavior.isHidden()) {
|
||||||
scrollDistance += abs(dy)
|
scrollDistance += abs(dy)
|
||||||
@ -249,6 +241,22 @@ class LibraryController(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun isAtTop(): Boolean {
|
||||||
|
return if (presenter.showAllCategories) {
|
||||||
|
getVisibleHeader() == adapter.headerItems.firstOrNull()
|
||||||
|
} else {
|
||||||
|
getVisibleHeader()?.category?.id == presenter.categories.firstOrNull()?.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isAtBottom(): Boolean {
|
||||||
|
return if (presenter.showAllCategories) {
|
||||||
|
getVisibleHeader() == adapter.headerItems.lastOrNull()
|
||||||
|
} else {
|
||||||
|
getVisibleHeader()?.category?.id == presenter.categories.lastOrNull()?.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun showFilterTip() {
|
private fun showFilterTip() {
|
||||||
if (preferences.shownFilterTutorial().get()) return
|
if (preferences.shownFilterTutorial().get()) return
|
||||||
val activity = activity ?: return
|
val activity = activity ?: return
|
||||||
@ -381,24 +389,10 @@ class LibraryController(
|
|||||||
|
|
||||||
category_hopper_frame.gone()
|
category_hopper_frame.gone()
|
||||||
down_category.setOnClickListener {
|
down_category.setOnClickListener {
|
||||||
val position = getVisibleHeader() ?: return@setOnClickListener
|
jumpToNextCategory(true)
|
||||||
val newOffset = adapter.headerItems.indexOf(position) + 1
|
|
||||||
if (newOffset < presenter.categories.size) {
|
|
||||||
val newOrder = (adapter.headerItems[newOffset] as LibraryHeaderItem).category.order
|
|
||||||
scrollToHeader(newOrder)
|
|
||||||
} else {
|
|
||||||
recycler.scrollToPosition(adapter.itemCount - 1)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
up_category.setOnClickListener {
|
up_category.setOnClickListener {
|
||||||
val position = getVisibleHeader() ?: return@setOnClickListener
|
jumpToNextCategory(false)
|
||||||
val newOffset = adapter.headerItems.indexOf(position) - 1
|
|
||||||
if (newOffset > -1) {
|
|
||||||
val newOrder = (adapter.headerItems[newOffset] as LibraryHeaderItem).category.order
|
|
||||||
scrollToHeader(newOrder)
|
|
||||||
} else {
|
|
||||||
recycler.scrollToPosition(0)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
down_category.setOnLongClickListener {
|
down_category.setOnLongClickListener {
|
||||||
recycler.scrollToPosition(adapter.itemCount - 1)
|
recycler.scrollToPosition(adapter.itemCount - 1)
|
||||||
@ -506,6 +500,37 @@ class LibraryController(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun jumpToNextCategory(next: Boolean) {
|
||||||
|
val category = getVisibleHeader() ?: return
|
||||||
|
if (presenter.showAllCategories) {
|
||||||
|
val newOffset = adapter.headerItems.indexOf(category) + (if (next) 1 else -1)
|
||||||
|
if (if (!next) {
|
||||||
|
newOffset > -1
|
||||||
|
} else {
|
||||||
|
newOffset < adapter.headerItems.size
|
||||||
|
}) {
|
||||||
|
val newOrder =
|
||||||
|
(adapter.headerItems[newOffset] as LibraryHeaderItem).category.order
|
||||||
|
scrollToHeader(newOrder)
|
||||||
|
} else {
|
||||||
|
recycler.scrollToPosition(if (next) adapter.itemCount - 1 else 0)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val newOffset =
|
||||||
|
presenter.categories.indexOfFirst { presenter.currentCategory == it.id } +
|
||||||
|
(if (next) 1 else -1)
|
||||||
|
if (if (!next) {
|
||||||
|
newOffset > -1
|
||||||
|
} else {
|
||||||
|
newOffset < presenter.categories.size
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
val newOrder = presenter.categories[newOffset].order
|
||||||
|
scrollToHeader(newOrder)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun getHeader(): LibraryHeaderItem? {
|
private fun getHeader(): LibraryHeaderItem? {
|
||||||
val position =
|
val position =
|
||||||
(recycler.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition()
|
(recycler.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition()
|
||||||
|
@ -16,11 +16,11 @@ import eu.kanade.tachiyomi.source.SourceManager
|
|||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import eu.kanade.tachiyomi.ui.library.filter.FilterBottomSheet
|
import eu.kanade.tachiyomi.ui.library.filter.FilterBottomSheet
|
||||||
import eu.kanade.tachiyomi.util.lang.removeArticles
|
|
||||||
import eu.kanade.tachiyomi.util.system.executeOnIO
|
|
||||||
import eu.kanade.tachiyomi.ui.library.filter.FilterBottomSheet.Companion.STATE_EXCLUDE
|
import eu.kanade.tachiyomi.ui.library.filter.FilterBottomSheet.Companion.STATE_EXCLUDE
|
||||||
import eu.kanade.tachiyomi.ui.library.filter.FilterBottomSheet.Companion.STATE_IGNORE
|
import eu.kanade.tachiyomi.ui.library.filter.FilterBottomSheet.Companion.STATE_IGNORE
|
||||||
import eu.kanade.tachiyomi.ui.library.filter.FilterBottomSheet.Companion.STATE_INCLUDE
|
import eu.kanade.tachiyomi.ui.library.filter.FilterBottomSheet.Companion.STATE_INCLUDE
|
||||||
|
import eu.kanade.tachiyomi.util.lang.removeArticles
|
||||||
|
import eu.kanade.tachiyomi.util.system.executeOnIO
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
@ -110,7 +110,21 @@ class LibraryPresenter(
|
|||||||
preferences.lastUsedCategory().set(order)
|
preferences.lastUsedCategory().set(order)
|
||||||
val category = categories.find { it.order == order }?.id ?: return
|
val category = categories.find { it.order == order }?.id ?: return
|
||||||
currentCategory = category
|
currentCategory = category
|
||||||
view.onNextLibraryUpdate(sectionedLibraryItems[currentCategory] ?: emptyList())
|
view.onNextLibraryUpdate(
|
||||||
|
sectionedLibraryItems[currentCategory] ?: blankItem()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun blankItem(id: Int = currentCategory): List<LibraryItem> {
|
||||||
|
return listOf(
|
||||||
|
LibraryItem(
|
||||||
|
LibraryManga.createBlank(id), LibraryHeaderItem(
|
||||||
|
{ getCategory(id) },
|
||||||
|
id,
|
||||||
|
preferences.alwaysShowSeeker()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun restoreLibrary() {
|
fun restoreLibrary() {
|
||||||
@ -124,7 +138,7 @@ class LibraryPresenter(
|
|||||||
}
|
}
|
||||||
view.onNextLibraryUpdate(
|
view.onNextLibraryUpdate(
|
||||||
if (!show) sectionedLibraryItems[currentCategory]
|
if (!show) sectionedLibraryItems[currentCategory]
|
||||||
?: sectionedLibraryItems[categories.first().id] ?: emptyList()
|
?: sectionedLibraryItems[categories.first().id] ?: blankItem()
|
||||||
else libraryItems, true
|
else libraryItems, true
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -141,7 +155,7 @@ class LibraryPresenter(
|
|||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
view.onNextLibraryUpdate(
|
view.onNextLibraryUpdate(
|
||||||
if (!show) sectionedLibraryItems[currentCategory]
|
if (!show) sectionedLibraryItems[currentCategory]
|
||||||
?: sectionedLibraryItems[categories.first().id] ?: emptyList()
|
?: sectionedLibraryItems[categories.first().id] ?: blankItem()
|
||||||
else libraryItems, freshStart
|
else libraryItems, freshStart
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -168,15 +182,32 @@ class LibraryPresenter(
|
|||||||
return items.filter f@{ item ->
|
return items.filter f@{ item ->
|
||||||
if (item.manga.status == -1) {
|
if (item.manga.status == -1) {
|
||||||
return@f sectionedLibraryItems[item.manga.category]?.any {
|
return@f sectionedLibraryItems[item.manga.category]?.any {
|
||||||
matchesFilters(it, filterDownloaded, filterUnread, filterCompleted,
|
matchesFilters(
|
||||||
filterTracked, filterMangaType, filterTrackers)
|
it,
|
||||||
|
filterDownloaded,
|
||||||
|
filterUnread,
|
||||||
|
filterCompleted,
|
||||||
|
filterTracked,
|
||||||
|
filterMangaType,
|
||||||
|
filterTrackers
|
||||||
|
)
|
||||||
} ?: false
|
} ?: false
|
||||||
} else if (item.manga.isBlank()) {
|
} else if (item.manga.isBlank()) {
|
||||||
return@f filterDownloaded == 0 && filterUnread == 0 && filterCompleted == 0 &&
|
return@f if (showAllCategories) {
|
||||||
filterTracked == 0 && filterMangaType == 0
|
filterDownloaded == 0 && filterUnread == 0 && filterCompleted == 0 && filterTracked == 0 && filterMangaType == 0
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
matchesFilters(item, filterDownloaded, filterUnread, filterCompleted, filterTracked,
|
matchesFilters(
|
||||||
filterMangaType, filterTrackers)
|
item,
|
||||||
|
filterDownloaded,
|
||||||
|
filterUnread,
|
||||||
|
filterCompleted,
|
||||||
|
filterTracked,
|
||||||
|
filterMangaType,
|
||||||
|
filterTrackers
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user