From 544e393b2214a66433d9b197782453b364638ad9 Mon Sep 17 00:00:00 2001 From: Hasinjato Date: Mon, 28 Sep 2026 16:01:35 +0300 Subject: [PATCH] Add "k" metadata for optimum column count on source; |k:16 --- .../kotlin/mg/dot/feufaro/solfa/Solfa.kt | 1 + .../mg/dot/feufaro/solfa/TimeUnitObject.kt | 69 +++++++++++++------ .../feufaro/viewmodel/SharedScreenModel.kt | 10 +++ 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt index f1ca430..61871df 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt @@ -2050,6 +2050,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository sharedScreenModel.setSongComposer(meta["h"] ?: "") sharedScreenModel.setSongRhythm(meta["r"] ?: "") sharedScreenModel.setBpmFlow(meta["p"]?.toFloat() ?: 120.0f) + sharedScreenModel.setOptimColGrid(meta["k"]?.toIntOrNull() ?: 0) } private fun loadN(voiceNumber: Int, line: String, templateComments: MutableList) { 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 06efe11..b4a3fa0 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TimeUnitObject.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TimeUnitObject.kt @@ -662,32 +662,61 @@ fun LazyVerticalGridTUO( noteStyle = MaterialTheme.typography.bodyLarge ) val itemMinBaseWidth = tuoWidthMeasure.width + val optimColGrid by sharedScreenModel.getOptimColGrid().collectAsState() val gridWidthDp = with(density) { gridWidthPx.toDp() } + var initialWidthPx by remember { mutableStateOf(null) } + var hasResized by remember { mutableStateOf(false) } - // on affiche un loader pour éviter le "saut" visuel - val isLayoutReady = tuoWidthMeasure.isReady && gridWidthDp > 0.dp + LaunchedEffect(gridWidthPx) { + if (gridWidthPx > 0) { + if (initialWidthPx == null) { + initialWidthPx = gridWidthPx + } else if (gridWidthPx != initialWidthPx) { + hasResized = true + } + } + } + + LaunchedEffect(optimColGrid, tuoList) { + hasResized = false + initialWidthPx = null + } + + val isLayoutReady = if (optimColGrid > 0 && !hasResized) { + true + } else { + tuoWidthMeasure.isReady && gridWidthDp > 0.dp + } val gridCount by sharedScreenModel.gridCount.collectAsState() - var baseGridColumnCount: Int = remember(gridWidthDp, tuoWidthMeasure.isReady, tuoWidthMeasure.width, multiple) { - if (!tuoWidthMeasure.isReady || gridWidthDp <= 0.dp || tuoWidthMeasure.width <= 0.dp) { - return@remember multiple + val baseGridColumnCount: Int = remember( + gridWidthDp, + tuoWidthMeasure.isReady, + tuoWidthMeasure.width, + multiple, + optimColGrid, + hasResized + ) { + if (optimColGrid > 0 && !hasResized) { + optimColGrid + } else { + if (!tuoWidthMeasure.isReady || gridWidthDp <= 0.dp || tuoWidthMeasure.width <= 0.dp) { + multiple + } else { + val rawCapacity = (gridWidthDp + 9.dp) / tuoWidthMeasure.width + val rawColsInt = rawCapacity.toInt() + val roundedToMultiple = (rawColsInt / multiple) * multiple + // println("Largeur écran/grille : $gridWidthDp") + // println("Largeur bloc TUO max : ${tuoWidthMeasure.width}") + // println("Signature temps (multiple) : $multiple") + // println("Capacité brute d'accueil : $rawCapacity blocs ($rawColsInt entiers)") + // println("Arrondi au multiple inférieur : $roundedToMultiple colonnes") + // println("Nombre final retenu (min $multiple) : $finalCols colonnes") + // println("=========================") + roundedToMultiple.coerceAtLeast(multiple) + } } - - val rawCapacity = (gridWidthDp + 9.dp) / tuoWidthMeasure.width - val rawColsInt = rawCapacity.toInt() - val roundedToMultiple = (rawColsInt / multiple) * multiple - val finalCols = roundedToMultiple.coerceAtLeast(multiple) - -// println("Largeur écran/grille : $gridWidthDp") -// println("Largeur bloc TUO max : ${tuoWidthMeasure.width}") -// println("Signature temps (multiple) : $multiple") -// println("Capacité brute d'accueil : $rawCapacity blocs ($rawColsInt entiers)") -// println("Arrondi au multiple inférieur : $roundedToMultiple colonnes") -// println("Nombre final retenu (min $multiple) : $finalCols colonnes") -// println("=========================") - - finalCols } val gridColumnCount = (baseGridColumnCount + gridCount).coerceAtLeast(multiple) diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/viewmodel/SharedScreenModel.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/viewmodel/SharedScreenModel.kt index 4eda066..69f36a9 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/viewmodel/SharedScreenModel.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/viewmodel/SharedScreenModel.kt @@ -78,6 +78,16 @@ class SharedScreenModel(private val fileRepository: FileRepository) : ScreenMode fun getBpmFlow(): StateFlow { return currentBpmFlow } + + private val _optimColGrid = MutableStateFlow(0) + val optimColNbGrid: StateFlow = _optimColGrid.asStateFlow() + + fun setOptimColGrid(nbGrid: Int) { + _optimColGrid.value = nbGrid + } + fun getOptimColGrid(): StateFlow { + return optimColNbGrid + } val internalItems: StateFlow> = _drawerItems .map { list -> list.filter { it.path.startsWith("assets://") } } .stateIn(screenModelScope, SharingStarted.Lazily, emptyList())