feat(search): update genre selection to support multiple selections in SearchScreen

This commit is contained in:
2026-05-02 21:38:56 +02:00
parent f957098369
commit ae4c2b34f4
3 changed files with 59 additions and 43 deletions

View File

@@ -1,6 +1,7 @@
package hu.bbara.purefin.ui.screen.libraries.components package hu.bbara.purefin.ui.screen.libraries.components
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
@@ -16,18 +17,21 @@ fun LibrariesContent(
onLibrarySelected: (LibraryUiModel) -> Unit, onLibrarySelected: (LibraryUiModel) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
LazyVerticalGrid( BoxWithConstraints(modifier = modifier) {
modifier = modifier, val minCellSize = if (maxWidth >= 600.dp) 220.dp else 160.dp
columns = GridCells.Adaptive(minSize = 160.dp),
contentPadding = PaddingValues(16.dp), LazyVerticalGrid(
horizontalArrangement = Arrangement.spacedBy(16.dp), columns = GridCells.Adaptive(minSize = minCellSize),
verticalArrangement = Arrangement.spacedBy(16.dp), contentPadding = PaddingValues(16.dp),
) { horizontalArrangement = Arrangement.spacedBy(16.dp),
items(items, key = { it.id }) { item -> verticalArrangement = Arrangement.spacedBy(16.dp),
LibraryListItem( ) {
uiModel = item, items(items, key = { it.id }) { item ->
onClick = { onLibrarySelected(item) } LibraryListItem(
) uiModel = item,
onClick = { onLibrarySelected(item) }
)
}
} }
} }
} }

View File

@@ -2,6 +2,7 @@ package hu.bbara.purefin.ui.screen.library
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
@@ -67,39 +68,42 @@ internal fun LibraryPosterGrid(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
viewModel: LibraryViewModel = hiltViewModel() viewModel: LibraryViewModel = hiltViewModel()
) { ) {
LazyVerticalGrid( BoxWithConstraints(modifier = modifier.background(MaterialTheme.colorScheme.background)) {
columns = GridCells.Adaptive(minSize = 120.dp), val minCellSize = if (maxWidth >= 600.dp) 220.dp else 120.dp
contentPadding = PaddingValues(16.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp), LazyVerticalGrid(
verticalArrangement = Arrangement.spacedBy(16.dp), columns = GridCells.Adaptive(minSize = minCellSize),
modifier = modifier.background(MaterialTheme.colorScheme.background) contentPadding = PaddingValues(16.dp),
) { horizontalArrangement = Arrangement.spacedBy(16.dp),
items(libraryItems, key = { item -> item.id }) { item -> verticalArrangement = Arrangement.spacedBy(16.dp),
MediaImageCard( ) {
imageUrl = item.primaryImageUrl, items(libraryItems, key = { item -> item.id }) { item ->
title = item.primaryText, MediaImageCard(
subtitle = item.secondaryText, imageUrl = item.primaryImageUrl,
onClick = { title = item.primaryText,
subtitle = item.secondaryText,
onClick = {
when (item) {
is MovieUiModel -> viewModel.onMovieSelected(item.id)
is SeriesUiModel -> viewModel.onSeriesSelected(item.id)
is EpisodeUiModel -> Unit
}
}
) {
when (item) { when (item) {
is MovieUiModel -> viewModel.onMovieSelected(item.id) is MovieUiModel, is EpisodeUiModel -> {
is SeriesUiModel -> viewModel.onSeriesSelected(item.id) WatchStateBadge(
is EpisodeUiModel -> Unit size = 28,
modifier = Modifier
.align(Alignment.TopEnd)
.padding(8.dp),
watched = item.watched,
started = (item.progress ?: 0f) > 0f
)
}
else -> Unit
} }
} }
) {
when (item) {
is MovieUiModel, is EpisodeUiModel -> {
WatchStateBadge(
size = 28,
modifier = Modifier
.align(Alignment.TopEnd)
.padding(8.dp),
watched = item.watched,
started = (item.progress ?: 0f) > 0f
)
}
else -> Unit
}
} }
} }
} }

View File

@@ -1,7 +1,8 @@
package hu.bbara.purefin.ui.screen.library.components package hu.bbara.purefin.ui.screen.library.components
import androidx.compose.material.icons.automirrored.outlined.ArrowBack
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.ArrowBack
import androidx.compose.material.icons.outlined.FilterAlt
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import hu.bbara.purefin.ui.screen.home.components.DefaultTopBar import hu.bbara.purefin.ui.screen.home.components.DefaultTopBar
import hu.bbara.purefin.ui.screen.home.components.DefaultTopBarIconButton import hu.bbara.purefin.ui.screen.home.components.DefaultTopBarIconButton
@@ -17,6 +18,13 @@ fun LibraryTopBar(
contentDescription = "Back", contentDescription = "Back",
onClick = onBack, onClick = onBack,
) )
},
rightActions = {
DefaultTopBarIconButton(
imageVector = Icons.Outlined.FilterAlt,
contentDescription = "Search",
onClick = {},
)
} }
) )
} }