Done replacing LazyGrid with FlowRow

This commit is contained in:
dotmg 2025-09-18 10:01:14 +02:00
parent 69e9ef3087
commit d35fd2e283
2 changed files with 113 additions and 108 deletions

View file

@ -1,20 +1,23 @@
package mg.dot.feufaro package mg.dot.feufaro
import SharedScreenModel import SharedScreenModel
import androidx.compose.foundation.VerticalScrollbar
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height 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.rememberScrollbarAdapter
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -56,14 +59,16 @@ 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() val coroutineScope = rememberCoroutineScope()
val scrollState = rememberScrollState()
Box(Modifier.fillMaxSize()
) {
Column( Column(
Modifier.fillMaxSize() Modifier
.verticalScroll(scrollState)
.pointerInput(Unit) { .pointerInput(Unit) {
detectTapGestures( detectTapGestures(
onDoubleTap = { onDoubleTap = { offset ->
offset ->
menuPosition = offset menuPosition = offset
showContextualMenu = true showContextualMenu = true
} }
@ -71,12 +76,13 @@ object ScreenSolfa : Screen {
}, },
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
) { ) {
val columnScrollState = rememberScrollState()
if (showContextualMenu) { if (showContextualMenu) {
Popup( Popup(
alignment = Alignment.TopStart, alignment = Alignment.TopStart,
offset = IntOffset(menuPosition.x.roundToInt(), offset = IntOffset(
menuPosition.y.roundToInt()), menuPosition.x.roundToInt(),
menuPosition.y.roundToInt()
),
onDismissRequest = { onDismissRequest = {
showContextualMenu = false showContextualMenu = false
} }
@ -89,9 +95,7 @@ object ScreenSolfa : Screen {
} }
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxSize()
.weight(1f)
.verticalScroll(columnScrollState)
) { ) {
FlowRow( FlowRow(
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
@ -116,8 +120,7 @@ object ScreenSolfa : Screen {
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
@ -141,8 +144,7 @@ object ScreenSolfa : Screen {
onClick = { onClick = {
sharedScreenModel.setStanza(i) sharedScreenModel.setStanza(i)
coroutineScope.launch { coroutineScope.launch {
lazyGridState.animateScrollToItem(0) scrollState.animateScrollTo(0)
columnScrollState.animateScrollTo(0)
} }
}, },
modifier = Modifier.padding(horizontal = 4.dp) modifier = Modifier.padding(horizontal = 4.dp)
@ -160,6 +162,11 @@ object ScreenSolfa : Screen {
} }
} }
} }
VerticalScrollbar(
adapter = rememberScrollbarAdapter(scrollState),
modifier = Modifier.fillMaxHeight(0.5f).background(Color.Green).align(Alignment.CenterEnd)
)
}
} }
@Throws(ObjectStreamException::class) // C'est une méthode de sérialisation Java, donc l'exception est nécessaire @Throws(ObjectStreamException::class) // C'est une méthode de sérialisation Java, donc l'exception est nécessaire
private fun readResolve(): Any { private fun readResolve(): Any {

View file

@ -21,7 +21,6 @@ import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.foundation.Canvas import androidx.compose.foundation.Canvas
import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.lazy.grid.itemsIndexed
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
@ -509,8 +508,7 @@ 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
@ -529,8 +527,8 @@ fun LazyVerticalGridTUO(
val itemMinBaseWidth = bestTUOWidth(tuoList) val itemMinBaseWidth = bestTUOWidth(tuoList)
val gridWidthDp = with(density) { gridWidthPx.toDp() } val gridWidthDp = with(density) { gridWidthPx.toDp() }
val (gridCells: GridCells, gridColumnCount: Int) = remember(gridWidthDp, itemMinBaseWidth, columnGroup) { val gridColumnCount: Int = remember(gridWidthDp, itemMinBaseWidth, columnGroup) {
if (gridWidthDp == 0.dp) return@remember Pair(GridCells.Fixed(columnGroup), columnGroup) if (gridWidthDp == 0.dp) return@remember columnGroup
var calculatedCols = var calculatedCols =
(gridWidthDp / (itemMinBaseWidth + horizontalArrangementSpacing)).toInt() (gridWidthDp / (itemMinBaseWidth + horizontalArrangementSpacing)).toInt()
if (calculatedCols == 0) calculatedCols = columnGroup if (calculatedCols == 0) calculatedCols = columnGroup
@ -539,24 +537,24 @@ fun LazyVerticalGridTUO(
if (calculatedCols == 0) calculatedCols = columnGroup if (calculatedCols == 0) calculatedCols = columnGroup
} }
val actualColumnCount: Int = calculatedCols.coerceAtLeast(columnGroup) val actualColumnCount: Int = calculatedCols.coerceAtLeast(columnGroup)
Pair(GridCells.Fixed(actualColumnCount), actualColumnCount) actualColumnCount
} }
val flowRowSize: Float = 0.98f / gridColumnCount
val currentStanza = viewModel.stanza val currentStanza = viewModel.stanza
LazyVerticalGrid( FlowRow(
columns = gridCells, modifier = Modifier.fillMaxWidth(),
modifier = Modifier.fillMaxWidth().heightIn(max = 800.dp),
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 extérieur de toute la liste //contentPadding = PaddingValues(8.dp), // c'est juste le padding extérieur de toute la liste
state = lazyGridState // state = lazyGridState
) { ) {
itemsIndexed(items = tuoList.drop(1), key = { _, it -> it.numBlock }) { relativeIndex, oneTUO -> tuoList.drop(n=1).forEachIndexed { relativeIndex, oneTUO ->
Box( Box(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth(flowRowSize)
.combinedClickable( .combinedClickable(
onClick = { onClick = {
println("Clicked: ${oneTUO.numBlock} / relative index: $relativeIndex") println("Clicked: ${oneTUO.numBlock} / relative index: $relativeIndex")