Fixed: underlines

This commit is contained in:
dotmg 2025-07-24 12:11:46 +02:00
parent c619485bb6
commit 0941cc674c
3 changed files with 23 additions and 10 deletions

View file

@ -6,7 +6,8 @@ enum class LineType {
} }
class UnderlineSpec ( class UnderlineSpec (
var x: Int, var x: Int,
val lineType: LineType val lineType: LineType,
val isNewParen: Boolean = false
) { ) {
var y: Int = -1 var y: Int = -1
var okX = false var okX = false
@ -30,9 +31,10 @@ class AnnotatedTUO (originalString: String, val voiceNumber: Int){
while (inRoundParen.size <= voiceNumber) { while (inRoundParen.size <= voiceNumber) {
inRoundParen.add(false) inRoundParen.add(false)
} }
val newParen = value && !inRoundParen[voiceNumber]
inRoundParen[voiceNumber] = value inRoundParen[voiceNumber] = value
if (value) { if (value) {
underlineSpec.add(UnderlineSpec(x, LineType.ROUND)) underlineSpec.add(UnderlineSpec(x, LineType.ROUND, newParen))
} else { } else {
underlineSpec.lastOrNull()?.y = x underlineSpec.lastOrNull()?.y = x
} }
@ -49,9 +51,10 @@ class AnnotatedTUO (originalString: String, val voiceNumber: Int){
while (inSquareParen.size <= voiceNumber) { while (inSquareParen.size <= voiceNumber) {
inSquareParen.add(false) inSquareParen.add(false)
} }
val newParen = value && !inSquareParen[voiceNumber]
inSquareParen[voiceNumber] = value inSquareParen[voiceNumber] = value
if (value) { if (value) {
underlineSpec.add(UnderlineSpec(x, LineType.SQUARE)) underlineSpec.add(UnderlineSpec(x, LineType.SQUARE, newParen))
} else { } else {
underlineSpec.lastOrNull()?.y = x underlineSpec.lastOrNull()?.y = x
} }
@ -60,10 +63,10 @@ class AnnotatedTUO (originalString: String, val voiceNumber: Int){
var x = -1 var x = -1
if (voiceNumber > 0) { if (voiceNumber > 0) {
if (inRoundParen.size > voiceNumber && inRoundParen[voiceNumber]) { if (inRoundParen.size > voiceNumber && inRoundParen[voiceNumber]) {
underlineSpec.add(UnderlineSpec(0, LineType.ROUND)) underlineSpec.add(UnderlineSpec(-1, LineType.ROUND))
} }
if (inSquareParen.size > voiceNumber && inSquareParen[voiceNumber]) { if (inSquareParen.size > voiceNumber && inSquareParen[voiceNumber]) {
underlineSpec.add(UnderlineSpec(0, LineType.SQUARE)) underlineSpec.add(UnderlineSpec(-1, LineType.SQUARE))
} }
originalString.toCharArray().forEach { originalString.toCharArray().forEach {
when (it) { when (it) {
@ -75,7 +78,7 @@ class AnnotatedTUO (originalString: String, val voiceNumber: Int){
else -> { else -> {
x++ x++
finalText += it finalText += it
if (it in listOf('d', 'r', 'm', 'f', 's', 'l', 't')) { if (it in listOf('d', 'r', 'm', 'f', 's', 'l', 't', '-', '―')) {
val lastUnderLineSpec = underlineSpec.lastOrNull() val lastUnderLineSpec = underlineSpec.lastOrNull()
if (lastUnderLineSpec?.okX == false) { if (lastUnderLineSpec?.okX == false) {
lastUnderLineSpec.okX = true lastUnderLineSpec.okX = true

View file

@ -30,6 +30,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
val REGEX_VOWELS_STAGE3 = Regex("_([\\?\\!:,;\\\\)]+)") val REGEX_VOWELS_STAGE3 = Regex("_([\\?\\!:,;\\\\)]+)")
val REGEX_MALAGASY_MN = Regex("([aeio])_([nm])([tdjkbp])") val REGEX_MALAGASY_MN = Regex("([aeio])_([nm])([tdjkbp])")
val REGEX_MALAGASY_MN_STAGE2 = Regex("_([mn])-") val REGEX_MALAGASY_MN_STAGE2 = Regex("_([mn])-")
val REGEX_PAREN_RECURSIVE = Regex("(\\([^\\(\\)]*)\\(([^\\)]*)\\)")
} }
var nextTIndex: Int = -1 var nextTIndex: Int = -1
var nextNIndex: Int = -1 var nextNIndex: Int = -1
@ -151,6 +152,9 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
} }
private fun rearrangeNote(noteString: String, infiniteIter: Int = 0): String { private fun rearrangeNote(noteString: String, infiniteIter: Int = 0): String {
var result: String = noteString var result: String = noteString
result = result .replace(REGEX_PAREN_RECURSIVE, "$1$2")
result = result .replace(REGEX_PAREN_RECURSIVE, "$1$2")
result = result .replace(REGEX_PAREN_RECURSIVE, "$1$2")
result = result .replace(REGEX_SHIFT_PAREN_UPWARD, "$2$1") result = result .replace(REGEX_SHIFT_PAREN_UPWARD, "$2$1")
result = result .replace(REGEX_SHIFT_PAREN_DOWNWARD, "$2$1") result = result .replace(REGEX_SHIFT_PAREN_DOWNWARD, "$2$1")
result = result .replace(REGEX_COLLAPSE_PARENS_OPEN, "$1") result = result .replace(REGEX_COLLAPSE_PARENS_OPEN, "$1")
@ -228,10 +232,14 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
replacement = if (noteCharIterator.hasNext()) noteCharIterator.next() else 'd' replacement = if (noteCharIterator.hasNext()) noteCharIterator.next() else 'd'
firstInLoop = false firstInLoop = false
} }
if (replacement == '(') {
result += replacement
replacement = if (noteCharIterator.hasNext()) noteCharIterator.next() else 'd'
}
for (repetition in 0 until 6) { for (repetition in 0 until 6) {
result += replacement result += replacement
replacement = if (noteCharIterator.hasNext()) noteCharIterator.next() else 'd' replacement = if (noteCharIterator.hasNext()) noteCharIterator.next() else 'd'
if (replacement in setOf('d', 'r', 'm', 'f', 's', 'l', 't' , 'z', if (replacement in setOf('d', 'r', 'm', 'f', 's', 'l', 't' , 'z', '(',
'D', 'R', 'M', 'F', 'S', 'L', 'T', '-', 'Z')) { 'D', 'R', 'M', 'F', 'S', 'L', 'T', '-', 'Z')) {
break break
} }

View file

@ -345,8 +345,8 @@ fun TimeUnitComposable(
var xStart = 0f var xStart = 0f
val separatorLength = if (tuo.sep0 in listOf(":", "!")) 1 else 0 val separatorLength = if (tuo.sep0 in listOf(":", "!")) 1 else 0
val leftMarginUnderlineDp = when (tuo.sep0) { val leftMarginUnderlineDp = when (tuo.sep0) {
"/" -> 8.dp "!" -> 8.dp
"|" -> 5.dp ":" -> 3.dp
else -> 0.dp else -> 0.dp
} }
val leftMarginUnderline = with(currentDensity) { val leftMarginUnderline = with(currentDensity) {
@ -356,7 +356,9 @@ fun TimeUnitComposable(
val lineGlobalStartOffset = textLayoutResult?.getLineStart(ta.voiceNumber - 1) ?: 0 val lineGlobalStartOffset = textLayoutResult?.getLineStart(ta.voiceNumber - 1) ?: 0
val globalStartIndex = lineGlobalStartOffset + us.x val globalStartIndex = lineGlobalStartOffset + us.x
xStart = textLayoutResult?.getCursorRect(globalStartIndex)?.left ?: 0f xStart = textLayoutResult?.getCursorRect(globalStartIndex)?.left ?: 0f
xStart -= leftMarginUnderline if (us.isNewParen) {
xStart += leftMarginUnderline
}
} }
var xEnd = size.width var xEnd = size.width
if (us.y > -1 ) { if (us.y > -1 ) {