archive-97f2350/app/src/main/java/uk/orllewin/sianel/ui/components/upload/QualityPicker.kt 1.9 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
package uk.orllewin.sianel.ui.components.upload

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.selection.selectable
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.RadioButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import uk.orllewin.sianel.data.Quality
import uk.orllewin.sianel.ui.fmtSize


@Composable
fun QualityPicker(
    selected: Quality,
    onChange: (Quality) -> Unit,
    estimateFor: ((Quality) -> Long?)? = null,
) {
    Column(Modifier.fillMaxWidth()) {
        Text(
            "Compression",
            style = MaterialTheme.typography.labelLarge,
            modifier = Modifier.padding(bottom = 4.dp),
        )
        Quality.entries.forEach { q ->
            val estimate = estimateFor?.invoke(q)
            val suffix = estimate?.let { "  •  ~${fmtSize(it)}" } ?: ""
            Row(
                modifier = Modifier
                    .fillMaxWidth()
                    .selectable(
                        selected = (q == selected),
                        onClick = { onChange(q) },
                    )
                    .padding(vertical = 4.dp),
                verticalAlignment = Alignment.CenterVertically,
            ) {
                RadioButton(
                    selected = (q == selected),
                    onClick = null,
                )
                Text(
                    text = "${q.label}$suffix",
                    style = MaterialTheme.typography.bodyMedium,
                    modifier = Modifier.padding(start = 8.dp),
                )
            }
        }
    }
}