Add thumbnail roundness selector in SettingsScreen

This commit is contained in:
vfsfitvnm
2022-06-05 15:29:36 +02:00
parent 5e18d7e22a
commit 85a5b60e29
8 changed files with 61 additions and 16 deletions

View File

@@ -0,0 +1,28 @@
package it.vfsfitvnm.vimusic.enums
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.utils.LocalPreferences
enum class ThumbnailRoundness {
None,
Light,
Medium,
Heavy;
companion object {
val shape: Shape
@Composable
@ReadOnlyComposable
get() = when (LocalPreferences.current.thumbnailRoundness) {
None -> RectangleShape
Light -> RoundedCornerShape(2.dp)
Medium -> RoundedCornerShape(4.dp)
Heavy -> RoundedCornerShape(8.dp)
}
}
}

View File

@@ -9,8 +9,10 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
@@ -31,6 +33,7 @@ import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
import it.vfsfitvnm.vimusic.ui.views.SongItem import it.vfsfitvnm.vimusic.ui.views.SongItem
import it.vfsfitvnm.vimusic.utils.* import it.vfsfitvnm.vimusic.utils.*
import it.vfsfitvnm.route.RouteHandler import it.vfsfitvnm.route.RouteHandler
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
import it.vfsfitvnm.vimusic.ui.components.themed.* import it.vfsfitvnm.vimusic.ui.components.themed.*
import it.vfsfitvnm.youtubemusic.Outcome import it.vfsfitvnm.youtubemusic.Outcome
import it.vfsfitvnm.youtubemusic.YouTube import it.vfsfitvnm.youtubemusic.YouTube
@@ -190,7 +193,9 @@ fun AlbumScreen(
AsyncImage( AsyncImage(
model = album.thumbnail.size(thumbnailSizePx), model = album.thumbnail.size(thumbnailSizePx),
contentDescription = null, contentDescription = null,
contentScale = ContentScale.FillBounds,
modifier = Modifier modifier = Modifier
.clip(ThumbnailRoundness.shape)
.size(thumbnailSizeDp) .size(thumbnailSizeDp)
) )
@@ -309,7 +314,7 @@ private fun Loading() {
) { ) {
Spacer( Spacer(
modifier = Modifier modifier = Modifier
.background(color = colorPalette.darkGray) .background(color = colorPalette.darkGray, shape = ThumbnailRoundness.shape)
.size(128.dp) .size(128.dp)
) )

View File

@@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
@@ -31,6 +32,7 @@ import com.valentinilk.shimmer.rememberShimmer
import com.valentinilk.shimmer.shimmer import com.valentinilk.shimmer.shimmer
import it.vfsfitvnm.route.RouteHandler import it.vfsfitvnm.route.RouteHandler
import it.vfsfitvnm.vimusic.R import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
import it.vfsfitvnm.vimusic.ui.components.* import it.vfsfitvnm.vimusic.ui.components.*
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
@@ -292,7 +294,7 @@ fun SmallSongItemShimmer(
) { ) {
Spacer( Spacer(
modifier = Modifier modifier = Modifier
.background(colorPalette.darkGray) .background(color = colorPalette.darkGray, shape = ThumbnailRoundness.shape)
.size(thumbnailSizeDp) .size(thumbnailSizeDp)
) )
@@ -365,7 +367,6 @@ fun SmallItem(
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
onClick = onClick onClick = onClick
) )
.padding(vertical = 4.dp, horizontal = 16.dp) .padding(vertical = 4.dp, horizontal = 16.dp)
) )
is YouTube.Item.Video -> SmallVideoItem( is YouTube.Item.Video -> SmallVideoItem(
@@ -436,7 +437,9 @@ fun SmallAlbumItem(
AsyncImage( AsyncImage(
model = album.thumbnail.size(thumbnailSizePx), model = album.thumbnail.size(thumbnailSizePx),
contentDescription = null, contentDescription = null,
contentScale = ContentScale.FillBounds,
modifier = Modifier modifier = Modifier
.clip(ThumbnailRoundness.shape)
.size(thumbnailSizeDp) .size(thumbnailSizeDp)
) )

View File

@@ -15,7 +15,6 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import it.vfsfitvnm.route.RouteHandler import it.vfsfitvnm.route.RouteHandler
import it.vfsfitvnm.vimusic.R import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.ColorPaletteMode
import it.vfsfitvnm.vimusic.ui.components.TopAppBar import it.vfsfitvnm.vimusic.ui.components.TopAppBar
import it.vfsfitvnm.vimusic.ui.components.themed.EnumValueSelectorDialog import it.vfsfitvnm.vimusic.ui.components.themed.EnumValueSelectorDialog
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
@@ -115,13 +114,14 @@ fun SettingsScreen() {
selectedValue = preferences.colorPaletteMode, selectedValue = preferences.colorPaletteMode,
onValueSelected = { onValueSelected = {
preferences.colorPaletteMode = it preferences.colorPaletteMode = it
}, }
valueText = { )
when (it) {
ColorPaletteMode.Light -> "Light" EnumValueSelectorEntry(
ColorPaletteMode.Dark -> "Dark" title = "Thumbnail roundness",
ColorPaletteMode.System -> "System" selectedValue = preferences.thumbnailRoundness,
} onValueSelected = {
preferences.thumbnailRoundness = it
} }
) )
} }

View File

@@ -10,6 +10,7 @@ import androidx.compose.foundation.text.BasicText
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.drawWithCache import androidx.compose.ui.draw.drawWithCache
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorFilter
@@ -30,6 +31,7 @@ import androidx.media3.ui.TimeBar
import coil.compose.AsyncImage import coil.compose.AsyncImage
import it.vfsfitvnm.vimusic.Database import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.R import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
import it.vfsfitvnm.vimusic.ui.components.* import it.vfsfitvnm.vimusic.ui.components.*
import it.vfsfitvnm.vimusic.ui.components.themed.QueuedMediaItemMenu import it.vfsfitvnm.vimusic.ui.components.themed.QueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
@@ -113,8 +115,9 @@ fun PlayerView(
AsyncImage( AsyncImage(
model = "${player.mediaMetadata.artworkUri}-w$smallThumbnailSize-h$smallThumbnailSize", model = "${player.mediaMetadata.artworkUri}-w$smallThumbnailSize-h$smallThumbnailSize",
contentDescription = null, contentDescription = null,
contentScale = ContentScale.Crop, contentScale = ContentScale.FillBounds,
modifier = Modifier modifier = Modifier
.clip(ThumbnailRoundness.shape)
.size(64.dp) .size(64.dp)
) )
@@ -231,9 +234,11 @@ fun PlayerView(
AsyncImage( AsyncImage(
model = "$artworkUri-w$thumbnailSizePx-h$thumbnailSizePx", model = "$artworkUri-w$thumbnailSizePx-h$thumbnailSizePx",
contentDescription = null, contentDescription = null,
contentScale = ContentScale.FillBounds,
modifier = Modifier modifier = Modifier
.padding(bottom = 32.dp) .padding(bottom = 32.dp)
.padding(horizontal = 32.dp) .padding(horizontal = 32.dp)
.clip(ThumbnailRoundness.shape)
.size(thumbnailSizeDp) .size(thumbnailSizeDp)
) )
} }

View File

@@ -70,7 +70,7 @@ fun PlaylistPreviewItem(
AsyncImage( AsyncImage(
model = "${thumbnails.getOrNull(index)}-w$thumbnailSizePx-h$thumbnailSizePx", model = "${thumbnails.getOrNull(index)}-w$thumbnailSizePx-h$thumbnailSizePx",
contentDescription = null, contentDescription = null,
contentScale = ContentScale.Crop, contentScale = ContentScale.FillBounds,
modifier = Modifier modifier = Modifier
.align(alignment) .align(alignment)
.size(thumbnailSize) .size(thumbnailSize)

View File

@@ -10,10 +10,10 @@ import androidx.compose.foundation.text.BasicText
import androidx.compose.material.ripple.rememberRipple import androidx.compose.material.ripple.rememberRipple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.NonRestartableComposable import androidx.compose.runtime.NonRestartableComposable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
@@ -24,9 +24,10 @@ import androidx.compose.ui.unit.dp
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import coil.compose.AsyncImage import coil.compose.AsyncImage
import coil.request.ImageRequest import coil.request.ImageRequest
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.R import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
import it.vfsfitvnm.vimusic.models.SongWithInfo import it.vfsfitvnm.vimusic.models.SongWithInfo
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
import it.vfsfitvnm.vimusic.utils.secondary import it.vfsfitvnm.vimusic.utils.secondary
@@ -114,8 +115,9 @@ fun SongItem(
AsyncImage( AsyncImage(
model = thumbnailModel, model = thumbnailModel,
contentDescription = null, contentDescription = null,
contentScale = ContentScale.Crop, contentScale = ContentScale.FillBounds,
modifier = Modifier modifier = Modifier
.clip(ThumbnailRoundness.shape)
.fillMaxSize() .fillMaxSize()
) )

View File

@@ -12,6 +12,7 @@ import androidx.core.content.edit
import androidx.media3.common.Player import androidx.media3.common.Player
import it.vfsfitvnm.vimusic.enums.ColorPaletteMode import it.vfsfitvnm.vimusic.enums.ColorPaletteMode
import it.vfsfitvnm.vimusic.enums.SongCollection import it.vfsfitvnm.vimusic.enums.SongCollection
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
import it.vfsfitvnm.youtubemusic.YouTube import it.vfsfitvnm.youtubemusic.YouTube
@Stable @Stable
@@ -20,6 +21,7 @@ class Preferences(holder: SharedPreferences) : SharedPreferences by holder {
var searchFilter by preference("searchFilter", YouTube.Item.Song.Filter.value) var searchFilter by preference("searchFilter", YouTube.Item.Song.Filter.value)
var repeatMode by preference("repeatMode", Player.REPEAT_MODE_OFF) var repeatMode by preference("repeatMode", Player.REPEAT_MODE_OFF)
var homePageSongCollection by preference("homePageSongCollection", SongCollection.MostPlayed) var homePageSongCollection by preference("homePageSongCollection", SongCollection.MostPlayed)
var thumbnailRoundness by preference("thumbnailRoundness", ThumbnailRoundness.Light)
} }
val LocalPreferences = staticCompositionLocalOf<Preferences> { TODO() } val LocalPreferences = staticCompositionLocalOf<Preferences> { TODO() }