Add sliders to set ISO and aperture

This commit is contained in:
2024-08-05 21:07:02 +02:00
parent 04f0093ad7
commit 0e164b41bf
@@ -11,11 +11,11 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Slider
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
@@ -27,6 +27,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import eu.wa5p.lightmeter.ui.theme.LightMeterTheme
import kotlin.math.roundToInt
const val TAG: String = "lightmeter MainActivity"
@@ -104,16 +105,22 @@ fun LightmeterListItem(
) {
Row(modifier = Modifier.padding(bottom = 8.dp)) {
Text(
modifier = Modifier.weight(0.4f).padding(all = 8.dp),
modifier = Modifier
.weight(0.4f)
.padding(all = 8.dp),
text = label
)
Text(
modifier = Modifier.weight(0.4f).padding(all = 8.dp),
modifier = Modifier
.weight(0.4f)
.padding(all = 8.dp),
textAlign = TextAlign.Right,
text = value
)
Text(
modifier = Modifier.weight(0.2f).padding(all = 8.dp),
modifier = Modifier
.weight(0.2f)
.padding(all = 8.dp),
text = unit
)
}
@@ -131,14 +138,86 @@ fun LightmeterListItemPreview() {
}
}
// TODO: Recalculate state on change
@Composable
fun IsoSlider(state: MutableState<LightmeterState>) {
Row(
modifier = Modifier.padding(all = 8.dp),
verticalAlignment = Alignment.CenterVertically
) {
Text(
modifier = Modifier.weight(0.3f),
text = "ISO"
)
Slider(
modifier = Modifier.weight(0.7f),
value = state.value.iso.toFloat(),
onValueChange = { value ->
state.value = state.value.copy(iso = value.roundToInt())
},
valueRange = 1f..2000f
)
}
}
val previewlightmeterState = mutableStateOf(
LightmeterState(
illuminance = 0.0,
aperture = 1.8,
iso = 100,
shutterSpeed = 0.01
)
)
@Preview(showBackground = true)
@Composable
fun IsoSliderPreview() {
LightMeterTheme {
IsoSlider(
state = remember { previewlightmeterState }
)
}
}
// TODO: Recalculate state on change
@Composable
fun ApertureSlider(state: MutableState<LightmeterState>) {
Row(
modifier = Modifier.padding(all = 8.dp),
verticalAlignment = Alignment.CenterVertically
) {
Text(
modifier = Modifier.weight(0.3f),
text = "Aperture"
)
Slider(
modifier = Modifier.weight(0.7f),
value = state.value.aperture.toFloat(),
onValueChange = { value ->
state.value = state.value.copy(aperture = value.toDouble())
},
valueRange = 0.85f..22f
)
}
}
@Preview(showBackground = true)
@Composable
fun ApertureSliderPreview() {
LightMeterTheme {
ApertureSlider(state = remember { previewlightmeterState })
}
}
@Composable
fun LightmeterHomeScreen(state: MutableState<LightmeterState>) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
Column(modifier = Modifier
.fillMaxSize()
.padding(top = 64.dp)
.padding(all = 32.dp)
) {
Column(
verticalArrangement = Arrangement.Center
verticalArrangement = Arrangement.Top
) {
LightmeterListItem(
label = "Illuminance",
@@ -161,6 +240,14 @@ fun LightmeterHomeScreen(state: MutableState<LightmeterState>) {
unit = "s"
)
}
Column(
modifier = Modifier.padding(top = 64.dp),
verticalArrangement = Arrangement.Bottom
) {
IsoSlider(state = state)
ApertureSlider(state = state)
}
}
}
@@ -169,16 +256,7 @@ fun LightmeterHomeScreen(state: MutableState<LightmeterState>) {
fun LightmeterHomeScreenPreview() {
LightMeterTheme {
LightmeterHomeScreen(
state = remember {
mutableStateOf(
LightmeterState(
illuminance = 0.0,
aperture = 1.8,
iso = 100,
shutterSpeed = 0.01
)
)
}
state = remember { previewlightmeterState }
)
}
}