From abcdadbd0efdd0e612edba4c22284ab1c51b69ce Mon Sep 17 00:00:00 2001 From: sevonj <100710152+sevonj@users.noreply.github.com> Date: Tue, 19 Nov 2024 18:05:36 +0000 Subject: [PATCH] feature: add tile size adjustment for all grid tabs (#673) * Feat: View options sheet for Artists tab * Feat: View options sheet for Playlists tab * Feat: View options sheet for Album Artists tab * Feat: View options sheet for Folders tab * Feat: View options sheet for Genres tab --- .../zyrouge/symphony/services/Settings.kt | 5 ++++ .../symphony/ui/components/AlbumArtistGrid.kt | 30 ++++++++++++++++++- .../symphony/ui/components/ArtistGrid.kt | 30 ++++++++++++++++++- .../symphony/ui/components/GenreGrid.kt | 28 ++++++++++++++++- .../symphony/ui/components/PlaylistGrid.kt | 30 ++++++++++++++++++- .../zyrouge/symphony/ui/view/home/Folders.kt | 29 +++++++++++++++++- 6 files changed, 147 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/zyrouge/symphony/services/Settings.kt b/app/src/main/java/io/github/zyrouge/symphony/services/Settings.kt index 51177c27..c966e7a2 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/services/Settings.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/services/Settings.kt @@ -134,6 +134,7 @@ class Settings(private val symphony: Symphony) { ArtistRepository.SortBy.ARTIST_NAME, ) val lastUsedArtistsSortReverse = BooleanEntry("last_used_artists_sort_reverse", false) + val lastUsedArtistsTileSize = FloatEntry("last_used_artists_tile_size", 200f) val lastUsedAlbumArtistsSortBy = EnumEntry( "last_used_album_artists_sort_by", enumEntries(), @@ -141,6 +142,7 @@ class Settings(private val symphony: Symphony) { ) val lastUsedAlbumArtistsSortReverse = BooleanEntry("last_used_album_artists_sort_reverse", false) + val lastUsedAlbumArtistsTileSize = FloatEntry("last_used_album_artists_tile_size", 200f) val lastUsedAlbumsSortBy = EnumEntry( "last_used_albums_sort_by", enumEntries(), @@ -154,6 +156,7 @@ class Settings(private val symphony: Symphony) { GenreRepository.SortBy.GENRE, ) val lastUsedGenresSortReverse = BooleanEntry("last_used_genres_sort_reverse", false) + val lastUsedGenreTileSize = FloatEntry("last_used_genre_tile_size", 200f) val lastUsedBrowserSortBy = EnumEntry( "last_used_folder_sort_by", enumEntries(), @@ -167,6 +170,7 @@ class Settings(private val symphony: Symphony) { PlaylistRepository.SortBy.TITLE, ) val lastUsedPlaylistsSortReverse = BooleanEntry("last_used_playlists_sort_reverse", false) + val lastUsedPlaylistsTileSize = FloatEntry("last_used_playlists_tile_size", 200f) val lastUsedPlaylistSongsSortBy = EnumEntry( "last_used_playlist_songs_sort_by", enumEntries(), @@ -192,6 +196,7 @@ class Settings(private val symphony: Symphony) { StringListUtils.SortBy.NAME, ) val lastUsedFoldersSortReverse = BooleanEntry("last_used_folders_sort_reverse", false) + val lastUsedFoldersTileSize = FloatEntry("last_used_folders_tile_size", 200f) val lastDisabledTreePaths = StringSetEntry("last_disabled_tree_paths", emptySet()) val previousSongQueue = object : Entry("previous_song_queue") { override fun getValueInternal() = getSharedPreferences().getString(key, null)?.let { diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/components/AlbumArtistGrid.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/components/AlbumArtistGrid.kt index b046f583..e50a99c3 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/components/AlbumArtistGrid.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/components/AlbumArtistGrid.kt @@ -3,17 +3,23 @@ package io.github.zyrouge.symphony.ui.components import androidx.compose.foundation.lazy.grid.itemsIndexed import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Person +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import io.github.zyrouge.symphony.services.groove.Groove import io.github.zyrouge.symphony.services.groove.repositories.AlbumArtistRepository import io.github.zyrouge.symphony.ui.helpers.ViewContext +@OptIn(ExperimentalMaterial3Api::class) @Composable fun AlbumArtistGrid( context: ViewContext, @@ -27,6 +33,10 @@ fun AlbumArtistGrid( context.symphony.groove.albumArtist.sort(albumArtistNames, sortBy, sortReverse) } } + val tileSize by context.symphony.settings.lastUsedAlbumArtistsTileSize.flow.collectAsState() + + val sheetState = rememberModalBottomSheetState() + var showBottomSheet by remember { mutableStateOf(false) } MediaSortBarScaffold( mediaSortBar = { @@ -49,6 +59,7 @@ fun AlbumArtistGrid( ) ) }, + onShowSheet = { showBottomSheet = true } ) }, content = { @@ -64,7 +75,7 @@ fun AlbumArtistGrid( content = { Text(context.symphony.t.DamnThisIsSoEmpty) } ) - else -> ResponsiveGrid { + else -> ResponsiveGrid(tileSize) { itemsIndexed( sortedAlbumArtistNames, key = { i, x -> "$i-$x" }, @@ -77,6 +88,23 @@ fun AlbumArtistGrid( } } } + + if (showBottomSheet) { + ModalBottomSheet( + onDismissRequest = { showBottomSheet = false }, + sheetState = sheetState + ) { + ResponsiveGridSizeAdjust( + context, + tileSize, + onTileSizeChange = { + context.symphony.settings.lastUsedAlbumArtistsTileSize.setValue( + it + ) + }, + ) + } + } } ) } diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/components/ArtistGrid.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/components/ArtistGrid.kt index 23f1e775..28e292c4 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/components/ArtistGrid.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/components/ArtistGrid.kt @@ -3,17 +3,23 @@ package io.github.zyrouge.symphony.ui.components import androidx.compose.foundation.lazy.grid.itemsIndexed import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Person +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import io.github.zyrouge.symphony.services.groove.Groove import io.github.zyrouge.symphony.services.groove.repositories.ArtistRepository import io.github.zyrouge.symphony.ui.helpers.ViewContext +@OptIn(ExperimentalMaterial3Api::class) @Composable fun ArtistGrid( context: ViewContext, @@ -27,6 +33,10 @@ fun ArtistGrid( context.symphony.groove.artist.sort(artistName, sortBy, sortReverse) } } + val tileSize by context.symphony.settings.lastUsedArtistsTileSize.flow.collectAsState() + + val sheetState = rememberModalBottomSheetState() + var showBottomSheet by remember { mutableStateOf(false) } MediaSortBarScaffold( mediaSortBar = { @@ -45,6 +55,7 @@ fun ArtistGrid( label = { Text(context.symphony.t.XArtists((artistsCount ?: artistName.size).toString())) }, + onShowSheet = { showBottomSheet = true }, ) }, content = { @@ -60,7 +71,7 @@ fun ArtistGrid( content = { Text(context.symphony.t.DamnThisIsSoEmpty) } ) - else -> ResponsiveGrid { + else -> ResponsiveGrid(tileSize) { itemsIndexed( sortedArtistNames, key = { i, x -> "$i-$x" }, @@ -72,6 +83,23 @@ fun ArtistGrid( } } } + + if (showBottomSheet) { + ModalBottomSheet( + onDismissRequest = { showBottomSheet = false }, + sheetState = sheetState + ) { + ResponsiveGridSizeAdjust( + context, + tileSize, + onTileSizeChange = { + context.symphony.settings.lastUsedArtistsTileSize.setValue( + it + ) + }, + ) + } + } } ) } diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/components/GenreGrid.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/components/GenreGrid.kt index babdcaf0..92628fdc 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/components/GenreGrid.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/components/GenreGrid.kt @@ -18,12 +18,16 @@ import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha @@ -74,6 +78,10 @@ fun GenreGrid( context.symphony.groove.genre.sort(genreNames, sortBy, sortReverse) } } + val tileSize by context.symphony.settings.lastUsedGenreTileSize.flow.collectAsState() + + val sheetState = rememberModalBottomSheetState() + var showBottomSheet by remember { mutableStateOf(false) } MediaSortBarScaffold( mediaSortBar = { @@ -97,6 +105,7 @@ fun GenreGrid( ) ) }, + onShowSheet = { showBottomSheet = true } ) } }, @@ -113,7 +122,7 @@ fun GenreGrid( content = { Text(context.symphony.t.DamnThisIsSoEmpty) } ) - else -> ResponsiveGrid { gridData -> + else -> ResponsiveGrid(tileSize) { gridData -> itemsIndexed( sortedGenreNames, key = { i, x -> "$i-$x" }, @@ -179,6 +188,23 @@ fun GenreGrid( } } } + + if (showBottomSheet) { + ModalBottomSheet( + onDismissRequest = { showBottomSheet = false }, + sheetState = sheetState + ) { + ResponsiveGridSizeAdjust( + context, + tileSize, + onTileSizeChange = { + context.symphony.settings.lastUsedGenreTileSize.setValue( + it + ) + }, + ) + } + } } ) } diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistGrid.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistGrid.kt index f1d36ad7..642e47dd 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistGrid.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistGrid.kt @@ -4,17 +4,23 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.lazy.grid.itemsIndexed import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.QueueMusic +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import io.github.zyrouge.symphony.services.groove.Groove import io.github.zyrouge.symphony.services.groove.repositories.PlaylistRepository import io.github.zyrouge.symphony.ui.helpers.ViewContext +@OptIn(ExperimentalMaterial3Api::class) @Composable fun PlaylistGrid( context: ViewContext, @@ -29,6 +35,10 @@ fun PlaylistGrid( context.symphony.groove.playlist.sort(playlistIds, sortBy, sortReverse) } } + val tileSize by context.symphony.settings.lastUsedPlaylistsTileSize.flow.collectAsState() + + val sheetState = rememberModalBottomSheetState() + var showBottomSheet by remember { mutableStateOf(false) } MediaSortBarScaffold( mediaSortBar = { @@ -53,6 +63,7 @@ fun PlaylistGrid( ) ) }, + onShowSheet = { showBottomSheet = true }, ) } }, @@ -71,7 +82,7 @@ fun PlaylistGrid( } ) - else -> ResponsiveGrid { + else -> ResponsiveGrid(tileSize) { itemsIndexed( sortedPlaylistIds, key = { i, x -> "$i-$x" }, @@ -83,6 +94,23 @@ fun PlaylistGrid( } } } + + if (showBottomSheet) { + ModalBottomSheet( + onDismissRequest = { showBottomSheet = false }, + sheetState = sheetState + ) { + ResponsiveGridSizeAdjust( + context, + tileSize, + onTileSizeChange = { + context.symphony.settings.lastUsedPlaylistsTileSize.setValue( + it + ) + }, + ) + } + } } ) } diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/view/home/Folders.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/view/home/Folders.kt index 25d8d8ad..4bfb2d2c 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/view/home/Folders.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/view/home/Folders.kt @@ -12,11 +12,14 @@ import androidx.compose.material.icons.automirrored.filled.PlaylistPlay import androidx.compose.material.icons.filled.FolderCopy import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf @@ -35,6 +38,7 @@ import io.github.zyrouge.symphony.ui.components.LoaderScaffold import io.github.zyrouge.symphony.ui.components.MediaSortBar import io.github.zyrouge.symphony.ui.components.MediaSortBarScaffold import io.github.zyrouge.symphony.ui.components.ResponsiveGrid +import io.github.zyrouge.symphony.ui.components.ResponsiveGridSizeAdjust import io.github.zyrouge.symphony.ui.components.SongList import io.github.zyrouge.symphony.ui.components.SquareGrooveTile import io.github.zyrouge.symphony.ui.components.label @@ -142,6 +146,7 @@ fun FoldersView(context: ViewContext) { } } +@OptIn(ExperimentalMaterial3Api::class) @Composable private fun FoldersGrid( context: ViewContext, @@ -155,6 +160,10 @@ private fun FoldersGrid( StringListUtils.sort(folders.keys.toList(), sortBy, sortReverse) } } + val tileSize by context.symphony.settings.lastUsedFoldersTileSize.flow.collectAsState() + + val sheetState = rememberModalBottomSheetState() + var showBottomSheet by remember { mutableStateOf(false) } MediaSortBarScaffold( mediaSortBar = { @@ -173,6 +182,7 @@ private fun FoldersGrid( label = { Text(context.symphony.t.XFolders(folders.size.toString())) }, + onShowSheet = { showBottomSheet = true } ) }, content = { @@ -188,7 +198,7 @@ private fun FoldersGrid( content = { Text(context.symphony.t.DamnThisIsSoEmpty) } ) - else -> ResponsiveGrid { + else -> ResponsiveGrid(tileSize) { itemsIndexed( sortedFolderNames, key = { i, x -> "$i-$x" }, @@ -203,6 +213,23 @@ private fun FoldersGrid( } } } + + if (showBottomSheet) { + ModalBottomSheet( + onDismissRequest = { showBottomSheet = false }, + sheetState = sheetState + ) { + ResponsiveGridSizeAdjust( + context, + tileSize, + onTileSizeChange = { + context.symphony.settings.lastUsedFoldersTileSize.setValue( + it + ) + }, + ) + } + } } ) }