Add Transpose to C btn on key tools

This commit is contained in:
Hasinjato 2026-06-10 15:00:25 +03:00
parent 93797089d8
commit 89d0b850f8
2 changed files with 130 additions and 90 deletions

View file

@ -63,11 +63,8 @@ class Transpose {
val totalAlter = interval + currentModulationInterval val totalAlter = interval + currentModulationInterval
val transposedBody = NOTE_UNIT_REGEX.replace(remaining) { matchResult -> val transposedBody = NOTE_UNIT_REGEX.replace(remaining) { matchResult ->
val noteCore = matchResult.groupValues[1] val fullNote = matchResult.value
val octave = matchResult.groupValues[2] transpose(note = fullNote, fromKey = "C", toKey = "C", alter = totalAlter)
val transposedCore = transpose(note = noteCore, fromKey = "C", toKey = "C", alter = totalAlter)
transposedCore + octave
} }
val result = separators + transposedBody val result = separators + transposedBody

View file

@ -2,7 +2,6 @@ package mg.dot.feufaro.ui
import SharedScreenModel import SharedScreenModel
import androidx.compose.animation.* import androidx.compose.animation.*
import androidx.compose.animation.core.tween
import androidx.compose.foundation.* import androidx.compose.foundation.*
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@ -107,6 +106,11 @@ fun MainScreenWithDrawer(
} }
} }
val isEditMode by sharedScreenModel.modeEditor.collectAsState() val isEditMode by sharedScreenModel.modeEditor.collectAsState()
LaunchedEffect(isEditMode) {
if(isEditMode) {
drawerState.close()
}
}
val currentActiveFilePath = sharedScreenModel.activeFilePath.value val currentActiveFilePath = sharedScreenModel.activeFilePath.value
val fileName = currentActiveFilePath.substringAfterLast('/') val fileName = currentActiveFilePath.substringAfterLast('/')
@ -238,113 +242,152 @@ fun MainScreenWithDrawer(
val isPendingChange = tempInterval != appliedInterval val isPendingChange = tempInterval != appliedInterval
val isCurrentlyTransposed = appliedInterval != 0 val isCurrentlyTransposed = appliedInterval != 0
Row( Box(
modifier = Modifier.fillMaxHeight(), modifier = Modifier.padding(end = 16.dp),
verticalAlignment = Alignment.CenterVertically contentAlignment = Alignment.TopEnd
) { ) {
AnimatedVisibility( Row(
visible = isEyeVisible, modifier = Modifier.fillMaxHeight(),
enter = expandHorizontally(expandFrom = Alignment.End) + fadeIn(tween(300)), verticalAlignment = Alignment.CenterVertically
exit = shrinkHorizontally(shrinkTowards = Alignment.End) + fadeOut(tween(300))
) { ) {
Row( Text(
verticalAlignment = Alignment.CenterVertically, text = tempUiKey,
horizontalArrangement = Arrangement.SpaceEvenly, fontSize = 25.sp,
fontWeight = FontWeight.Black,
textAlign = TextAlign.Center,
color = if (isCurrentlyTransposed && !isPendingChange) Color(0xFFFFD700) else Color.White,
modifier = Modifier modifier = Modifier
.padding(end = 8.dp) .clickable(
.background(Color.White.copy(alpha = 0.15f), RoundedCornerShape(50)) interactionSource = remember { MutableInteractionSource() },
.padding(horizontal = 4.dp) indication = null
) {
/* <*/
val currentIndex = keysOrder.indexOf(tempUiKey).takeIf { it != -1 } ?: 0
val targetKeyLeft = keysOrder[(currentIndex - 1 + 12) % 12]
TooltipBox(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
tooltip = { PlainTooltip(containerColor = Color.DarkGray, contentColor = Color.White) { Text(targetKeyLeft, fontSize = 12.sp) } },
state = rememberTooltipState()
) {
IconButton(
modifier = Modifier.size(36.dp),
onClick = { tempInterval-- }
) { ) {
Icon( isEyeVisible = !isEyeVisible
imageVector = Icons.AutoMirrored.Filled.KeyboardArrowLeft, }
contentDescription = null, .width(45.dp)
tint = Color.White )
) }
DropdownMenu(
expanded = isEyeVisible,
onDismissRequest = { isEyeVisible = false },
containerColor = Color(0xFF2C3135).copy(alpha = 0.75f),
shape = RoundedCornerShape(16.dp),
modifier = Modifier.padding(12.dp)
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
/* < = > */
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceEvenly,
modifier = Modifier.padding(horizontal = 4.dp)
) {
/* < */
val currentIndex = keysOrder.indexOf(tempUiKey).takeIf { it != -1 } ?: 0
val targetKeyLeft = keysOrder[(currentIndex - 1 + 12) % 12]
TooltipBox(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
tooltip = { PlainTooltip(containerColor = Color.DarkGray, contentColor = Color.White) { Text(targetKeyLeft, fontSize = 12.sp) } },
state = rememberTooltipState()
) {
IconButton(
modifier = Modifier.size(36.dp),
onClick = { tempInterval-- }
) {
Icon(
imageVector = Icons.AutoMirrored.Filled.KeyboardArrowLeft,
contentDescription = null,
tint = Color.White
)
}
}
val centralIcon = if (isPendingChange) Icons.Filled.Check else Icons.Filled.SwapHoriz
val centralTint = if (isPendingChange) Color(0xFFFFD700) else Color.White
val tooltipText = if (isPendingChange) "Transposer en $tempUiKey" else if (isCurrentlyTransposed) "Revenir en $songKey" else "Transposer"
TooltipBox(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
tooltip = {
PlainTooltip(containerColor = Color.DarkGray, contentColor = Color.White) { Text(text = tooltipText, fontSize = 12.sp) }
},
state = rememberTooltipState()
) {
IconButton(
modifier = Modifier.size(36.dp),
onClick = {
if (!isPendingChange && isCurrentlyTransposed) {
tempInterval = 0
sharedScreenModel.setTranspositionInterval(0)
} else {
sharedScreenModel.setTranspositionInterval(tempInterval)
}
solfaScreenModel.loadFromFile(sharedScreenModel.activeFilePath.value)
isEyeVisible = false
}
) {
Icon(
imageVector = centralIcon,
contentDescription = null,
tint = centralTint
)
}
}
/* > */
val targetKeyRight = keysOrder[(currentIndex + 1) % 12]
TooltipBox(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
tooltip = { PlainTooltip(containerColor = Color.DarkGray, contentColor = Color.White) { Text(targetKeyRight, fontSize = 12.sp) } },
state = rememberTooltipState()
) {
IconButton(
modifier = Modifier.size(36.dp),
onClick = { tempInterval++ }
) {
Icon(
imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight,
contentDescription = null,
tint = Color.White
)
}
} }
} }
val centralIcon = if (isPendingChange) Icons.Filled.Check else Icons.Filled.SwapHoriz val cIndex = keysOrder.indexOf("C")
val centralTint = if (isPendingChange) Color(0xFFFFD700) else Color.White val intervalToC = if (cIndex != -1) cIndex - songKeyIndex else 0
val tooltipText = if (isPendingChange) "Transposer en $tempUiKey" else if (isCurrentlyTransposed) "Revenir au ($songKey)" else "Transposer"
TooltipBox( TooltipBox(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
tooltip = { tooltip = {
PlainTooltip(containerColor = Color.DarkGray, contentColor = Color.White) { Text(text = tooltipText, fontSize = 12.sp) } PlainTooltip(containerColor = Color.DarkGray, contentColor = Color.White) { Text(text = "Transposer en Do (C)", fontSize = 12.sp) }
}, },
state = rememberTooltipState() state = rememberTooltipState()
) { ) {
IconButton( OutlinedButton(
modifier = Modifier.size(36.dp),
onClick = { onClick = {
if (!isPendingChange && isCurrentlyTransposed) { tempInterval = intervalToC
tempInterval = 0 sharedScreenModel.setTranspositionInterval(intervalToC)
sharedScreenModel.setTranspositionInterval(0)
} else {
sharedScreenModel.setTranspositionInterval(tempInterval)
}
solfaScreenModel.loadFromFile(sharedScreenModel.activeFilePath.value) solfaScreenModel.loadFromFile(sharedScreenModel.activeFilePath.value)
isEyeVisible = false isEyeVisible = false
} },
modifier = Modifier.fillMaxWidth().height(36.dp),
shape = RoundedCornerShape(8.dp),
border = BorderStroke(1.dp, Color(0xFFFFD700).copy(alpha = 0.5f)),
colors = ButtonDefaults.outlinedButtonColors(contentColor = Color(0xFFFFD700))
) { ) {
Icon( Text(
imageVector = centralIcon, text = "Transposer en C",
contentDescription = null, fontSize = 12.sp,
tint = centralTint fontWeight = FontWeight.Bold
)
}
}
/* > */
val targetKeyRight = keysOrder[(currentIndex + 1) % 12]
TooltipBox(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
tooltip = { PlainTooltip(containerColor = Color.DarkGray, contentColor = Color.White) { Text(targetKeyRight, fontSize = 12.sp) } },
state = rememberTooltipState()
) {
IconButton(
modifier = Modifier.size(36.dp),
onClick = { tempInterval++ }
) {
Icon(
imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight,
contentDescription = null,
tint = Color.White
) )
} }
} }
} }
} }
Text(
text = tempUiKey,
fontSize = 25.sp,
fontWeight = FontWeight.Black,
textAlign = TextAlign.Center,
color = if (isCurrentlyTransposed && !isPendingChange) Color(0xFFFFD700) else Color.White,
modifier = Modifier
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = null
) {
isEyeVisible = !isEyeVisible
}
.padding(end = 16.dp)
.width(45.dp)
)
} }
}, colors = TopAppBarColors( }, colors = TopAppBarColors(
containerColor = MaterialTheme.colorScheme.primary, containerColor = MaterialTheme.colorScheme.primary,