add FilterItemCheckBox
This commit is contained in:
+59
-34
@@ -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
|
||||||
import androiddev.apps.vbox.client.shared.generated.resources.user_tags_filter_disable
|
import androiddev.apps.vbox.client.shared.generated.resources.user_tags_filter_disable
|
||||||
import androidx.compose.foundation.clickable
|
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.PaddingValues
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.calculateEndPadding
|
import androidx.compose.foundation.layout.calculateEndPadding
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.lazy.items
|
import androidx.compose.foundation.lazy.items
|
||||||
|
import androidx.compose.material3.Checkbox
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.FloatingActionButton
|
import androidx.compose.material3.FloatingActionButton
|
||||||
import androidx.compose.material3.Icon
|
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.painterResource
|
||||||
import org.jetbrains.compose.resources.stringResource
|
import org.jetbrains.compose.resources.stringResource
|
||||||
import ru.shadowsparky.ui.components.LazyColumn
|
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.domain.tag.TagInfo
|
||||||
import ru.shadowsparky.vbox.shared.presentation.list.VideoScreenContent
|
import ru.shadowsparky.vbox.shared.presentation.list.VideoScreenContent
|
||||||
|
|
||||||
@@ -43,6 +44,7 @@ fun SavedMovieContent(comp: SavedMovieScreenComponent, paddingValues: PaddingVal
|
|||||||
var filterBottomSheetVisible by rememberSaveable { mutableStateOf(false) }
|
var filterBottomSheetVisible by rememberSaveable { mutableStateOf(false) }
|
||||||
if (filterBottomSheetVisible) {
|
if (filterBottomSheetVisible) {
|
||||||
FilterBottomSheet(
|
FilterBottomSheet(
|
||||||
|
comp.filterTag,
|
||||||
tags,
|
tags,
|
||||||
{ filterBottomSheetVisible = false },
|
{ filterBottomSheetVisible = false },
|
||||||
onFilterBy = { comp.filterByTag(it) }
|
onFilterBy = { comp.filterByTag(it) }
|
||||||
@@ -79,46 +81,69 @@ fun SavedMovieContent(comp: SavedMovieScreenComponent, paddingValues: PaddingVal
|
|||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
private fun FilterBottomSheet(
|
private fun FilterBottomSheet(
|
||||||
|
filterTag: String?,
|
||||||
allTags: List<TagInfo>?,
|
allTags: List<TagInfo>?,
|
||||||
onDismiss: () -> Unit,
|
onDismiss: () -> Unit,
|
||||||
onFilterBy: (String?) -> Unit
|
onFilterBy: (String?) -> Unit
|
||||||
) {
|
) {
|
||||||
allTags ?: return
|
allTags ?: return
|
||||||
ModalBottomSheet(onDismissRequest = onDismiss) {
|
ModalBottomSheet(onDismissRequest = onDismiss) {
|
||||||
Column(
|
LazyColumn(modifier = Modifier.fillMaxWidth().padding(8.dp)) {
|
||||||
modifier = Modifier.fillMaxWidth().padding(8.dp),
|
item {
|
||||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
Text(
|
||||||
) {
|
text = stringResource(Res.string.user_tags),
|
||||||
Text(
|
style = MaterialTheme.typography.titleLarge
|
||||||
text = stringResource(Res.string.user_tags),
|
)
|
||||||
style = MaterialTheme.typography.titleLarge
|
}
|
||||||
)
|
item {
|
||||||
LazyColumn(
|
Spacer(Modifier.height(8.dp))
|
||||||
modifier = Modifier.fillMaxWidth(),
|
}
|
||||||
verticalArrangement = Arrangement.spacedBy(4.dp)
|
item {
|
||||||
) {
|
FilterItemCheckBox(
|
||||||
item {
|
filterTag == null,
|
||||||
TextPreference(
|
stringResource(Res.string.user_tags_filter_disable)
|
||||||
Modifier.clickable {
|
) {
|
||||||
onFilterBy(null)
|
onFilterBy(null)
|
||||||
onDismiss()
|
onDismiss()
|
||||||
},
|
|
||||||
text = stringResource(Res.string.user_tags_filter_disable)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
items(
|
}
|
||||||
items = allTags.filter { it.id != null },
|
items(
|
||||||
key = { tag -> tag.id ?: tag.tag }
|
items = allTags.filter { it.id != null },
|
||||||
) { tag ->
|
key = { tag -> tag.id ?: tag.tag }
|
||||||
TextPreference(
|
) { tag ->
|
||||||
text = tag.tag,
|
FilterItemCheckBox(
|
||||||
modifier = Modifier.clickable {
|
filterTag == tag.tag,
|
||||||
onFilterBy(tag.tag)
|
tag.tag
|
||||||
onDismiss()
|
) {
|
||||||
}
|
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() }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+4
-2
@@ -41,6 +41,8 @@ class SavedMovieScreenComponent(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val filterTag get() = filterTagFlow.value
|
||||||
|
|
||||||
val all = combine(allMovies, filterMovieIds) { movies, ids ->
|
val all = combine(allMovies, filterMovieIds) { movies, ids ->
|
||||||
if (ids == null) {
|
if (ids == null) {
|
||||||
movies
|
movies
|
||||||
@@ -49,8 +51,8 @@ class SavedMovieScreenComponent(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun filterByTag(tagId: String?) {
|
fun filterByTag(tagName: String?) {
|
||||||
filterTagFlow.tryEmit(tagId)
|
filterTagFlow.tryEmit(tagName)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun List<VideoDetails>.map(): List<VideoItem> {
|
private fun List<VideoDetails>.map(): List<VideoItem> {
|
||||||
|
|||||||
+1
-2
@@ -37,8 +37,7 @@ fun LinkTagBottomSheet(
|
|||||||
) {
|
) {
|
||||||
ModalBottomSheet(onDismissRequest = onDismiss) {
|
ModalBottomSheet(onDismissRequest = onDismiss) {
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth().padding(8.dp),
|
||||||
.padding(8.dp),
|
|
||||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
|
|||||||
Reference in New Issue
Block a user