From 5bdd46420089b1db4fcce69b545b07c61e71e72e Mon Sep 17 00:00:00 2001 From: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> Date: Mon, 13 Oct 2025 13:10:31 +0700 Subject: [PATCH] feat(library): Improve category tab selection when searching/filtering library or adding/removing categories (#1233) * feat(library): Improve category tab selection when searching/filtering library or adding/removing categories * Improve active category index handling in LibraryScreenModel --- .../library/components/LibraryContent.kt | 15 +++++++++++-- .../ui/library/LibraryScreenModel.kt | 21 ++++++++++++++----- .../kanade/tachiyomi/ui/library/LibraryTab.kt | 3 +++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/library/components/LibraryContent.kt b/app/src/main/java/eu/kanade/presentation/library/components/LibraryContent.kt index 185c1eb55..1616db279 100644 --- a/app/src/main/java/eu/kanade/presentation/library/components/LibraryContent.kt +++ b/app/src/main/java/eu/kanade/presentation/library/components/LibraryContent.kt @@ -28,6 +28,9 @@ import kotlin.time.Duration.Companion.seconds @Composable fun LibraryContent( categories: List, + // KMK --> + activeCategoryIndex: Int, + // KMK <-- searchQuery: String?, selection: Set, contentPadding: PaddingValues, @@ -60,9 +63,17 @@ fun LibraryContent( if (showPageTabs && categories.isNotEmpty() && (categories.size > 1 || !categories.first().isSystemCategory)) { LaunchedEffect(categories) { - if (categories.size <= pagerState.currentPage) { - pagerState.scrollToPage(categories.size - 1) + // KMK --> + val targetPage = when { + categories.isEmpty() -> 0 + activeCategoryIndex != pagerState.currentPage -> activeCategoryIndex.coerceAtMost(categories.size - 1) + pagerState.currentPage >= categories.size -> categories.size - 1 + else -> pagerState.currentPage } + if (targetPage != pagerState.currentPage) { + pagerState.scrollToPage(targetPage) + } + // KMK <-- } LibraryTabs( categories = categories, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt index ce7436f60..14f658fdb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt @@ -1386,7 +1386,12 @@ class LibraryScreenModel( fun updateActiveCategoryIndex(index: Int) { val newIndex = mutableState.updateAndGet { state -> - state.copy(activeCategoryIndex = index) + state.copy( + activeCategoryIndex = index, + // KMK --> + activeCategoryId = state.displayedCategories.getOrNull(index)?.id, + // KMK <-- + ) } .coercedActiveCategoryIndex @@ -1653,6 +1658,9 @@ class LibraryScreenModel( val dialog: Dialog? = null, val libraryData: LibraryData = LibraryData(), private val activeCategoryIndex: Int = 0, + // KMK --> + private val activeCategoryId: Long? = null, + // KMK <-- private val groupedFavorites: Map> = emptyMap(), // SY --> val showSyncExh: Boolean = false, @@ -1671,10 +1679,13 @@ class LibraryScreenModel( */ val displayedCategories: List = groupedFavorites.keys.toList() - val coercedActiveCategoryIndex = activeCategoryIndex.coerceIn( - minimumValue = 0, - maximumValue = displayedCategories.lastIndex.coerceAtLeast(0), - ) + val coercedActiveCategoryIndex = /* KMK --> */ displayedCategories.indexOfFirst { it.id == activeCategoryId } + .takeIf { it != -1 } ?: activeCategoryIndex + // KMK <-- + .coerceIn( + minimumValue = 0, + maximumValue = displayedCategories.lastIndex.coerceAtLeast(0), + ) val activeCategory: Category? = displayedCategories.getOrNull(coercedActiveCategoryIndex) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt index 69a39f6ef..c1d1b7059 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt @@ -302,6 +302,9 @@ data object LibraryTab : Tab { else -> { LibraryContent( categories = state.displayedCategories, + // KMK --> + activeCategoryIndex = state.coercedActiveCategoryIndex, + // KMK <-- searchQuery = state.searchQuery, selection = state.selection, contentPadding = contentPadding,