From 004b63dfb53a677aaeeaf602b320c985f9530ecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferm=C3=ADn=20Cirella?= Date: Wed, 10 Sep 2025 00:02:36 -0300 Subject: [PATCH] feat(library): Add library preference to show empty categories during search/filtering (#1088) * feat(library): Add library preference to show empty categories during search/filtering * Add comment back * Fix formatting * subscribe to changes & refactor Regex * format --------- Co-authored-by: Cuong-Tran --- .../settings/screen/SettingsLibraryScreen.kt | 7 +++++ .../ui/library/LibraryScreenModel.kt | 28 ++++++++++++------- .../library/service/LibraryPreferences.kt | 4 +++ .../moko-resources/base/strings.xml | 1 + 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt index 4d58a79b5..22d48fe72 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt @@ -50,6 +50,7 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object SettingsLibraryScreen : SearchableSettings { + @Suppress("unused") private fun readResolve(): Any = SettingsLibraryScreen @Composable @@ -291,6 +292,12 @@ object SettingsLibraryScreen : SearchableSettings { preference = libraryPreferences.hideMissingChapters(), title = stringResource(MR.strings.pref_hide_missing_chapter_indicators), ), + // KMK --> + Preference.PreferenceItem.SwitchPreference( + preference = libraryPreferences.showEmptyCategoriesSearch(), + title = stringResource(KMR.strings.pref_show_empty_categories_search), + ), + // KMK <-- ), ) } 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 b78a37398..6d4034b10 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 @@ -252,7 +252,8 @@ class LibraryScreenModel( combine( libraryPreferences.sortingMode().changes(), libraryPreferences.showHiddenCategories().changes(), - ::Pair, + libraryPreferences.showEmptyCategoriesSearch().changes(), + ::Triple, ), combine( state.map { it.filterCategory }.distinctUntilChanged(), @@ -260,7 +261,7 @@ class LibraryScreenModel( ::Pair, ), // KMK <-- - ) { (data, groupType, noActiveFilterOrSearch), (sort, showHiddenCategories), (filterCategory, includedCategories) -> + ) { (data, groupType, noActiveFilterOrSearch), (sort, showHiddenCategories, showEmptyCategoriesSearch), (filterCategory, includedCategories) -> data.favorites .applyGrouping( data.categories, @@ -285,7 +286,7 @@ class LibraryScreenModel( // KMK --> .filter { // Hide empty categories if no active filter or search - noActiveFilterOrSearch || it.value.isNotEmpty() + showEmptyCategoriesSearch || noActiveFilterOrSearch || it.value.isNotEmpty() } .let { // Fall back to default category if no categories are present @@ -934,7 +935,6 @@ class LibraryScreenModel( manga.ogTitle, // SY <-- manga.source, - ) } .let { if (amount != null) it.take(amount) else it } @@ -946,17 +946,25 @@ class LibraryScreenModel( // SY --> fun cleanTitles() { + val regex1 = "\\[.*?]".toRegex() + val regex2 = "\\(.*?\\)".toRegex() + val regex3 = "\\{.*?\\}".toRegex() + val regex4 = ".*\\|".toRegex() state.value.selectedManga.fastFilter { it.isEhBasedManga() || it.source in nHentaiSourceIds }.fastForEach { manga -> - val editedTitle = manga.title.replace("\\[.*?]".toRegex(), "").trim().replace("\\(.*?\\)".toRegex(), "").trim().replace("\\{.*?\\}".toRegex(), "").trim().let { - if (it.contains("|")) { - it.replace(".*\\|".toRegex(), "").trim() - } else { - it + val editedTitle = manga.title + .replace(regex1, "").trim() + .replace(regex2, "").trim() + .replace(regex3, "").trim() + .let { + if (it.contains("|")) { + it.replace(regex4, "").trim() + } else { + it + } } - } if (manga.title == editedTitle) return@fastForEach val mangaInfo = CustomMangaInfo( id = manga.id, diff --git a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt index 05bcf06e4..258440db2 100644 --- a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt @@ -224,6 +224,10 @@ class LibraryPreferences( fun autoClearChapterCache() = preferenceStore.getBoolean("auto_clear_chapter_cache", false) fun hideMissingChapters() = preferenceStore.getBoolean("pref_hide_missing_chapter_indicators", false) + + // KMK --> + fun showEmptyCategoriesSearch() = preferenceStore.getBoolean("show_empty_categories_search", false) + // KMK <-- // endregion // region Swipe Actions diff --git a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml index 46a3c99aa..f08f8aaa1 100644 --- a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml @@ -93,6 +93,7 @@ Use language icon Entries in excluded categories will not be shown even if they are also in included categories. Updating + Show empty categories during search/filtering. Refresh extension page to update list. More extensions...