From 8631fa05e4537c7ffef81526ab142701486773a9 Mon Sep 17 00:00:00 2001 From: Eugene Date: Sun, 21 Jun 2026 22:02:00 +0300 Subject: [PATCH] add FilterItemCheckBox --- .../presentation/saved/SavedMovieScreen.kt | 93 ++++++++++++------- .../saved/SavedMovieScreenComponent.kt | 6 +- .../settings/tag/LinkTagBottomSheet.kt | 3 +- 3 files changed, 64 insertions(+), 38 deletions(-) diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieScreen.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieScreen.kt index 946b96f..feff0cf 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieScreen.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieScreen.kt @@ -6,13 +6,15 @@ import androiddev.apps.vbox.client.shared.generated.resources.saved_movies_not_f import androiddev.apps.vbox.client.shared.generated.resources.user_tags import androiddev.apps.vbox.client.shared.generated.resources.user_tags_filter_disable import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Checkbox import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon @@ -32,7 +34,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import ru.shadowsparky.ui.components.LazyColumn -import ru.shadowsparky.ui.components.TextPreference import ru.shadowsparky.vbox.shared.domain.tag.TagInfo import ru.shadowsparky.vbox.shared.presentation.list.VideoScreenContent @@ -43,6 +44,7 @@ fun SavedMovieContent(comp: SavedMovieScreenComponent, paddingValues: PaddingVal var filterBottomSheetVisible by rememberSaveable { mutableStateOf(false) } if (filterBottomSheetVisible) { FilterBottomSheet( + comp.filterTag, tags, { filterBottomSheetVisible = false }, onFilterBy = { comp.filterByTag(it) } @@ -79,46 +81,69 @@ fun SavedMovieContent(comp: SavedMovieScreenComponent, paddingValues: PaddingVal @OptIn(ExperimentalMaterial3Api::class) @Composable private fun FilterBottomSheet( + filterTag: String?, allTags: List?, onDismiss: () -> Unit, onFilterBy: (String?) -> Unit ) { allTags ?: return ModalBottomSheet(onDismissRequest = onDismiss) { - Column( - modifier = Modifier.fillMaxWidth().padding(8.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { - Text( - text = stringResource(Res.string.user_tags), - style = MaterialTheme.typography.titleLarge - ) - LazyColumn( - modifier = Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(4.dp) - ) { - item { - TextPreference( - Modifier.clickable { - onFilterBy(null) - onDismiss() - }, - text = stringResource(Res.string.user_tags_filter_disable) - ) + LazyColumn(modifier = Modifier.fillMaxWidth().padding(8.dp)) { + item { + Text( + text = stringResource(Res.string.user_tags), + style = MaterialTheme.typography.titleLarge + ) + } + item { + Spacer(Modifier.height(8.dp)) + } + item { + FilterItemCheckBox( + filterTag == null, + stringResource(Res.string.user_tags_filter_disable) + ) { + onFilterBy(null) + onDismiss() } - items( - items = allTags.filter { it.id != null }, - key = { tag -> tag.id ?: tag.tag } - ) { tag -> - TextPreference( - text = tag.tag, - modifier = Modifier.clickable { - onFilterBy(tag.tag) - onDismiss() - } - ) + } + items( + items = allTags.filter { it.id != null }, + key = { tag -> tag.id ?: tag.tag } + ) { tag -> + FilterItemCheckBox( + filterTag == tag.tag, + tag.tag + ) { + onFilterBy(tag.tag) + onDismiss() } } } } } + +@Composable +private fun FilterItemCheckBox( + isChecked: Boolean, + name: String, + onFilterChanged: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { onFilterChanged() } + .padding(vertical = 4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = name, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.bodyLarge + ) + Checkbox( + checked = isChecked, + onCheckedChange = { _ -> onFilterChanged() } + ) + } +} diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieScreenComponent.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieScreenComponent.kt index 366324d..9717661 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieScreenComponent.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieScreenComponent.kt @@ -41,6 +41,8 @@ class SavedMovieScreenComponent( } } + val filterTag get() = filterTagFlow.value + val all = combine(allMovies, filterMovieIds) { movies, ids -> if (ids == null) { movies @@ -49,8 +51,8 @@ class SavedMovieScreenComponent( } } - fun filterByTag(tagId: String?) { - filterTagFlow.tryEmit(tagId) + fun filterByTag(tagName: String?) { + filterTagFlow.tryEmit(tagName) } private fun List.map(): List { diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/settings/tag/LinkTagBottomSheet.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/settings/tag/LinkTagBottomSheet.kt index 8c30bf8..7c1cfd3 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/settings/tag/LinkTagBottomSheet.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/settings/tag/LinkTagBottomSheet.kt @@ -37,8 +37,7 @@ fun LinkTagBottomSheet( ) { ModalBottomSheet(onDismissRequest = onDismiss) { Column( - modifier = Modifier.fillMaxWidth() - .padding(8.dp), + modifier = Modifier.fillMaxWidth().padding(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { Text(