Coverage Summary for Class: CueDurationViewKt (com.vsevolodganin.clicktrack.ui.piece)
Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
CueDurationViewKt |
0%
(0/10)
|
0%
(0/43)
|
0%
(0/65)
|
0.4%
(4/958)
|
CueDurationViewKt$WhenMappings |
|
Total |
0%
(0/10)
|
0%
(0/43)
|
0%
(0/65)
|
0.4%
(4/958)
|
package com.vsevolodganin.clicktrack.ui.piece
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.material.MaterialTheme
import androidx.compose.material.ProvideTextStyle
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.vsevolodganin.clicktrack.generated.resources.MR
import com.vsevolodganin.clicktrack.model.CueDuration
import com.vsevolodganin.clicktrack.utils.compose.Preview
import dev.icerock.moko.resources.compose.stringResource
import kotlin.time.Duration.Companion.minutes
@Composable
fun CueDurationView(
value: CueDuration,
onValueChange: (CueDuration) -> Unit,
onTypeChange: (CueDuration.Type) -> Unit,
modifier: Modifier = Modifier,
) {
Row(modifier = modifier.height(IntrinsicSize.Min)) {
DurationTypeDropdown(
value = value.type,
onValueChange = onTypeChange,
)
Spacer(modifier = Modifier.width(8.dp))
val commonCueDurationModifier = Modifier
.align(Alignment.CenterVertically)
.fillMaxWidth()
ProvideTextStyle(MaterialTheme.typography.subtitle1) {
when (value) {
is CueDuration.Beats -> {
EditBeatsView(
value = value,
onValueChange = onValueChange,
modifier = commonCueDurationModifier,
)
}
is CueDuration.Measures -> {
EditMeasuresView(
value = value,
onValueChange = onValueChange,
modifier = commonCueDurationModifier,
)
}
is CueDuration.Time -> {
EditTimeView(
value = value,
onValueChange = onValueChange,
modifier = commonCueDurationModifier,
)
}
}
}
}
}
@Composable
private fun DurationTypeDropdown(value: CueDuration.Type, onValueChange: (CueDuration.Type) -> Unit) {
DropdownSelector(
items = CueDuration.Type.entries,
selectedValue = value,
onSelect = { selectedValue ->
onValueChange(selectedValue)
},
toString = { it.stringResource() },
modifier = Modifier.width(140.dp),
)
}
@Composable
private fun EditBeatsView(value: CueDuration.Beats, onValueChange: (CueDuration) -> Unit, modifier: Modifier = Modifier) {
NumberInputField(
value = value.value,
onValueChange = { onValueChange(CueDuration.Beats(it)) },
modifier = modifier,
)
}
@Composable
private fun EditMeasuresView(value: CueDuration.Measures, onValueChange: (CueDuration) -> Unit, modifier: Modifier = Modifier) {
NumberInputField(
value = value.value,
onValueChange = { onValueChange(CueDuration.Measures(it)) },
modifier = modifier,
)
}
@Composable
private fun EditTimeView(value: CueDuration.Time, onValueChange: (CueDuration) -> Unit, modifier: Modifier = Modifier) {
DurationPicker(
value = value.value,
onValueChange = { onValueChange(CueDuration.Time(it)) },
modifier = modifier,
)
}
@Composable
private fun CueDuration.Type.stringResource(): String {
return when (this) {
CueDuration.Type.BEATS -> MR.strings.cue_duration_beats
CueDuration.Type.MEASURES -> MR.strings.cue_duration_measures
CueDuration.Type.TIME -> MR.strings.cue_duration_time
}.let { stringResource(it) }
}
@Preview
@Composable
private fun Preview() {
MaterialTheme {
Column {
CueDurationView(CueDuration.Beats(999999), {}, {})
CueDurationView(CueDuration.Measures(999999), {}, {})
CueDurationView(CueDuration.Time(1.minutes), {}, {})
}
}
}