mirror of
https://github.com/JustinZeus/Wholphin.git
synced 2026-07-08 23:51:21 +02:00
Route card height and spacing through global preferences
Replaces hardcoded card heights and the per-library Spacing slider with reads from LocalInterfaceCustomization. Home rows split the previous single horizontalPadding arg into a fixed leading-edge contentPadding (BASE_SPACING_DP.dp) and a slider-driven cardSpacing. CardGrid grows a contentPadding so its leading edge stays flush regardless of the spacing slider. The ViewOptionsSpacing slider in ViewOptionsDialog (grid + list) and CollectionViewOptionsDialog is removed - the global Spacing slider covers all browse-density tuning. ViewOptions.spacing remains as a type-driven base (16/4/2 dp for GRID/LIST/DENSE_LIST, set by the type setter) and is multiplied by the global Spacing percent at the list-view consumer site. The Increase / Decrease all card-size shortcuts in HomeSettingsGlobal are also removed (superseded by the global Card size slider). Episode-card heights also scale with the global Card size slider via a new InterfaceCustomization.episodeCardHeightDp helper. Direct consumer sites (ExtrasRow, MovieDetails similar-items, PersonPage episode row, SearchPage EPISODE_ROW results) read it. Preset-set absolute heights (Favorite-Episode preset, etc.) stay as overrides. Adds HomeRowViewOptions.resolvedCardHeight() to InterfaceHelpers.kt - the composable resolver bridging per-row heightDp overrides and the global slider. HomeRowViewOptions.heightDp default flips from Cards.HEIGHT_2X3_DP (172) to 0, the new sentinel meaning "use the global value".
This commit is contained in:
parent
4d575b1e11
commit
66b58adaca
25 changed files with 77 additions and 124 deletions
|
|
@ -223,7 +223,7 @@ const val SUPPORTED_HOME_PAGE_SETTINGS_VERSION = 1
|
||||||
*/
|
*/
|
||||||
@Serializable
|
@Serializable
|
||||||
data class HomeRowViewOptions(
|
data class HomeRowViewOptions(
|
||||||
val heightDp: Int = Cards.HEIGHT_2X3_DP,
|
val heightDp: Int = 0,
|
||||||
val spacing: Int = 16,
|
val spacing: Int = 16,
|
||||||
val contentScale: PrefContentScale = PrefContentScale.FILL,
|
val contentScale: PrefContentScale = PrefContentScale.FILL,
|
||||||
val aspectRatio: AspectRatio = AspectRatio.TALL,
|
val aspectRatio: AspectRatio = AspectRatio.TALL,
|
||||||
|
|
|
||||||
|
|
@ -41,11 +41,11 @@ import com.github.damontecres.wholphin.data.model.SeerrAvailability
|
||||||
import com.github.damontecres.wholphin.data.model.SeerrItemType
|
import com.github.damontecres.wholphin.data.model.SeerrItemType
|
||||||
import com.github.damontecres.wholphin.ui.AppColors
|
import com.github.damontecres.wholphin.ui.AppColors
|
||||||
import com.github.damontecres.wholphin.ui.AspectRatios
|
import com.github.damontecres.wholphin.ui.AspectRatios
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
|
||||||
import com.github.damontecres.wholphin.ui.FontAwesome
|
import com.github.damontecres.wholphin.ui.FontAwesome
|
||||||
import com.github.damontecres.wholphin.ui.PreviewTvSpec
|
import com.github.damontecres.wholphin.ui.PreviewTvSpec
|
||||||
import com.github.damontecres.wholphin.ui.enableMarquee
|
import com.github.damontecres.wholphin.ui.enableMarquee
|
||||||
import com.github.damontecres.wholphin.ui.theme.WholphinTheme
|
import com.github.damontecres.wholphin.ui.theme.WholphinTheme
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -56,7 +56,7 @@ fun DiscoverItemCard(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
showOverlay: Boolean = true,
|
showOverlay: Boolean = true,
|
||||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||||
width: Dp = Cards.height2x3 * AspectRatios.TALL,
|
width: Dp = LocalInterfaceCustomization.current.cardHeightDp.dp * AspectRatios.TALL,
|
||||||
) {
|
) {
|
||||||
val focused by interactionSource.collectIsFocusedAsState()
|
val focused by interactionSource.collectIsFocusedAsState()
|
||||||
val spaceBetween by animateDpAsState(if (focused) 12.dp else 4.dp)
|
val spaceBetween by animateDpAsState(if (focused) 12.dp else 4.dp)
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,11 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
import com.github.damontecres.wholphin.R
|
import com.github.damontecres.wholphin.R
|
||||||
import com.github.damontecres.wholphin.data.ExtrasItem
|
import com.github.damontecres.wholphin.data.ExtrasItem
|
||||||
import com.github.damontecres.wholphin.ui.AspectRatios
|
import com.github.damontecres.wholphin.ui.AspectRatios
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ExtrasRow(
|
fun ExtrasRow(
|
||||||
|
|
@ -30,7 +31,7 @@ fun ExtrasRow(
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
modifier = mod,
|
modifier = mod,
|
||||||
showImageOverlay = true,
|
showImageOverlay = true,
|
||||||
imageHeight = Cards.heightEpisode,
|
imageHeight = LocalInterfaceCustomization.current.episodeCardHeightDp.dp,
|
||||||
imageWidth = Dp.Unspecified,
|
imageWidth = Dp.Unspecified,
|
||||||
imageUrl = item?.imageUrl,
|
imageUrl = item?.imageUrl,
|
||||||
isFavorite = false,
|
isFavorite = false,
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ fun <T> ItemRow(
|
||||||
) -> Unit,
|
) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
horizontalPadding: Dp = 16.dp,
|
horizontalPadding: Dp = 16.dp,
|
||||||
|
cardSpacing: Dp = horizontalPadding,
|
||||||
showViewMore: Boolean = false,
|
showViewMore: Boolean = false,
|
||||||
viewMoreCardContent: @Composable (Modifier) -> Unit = {},
|
viewMoreCardContent: @Composable (Modifier) -> Unit = {},
|
||||||
) {
|
) {
|
||||||
|
|
@ -66,7 +67,7 @@ fun <T> ItemRow(
|
||||||
|
|
||||||
LazyRow(
|
LazyRow(
|
||||||
state = state,
|
state = state,
|
||||||
horizontalArrangement = Arrangement.spacedBy(horizontalPadding),
|
horizontalArrangement = Arrangement.spacedBy(cardSpacing),
|
||||||
contentPadding = PaddingValues(horizontal = horizontalPadding, vertical = 8.dp),
|
contentPadding = PaddingValues(horizontal = horizontalPadding, vertical = 8.dp),
|
||||||
modifier =
|
modifier =
|
||||||
Modifier
|
Modifier
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ import com.github.damontecres.wholphin.ui.detail.CardGrid
|
||||||
import com.github.damontecres.wholphin.ui.detail.GridItemDetails
|
import com.github.damontecres.wholphin.ui.detail.GridItemDetails
|
||||||
import com.github.damontecres.wholphin.ui.main.HomePageHeader
|
import com.github.damontecres.wholphin.ui.main.HomePageHeader
|
||||||
import com.github.damontecres.wholphin.ui.playback.scale
|
import com.github.damontecres.wholphin.ui.playback.scale
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.ui.util.ScrollToTopBringIntoViewSpec
|
import com.github.damontecres.wholphin.ui.util.ScrollToTopBringIntoViewSpec
|
||||||
import org.jellyfin.sdk.model.api.BaseItemKind
|
import org.jellyfin.sdk.model.api.BaseItemKind
|
||||||
import org.jellyfin.sdk.model.api.CollectionType
|
import org.jellyfin.sdk.model.api.CollectionType
|
||||||
|
|
@ -73,6 +74,7 @@ fun CollectionFolderGrid(
|
||||||
) {
|
) {
|
||||||
val defaultBringIntoViewSpec = LocalBringIntoViewSpec.current
|
val defaultBringIntoViewSpec = LocalBringIntoViewSpec.current
|
||||||
val density = LocalDensity.current
|
val density = LocalDensity.current
|
||||||
|
val spacingDp = LocalInterfaceCustomization.current.spacingDp
|
||||||
AnimatedVisibility(viewOptions.showDetails) {
|
AnimatedVisibility(viewOptions.showDetails) {
|
||||||
HomePageHeader(
|
HomePageHeader(
|
||||||
item = focusedItem,
|
item = focusedItem,
|
||||||
|
|
@ -110,10 +112,10 @@ fun CollectionFolderGrid(
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
columns = viewOptions.columns,
|
columns = viewOptions.columns,
|
||||||
spacing = viewOptions.spacing.dp,
|
spacing = spacingDp.dp,
|
||||||
bringIntoViewSpec =
|
bringIntoViewSpec =
|
||||||
remember(viewOptions) {
|
remember(viewOptions.showDetails, spacingDp) {
|
||||||
val spacingPx = with(density) { viewOptions.spacing.dp.toPx() }
|
val spacingPx = with(density) { spacingDp.dp.toPx() }
|
||||||
if (viewOptions.showDetails) {
|
if (viewOptions.showDetails) {
|
||||||
ScrollToTopBringIntoViewSpec(spacingPx)
|
ScrollToTopBringIntoViewSpec(spacingPx)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -132,7 +134,6 @@ data class PositionItem(
|
||||||
|
|
||||||
data class CollectionFolderGridParameters(
|
data class CollectionFolderGridParameters(
|
||||||
val columns: Int = 6,
|
val columns: Int = 6,
|
||||||
val spacing: Dp = 16.dp,
|
|
||||||
val cardContent: @Composable (GridItemDetails<BaseItem>) -> Unit = { (item, index, onClick, onLongClick, widthPx, mod) ->
|
val cardContent: @Composable (GridItemDetails<BaseItem>) -> Unit = { (item, index, onClick, onLongClick, widthPx, mod) ->
|
||||||
GridCard(
|
GridCard(
|
||||||
item = item,
|
item = item,
|
||||||
|
|
@ -148,7 +149,6 @@ data class CollectionFolderGridParameters(
|
||||||
val POSTER =
|
val POSTER =
|
||||||
CollectionFolderGridParameters(
|
CollectionFolderGridParameters(
|
||||||
columns = 6,
|
columns = 6,
|
||||||
spacing = 16.dp,
|
|
||||||
cardContent = { (item, index, onClick, onLongClick, widthPx, mod) ->
|
cardContent = { (item, index, onClick, onLongClick, widthPx, mod) ->
|
||||||
GridCard(
|
GridCard(
|
||||||
item = item,
|
item = item,
|
||||||
|
|
@ -164,7 +164,6 @@ data class CollectionFolderGridParameters(
|
||||||
val WIDE =
|
val WIDE =
|
||||||
CollectionFolderGridParameters(
|
CollectionFolderGridParameters(
|
||||||
columns = 4,
|
columns = 4,
|
||||||
spacing = 24.dp,
|
|
||||||
cardContent = { (item, index, onClick, onLongClick, widthPx, mod) ->
|
cardContent = { (item, index, onClick, onLongClick, widthPx, mod) ->
|
||||||
GridCard(
|
GridCard(
|
||||||
item = item,
|
item = item,
|
||||||
|
|
@ -180,7 +179,6 @@ data class CollectionFolderGridParameters(
|
||||||
val SQUARE =
|
val SQUARE =
|
||||||
CollectionFolderGridParameters(
|
CollectionFolderGridParameters(
|
||||||
columns = 6,
|
columns = 6,
|
||||||
spacing = 16.dp,
|
|
||||||
cardContent = { (item, index, onClick, onLongClick, widthPx, mod) ->
|
cardContent = { (item, index, onClick, onLongClick, widthPx, mod) ->
|
||||||
GridCard(
|
GridCard(
|
||||||
item = item,
|
item = item,
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ import com.github.damontecres.wholphin.ui.launchIO
|
||||||
import com.github.damontecres.wholphin.ui.rememberInt
|
import com.github.damontecres.wholphin.ui.rememberInt
|
||||||
import com.github.damontecres.wholphin.ui.roundMinutes
|
import com.github.damontecres.wholphin.ui.roundMinutes
|
||||||
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.jellyfin.sdk.model.api.BaseItemKind
|
import org.jellyfin.sdk.model.api.BaseItemKind
|
||||||
|
|
@ -273,9 +274,10 @@ fun CollectionFolderContent(
|
||||||
onPositionChange: (Int) -> Unit,
|
onPositionChange: (Int) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
|
val globalSpacingPercent = LocalInterfaceCustomization.current.spacingPercent
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
state = listState,
|
state = listState,
|
||||||
verticalArrangement = Arrangement.spacedBy(viewOptions.spacing.dp),
|
verticalArrangement = Arrangement.spacedBy((viewOptions.spacing * globalSpacingPercent / 100).dp),
|
||||||
modifier = modifier.focusRestorer(positionFocusRequester),
|
modifier = modifier.focusRestorer(positionFocusRequester),
|
||||||
) {
|
) {
|
||||||
itemsIndexed(items) { index, item ->
|
itemsIndexed(items) { index, item ->
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ import com.github.damontecres.wholphin.ui.detail.CardGrid
|
||||||
import com.github.damontecres.wholphin.ui.launchIO
|
import com.github.damontecres.wholphin.ui.launchIO
|
||||||
import com.github.damontecres.wholphin.ui.nav.Destination
|
import com.github.damontecres.wholphin.ui.nav.Destination
|
||||||
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.util.ApiRequestPager
|
import com.github.damontecres.wholphin.util.ApiRequestPager
|
||||||
import com.github.damontecres.wholphin.util.DataLoadingState
|
import com.github.damontecres.wholphin.util.DataLoadingState
|
||||||
import com.github.damontecres.wholphin.util.RequestHandler
|
import com.github.damontecres.wholphin.util.RequestHandler
|
||||||
|
|
@ -140,7 +141,7 @@ fun ItemGrid(
|
||||||
showJumpButtons = false,
|
showJumpButtons = false,
|
||||||
showLetterButtons = false,
|
showLetterButtons = false,
|
||||||
initialPosition = destination.initialPosition,
|
initialPosition = destination.initialPosition,
|
||||||
spacing = destination.viewOptions.spacing.dp,
|
spacing = LocalInterfaceCustomization.current.spacingDp.dp,
|
||||||
cardContent = @Composable { (item, index, onClick, onLongClick, widthPx, mod) ->
|
cardContent = @Composable { (item, index, onClick, onLongClick, widthPx, mod) ->
|
||||||
GridCard(
|
GridCard(
|
||||||
item = item,
|
item = item,
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,11 @@ import androidx.tv.material3.MaterialTheme
|
||||||
import androidx.tv.material3.Text
|
import androidx.tv.material3.Text
|
||||||
import com.github.damontecres.wholphin.R
|
import com.github.damontecres.wholphin.R
|
||||||
import com.github.damontecres.wholphin.data.model.BaseItem
|
import com.github.damontecres.wholphin.data.model.BaseItem
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
|
||||||
import com.github.damontecres.wholphin.ui.cards.ItemRow
|
import com.github.damontecres.wholphin.ui.cards.ItemRow
|
||||||
import com.github.damontecres.wholphin.ui.cards.SeasonCard
|
import com.github.damontecres.wholphin.ui.cards.SeasonCard
|
||||||
import com.github.damontecres.wholphin.ui.data.RowColumn
|
import com.github.damontecres.wholphin.ui.data.RowColumn
|
||||||
import com.github.damontecres.wholphin.ui.ifElse
|
import com.github.damontecres.wholphin.ui.ifElse
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.util.RowLoadingState
|
import com.github.damontecres.wholphin.util.RowLoadingState
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -48,7 +48,7 @@ fun LoadingRow(
|
||||||
onClick.invoke()
|
onClick.invoke()
|
||||||
},
|
},
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
imageHeight = Cards.height2x3,
|
imageHeight = LocalInterfaceCustomization.current.cardHeightDp.dp,
|
||||||
modifier =
|
modifier =
|
||||||
mod
|
mod
|
||||||
.ifElse(
|
.ifElse(
|
||||||
|
|
|
||||||
|
|
@ -146,16 +146,6 @@ data class ViewOptions(
|
||||||
getter = { it.columns.toLong() },
|
getter = { it.columns.toLong() },
|
||||||
setter = { prefs, value -> prefs.copy(columns = value.toInt()) },
|
setter = { prefs, value -> prefs.copy(columns = value.toInt()) },
|
||||||
)
|
)
|
||||||
val ViewOptionsSpacing =
|
|
||||||
AppSliderPreference<ViewOptions>(
|
|
||||||
title = R.string.spacing,
|
|
||||||
defaultValue = 16,
|
|
||||||
min = 0,
|
|
||||||
max = 32,
|
|
||||||
interval = 2,
|
|
||||||
getter = { it.spacing.toLong() },
|
|
||||||
setter = { prefs, value -> prefs.copy(spacing = value.toInt()) },
|
|
||||||
)
|
|
||||||
|
|
||||||
val ViewOptionsContentScale =
|
val ViewOptionsContentScale =
|
||||||
AppChoicePreference<ViewOptions, PrefContentScale>(
|
AppChoicePreference<ViewOptions, PrefContentScale>(
|
||||||
|
|
@ -252,7 +242,6 @@ data class ViewOptions(
|
||||||
ViewOptionsBackdrop,
|
ViewOptionsBackdrop,
|
||||||
ViewOptionsShowTitles,
|
ViewOptionsShowTitles,
|
||||||
ViewOptionsColumns,
|
ViewOptionsColumns,
|
||||||
ViewOptionsSpacing,
|
|
||||||
ViewOptionsContentScale,
|
ViewOptionsContentScale,
|
||||||
ViewOptionsReset,
|
ViewOptionsReset,
|
||||||
)
|
)
|
||||||
|
|
@ -262,7 +251,6 @@ data class ViewOptions(
|
||||||
ViewOptionsTypePref,
|
ViewOptionsTypePref,
|
||||||
ViewOptionsDetailHeader,
|
ViewOptionsDetailHeader,
|
||||||
ViewOptionsBackdrop,
|
ViewOptionsBackdrop,
|
||||||
ViewOptionsSpacing,
|
|
||||||
ViewOptionsReset,
|
ViewOptionsReset,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,7 @@ import androidx.tv.material3.MaterialTheme
|
||||||
import androidx.tv.material3.Text
|
import androidx.tv.material3.Text
|
||||||
import com.github.damontecres.wholphin.R
|
import com.github.damontecres.wholphin.R
|
||||||
import com.github.damontecres.wholphin.ui.AppColors
|
import com.github.damontecres.wholphin.ui.AppColors
|
||||||
|
import com.github.damontecres.wholphin.ui.BASE_SPACING_DP
|
||||||
import com.github.damontecres.wholphin.ui.FontAwesome
|
import com.github.damontecres.wholphin.ui.FontAwesome
|
||||||
import com.github.damontecres.wholphin.ui.ifElse
|
import com.github.damontecres.wholphin.ui.ifElse
|
||||||
import com.github.damontecres.wholphin.ui.playback.isBackwardButton
|
import com.github.damontecres.wholphin.ui.playback.isBackwardButton
|
||||||
|
|
@ -320,7 +321,7 @@ fun <T : CardGridItem> CardGrid(
|
||||||
horizontalArrangement = Arrangement.spacedBy(spacing),
|
horizontalArrangement = Arrangement.spacedBy(spacing),
|
||||||
verticalArrangement = Arrangement.spacedBy(spacing),
|
verticalArrangement = Arrangement.spacedBy(spacing),
|
||||||
state = gridState,
|
state = gridState,
|
||||||
contentPadding = PaddingValues(vertical = 16.dp),
|
contentPadding = PaddingValues(horizontal = BASE_SPACING_DP.dp, vertical = 16.dp),
|
||||||
modifier =
|
modifier =
|
||||||
Modifier
|
Modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
|
|
@ -333,10 +334,11 @@ fun <T : CardGridItem> CardGrid(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.onLayoutRectChanged(0, 0) {
|
}.onLayoutRectChanged(0, 0) {
|
||||||
val width = it.width
|
|
||||||
val spacingPx = with(density) { spacing.toPx() }
|
val spacingPx = with(density) { spacing.toPx() }
|
||||||
|
val horizontalPaddingPx = with(density) { BASE_SPACING_DP.dp.toPx() } * 2
|
||||||
|
val usableWidth = it.width - horizontalPaddingPx
|
||||||
val cardWidth =
|
val cardWidth =
|
||||||
ceil((width - (spacingPx * (columns - 1))) / columns)
|
ceil((usableWidth - (spacingPx * (columns - 1))) / columns)
|
||||||
cardWidthPx = cardWidth.toInt()
|
cardWidthPx = cardWidth.toInt()
|
||||||
// Timber.v("cardWidthPx=%s", cardWidthPx)
|
// Timber.v("cardWidthPx=%s", cardWidthPx)
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,7 @@ import com.github.damontecres.wholphin.ui.nav.Destination
|
||||||
import com.github.damontecres.wholphin.ui.playback.scale
|
import com.github.damontecres.wholphin.ui.playback.scale
|
||||||
import com.github.damontecres.wholphin.ui.rememberInt
|
import com.github.damontecres.wholphin.ui.rememberInt
|
||||||
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.ui.util.StringProvider
|
import com.github.damontecres.wholphin.ui.util.StringProvider
|
||||||
import com.github.damontecres.wholphin.ui.util.StringStringProvider
|
import com.github.damontecres.wholphin.ui.util.StringStringProvider
|
||||||
import com.github.damontecres.wholphin.util.ApiRequestPager
|
import com.github.damontecres.wholphin.util.ApiRequestPager
|
||||||
|
|
@ -368,7 +369,7 @@ fun HomeRowGrid(
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
columns = if (viewOptions.aspectRatio.ratio > 1f) 4 else 6,
|
columns = if (viewOptions.aspectRatio.ratio > 1f) 4 else 6,
|
||||||
spacing = viewOptions.spacing.dp,
|
spacing = LocalInterfaceCustomization.current.spacingDp.dp,
|
||||||
bringIntoViewSpec = LocalBringIntoViewSpec.current,
|
bringIntoViewSpec = LocalBringIntoViewSpec.current,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,6 @@ import com.github.damontecres.wholphin.preferences.UserPreferences
|
||||||
import com.github.damontecres.wholphin.services.FavoriteWatchManager
|
import com.github.damontecres.wholphin.services.FavoriteWatchManager
|
||||||
import com.github.damontecres.wholphin.services.NavigationManager
|
import com.github.damontecres.wholphin.services.NavigationManager
|
||||||
import com.github.damontecres.wholphin.services.SeerrService
|
import com.github.damontecres.wholphin.services.SeerrService
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
|
||||||
import com.github.damontecres.wholphin.ui.LocalImageUrlService
|
import com.github.damontecres.wholphin.ui.LocalImageUrlService
|
||||||
import com.github.damontecres.wholphin.ui.PreviewTvSpec
|
import com.github.damontecres.wholphin.ui.PreviewTvSpec
|
||||||
import com.github.damontecres.wholphin.ui.SlimItemFields
|
import com.github.damontecres.wholphin.ui.SlimItemFields
|
||||||
|
|
@ -68,6 +67,7 @@ import com.github.damontecres.wholphin.ui.nav.Destination
|
||||||
import com.github.damontecres.wholphin.ui.rememberPosition
|
import com.github.damontecres.wholphin.ui.rememberPosition
|
||||||
import com.github.damontecres.wholphin.ui.theme.WholphinTheme
|
import com.github.damontecres.wholphin.ui.theme.WholphinTheme
|
||||||
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.ui.util.ResStringProvider
|
import com.github.damontecres.wholphin.ui.util.ResStringProvider
|
||||||
import com.github.damontecres.wholphin.util.ApiRequestPager
|
import com.github.damontecres.wholphin.util.ApiRequestPager
|
||||||
import com.github.damontecres.wholphin.util.DataLoadingState
|
import com.github.damontecres.wholphin.util.DataLoadingState
|
||||||
|
|
@ -407,7 +407,7 @@ fun PersonPageContent(
|
||||||
onClick.invoke()
|
onClick.invoke()
|
||||||
},
|
},
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
imageHeight = Cards.heightEpisode,
|
imageHeight = LocalInterfaceCustomization.current.episodeCardHeightDp.dp,
|
||||||
modifier =
|
modifier =
|
||||||
mod
|
mod
|
||||||
.ifElse(
|
.ifElse(
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ import com.github.damontecres.wholphin.ui.cards.GridCard
|
||||||
import com.github.damontecres.wholphin.ui.data.RowColumn
|
import com.github.damontecres.wholphin.ui.data.RowColumn
|
||||||
import com.github.damontecres.wholphin.ui.detail.CardGrid
|
import com.github.damontecres.wholphin.ui.detail.CardGrid
|
||||||
import com.github.damontecres.wholphin.ui.playback.scale
|
import com.github.damontecres.wholphin.ui.playback.scale
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.ui.util.ScrollToTopBringIntoViewSpec
|
import com.github.damontecres.wholphin.ui.util.ScrollToTopBringIntoViewSpec
|
||||||
import org.jellyfin.sdk.model.api.ItemSortBy
|
import org.jellyfin.sdk.model.api.ItemSortBy
|
||||||
|
|
||||||
|
|
@ -44,6 +45,7 @@ fun CollectionMixedGrid(
|
||||||
val density = LocalDensity.current
|
val density = LocalDensity.current
|
||||||
|
|
||||||
val cardViewOptions = state.viewOptions.cardViewOptions
|
val cardViewOptions = state.viewOptions.cardViewOptions
|
||||||
|
val spacingDp = LocalInterfaceCustomization.current.spacingDp
|
||||||
CardGrid(
|
CardGrid(
|
||||||
pager = state.items,
|
pager = state.items,
|
||||||
onClickItem = { index: Int, item: BaseItem -> onClickItem.invoke(RowColumn(0, index), item) },
|
onClickItem = { index: Int, item: BaseItem -> onClickItem.invoke(RowColumn(0, index), item) },
|
||||||
|
|
@ -74,10 +76,10 @@ fun CollectionMixedGrid(
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
columns = cardViewOptions.columns,
|
columns = cardViewOptions.columns,
|
||||||
spacing = cardViewOptions.spacing.dp,
|
spacing = spacingDp.dp,
|
||||||
bringIntoViewSpec =
|
bringIntoViewSpec =
|
||||||
remember(cardViewOptions) {
|
remember(cardViewOptions.showDetails, spacingDp) {
|
||||||
val spacingPx = with(density) { cardViewOptions.spacing.dp.toPx() }
|
val spacingPx = with(density) { spacingDp.dp.toPx() }
|
||||||
if (cardViewOptions.showDetails) {
|
if (cardViewOptions.showDetails) {
|
||||||
ScrollToTopBringIntoViewSpec(spacingPx)
|
ScrollToTopBringIntoViewSpec(spacingPx)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,6 @@ import com.github.damontecres.wholphin.ui.components.ViewOptions.Companion.ViewO
|
||||||
import com.github.damontecres.wholphin.ui.components.ViewOptions.Companion.ViewOptionsImageType
|
import com.github.damontecres.wholphin.ui.components.ViewOptions.Companion.ViewOptionsImageType
|
||||||
import com.github.damontecres.wholphin.ui.components.ViewOptions.Companion.ViewOptionsReset
|
import com.github.damontecres.wholphin.ui.components.ViewOptions.Companion.ViewOptionsReset
|
||||||
import com.github.damontecres.wholphin.ui.components.ViewOptions.Companion.ViewOptionsShowTitles
|
import com.github.damontecres.wholphin.ui.components.ViewOptions.Companion.ViewOptionsShowTitles
|
||||||
import com.github.damontecres.wholphin.ui.components.ViewOptions.Companion.ViewOptionsSpacing
|
|
||||||
import com.github.damontecres.wholphin.ui.preferences.ComposablePreference
|
import com.github.damontecres.wholphin.ui.preferences.ComposablePreference
|
||||||
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
@ -159,7 +158,6 @@ data class CollectionViewOptions(
|
||||||
ViewOptionsDetailHeader,
|
ViewOptionsDetailHeader,
|
||||||
ViewOptionsShowTitles,
|
ViewOptionsShowTitles,
|
||||||
ViewOptionsColumns,
|
ViewOptionsColumns,
|
||||||
ViewOptionsSpacing,
|
|
||||||
ViewOptionsContentScale,
|
ViewOptionsContentScale,
|
||||||
ViewOptionsReset,
|
ViewOptionsReset,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,6 @@ import com.github.damontecres.wholphin.data.model.hasPermission
|
||||||
import com.github.damontecres.wholphin.preferences.UserPreferences
|
import com.github.damontecres.wholphin.preferences.UserPreferences
|
||||||
import com.github.damontecres.wholphin.services.SeerrUserConfig
|
import com.github.damontecres.wholphin.services.SeerrUserConfig
|
||||||
import com.github.damontecres.wholphin.services.TrailerService
|
import com.github.damontecres.wholphin.services.TrailerService
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
|
||||||
import com.github.damontecres.wholphin.ui.cards.DiscoverItemCard
|
import com.github.damontecres.wholphin.ui.cards.DiscoverItemCard
|
||||||
import com.github.damontecres.wholphin.ui.cards.DiscoverPersonRow
|
import com.github.damontecres.wholphin.ui.cards.DiscoverPersonRow
|
||||||
import com.github.damontecres.wholphin.ui.cards.ItemRow
|
import com.github.damontecres.wholphin.ui.cards.ItemRow
|
||||||
|
|
@ -63,6 +62,7 @@ import com.github.damontecres.wholphin.ui.data.ItemDetailsDialogInfo
|
||||||
import com.github.damontecres.wholphin.ui.nav.Destination
|
import com.github.damontecres.wholphin.ui.nav.Destination
|
||||||
import com.github.damontecres.wholphin.ui.rememberInt
|
import com.github.damontecres.wholphin.ui.rememberInt
|
||||||
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.util.DataLoadingState
|
import com.github.damontecres.wholphin.util.DataLoadingState
|
||||||
import com.github.damontecres.wholphin.util.ExceptionHandler
|
import com.github.damontecres.wholphin.util.ExceptionHandler
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
@ -416,7 +416,7 @@ fun TrailerRow(
|
||||||
item = item.baseItem,
|
item = item.baseItem,
|
||||||
onClick = { onClickTrailer.invoke(item) },
|
onClick = { onClickTrailer.invoke(item) },
|
||||||
onLongClick = {},
|
onLongClick = {},
|
||||||
imageHeight = Cards.height2x3,
|
imageHeight = LocalInterfaceCustomization.current.cardHeightDp.dp,
|
||||||
imageWidth = Dp.Unspecified,
|
imageWidth = Dp.Unspecified,
|
||||||
showImageOverlay = false,
|
showImageOverlay = false,
|
||||||
modifier = cardModifier,
|
modifier = cardModifier,
|
||||||
|
|
@ -443,7 +443,7 @@ fun TrailerRow(
|
||||||
onLongClick = {},
|
onLongClick = {},
|
||||||
modifier = cardModifier,
|
modifier = cardModifier,
|
||||||
showImageOverlay = false,
|
showImageOverlay = false,
|
||||||
imageHeight = Cards.height2x3,
|
imageHeight = LocalInterfaceCustomization.current.cardHeightDp.dp,
|
||||||
imageWidth = Dp.Unspecified,
|
imageWidth = Dp.Unspecified,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,6 @@ import com.github.damontecres.wholphin.data.model.aspectRatioFloat
|
||||||
import com.github.damontecres.wholphin.preferences.UserPreferences
|
import com.github.damontecres.wholphin.preferences.UserPreferences
|
||||||
import com.github.damontecres.wholphin.services.TrailerService
|
import com.github.damontecres.wholphin.services.TrailerService
|
||||||
import com.github.damontecres.wholphin.ui.AspectRatios
|
import com.github.damontecres.wholphin.ui.AspectRatios
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
|
||||||
import com.github.damontecres.wholphin.ui.RequestOrRestoreFocus
|
import com.github.damontecres.wholphin.ui.RequestOrRestoreFocus
|
||||||
import com.github.damontecres.wholphin.ui.cards.ChapterRow
|
import com.github.damontecres.wholphin.ui.cards.ChapterRow
|
||||||
import com.github.damontecres.wholphin.ui.cards.ExtrasRow
|
import com.github.damontecres.wholphin.ui.cards.ExtrasRow
|
||||||
|
|
@ -62,6 +61,7 @@ import com.github.damontecres.wholphin.ui.discover.DiscoverRowData
|
||||||
import com.github.damontecres.wholphin.ui.letNotEmpty
|
import com.github.damontecres.wholphin.ui.letNotEmpty
|
||||||
import com.github.damontecres.wholphin.ui.nav.Destination
|
import com.github.damontecres.wholphin.ui.nav.Destination
|
||||||
import com.github.damontecres.wholphin.ui.rememberInt
|
import com.github.damontecres.wholphin.ui.rememberInt
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.ui.util.ResStringProvider
|
import com.github.damontecres.wholphin.ui.util.ResStringProvider
|
||||||
import com.github.damontecres.wholphin.util.DataLoadingState
|
import com.github.damontecres.wholphin.util.DataLoadingState
|
||||||
import com.github.damontecres.wholphin.util.DiscoverRequestType
|
import com.github.damontecres.wholphin.util.DiscoverRequestType
|
||||||
|
|
@ -431,12 +431,14 @@ fun MovieDetailsContent(
|
||||||
}
|
}
|
||||||
state.similar.letNotEmpty { similar ->
|
state.similar.letNotEmpty { similar ->
|
||||||
item {
|
item {
|
||||||
|
val movieCardHeight = LocalInterfaceCustomization.current.cardHeightDp.dp
|
||||||
|
val episodeCardHeight = LocalInterfaceCustomization.current.episodeCardHeightDp.dp
|
||||||
val imageHeight =
|
val imageHeight =
|
||||||
remember(movie.type) {
|
remember(movie.type, movieCardHeight, episodeCardHeight) {
|
||||||
if (movie.type == BaseItemKind.MOVIE) {
|
if (movie.type == BaseItemKind.MOVIE) {
|
||||||
Cards.height2x3
|
movieCardHeight
|
||||||
} else {
|
} else {
|
||||||
Cards.heightEpisode
|
episodeCardHeight
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ItemRow(
|
ItemRow(
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,6 @@ import androidx.tv.material3.MaterialTheme
|
||||||
import androidx.tv.material3.Text
|
import androidx.tv.material3.Text
|
||||||
import com.github.damontecres.wholphin.R
|
import com.github.damontecres.wholphin.R
|
||||||
import com.github.damontecres.wholphin.data.model.BaseItem
|
import com.github.damontecres.wholphin.data.model.BaseItem
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
|
||||||
import com.github.damontecres.wholphin.ui.cards.ItemRow
|
import com.github.damontecres.wholphin.ui.cards.ItemRow
|
||||||
import com.github.damontecres.wholphin.ui.cards.SeasonCard
|
import com.github.damontecres.wholphin.ui.cards.SeasonCard
|
||||||
import com.github.damontecres.wholphin.ui.components.BasicDialog
|
import com.github.damontecres.wholphin.ui.components.BasicDialog
|
||||||
|
|
@ -49,6 +48,7 @@ import com.github.damontecres.wholphin.ui.components.ErrorMessage
|
||||||
import com.github.damontecres.wholphin.ui.components.SearchEditTextBox
|
import com.github.damontecres.wholphin.ui.components.SearchEditTextBox
|
||||||
import com.github.damontecres.wholphin.ui.components.VoiceSearchButton
|
import com.github.damontecres.wholphin.ui.components.VoiceSearchButton
|
||||||
import com.github.damontecres.wholphin.ui.main.SearchResult
|
import com.github.damontecres.wholphin.ui.main.SearchResult
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import org.jellyfin.sdk.model.api.BaseItemKind
|
import org.jellyfin.sdk.model.api.BaseItemKind
|
||||||
|
|
||||||
|
|
@ -219,7 +219,7 @@ fun SearchForContent(
|
||||||
onClick.invoke()
|
onClick.invoke()
|
||||||
},
|
},
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
imageHeight = Cards.height2x3,
|
imageHeight = LocalInterfaceCustomization.current.cardHeightDp.dp,
|
||||||
modifier = mod,
|
modifier = mod,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,6 @@ import com.github.damontecres.wholphin.data.model.Trailer
|
||||||
import com.github.damontecres.wholphin.data.model.studioNames
|
import com.github.damontecres.wholphin.data.model.studioNames
|
||||||
import com.github.damontecres.wholphin.preferences.UserPreferences
|
import com.github.damontecres.wholphin.preferences.UserPreferences
|
||||||
import com.github.damontecres.wholphin.services.TrailerService
|
import com.github.damontecres.wholphin.services.TrailerService
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
|
||||||
import com.github.damontecres.wholphin.ui.RequestOrRestoreFocus
|
import com.github.damontecres.wholphin.ui.RequestOrRestoreFocus
|
||||||
import com.github.damontecres.wholphin.ui.cards.ExtrasRow
|
import com.github.damontecres.wholphin.ui.cards.ExtrasRow
|
||||||
import com.github.damontecres.wholphin.ui.cards.ItemRow
|
import com.github.damontecres.wholphin.ui.cards.ItemRow
|
||||||
|
|
@ -82,6 +81,7 @@ import com.github.damontecres.wholphin.ui.discover.DiscoverRowData
|
||||||
import com.github.damontecres.wholphin.ui.letNotEmpty
|
import com.github.damontecres.wholphin.ui.letNotEmpty
|
||||||
import com.github.damontecres.wholphin.ui.nav.Destination
|
import com.github.damontecres.wholphin.ui.nav.Destination
|
||||||
import com.github.damontecres.wholphin.ui.rememberInt
|
import com.github.damontecres.wholphin.ui.rememberInt
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.ui.util.ResStringProvider
|
import com.github.damontecres.wholphin.ui.util.ResStringProvider
|
||||||
import com.github.damontecres.wholphin.util.DataLoadingState
|
import com.github.damontecres.wholphin.util.DataLoadingState
|
||||||
import com.github.damontecres.wholphin.util.DiscoverRequestType
|
import com.github.damontecres.wholphin.util.DiscoverRequestType
|
||||||
|
|
@ -527,7 +527,7 @@ fun SeriesDetailsContent(
|
||||||
item = item,
|
item = item,
|
||||||
onClick = onClick,
|
onClick = onClick,
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
imageHeight = Cards.height2x3,
|
imageHeight = LocalInterfaceCustomization.current.cardHeightDp.dp,
|
||||||
imageWidth = Dp.Unspecified,
|
imageWidth = Dp.Unspecified,
|
||||||
showImageOverlay = true,
|
showImageOverlay = true,
|
||||||
modifier = mod,
|
modifier = mod,
|
||||||
|
|
@ -612,7 +612,7 @@ fun SeriesDetailsContent(
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
modifier = mod,
|
modifier = mod,
|
||||||
showImageOverlay = true,
|
showImageOverlay = true,
|
||||||
imageHeight = Cards.height2x3,
|
imageHeight = LocalInterfaceCustomization.current.cardHeightDp.dp,
|
||||||
imageWidth = Dp.Unspecified,
|
imageWidth = Dp.Unspecified,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ import com.github.damontecres.wholphin.data.model.HomeRowConfig
|
||||||
import com.github.damontecres.wholphin.data.model.HomeRowViewOptions
|
import com.github.damontecres.wholphin.data.model.HomeRowViewOptions
|
||||||
import com.github.damontecres.wholphin.data.model.QuickDetailsData
|
import com.github.damontecres.wholphin.data.model.QuickDetailsData
|
||||||
import com.github.damontecres.wholphin.preferences.UserPreferences
|
import com.github.damontecres.wholphin.preferences.UserPreferences
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
import com.github.damontecres.wholphin.ui.BASE_SPACING_DP
|
||||||
import com.github.damontecres.wholphin.ui.cards.BannerCard
|
import com.github.damontecres.wholphin.ui.cards.BannerCard
|
||||||
import com.github.damontecres.wholphin.ui.cards.BannerCardWithTitle
|
import com.github.damontecres.wholphin.ui.cards.BannerCardWithTitle
|
||||||
import com.github.damontecres.wholphin.ui.cards.GenreCard
|
import com.github.damontecres.wholphin.ui.cards.GenreCard
|
||||||
|
|
@ -84,7 +84,9 @@ import com.github.damontecres.wholphin.ui.playback.playable
|
||||||
import com.github.damontecres.wholphin.ui.playback.scale
|
import com.github.damontecres.wholphin.ui.playback.scale
|
||||||
import com.github.damontecres.wholphin.ui.rememberPosition
|
import com.github.damontecres.wholphin.ui.rememberPosition
|
||||||
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.ui.util.ScrollToTopBringIntoViewSpec
|
import com.github.damontecres.wholphin.ui.util.ScrollToTopBringIntoViewSpec
|
||||||
|
import com.github.damontecres.wholphin.ui.util.resolvedCardHeight
|
||||||
import com.github.damontecres.wholphin.util.HomeRowLoadingState
|
import com.github.damontecres.wholphin.util.HomeRowLoadingState
|
||||||
import com.github.damontecres.wholphin.util.LoadingState
|
import com.github.damontecres.wholphin.util.LoadingState
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
|
@ -364,7 +366,7 @@ fun HomePageContent(
|
||||||
verticalArrangement = Arrangement.spacedBy(8.dp),
|
verticalArrangement = Arrangement.spacedBy(8.dp),
|
||||||
contentPadding =
|
contentPadding =
|
||||||
PaddingValues(
|
PaddingValues(
|
||||||
bottom = Cards.height2x3,
|
bottom = LocalInterfaceCustomization.current.cardHeightDp.dp,
|
||||||
),
|
),
|
||||||
modifier =
|
modifier =
|
||||||
Modifier
|
Modifier
|
||||||
|
|
@ -427,7 +429,8 @@ fun HomePageContent(
|
||||||
.focusGroup()
|
.focusGroup()
|
||||||
.focusRequester(rowFocusRequesters[rowIndex])
|
.focusRequester(rowFocusRequesters[rowIndex])
|
||||||
.animateItem(),
|
.animateItem(),
|
||||||
horizontalPadding = viewOptions.spacing.dp,
|
horizontalPadding = BASE_SPACING_DP.dp,
|
||||||
|
cardSpacing = LocalInterfaceCustomization.current.spacingDp.dp,
|
||||||
cardContent = { index, item, cardModifier, onClick, onLongClick ->
|
cardContent = { index, item, cardModifier, onClick, onLongClick ->
|
||||||
val onFocus =
|
val onFocus =
|
||||||
remember(rowIndex, index) {
|
remember(rowIndex, index) {
|
||||||
|
|
@ -623,7 +626,7 @@ fun HomePageCardContent(
|
||||||
imageUrl = item.imageUrlOverride,
|
imageUrl = item.imageUrlOverride,
|
||||||
onClick = onClick,
|
onClick = onClick,
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
modifier = modifier.height(viewOptions.heightDp.dp),
|
modifier = modifier.height(viewOptions.resolvedCardHeight()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -634,7 +637,7 @@ fun HomePageCardContent(
|
||||||
imageUrl = item.imageUrlOverride,
|
imageUrl = item.imageUrlOverride,
|
||||||
onClick = onClick,
|
onClick = onClick,
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
modifier = modifier.height(viewOptions.heightDp.dp),
|
modifier = modifier.height(viewOptions.resolvedCardHeight()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -680,7 +683,7 @@ fun HomePageCardContent(
|
||||||
onClick = onClick,
|
onClick = onClick,
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
cardHeight = viewOptions.heightDp.dp,
|
cardHeight = viewOptions.resolvedCardHeight(),
|
||||||
useSeriesForPrimary = viewOptions.useSeries,
|
useSeriesForPrimary = viewOptions.useSeries,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -700,7 +703,7 @@ fun HomePageCardContent(
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
interactionSource = null,
|
interactionSource = null,
|
||||||
cardHeight = viewOptions.heightDp.dp,
|
cardHeight = viewOptions.resolvedCardHeight(),
|
||||||
useSeriesForPrimary = viewOptions.useSeries,
|
useSeriesForPrimary = viewOptions.useSeries,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -729,7 +732,7 @@ fun HomePageViewMoreCard(
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
aspectRatio = aspectRatio,
|
aspectRatio = aspectRatio,
|
||||||
size = DpSize(height = viewOptions.heightDp.dp, width = Dp.Unspecified),
|
size = DpSize(height = viewOptions.resolvedCardHeight(), width = Dp.Unspecified),
|
||||||
showTitle = viewOptions.showTitles,
|
showTitle = viewOptions.showTitles,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,6 @@ import com.github.damontecres.wholphin.services.NavigationManager
|
||||||
import com.github.damontecres.wholphin.services.SeerrService
|
import com.github.damontecres.wholphin.services.SeerrService
|
||||||
import com.github.damontecres.wholphin.services.UserPreferencesService
|
import com.github.damontecres.wholphin.services.UserPreferencesService
|
||||||
import com.github.damontecres.wholphin.ui.AspectRatios
|
import com.github.damontecres.wholphin.ui.AspectRatios
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
|
||||||
import com.github.damontecres.wholphin.ui.RequestOrRestoreFocus
|
import com.github.damontecres.wholphin.ui.RequestOrRestoreFocus
|
||||||
import com.github.damontecres.wholphin.ui.SlimItemFields
|
import com.github.damontecres.wholphin.ui.SlimItemFields
|
||||||
import com.github.damontecres.wholphin.ui.cards.DiscoverItemCard
|
import com.github.damontecres.wholphin.ui.cards.DiscoverItemCard
|
||||||
|
|
@ -101,6 +100,7 @@ import com.github.damontecres.wholphin.ui.onMain
|
||||||
import com.github.damontecres.wholphin.ui.preferences.SwitchColors
|
import com.github.damontecres.wholphin.ui.preferences.SwitchColors
|
||||||
import com.github.damontecres.wholphin.ui.rememberPosition
|
import com.github.damontecres.wholphin.ui.rememberPosition
|
||||||
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
import com.github.damontecres.wholphin.ui.tryRequestFocus
|
||||||
|
import com.github.damontecres.wholphin.ui.util.LocalInterfaceCustomization
|
||||||
import com.github.damontecres.wholphin.util.ExceptionHandler
|
import com.github.damontecres.wholphin.util.ExceptionHandler
|
||||||
import com.github.damontecres.wholphin.util.SearchRelevance
|
import com.github.damontecres.wholphin.util.SearchRelevance
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
|
|
@ -746,7 +746,7 @@ fun SearchPage(
|
||||||
onClick.invoke()
|
onClick.invoke()
|
||||||
},
|
},
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
imageHeight = Cards.heightEpisode,
|
imageHeight = LocalInterfaceCustomization.current.episodeCardHeightDp.dp,
|
||||||
aspectRatio = AspectRatios.SQUARE,
|
aspectRatio = AspectRatios.SQUARE,
|
||||||
showImageOverlay = true,
|
showImageOverlay = true,
|
||||||
modifier = mod,
|
modifier = mod,
|
||||||
|
|
@ -770,7 +770,7 @@ fun SearchPage(
|
||||||
onClick.invoke()
|
onClick.invoke()
|
||||||
},
|
},
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
imageHeight = Cards.heightEpisode,
|
imageHeight = LocalInterfaceCustomization.current.episodeCardHeightDp.dp,
|
||||||
aspectRatio = AspectRatios.SQUARE,
|
aspectRatio = AspectRatios.SQUARE,
|
||||||
showImageOverlay = true,
|
showImageOverlay = true,
|
||||||
modifier = mod,
|
modifier = mod,
|
||||||
|
|
@ -794,7 +794,7 @@ fun SearchPage(
|
||||||
onClick.invoke()
|
onClick.invoke()
|
||||||
},
|
},
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
imageHeight = Cards.heightEpisode,
|
imageHeight = LocalInterfaceCustomization.current.episodeCardHeightDp.dp,
|
||||||
aspectRatio = AspectRatios.SQUARE,
|
aspectRatio = AspectRatios.SQUARE,
|
||||||
showImageOverlay = true,
|
showImageOverlay = true,
|
||||||
modifier = mod,
|
modifier = mod,
|
||||||
|
|
@ -1069,7 +1069,7 @@ fun LazyListScope.searchResultRow(
|
||||||
onClick.invoke()
|
onClick.invoke()
|
||||||
},
|
},
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
imageHeight = Cards.height2x3,
|
imageHeight = LocalInterfaceCustomization.current.cardHeightDp.dp,
|
||||||
showImageOverlay = true,
|
showImageOverlay = true,
|
||||||
modifier = mod,
|
modifier = mod,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,6 @@ import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.fillMaxHeight
|
import androidx.compose.foundation.layout.fillMaxHeight
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.material.icons.Icons
|
|
||||||
import androidx.compose.material.icons.filled.KeyboardArrowDown
|
|
||||||
import androidx.compose.material.icons.filled.KeyboardArrowUp
|
|
||||||
import androidx.compose.material3.HorizontalDivider
|
import androidx.compose.material3.HorizontalDivider
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
|
@ -19,7 +16,6 @@ import androidx.compose.ui.focus.focusRestorer
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.tv.material3.Icon
|
|
||||||
import androidx.tv.material3.MaterialTheme
|
import androidx.tv.material3.MaterialTheme
|
||||||
import androidx.tv.material3.Text
|
import androidx.tv.material3.Text
|
||||||
import com.github.damontecres.wholphin.R
|
import com.github.damontecres.wholphin.R
|
||||||
|
|
@ -33,7 +29,6 @@ import com.github.damontecres.wholphin.ui.tryRequestFocus
|
||||||
fun HomeSettingsGlobal(
|
fun HomeSettingsGlobal(
|
||||||
preferences: AppPreferences,
|
preferences: AppPreferences,
|
||||||
onPreferenceChange: (AppPreferences) -> Unit,
|
onPreferenceChange: (AppPreferences) -> Unit,
|
||||||
onClickResize: (Int) -> Unit,
|
|
||||||
onClickSave: () -> Unit,
|
onClickSave: () -> Unit,
|
||||||
onClickLoad: () -> Unit,
|
onClickLoad: () -> Unit,
|
||||||
onClickLoadWeb: () -> Unit,
|
onClickLoadWeb: () -> Unit,
|
||||||
|
|
@ -107,35 +102,6 @@ fun HomeSettingsGlobal(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
item { HorizontalDivider() }
|
item { HorizontalDivider() }
|
||||||
item {
|
|
||||||
HomeSettingsListItem(
|
|
||||||
selected = false,
|
|
||||||
headlineText = stringResource(R.string.increase_all_cards_size),
|
|
||||||
leadingContent = {
|
|
||||||
Icon(
|
|
||||||
imageVector = Icons.Default.KeyboardArrowUp,
|
|
||||||
contentDescription = null,
|
|
||||||
)
|
|
||||||
},
|
|
||||||
onClick = { onClickResize.invoke(1) },
|
|
||||||
modifier = Modifier,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
item {
|
|
||||||
HomeSettingsListItem(
|
|
||||||
selected = false,
|
|
||||||
headlineText = stringResource(R.string.decrease_all_cards_size),
|
|
||||||
leadingContent = {
|
|
||||||
Icon(
|
|
||||||
imageVector = Icons.Default.KeyboardArrowDown,
|
|
||||||
contentDescription = null,
|
|
||||||
)
|
|
||||||
},
|
|
||||||
onClick = { onClickResize.invoke(-1) },
|
|
||||||
modifier = Modifier,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
item { HorizontalDivider() }
|
|
||||||
item {
|
item {
|
||||||
HomeSettingsListItem(
|
HomeSettingsListItem(
|
||||||
selected = false,
|
selected = false,
|
||||||
|
|
|
||||||
|
|
@ -261,7 +261,6 @@ fun HomeSettingsPage(
|
||||||
viewModel.preferencesDataStore.updateData { newPrefs }
|
viewModel.preferencesDataStore.updateData { newPrefs }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onClickResize = { viewModel.resizeCards(it) },
|
|
||||||
onClickSave = {
|
onClickSave = {
|
||||||
showConfirmDialog =
|
showConfirmDialog =
|
||||||
ShowConfirm(R.string.overwrite_server_settings) {
|
ShowConfirm(R.string.overwrite_server_settings) {
|
||||||
|
|
|
||||||
|
|
@ -629,30 +629,6 @@ class HomeSettingsViewModel
|
||||||
homeSettingsService.currentSettings.update { HomePageResolvedSettings(state.value.rows) }
|
homeSettingsService.currentSettings.update { HomePageResolvedSettings(state.value.rows) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun resizeCards(relative: Int) {
|
|
||||||
viewModelScope.launchIO {
|
|
||||||
updateState {
|
|
||||||
val newRows =
|
|
||||||
it.rows.toMutableList().map { row ->
|
|
||||||
val vo = row.config.viewOptions
|
|
||||||
val newVo = vo.copy(heightDp = vo.heightDp + (4 * relative))
|
|
||||||
row.copy(config = row.config.updateViewOptions(newVo))
|
|
||||||
}
|
|
||||||
it.copy(
|
|
||||||
rows = newRows,
|
|
||||||
rowData =
|
|
||||||
it.rowData.toMutableList().mapIndexed { index, row ->
|
|
||||||
if (row is HomeRowLoadingState.Success) {
|
|
||||||
row.copy(viewOptions = newRows[index].config.viewOptions)
|
|
||||||
} else {
|
|
||||||
row
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun resetToDefault() =
|
fun resetToDefault() =
|
||||||
viewModelScope.launchIO {
|
viewModelScope.launchIO {
|
||||||
val userId = serverRepository.currentUser?.id ?: return@launchIO
|
val userId = serverRepository.currentUser?.id ?: return@launchIO
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,9 @@ data class InterfaceCustomization(
|
||||||
val cardHeightDp: Int
|
val cardHeightDp: Int
|
||||||
get() = Cards.HEIGHT_2X3_DP * cardSizePercent / 100
|
get() = Cards.HEIGHT_2X3_DP * cardSizePercent / 100
|
||||||
|
|
||||||
|
val episodeCardHeightDp: Int
|
||||||
|
get() = Cards.HEIGHT_EPISODE * cardSizePercent / 100
|
||||||
|
|
||||||
val spacingDp: Int
|
val spacingDp: Int
|
||||||
get() = BASE_SPACING_DP * spacingPercent / 100
|
get() = BASE_SPACING_DP * spacingPercent / 100
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,17 @@
|
||||||
package com.github.damontecres.wholphin.ui.util
|
package com.github.damontecres.wholphin.ui.util
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.unit.Dp
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import com.github.damontecres.wholphin.data.model.HomeRowViewOptions
|
||||||
import com.github.damontecres.wholphin.preferences.AppSliderPreference
|
import com.github.damontecres.wholphin.preferences.AppSliderPreference
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
internal fun HomeRowViewOptions.resolvedCardHeight(): Dp {
|
||||||
|
val global = LocalInterfaceCustomization.current.cardHeightDp
|
||||||
|
return (if (heightDp > 0) heightDp else global).dp
|
||||||
|
}
|
||||||
|
|
||||||
internal fun Int.withinBoundsOrDefault(preference: AppSliderPreference<*>): Int {
|
internal fun Int.withinBoundsOrDefault(preference: AppSliderPreference<*>): Int {
|
||||||
val min = preference.min.toInt()
|
val min = preference.min.toInt()
|
||||||
val max = preference.max.toInt()
|
val max = preference.max.toInt()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue