diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceScreen.kt index 78247173f..2c8a391ad 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceScreen.kt @@ -54,7 +54,10 @@ fun PreferenceScreen( item { Column { - PreferenceGroupHeader(title = preference.title) + PreferenceGroupHeader( + title = preference.title, + highlighted = preference.title == highlightKey, + ) } } items(preference.preferenceItems) { item -> @@ -86,7 +89,7 @@ private fun List.findHighlightedIndex(highlightKey: String): Int { return flatMap { if (it is Preference.PreferenceGroup) { buildList { - add(null) // Header + add(it.title) // Header addAll(it.preferenceItems.map { groupItem -> groupItem.title }) add(null) // Spacer } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSearchScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSearchScreen.kt index d0f29656a..8c21f5aed 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSearchScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSearchScreen.kt @@ -168,45 +168,47 @@ private fun SearchResult( val result by produceState?>(initialValue = null, searchKey) { value = index.asSequence() .flatMap { settingsData -> + fun result(title: String, categoryTitle: String?) = SearchResultItem( + route = settingsData.route, + title = title, + breadcrumbs = getLocalizedBreadcrumb( + path = settingsData.title, + node = categoryTitle, + isLtr = isLtr, + ), + highlightKey = title, + ) + + fun Preference.PreferenceItem<*, *>.matches(): Boolean { + // Don't show info preference + if (this is Preference.PreferenceItem.InfoPreference) return false + val inTitle = title.contains(searchKey, true) + val inSummary = subtitle?.contains(searchKey, true) ?: false + return inTitle || inSummary + } + settingsData.contents.asSequence() // Only search from enabled prefs and one with valid title .filter { it.visible && it.title.isNotBlank() } - // Flatten items contained inside *enabled* PreferenceGroup .flatMap { p -> when (p) { is Preference.PreferenceGroup -> { - if (p.visible) { - p.preferenceItems.asSequence() - .filter { it.visible && it.title.isNotBlank() } - .map { p.title to it } + // A matching heading leads to the group itself, not to one of its items + val heading = if (p.title.contains(searchKey, true)) { + sequenceOf(result(p.title, null)) } else { emptySequence() } + val items = p.preferenceItems.asSequence() + .filter { it.visible && it.title.isNotBlank() && it.matches() } + .map { result(it.title, p.title) } + heading + items + } + is Preference.PreferenceItem<*, *> -> { + if (p.matches()) sequenceOf(result(p.title, null)) else emptySequence() } - is Preference.PreferenceItem<*, *> -> sequenceOf(null to p) } } - // Don't show info preference - .filterNot { it.second is Preference.PreferenceItem.InfoPreference } - // Filter by search query - .filter { (_, p) -> - val inTitle = p.title.contains(searchKey, true) - val inSummary = p.subtitle?.contains(searchKey, true) ?: false - inTitle || inSummary - } - // Map result data - .map { (categoryTitle, p) -> - SearchResultItem( - route = settingsData.route, - title = p.title, - breadcrumbs = getLocalizedBreadcrumb( - path = settingsData.title, - node = categoryTitle, - isLtr = isLtr, - ), - highlightKey = p.title, - ) - } } .take(10) // Just take top 10 result for quicker result .toList() diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/widget/PreferenceGroupHeader.kt b/app/src/main/java/eu/kanade/presentation/more/settings/widget/PreferenceGroupHeader.kt index d41b9a277..9e2a20f6a 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/widget/PreferenceGroupHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/widget/PreferenceGroupHeader.kt @@ -11,11 +11,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable -fun PreferenceGroupHeader(title: String) { +fun PreferenceGroupHeader(title: String, highlighted: Boolean = false) { Box( contentAlignment = Alignment.CenterStart, modifier = Modifier .fillMaxWidth() + .highlightBackground(highlighted) .padding(bottom = 8.dp, top = 14.dp), ) { Text(