Add thumbnail roundness selector in SettingsScreen
This commit is contained in:
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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() }
|
||||||
|
|||||||
Reference in New Issue
Block a user