Scroll to top when selecting another stanza

This commit is contained in:
dotmg 2025-07-09 18:15:53 +02:00
parent e120dce2bd
commit e3f03703a2
2 changed files with 19 additions and 5 deletions

View file

@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -21,6 +22,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -37,6 +39,7 @@ import mg.dot.feufaro.solfa.LazyVerticalGridTUO
import kotlin.math.roundToInt import kotlin.math.roundToInt
import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.koin.koinScreenModel import cafe.adriel.voyager.koin.koinScreenModel
import kotlinx.coroutines.launch
import mg.dot.feufaro.data.GridTUOData import mg.dot.feufaro.data.GridTUOData
import mg.dot.feufaro.viewmodel.SolfaScreenModel import mg.dot.feufaro.viewmodel.SolfaScreenModel
import java.io.ObjectStreamException import java.io.ObjectStreamException
@ -53,6 +56,8 @@ object ScreenSolfa : Screen {
val measure by sharedScreenModel.measure.collectAsState() val measure by sharedScreenModel.measure.collectAsState()
val stanza by sharedScreenModel.stanza.collectAsState() val stanza by sharedScreenModel.stanza.collectAsState()
val gridTUOData = GridTUOData(measure, tuoList, stanza) val gridTUOData = GridTUOData(measure, tuoList, stanza)
val lazyGridState = rememberLazyGridState()
val coroutineScope = rememberCoroutineScope()
Column( Column(
Modifier.fillMaxSize() Modifier.fillMaxSize()
.pointerInput(Unit) { .pointerInput(Unit) {
@ -66,6 +71,7 @@ object ScreenSolfa : Screen {
}, },
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
) { ) {
val columnScrollState = rememberScrollState()
if (showContextualMenu) { if (showContextualMenu) {
Popup( Popup(
alignment = Alignment.TopStart, alignment = Alignment.TopStart,
@ -85,7 +91,7 @@ object ScreenSolfa : Screen {
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.weight(1f) .weight(1f)
.verticalScroll(rememberScrollState()) .verticalScroll(columnScrollState)
) { ) {
FlowRow( FlowRow(
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
@ -104,11 +110,13 @@ object ScreenSolfa : Screen {
.padding(horizontal = 4.dp) .padding(horizontal = 4.dp)
) )
Text(text = measureString) Text(text = measureString)
Text(text = "Stanza: $stanza")
} }
LazyVerticalGridTUO( LazyVerticalGridTUO(
gridTUOData, gridTUOData,
gridWidthPx = gridWidthPx, gridWidthPx = gridWidthPx,
onGridWidthMeasured = { width -> gridWidthPx = width } onGridWidthMeasured = { width -> gridWidthPx = width },
lazyGridState = lazyGridState
) )
MGButton(onClick = { MGButton(onClick = {
//showContent = !showContent //showContent = !showContent
@ -131,13 +139,16 @@ object ScreenSolfa : Screen {
enabled = (i != stanza.toInt()), enabled = (i != stanza.toInt()),
onClick = { onClick = {
sharedScreenModel.setStanza(i) sharedScreenModel.setStanza(i)
coroutineScope.launch {
lazyGridState.animateScrollToItem(0)
columnScrollState.animateScrollTo(0)
}
}, },
modifier = Modifier.padding(horizontal = 4.dp) modifier = Modifier.padding(horizontal = 4.dp)
) { ) {
Text("$i") Text("$i")
} }
} }
Text(text = "Stanza: $stanza")
val songAuthor: String by sharedScreenModel.songAuthor.collectAsState() val songAuthor: String by sharedScreenModel.songAuthor.collectAsState()
val songComposer: String by sharedScreenModel.songComposer.collectAsState() val songComposer: String by sharedScreenModel.songComposer.collectAsState()
val songRhythm: String by sharedScreenModel.songRhythm.collectAsState() val songRhythm: String by sharedScreenModel.songRhythm.collectAsState()

View file

@ -4,6 +4,7 @@ import androidx.compose.foundation.background
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.grid.GridCells 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.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.lazy.grid.items
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -334,7 +335,8 @@ fun LazyVerticalGridTUO(
viewModel: GridTUOData, viewModel: GridTUOData,
gridWidthPx: Int, gridWidthPx: Int,
onGridWidthMeasured: (Int) -> Unit, onGridWidthMeasured: (Int) -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier,
lazyGridState: LazyGridState
) { ) {
val regexMeasure = Regex("(\\d)/\\d").find(viewModel.measure) val regexMeasure = Regex("(\\d)/\\d").find(viewModel.measure)
val tuoList = viewModel.tuoList val tuoList = viewModel.tuoList
@ -373,7 +375,8 @@ fun LazyVerticalGridTUO(
horizontalArrangement = Arrangement.spacedBy(horizontalArrangementSpacing), horizontalArrangement = Arrangement.spacedBy(horizontalArrangementSpacing),
verticalArrangement = Arrangement.spacedBy(8.dp), 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 -> items(items = tuoList.drop(1), key = { it.numBlock }) { oneTUO ->
TimeUnitComposable( TimeUnitComposable(