Avsluta-dialogen: varaktighet och sluttid som pickers istället för steppers
Some checks failed
release / build-release (push) Has been cancelled
Some checks failed
release / build-release (push) Has been cancelled
±-knapparna fick inte plats på smala skärmar (Oukitel WP9) och var
klyddiga. Nu: två breda knappar — Varaktighet ('hur länge gymmade du?')
och Slut (klockslag, rullar över till nästa dag om det är före starten).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
This commit is contained in:
@@ -475,6 +475,63 @@ private fun CompleteSessionDialog(
|
|||||||
var showCalorieInfo by remember { mutableStateOf(false) }
|
var showCalorieInfo by remember { mutableStateOf(false) }
|
||||||
var showDatePicker by remember { mutableStateOf(false) }
|
var showDatePicker by remember { mutableStateOf(false) }
|
||||||
var showTimePicker by remember { mutableStateOf(false) }
|
var showTimePicker by remember { mutableStateOf(false) }
|
||||||
|
var showDurationPicker by remember { mutableStateOf(false) }
|
||||||
|
var showEndPicker by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
|
if (showDurationPicker) {
|
||||||
|
val durationState = androidx.compose.material3.rememberTimePickerState(
|
||||||
|
initialHour = (durationSeconds / 3600).coerceAtMost(23),
|
||||||
|
initialMinute = (durationSeconds % 3600) / 60,
|
||||||
|
is24Hour = true,
|
||||||
|
)
|
||||||
|
AlertDialog(
|
||||||
|
onDismissRequest = { showDurationPicker = false },
|
||||||
|
title = { Text("Hur länge gymmade du?") },
|
||||||
|
text = { androidx.compose.material3.TimePicker(state = durationState) },
|
||||||
|
confirmButton = {
|
||||||
|
TextButton(onClick = {
|
||||||
|
durationSeconds = (durationState.hour * 3600 + durationState.minute * 60)
|
||||||
|
.coerceAtLeast(60)
|
||||||
|
showDurationPicker = false
|
||||||
|
}) { Text("OK") }
|
||||||
|
},
|
||||||
|
dismissButton = {
|
||||||
|
TextButton(onClick = { showDurationPicker = false }) { Text("Avbryt") }
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showEndPicker) {
|
||||||
|
val zone = java.time.ZoneId.systemDefault()
|
||||||
|
val end = java.time.Instant.ofEpochMilli(startEpochMs + durationSeconds * 1000L).atZone(zone)
|
||||||
|
val endState = androidx.compose.material3.rememberTimePickerState(
|
||||||
|
initialHour = end.hour,
|
||||||
|
initialMinute = end.minute,
|
||||||
|
is24Hour = true,
|
||||||
|
)
|
||||||
|
AlertDialog(
|
||||||
|
onDismissRequest = { showEndPicker = false },
|
||||||
|
title = { Text("När slutade du?") },
|
||||||
|
text = { androidx.compose.material3.TimePicker(state = endState) },
|
||||||
|
confirmButton = {
|
||||||
|
TextButton(onClick = {
|
||||||
|
val start = java.time.Instant.ofEpochMilli(startEpochMs).atZone(zone)
|
||||||
|
var newEnd = start.toLocalDate()
|
||||||
|
.atTime(endState.hour, endState.minute).atZone(zone)
|
||||||
|
// Sluttid före starten? Då menas nästa dag.
|
||||||
|
if (!newEnd.toInstant().isAfter(start.toInstant())) {
|
||||||
|
newEnd = newEnd.plusDays(1)
|
||||||
|
}
|
||||||
|
durationSeconds = ((newEnd.toInstant().toEpochMilli() - startEpochMs) / 1000)
|
||||||
|
.toInt().coerceAtLeast(60)
|
||||||
|
showEndPicker = false
|
||||||
|
}) { Text("OK") }
|
||||||
|
},
|
||||||
|
dismissButton = {
|
||||||
|
TextButton(onClick = { showEndPicker = false }) { Text("Avbryt") }
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (showDatePicker) {
|
if (showDatePicker) {
|
||||||
val dateState = androidx.compose.material3.rememberDatePickerState(
|
val dateState = androidx.compose.material3.rememberDatePickerState(
|
||||||
@@ -597,39 +654,47 @@ private fun CompleteSessionDialog(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
|
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
|
||||||
Text(
|
val zone = java.time.ZoneId.systemDefault()
|
||||||
"VARAKTIGHET",
|
val startDay = java.time.Instant.ofEpochMilli(startEpochMs)
|
||||||
style = MaterialTheme.typography.labelSmall,
|
.atZone(zone).toLocalDate()
|
||||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
val end = java.time.Instant.ofEpochMilli(startEpochMs + durationSeconds * 1000L)
|
||||||
)
|
.atZone(zone)
|
||||||
Row(
|
Column(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
modifier = Modifier.weight(1f),
|
||||||
horizontalArrangement = Arrangement.spacedBy(6.dp),
|
verticalArrangement = Arrangement.spacedBy(4.dp),
|
||||||
) {
|
) {
|
||||||
FilledTonalButton(onClick = {
|
|
||||||
durationSeconds = (durationSeconds - 300).coerceAtLeast(60)
|
|
||||||
}) { Text("−5 m") }
|
|
||||||
FilledTonalButton(onClick = {
|
|
||||||
durationSeconds = (durationSeconds - 60).coerceAtLeast(60)
|
|
||||||
}) { Text("−1 m") }
|
|
||||||
Text(
|
Text(
|
||||||
"%d:%02d".format(durationSeconds / 3600, (durationSeconds % 3600) / 60),
|
"VARAKTIGHET",
|
||||||
style = MaterialTheme.typography.headlineSmall,
|
style = MaterialTheme.typography.labelSmall,
|
||||||
fontWeight = FontWeight.Bold,
|
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||||
textAlign = TextAlign.Center,
|
|
||||||
modifier = Modifier.weight(1f),
|
|
||||||
)
|
)
|
||||||
FilledTonalButton(onClick = { durationSeconds += 60 }) { Text("+1 m") }
|
FilledTonalButton(
|
||||||
FilledTonalButton(onClick = { durationSeconds += 300 }) { Text("+5 m") }
|
onClick = { showDurationPicker = true },
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Text("%d:%02d".format(durationSeconds / 3600, (durationSeconds % 3600) / 60))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.weight(1f),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(4.dp),
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
"SLUT",
|
||||||
|
style = MaterialTheme.typography.labelSmall,
|
||||||
|
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||||
|
)
|
||||||
|
FilledTonalButton(
|
||||||
|
onClick = { showEndPicker = true },
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
"%02d:%02d".format(end.hour, end.minute) +
|
||||||
|
if (end.toLocalDate() != startDay) " +1d" else ""
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Text(
|
|
||||||
"Slut: " + java.time.Instant.ofEpochMilli(startEpochMs + durationSeconds * 1000L)
|
|
||||||
.atZone(java.time.ZoneId.systemDefault())
|
|
||||||
.format(java.time.format.DateTimeFormatter.ofPattern("EEE d MMM HH:mm")),
|
|
||||||
style = MaterialTheme.typography.bodySmall,
|
|
||||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||||
|
|||||||
Reference in New Issue
Block a user