From e3f03703a2dd459bf538bc7b76507b6115400803 Mon Sep 17 00:00:00 2001 From: dotmg Date: Wed, 9 Jul 2025 18:15:53 +0200 Subject: [PATCH] Scroll to top when selecting another stanza --- .../kotlin/mg/dot/feufaro/ScreenSolfa.kt | 17 ++++++++++++++--- .../mg/dot/feufaro/solfa/TimeUnitObject.kt | 7 +++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/ScreenSolfa.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/ScreenSolfa.kt index d7625e7..7c65916 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/ScreenSolfa.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/ScreenSolfa.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text @@ -21,6 +22,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -37,6 +39,7 @@ import mg.dot.feufaro.solfa.LazyVerticalGridTUO import kotlin.math.roundToInt import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.koin.koinScreenModel +import kotlinx.coroutines.launch import mg.dot.feufaro.data.GridTUOData import mg.dot.feufaro.viewmodel.SolfaScreenModel import java.io.ObjectStreamException @@ -53,6 +56,8 @@ object ScreenSolfa : Screen { val measure by sharedScreenModel.measure.collectAsState() val stanza by sharedScreenModel.stanza.collectAsState() val gridTUOData = GridTUOData(measure, tuoList, stanza) + val lazyGridState = rememberLazyGridState() + val coroutineScope = rememberCoroutineScope() Column( Modifier.fillMaxSize() .pointerInput(Unit) { @@ -66,6 +71,7 @@ object ScreenSolfa : Screen { }, horizontalAlignment = Alignment.CenterHorizontally, ) { + val columnScrollState = rememberScrollState() if (showContextualMenu) { Popup( alignment = Alignment.TopStart, @@ -85,7 +91,7 @@ object ScreenSolfa : Screen { modifier = Modifier .fillMaxWidth() .weight(1f) - .verticalScroll(rememberScrollState()) + .verticalScroll(columnScrollState) ) { FlowRow( modifier = Modifier.fillMaxWidth() @@ -104,11 +110,13 @@ object ScreenSolfa : Screen { .padding(horizontal = 4.dp) ) Text(text = measureString) + Text(text = "Stanza: $stanza") } LazyVerticalGridTUO( gridTUOData, gridWidthPx = gridWidthPx, - onGridWidthMeasured = { width -> gridWidthPx = width } + onGridWidthMeasured = { width -> gridWidthPx = width }, + lazyGridState = lazyGridState ) MGButton(onClick = { //showContent = !showContent @@ -131,13 +139,16 @@ object ScreenSolfa : Screen { enabled = (i != stanza.toInt()), onClick = { sharedScreenModel.setStanza(i) + coroutineScope.launch { + lazyGridState.animateScrollToItem(0) + columnScrollState.animateScrollTo(0) + } }, modifier = Modifier.padding(horizontal = 4.dp) ) { Text("$i") } } - Text(text = "Stanza: $stanza") val songAuthor: String by sharedScreenModel.songAuthor.collectAsState() val songComposer: String by sharedScreenModel.songComposer.collectAsState() val songRhythm: String by sharedScreenModel.songRhythm.collectAsState() diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TimeUnitObject.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TimeUnitObject.kt index 5bc7c78..ba73654 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TimeUnitObject.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TimeUnitObject.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.background import androidx.compose.runtime.Composable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyGridState import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.ui.Modifier @@ -334,7 +335,8 @@ fun LazyVerticalGridTUO( viewModel: GridTUOData, gridWidthPx: Int, onGridWidthMeasured: (Int) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + lazyGridState: LazyGridState ) { val regexMeasure = Regex("(\\d)/\\d").find(viewModel.measure) val tuoList = viewModel.tuoList @@ -373,7 +375,8 @@ fun LazyVerticalGridTUO( horizontalArrangement = Arrangement.spacedBy(horizontalArrangementSpacing), verticalArrangement = Arrangement.spacedBy(8.dp), - contentPadding = PaddingValues(8.dp) // c'est juste le padding exterieur de toute la liste + contentPadding = PaddingValues(8.dp), // c'est juste le padding exterieur de toute la liste + state = lazyGridState ) { items(items = tuoList.drop(1), key = { it.numBlock }) { oneTUO -> TimeUnitComposable(