Coverage Summary for Class: CueSummaryViewKt (com.vsevolodganin.clicktrack.ui.piece)

Class Class, % Method, % Branch, % Line, % Instruction, %
CueSummaryViewKt 0% (0/1) 0% (0/5) 0% (0/24) 0% (0/45) 0% (0/632)


 package com.vsevolodganin.clicktrack.ui.piece
 
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.width
 import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import com.vsevolodganin.clicktrack.model.BeatsPerMinute
 import com.vsevolodganin.clicktrack.model.BeatsPerMinuteOffset
 import com.vsevolodganin.clicktrack.model.Cue
 import com.vsevolodganin.clicktrack.model.CueDuration
 import com.vsevolodganin.clicktrack.model.TimeSignature
 import com.vsevolodganin.clicktrack.model.bpm
 import com.vsevolodganin.clicktrack.utils.compose.Preview
 import com.vsevolodganin.clicktrack.utils.compose.widthInByText
 
 @Composable
 fun CueSummaryView(cue: Cue, tempoOffset: BeatsPerMinuteOffset) {
     val cueName = cue.name
     if (cueName.isNullOrBlank()) {
         BriefSummary(cue, tempoOffset)
     } else {
         DetailedSummary(cueName, cue, tempoOffset)
     }
 }
 
 @Composable
 private fun BriefSummary(cue: Cue, tempoOffset: BeatsPerMinuteOffset) {
     Row {
         Text(
             text = tempoToText(cue.bpm, tempoOffset),
             modifier = Modifier.align(Alignment.CenterVertically),
             fontSize = 12.sp,
         )
         Spacer(modifier = Modifier.width(2.dp))
         Text(
             text = "${cue.timeSignature.noteCount}\n${cue.timeSignature.noteValue}",
             textAlign = TextAlign.Center,
             style = LocalTextStyle.current.copy(fontSize = 9.sp),
             lineHeight = 7.sp,
         )
     }
 }
 
 @Composable
 private fun DetailedSummary(title: String, cue: Cue, tempoOffset: BeatsPerMinuteOffset) {
     Column {
         val textStyle = MaterialTheme.typography.subtitle1.copy(fontWeight = FontWeight.SemiBold)
         Text(
             text = title,
             modifier = Modifier.widthInByText(maxText = "MMMMMMMM", style = textStyle),
             style = textStyle,
             overflow = TextOverflow.Ellipsis,
             maxLines = 1,
         )
         BriefSummary(cue, tempoOffset)
     }
 }
 
 private fun tempoToText(tempo: BeatsPerMinute, tempoOffset: BeatsPerMinuteOffset): String {
     return StringBuilder().apply {
         append((tempo + tempoOffset).value)
         if (tempoOffset.value != 0) append('*')
     }.toString()
 }
 
 @Preview
 @Composable
 private fun Preview() {
     CueSummaryView(
         Cue(
             bpm = 60.bpm,
             timeSignature = TimeSignature(3, 4),
             duration = CueDuration.Beats(4),
         ),
         tempoOffset = BeatsPerMinuteOffset(13),
     )
 }