This commit is contained in:
2025-11-25 14:20:32 +01:00
commit 3d642622f2
52 changed files with 1643 additions and 0 deletions

View File

@@ -0,0 +1,162 @@
package com.petrovv.gogameclock
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.selection.selectable
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Button
import androidx.compose.material3.RadioButton
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
enum class TimingOption(val displayName: String) {
Absolute("Absolute Timing"),
Fischer("Fischer Timing"),
Canadian("Canadian Timing"),
Japan("Japan Timing"),
}
@Composable
fun SettingsScreen(
modifier: Modifier = Modifier,
onTimingChange: (IClock, IClock) -> Unit
) {
var t1 by remember { mutableStateOf("1200") }
var t2 by remember { mutableStateOf("60") }
var t3 by remember { mutableStateOf("25") }
val timingOptions = remember { TimingOption.entries }
var selectedTiming by remember { mutableStateOf(TimingOption.Absolute) }
Column(
modifier = modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = "Settings")
Spacer(modifier = Modifier.height(16.dp))
TextField(
value = t1,
onValueChange = { t1 = it },
label = { Text("Main time (s)") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
)
Column {
timingOptions.forEach { timingType ->
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.selectable(
selected = (timingType == selectedTiming),
onClick = { selectedTiming = timingType }
)
.padding(horizontal = 16.dp)
) {
RadioButton(
selected = (timingType == selectedTiming),
onClick = { selectedTiming = timingType }
)
Text(
text = timingType.displayName,
modifier = Modifier.padding(start = 16.dp)
)
}
}
}
var text1 = ""
var text2 = ""
var show1 = false
var show2 = false
when (selectedTiming) {
TimingOption.Absolute -> {}
TimingOption.Fischer -> {
text1 = "Increment (s)"
show1 = true
}
TimingOption.Canadian -> {
text1 = "byo-yomi time (s)"
text2 = "byo-yomi stones"
show1 = true
show2 = true
}
TimingOption.Japan -> {
text1 = "byo-yomi time (s)"
text2 = "byo-yomi periods"
show1 = true
show2 = true
}
}
if (show1) {
Spacer(modifier = Modifier.height(8.dp))
TextField(
value = t2,
onValueChange = { t2 = it },
label = { Text(text1) },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
}
if (show2) {
Spacer(modifier = Modifier.height(8.dp))
TextField(
value = t3,
onValueChange = { t3 = it },
label = { Text(text2) },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
}
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = {
val v1 = t1.toLongOrNull() ?: 25
val v2 = t2.toLongOrNull() ?: 25
val v3 = t3.toLongOrNull() ?: 25
when (selectedTiming) {
TimingOption.Absolute -> onTimingChange(AbsoluteTiming(v1), AbsoluteTiming(v1))
TimingOption.Fischer -> {
onTimingChange(
FischerTiming(v1, v2),
FischerTiming(v1, v2)
)
}
TimingOption.Canadian -> {
onTimingChange(
CanadianTiming(v1, v2, v3),
CanadianTiming(v1, v2, v3)
)
}
TimingOption.Japan -> {
onTimingChange(
JapanTiming(v1, v2, v3),
JapanTiming(v1, v2, v3)
)
}
}
}) {
Text(text = "Start Game")
}
}
}