From 911bef12002a468455a1462d19a7e70ac2f4d2a6 Mon Sep 17 00:00:00 2001 From: Damontecres Date: Tue, 30 Sep 2025 12:21:24 -0400 Subject: [PATCH] Add overview dialog --- .../dolphin/ui/components/Dialogs.kt | 5 +- .../dolphin/ui/data/ItemDetailsDialogInfo.kt | 56 +++++++++++++++++++ .../dolphin/ui/detail/SeriesDetails.kt | 3 +- .../ui/detail/series/SeriesOverview.kt | 43 ++++++++++++++ .../ui/detail/series/SeriesOverviewContent.kt | 15 +++-- 5 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/github/damontecres/dolphin/ui/data/ItemDetailsDialogInfo.kt diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/components/Dialogs.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/components/Dialogs.kt index 2980aedd..8892a58b 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/components/Dialogs.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/components/Dialogs.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn @@ -241,10 +242,10 @@ fun ScrollableDialog( modifier = modifier .width(600.dp) - .height(380.dp) + .heightIn(max = 380.dp) .focusable() .background( - MaterialTheme.colorScheme.surface, + MaterialTheme.colorScheme.surfaceColorAtElevation(3.dp), shape = RoundedCornerShape(8.dp), ).onKeyEvent { if (it.type == KeyEventType.KeyUp) { diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/data/ItemDetailsDialogInfo.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/data/ItemDetailsDialogInfo.kt new file mode 100644 index 00000000..c3bb37f5 --- /dev/null +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/data/ItemDetailsDialogInfo.kt @@ -0,0 +1,56 @@ +package com.github.damontecres.dolphin.ui.data + +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.tv.material3.MaterialTheme +import androidx.tv.material3.Text +import com.github.damontecres.dolphin.ui.components.ScrollableDialog +import com.github.damontecres.dolphin.ui.isNotNullOrBlank + +data class ItemDetailsDialogInfo( + val title: String, + val overview: String?, + val files: List, +) + +@Composable +fun ItemDetailsDialog( + info: ItemDetailsDialogInfo, + onDismissRequest: () -> Unit, + modifier: Modifier = Modifier, +) { + ScrollableDialog( + onDismissRequest = onDismissRequest, + modifier = modifier, + ) { + item { + Text( + text = info.title, + style = MaterialTheme.typography.titleMedium, + ) + } + if (info.overview.isNotNullOrBlank()) { + item { + Text( + text = info.overview, + style = MaterialTheme.typography.bodyMedium, + ) + } + } + if (info.files.isNotEmpty()) { + item { + Spacer(Modifier.height(8.dp)) + } + } + items(info.files) { file -> + Text( + text = "- $file", + style = MaterialTheme.typography.bodyMedium, + ) + } + } +} diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/SeriesDetails.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/SeriesDetails.kt index 3b50735d..41b11a0f 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/SeriesDetails.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/SeriesDetails.kt @@ -100,8 +100,7 @@ class SeriesViewModel sortOrder = listOf(SortOrder.ASCENDING), fields = listOf( - ItemFields.PRIMARY_IMAGE_ASPECT_RATIO, - ItemFields.CHILD_COUNT, + ItemFields.MEDIA_SOURCES, ItemFields.MEDIA_STREAMS, ItemFields.OVERVIEW, ), diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/series/SeriesOverview.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/series/SeriesOverview.kt index 2c94048e..e8704f22 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/series/SeriesOverview.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/series/SeriesOverview.kt @@ -15,6 +15,8 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.tv.material3.Text import com.github.damontecres.dolphin.preferences.UserPreferences import com.github.damontecres.dolphin.ui.OneTimeLaunchedEffect +import com.github.damontecres.dolphin.ui.data.ItemDetailsDialog +import com.github.damontecres.dolphin.ui.data.ItemDetailsDialogInfo import com.github.damontecres.dolphin.ui.detail.SeriesViewModel import com.github.damontecres.dolphin.ui.nav.Destination import com.github.damontecres.dolphin.ui.nav.NavigationManager @@ -57,6 +59,8 @@ fun SeriesOverview( ), ) { mutableStateOf(initialSeasonEpisode) } + var overviewDialog by remember { mutableStateOf(null) } + LaunchedEffect(episodes) { if (episodes.isNotEmpty()) { // TODO focus on first episode when changing seasons @@ -90,9 +94,48 @@ fun SeriesOverview( navigationManager.navigateTo(Destination.Playback(it.id, resumePosition.inWholeMilliseconds, it)) }, onLongClick = { + // TODO + }, + playOnClick = { resume -> + episodes.getOrNull(seasonEpisode.episode)?.let { + navigationManager.navigateTo( + Destination.Playback( + it.id, + resume.inWholeMilliseconds, + it, + ), + ) + } + }, + watchOnClick = { + // TODO toggle watched state + }, + moreOnClick = { + // TODO show more actions + }, + overviewOnClick = { + episodes.getOrNull(seasonEpisode.episode)?.let { + overviewDialog = + ItemDetailsDialogInfo( + title = it.name ?: "Unknown", + overview = it.data.overview, + files = + it.data.mediaSources + ?.mapNotNull { it.path } + .orEmpty(), + ) + } }, modifier = modifier, ) } } + + overviewDialog?.let { info -> + ItemDetailsDialog( + info = info, + onDismissRequest = { overviewDialog = null }, + modifier = Modifier, + ) + } } diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/series/SeriesOverviewContent.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/series/SeriesOverviewContent.kt index 880eba9c..37540a75 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/series/SeriesOverviewContent.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/series/SeriesOverviewContent.kt @@ -42,6 +42,7 @@ import com.github.damontecres.dolphin.data.model.BaseItem import com.github.damontecres.dolphin.ui.cards.BannerCard import com.github.damontecres.dolphin.ui.ifElse import com.github.damontecres.dolphin.ui.isNotNullOrBlank +import kotlin.time.Duration @Composable fun SeriesOverviewContent( @@ -54,6 +55,10 @@ fun SeriesOverviewContent( onFocus: (SeasonEpisode) -> Unit, onClick: (BaseItem) -> Unit, onLongClick: (BaseItem) -> Unit, + playOnClick: (Duration) -> Unit, + watchOnClick: () -> Unit, + moreOnClick: () -> Unit, + overviewOnClick: () -> Unit, modifier: Modifier = Modifier, ) { val bringIntoViewRequester = remember { BringIntoViewRequester() } @@ -156,9 +161,7 @@ fun SeriesOverviewContent( focusedEpisode?.let { ep -> FocusedEpisodeHeader( ep = ep, - overviewOnClick = { - // TODO show full overview dialog - }, + overviewOnClick = overviewOnClick, modifier = Modifier.fillMaxWidth(.66f), ) } @@ -199,9 +202,9 @@ fun SeriesOverviewContent( focusedEpisode?.let { ep -> FocusedEpisodeFooter( ep = ep, - playOnClick = {}, - moreOnClick = {}, - watchOnClick = {}, + playOnClick = playOnClick, + moreOnClick = moreOnClick, + watchOnClick = watchOnClick, modifier = Modifier .fillMaxWidth()